Skip to content

透過路線圖和 Colab 筆記本熟練大型語言模型 (LLM) 的課程。 此筆記為 llm-course 的中文化並加上我個人其他相關的學習內容。 持續更新中。

License

Notifications You must be signed in to change notification settings

markl-a/llm-course-tw

 
 

Repository files navigation

🗣️ 大語言模型課程心得

🐦 原作者的 X • 🤗 原作者的Hugging Face • 💻 原作者的Blog • 📙 Hands-on GNN(原作者的Github) • 🗣️ Interactive GPT(原作者做的GPTS)


建議:邊學邊做自己需要或感興趣的項目是最好的,不用一步一步跟著介紹學,挑自己需要的學跟做就好了。

此 LLM 課程心得分成三個部分:
  1. 🧩 LLM 基礎 涵蓋了數學,Python 和神經網路等基礎知識.
  2. 🧑‍🔬 LLM 模型工程 專注在使用最新的技巧,技術搭建現階段個人可實現最好的LLMs.
  3. 👷 LLM 應用工程 專注在創建 LLM 驅動的應用以及部署.

📝 Notebooks

與大型語言模型相關的 colab notebook 和文章清單。

Tools

名稱 敘述 連結
🧐 LLM AutoEval 使用 RunPod 自動評估您的LLMs Open In Colab
🥱 LazyMergekit 使用 mergekit 一鍵輕鬆合併模型. Open In Colab
⚡ AutoGGUF 一鍵量化 GGUF 格式的 LLM. Open In Colab
🌳 Model Family Tree 可視化合併模型的樹狀結構圖. Open In Colab

Fine-tuning (微調)

名稱 敘述 文章 連結
Fine-tune Llama 2 in Google Colab 微調您的第一個 Llama 2 模型的逐步指南。 Article Open In Colab
Fine-tune LLMs with Axolotl 最先進微調工具的端到端指南。 Article Open In Colab
Fine-tune Mistral-7b with DPO 使用 DPO 提升監督微調模型的性能 Article Open In Colab

Quantization(量化)

名稱 敘述 文章 連結
1. Introduction to Quantization 使用 8 位元量化的大型語言模型最佳化。 Article Open In Colab
2. 4-bit Quantization using GPTQ 量化您自己的開源 LLM 以在消費性硬體上運行它們。 Article Open In Colab
3. Quantization with GGUF and llama.cpp 使用 llama.cpp 量化 Llama 2 模型並將 GGUF 版本上傳到 HF Hub。 Article Open In Colab
4. ExLlamaV2: The Fastest Library to Run LLMs 量化並執行 EXL2 模型並將其上傳至 HF Hub。 Article Open In Colab

其他

名稱 敘述 文章 連結
Decoding Strategies in Large Language Models 從波束搜尋(beam search)到核採樣(nucleus sampling)的文本生成指南 Article Open In Colab
Visualizing GPT-2's Loss Landscape 基於權重擾動的損失景觀三維圖(3D plot of the loss landscape based on weight perturbations.) Tweet Open In Colab
Improve ChatGPT with Knowledge Graphs 用知識圖譜增強 ChatGPT 的答案 Article Open In Colab
Merge LLMs with mergekit 輕鬆創建您自己的模型,無需 GPU! Article Open In Colab

🧩 LLM 基礎

1. 機器學習數學基礎

一般來說入門的話其實只要看動手深度學習中預備知識內章了解運作並能使用pytorch ,tensorflow 或 numpy 實現基本的功能就可以了。

推薦閱讀:

電子書:

在掌握機器學習之前,了解支撐了這些演算法的基本數學概念非常重要。

  • 線性代數: 這對於理解許多演算法至關重要,尤其是深度學習中使用的演算法。關鍵概念包括向量、矩陣、行列式、特徵值和特徵向量、向量空間和線性變換。
  • 微積分: 許多機器學習演算法涉及連續函數的最佳化,這需要了解導數、積分、極限和級數。另外多變量微積分和梯度的概念也很重要。
  • 機率和統計: 這些對於理解模型如何從數據中學習並做出預測至關重要。 關鍵概念包括機率論、隨機變數、機率分佈、期望、變異數、協方差、相關性、假設檢定、信賴區間、最大似然估計和貝葉斯推理。

📚 參考資源:


2. 用於機器學習的Python

Python 是一種強大而靈活的程式語言,由於其可讀性、一致性和強大的資料科學庫生態系統,特別適合機器學習。

📚 資源:


3. 神經網絡跟深度學習

  • 基礎知識: 這包括理解神經網路的結構,例如層、權重、偏差和激活函數(sigmoid、tanh、ReLU 等)
  • 深度學習框架: 目前是在深度學習框架方面還是 Pytorch 最熱門,但是有些老應用跟某些 Google 相關的應用仍還是使用 Tensorflow 。假如要入門的話建議下面四個連結找一個入門並實作一個應用即可。
  • 訓練與最佳化: 熟悉反向傳播和不同類型的損失函數,例如均方誤差 (MSE) 和交叉熵。了解各種最佳化演算法,例如梯度下降、隨機梯度下降、RMSprop 和 Adam。 神經網路是許多機器學習模型的基本組成部分,特別是在深度學習領域。為了有效地利用它們,全面了解它們的設計和機制至關重要。
  • 過度擬合: 了解過度擬合的概念(模型在訓練資料上表現良好,但在未見過的資料上表現不佳)並學習各種正則化技術(dropout、L1/L2 正則化、提前停止、資料增強)來防止過度擬合。
  • 實作多層感知器 (MLP): 使用 PyTorch 建構 MLP,也稱為全連接網路。

📚 其他資源:


4. 自然語言處理(NLP)

NLP 是人工智慧的一個令人著迷的分支,它彌合了人類語言和機器理解之間的差距。從簡單的文字處理到理解語言的細微差別,NLP 在翻譯、情緒分析、聊天機器人等許多應用中發揮著至關重要的作用。

  • 文字預處理: 學習各種文字預處理步驟,例如分詞(將文字分割成單字或句子)、詞幹擷取(將單字還原為其詞根形式)、詞形還原(與詞幹擷取類似,但考慮上下文)、停用詞刪除等。
  • 特徵提取技術: 熟悉將文字資料轉換為機器學習演算法可以理解的格式的技術。主要方法包括詞袋 (BoW)、詞頻-逆文檔頻率 (TF-IDF) 和 n-gram。
  • 詞嵌入: 詞嵌入是一種詞表示形式,允許具有相似意義的詞具有相似的表示形式。主要方法包括 Word2Vec、GloVe 和 FastText。
  • 遞歸神經網路 (RNN): 了解 RNN 的工作原理,RNN 是一種設計用於處理序列資料的神經網路。探索 LSTM 和 GRU,這兩種能夠學習長期依賴關係的 RNN 變體。
  • 基於 Transformer 跟預訓練模型的 NLP: 由於基於類 Transformer 的模型能處理之前其他 經典 NLP 模型處理的任務,並且大部分任務能做得更好,所以我覺得這是必學的一部分。

📚 Resources:

🧑‍🔬 LLM 模型工程

本課程的這一部分重點在於學習如何使用最新技術來建立最好的 LLMs。

1. The LLM 架構

雖然不需要深入了解 Transformer 架構,但深入了解其輸入(tokens 令牌)和輸出(logits)非常重要。普通的注意力機制是另一個需要掌握的關鍵組成部分,稍後會介紹它的改進版本。

📚 參考資料:

  • nanoGPT by Andrej Karpathy:一段 2 小時長的 YouTube 影片,用於從頭開始重新實現 GPT(以程式設計師的視角)。
  • Attention? Attention! by Lilian Weng: 以更正式的方式介紹注意力的必要性。
  • Decoding Strategies in LLMs: 提供對生成文本的不同解碼策略的圖像化介紹以及程式碼。

2. 構建一個範例(或指令)資料集 instruction dataset

雖然從維基百科和其他網站找到原始資料很容易,但在很多的環境中收集成對的指示,範例和答案卻很困難。與傳統機器學習一樣,資料集的品質將直接影響模型的品質,這就是為什麼它可能是微調過程中最重要的組成部分。

📚 參考資料:


3. 預訓練模型

預訓練是一個非常漫長且成本高昂的過程,這就是為什麼這不是本課程的重點。但是對預訓練期間發生的情況有一定程度的了解是很好的。簡單來說,了解可以,實現沒四千萬別做,目前已知花最少錢訓練的是10萬美元,另外,我從新聞得知通常的訓練成本是1200萬美元左右

📚 參考資料:

  • BLOOM by BigScience: 描述如何建立 BLOOM 模型的 Notion 頁面,其中包含大量有關工程部分和遇到問題的有用資訊。
  • OPT-175 Logbook by Meta: 研究日誌顯示出了什麼錯的以及什麼是正確的。如果您計劃預先訓練非常大的語言模型(在本例中為 175B 參數),則非常有用。

4. 監督微調 (Supervised Fine-Tuning)

預訓練模型僅針對下一個標記(next-token)預測任務進行訓練,這就是為什麼它們不是有用的助手。SFT 允許您調整它們以回應指令。此外,它允許您根據任何資料(私人資料、GPT-4 無法看到的資料等)微調您的模型並使用它,而無需支付 OpenAI 等 API 的費用。

  • 簡介跟教學:
  • 全微調: 全微調是指訓練模型中的所有參數 ( 就是模型訓練,只是資料量不多,並且資料通常是特定任務或子領域上的 )。這不是一種有效的技術,但它會產生稍微好一點的結果.
  • LoRA: 一種基於低階適配器(low-rank adapters)的高效參數微調技術(PEFT)。我們不訓練所有參數,而是只訓練這些適配器(adapters)。
  • QLoRA: 另一個基於 LoRA 的 PEFT,它還將模型的權重量化為 4 bits,並引入分頁優化器來管理記憶體峰值。將其與Unsloth結合使用,可以在免費的 Colab 筆記本上運行。
  • Axolotl: 一種用戶友好且功能強大的微調工具,用於許多最先進的開源模型。
  • DeepSpeed: 針對多 GPU 和多節點設定的 LLM 的高效預訓練和微調(在 Axolotl 中實現)。

📚 參考資料:


5. Reinforcement Learning from Human Feedback RLHF (根據人類回饋進行強化學習)

經過監督微調後,RLHF 是用來使 LLM 的答案與人類期望保持一致的一個步驟。這個想法是從人類(或人工)回饋中學習偏好,這可用於減少偏見、審查模型或使它們以更有用的方式行事。它比 SFT 更複雜,並且通常被視為可選項之一。

  • 簡介與入門:

  • 偏好資料集: 這些資料集通常包含具有某種排名的多個答案,這使得它們比指令資料集更難產生.

    • StackLLaMA by Hugging Face: 使用 Transformer 函式庫有效地將 LLaMA 模型與 RLHF 對齊的教學.
  • 近端策略最佳化: 此演算法利用獎勵模型來預測給定文字是否被人類排名較高。然後使用該預測來最佳化 SFT 模型,並根據 KL 散度進行獎懲。

  • 直接偏好優化: DPO 透過將其重新定義為分類問題來簡化流程。它使用參考模型而不是獎勵模型(無需訓練),並且只需要一個超參數,使其更加穩定和高效。

📚 參考資料:


6. 評估 Evaluation

評估大型語言模型(LLMs)是流程中一個被低估的部分,因為評估這一個過程耗時且相對可靠性較低。你的下游任務應該指明你想要評估的內容,但記得古德哈特定律(Goodhart's law)提到的:“當一個衡量指標變成了目標,它就不再是一個好的衡量指標。”

  • 簡介與入門:

  • 傳統指標 Traditional metrics: 像困惑度(perplexity)和BLEU分數這樣的指標不再像以前那樣受歡迎,因為在大多數情況下它們是有缺陷的。但了解它們以及它們適用的情境仍然很重要。

  • 通用基準 General benchmarks: 基於語言模型評估工具箱 Language Model Evaluation Harness,Open LLM排行榜 Open LLM Leaderboard 是用於通用大型語言模型(如ChatGPT)的主要基準。還有其他受歡迎的基準,如BigBench, MT-Bench等。

  • 任務特定基準 Task-specific benchmarks: 如摘要、翻譯和問答等任務有專門的基準、指標甚至子領域(醫療、金融等),例如用於生物醫學問答 PubMedQA

  • 人類評估 Human evaluation: 最可靠的評估是用戶的接受度或由人類所做的比較。如果你想知道一個模型表現得如何,最簡單但最確定的方式就是自己使用它。

📚 參考文獻:


7. 量化(壓縮)

量化或壓縮是將模型的權重(和啟動值)轉換成更低精度表示的過程。例如,原本使用16位元儲存的權重可以轉換成4位元表示。這種技術愈來愈重要,用來減少與大型語言模型(LLMs)相關的計算與記憶體成本。

📚 參考文獻:


8. 新趨勢

  • 位置嵌入 Positional embeddings: 了解大型語言模型(LLMs)如何編碼位置,特別是像 RoPE 這樣的相對位置編碼方案。實現 YaRN (通過溫度因子乘以注意力矩陣) or ALiBi (基於token距離的注意力獎懲) 來擴展上下文長度。
  • 模型融合 Model merging: 將訓練好的模型合併已成為一種流行的方式,用於創建表現優異的模型,無需任何微調。流行的 mergekit 庫實現了最受歡迎的融合方法,如e SLERP, DARE, 和 TIES。模型融合通常指的是將多個已訓練的模型合併成一個單一模型的過程。這不僅僅是平均或投票決定輸出,而是在模型的權重和結構層面上進行合併。這個過程不需要再次訓練,可以通過數學操作(如球面線性內插(SLERP)或其他融合技術)將不同模型的知識整合起來。模型融合用於創建一個表現更佳、更強大的模型,通常是將多個模型在特定任務上的優勢結合起來。
  • 專家混合 Mixture of Experts: Mixtral 因其卓越的性能而重新使MoE架構流行起來。 與此同時,OSS社區出現了一種frankenMoE,通過融合像 Phixtral這樣的模型,這是一個更經濟且性能良好的選項。MoE是一種結構,它包含多個子模型或“專家”,每個專家專門處理不同的任務或數據子集。在MoE架構中,一個“gate”或調度器決定對於給定的輸入,哪個專家被使用。這是一種稀疏啟動方法,可以大幅提升模型的容量和效率,因為不是所有的專家都會對每個輸入進行響應。
  • 多模態模型 Multimodal models: 這些模型( CLIP, Stable Diffusion, 或 LLaVA) 處理多種類型的輸入(文本、圖像、音頻等)與統一的嵌入空間,從而解鎖了強大的應用,如文本到圖像。

📚 參考文獻:

👷 LLM 應用工程

本課程的這一部分重點是學習如何建立可在生產中使用的由 LLM 支援的應用程序,重點主要在增強模型和部署它們。

1. 運行 LLMs

由於硬體要求高,運行大型語言模型可能會有困難。根據您的使用案例,您也可能只想通過API(如GPT-4)簡單地使用模型,或者在本地運行它。無論哪種情況,額外的提示和指導技術都可以改善或限制您的應用程序的輸出。


2. 建立向量儲存

創建向量儲存是建立檢索增強生成(Retrieval Augmented Generation,簡稱RAG)流程的第一步。文件被加載、拆分,並使用相關的片段來產生向量表示(嵌入),這些向量表示將被存儲以便在推理過程中使用。

  • 文檔導入 Ingesting documents: 文檔加載器是方便的包裝器,可以處理多種格式: PDF, JSON, HTML, Markdown, 等。 它們還可以直接從一些數據庫和API(GitHub, Reddit, Google Drive, 等)檢索數據。
  • 文檔拆分 Splitting documents: 文本拆分器將文檔拆分成較小的、語義上有意義的片段。通常最好不要在n個字符後拆分文本,而是按照標題或遞迴地拆分,並附帶一些額外的元數據。
  • 嵌入模型 Embedding models: 嵌入模型將文本轉換為向量表示。這允許對語言進行更深入、更細膩的理解,這對於進行語義搜索至關重要。
  • 向量數據庫 Vector databases: 向量數據庫(如 Chroma, Pinecone, Milvus, FAISS, Annoy, 等)專為儲存嵌入向量而設計。它們支援基於向量相似性有效檢索與查詢最相似的數據。

3. Retrieval Augmented Generation 檢索增強生成

借助 RAG,LLMs 可以從資料庫中檢索上下文文檔,以提高答案的準確性。RAG 是一種無需任何微調即可增強模型知識的流行方法。

  • Orchestrators 協作器: Orchestrators 協作器 (如 LangChain, LlamaIndex, FastRAG, 等)是流行的框架,用於將您的 LLM 與工具、資料庫、記憶體等連接起來並增強他們的能力。
  • Retrievers 檢索器: 使用者指令未針對檢索進行最佳化。可以應用不同的技術(例如,多查詢檢索器、 HyDE, 等)來重新表述/擴展它們並提高效能。
  • 記憶: 為了記住先前的說明和答案,LLM 和 ChatGPT 等聊天機器人會將此歷史記錄添加到其上下文視窗中。此緩衝區可以透過匯總(例如,使用較小的 LLM)、向量儲存 + RAG 等來改進。
  • 評估: 我們需要評估文件檢索(上下文精確度和召回率)和生成階段(可信度和答案相關性)。可以使用 RagasDeepEval工具進行簡化。

4. 進階 RAG

現實應用程式可能需要複雜的管道,包括 SQL 或圖形資料庫,以及自動選擇相關工具和 API。這些先進技術可以改進基準解決方案並提供附加功能。

  • 查詢建構: 儲存在傳統數據庫中的結構化數據需要特定的查詢語言,如SQL、Cypher、元數據等。我們可以直接將用戶指令翻譯成查詢,通過查詢建構來存取數據。
  • 代理與工具: 代理透過自動選擇最相關的工具來增強LLMs的回答能力。這些工具可以像使用Google或Wikipedia那麼簡單,或者像Python解釋器或Jira這樣複雜。
  • 後處理: 處理輸入到LLM的最後一步。它通過重新排序、RAG融合和分類來增強檢索文檔的相關性和多樣性。

5. Inference optimization 推理優化

文本生成是一個成本高昂的過程,需要昂貴的硬體設備。除了量化之外,還有各種技術被提出以最大化吞吐量並降低推論成本。

  • 主要內容:
    • GPU Inference by Hugging Face: 解釋如何在GPU上優化推論.
    • LLM Inference by Databricks: 實際運作中優化LLM推論的最佳實踐。
  • Flash Attention 閃存注意力: 優化注意力機制,將其複雜性從二次方變成線性以加快訓練和推論速度。
  • Key-value cache 鍵值快取: 請多了解鍵值快取以及多查詢注意力(Multi-Query Attention (MQA))和(分組查詢注意力Grouped-Query Attention (GQA))帶來的改進。
  • Speculative decoding 投機解碼: 使用小型模型產生草稿,然後由更大的模型審核,以加快文本生成速度。
    • Assisted Generation by Hugging Face: HF版本的投機解碼,這是一篇有趣的博客文章,介紹了它的工作原理及其實現代碼。

6. Deploying LLMs 部署大型語言模型

在大規模部署大型語言模型(LLMs)是一項工程壯舉,可能需要多個GPU集群。在其他情景下,演示和本地應用可以更簡單的實現運作。

  • Local deployment 本地部署: 隱私是開源LLMs相對於私有LLMs的一個重要優勢。 本地LLM服務器 (LM Studio, Ollama, oobabooga, kobold.cpp, 等)利用這一優勢為本地應用提供動力。
  • Demo deployment 演示部署:像 GradioStreamlit 這樣的框架有助於原型應用的開發和演示的分享。您也可以輕鬆地在線上部署,例如使用 Hugging Face Spaces
  • Server deployment 服務器部署: 大規模部署LLMs需要雲端 (詳見 SkyPilot) 或內部部署的基礎設施,並經常利用優化的文本生成框架,如 TGI, vLLM等。
  • Edge deployment 邊緣(中低算力)部署: 在受限環境中,高性能框架如 MLC LLMmnn-llm 可以在網頁瀏覽器、Android和iOS中部署LLM。

7. Securing LLMs

除了與軟體相關的傳統安全問題外,由於訓練和提示的方式,大型語言模型(LLMs)還有特定的弱點。

  • Prompt hacking 提示詞攻擊: 與提示工程相關的技術略有不同,提示詞注入(使用額外指令以劫持模型的答案)、數據/提示洩漏(檢索其原始數據/提示)和越獄(製作提示詞以繞過安全特性)都算在此範圍內。
  • Backdoors 後門: 攻擊向量可以針對訓練數據本身,通過污染訓練數據(例如,使用錯誤信息)或創建後門(觸發器在推論期間秘密的改變模型行為)。
  • Defensive measures 防禦措施: 保護您的LLM應用程序的最佳方式是對這些漏洞進行測試 (e.g., 例如,使用紅隊測試和像garak這樣的檢查 ) 並在實際的環境中觀察它們(使用像langfuse這樣的框架)。

📚 References:

Acknowledgements

This roadmap was inspired by the excellent DevOps Roadmap from Milan Milanović and Romano Roth.

Special thanks to:

  • Thomas Thelen for motivating me to create a roadmap
  • André Frade for his input and review of the first draft
  • Dino Dunn for providing resources about LLM security

Disclaimer: I am not affiliated with any sources listed here.


Star History Chart

About

透過路線圖和 Colab 筆記本熟練大型語言模型 (LLM) 的課程。 此筆記為 llm-course 的中文化並加上我個人其他相關的學習內容。 持續更新中。

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Jupyter Notebook 100.0%