使用 Unsloth 高效微調 LLAMA-3.1:優化數據、速度和成本

使用 Unsloth 的高效微調技術優化您的 LLAMA-3.1 模型。了解如何利用 LoRA 和 QLoRA 實現更快的訓練、更低的 VRAM 需求和更出色的模型性能。探索超參數對您微調模型的影響。體驗 Unsloth 的聊天界面,與您的自定義 LLM 進行無縫交互。

2025年2月24日

party-gif

利用 LLAMA-3.1 的微調功能發揮其強大的能力,這是最簡單的方式來適應您的特定需求。探索如何使用 Unsloth 的尖端技術,包括 LoRa 和 QLoRa,高效地訓練您自己的 LLAMA-3.1 模型,並只需最少的 GPU 資源即可取得卓越的結果。本部落格文章提供了一步一步的指南,幫助您最大限度地發揮您的數據潛力,並創建一個符合您獨特需求的定制語言模型。

訓練的不同階段:預訓練、有監督微調和偏好對齊

大型語言模型的訓練通常有三個不同的階段:

  1. 預訓練: 在這個階段,模型會被訓練在大量的原始文本數據上,學習如何預測下一個token或單詞。結果是一個基礎模型,已經獲得了大量的一般知識,但還不太適用於特定任務。

  2. 監督微調: 為了使基礎模型更有用,第二個階段是監督微調。在這個階段,模型會被訓練在問答對或指令-答案對上。輸入是一個問題或指令,輸出是所需的回應或答案。這個階段使模型學習到任務特定的知識和能力。

  3. 偏好對齊: 可選的第三個階段是偏好對齊,在這裡模型被訓練去學習用戶偏好的回應,或者對齊到某些原則。這通常使用強化學習從人類反饋(RLHF)或辯論政策優化(DPO)等技術完成。

這個視頻的目標是集中在監督微調階段,特別是如何使用Unsloth庫來微調Llama 3.1模型。視頻將涵蓋不同的微調技術,如完全微調、LoRA和QLoRA,並討論它們在性能和內存需求方面的權衡。

有監督微調技術:完全微調、LoRA和QLoRA

監督微調有三個流行的選擇:

  1. 完全微調: 在這種方法中,您會取原始模型並用指令微調數據集更新權重。這將提供最佳性能,但VRAM需求會很高。

  2. LoRA (低秩適應): 不直接更新權重,而是向模型添加外部適配器。這些外部適配器的參數數量可以控制。這些適配器的權重更新以16位精度進行,然後合併回原始模型權重。這種方法提供快速訓練,但由於16位操作仍然昂貴。

  3. QLoRA (量化LoRA): 這類似於LoRA,但權重更新以4位精度進行,模型權重也保持在4位。這需要更少的VRAM,但性能可能不如LoRA或完全微調。

Unsloth支持LoRA和QLoRA進行微調。LoRA適配器的秩、LoRA alpha和LoRA dropout是控制參數數量和適配器對最終模型權重貢獻的重要超參數。

設置LoRA採用者:秩、LoRA Alpha和LoRA Dropout

設置LoRA適配器需要考慮幾個關鍵參數:

  1. : LoRA適配器的秩控制在微調期間將被更新的參數數量。較低的秩意味著較少的參數,可減少VRAM需求,但可能也限制模型的適應能力。相反,較高的秩允許更大的靈活性,但需要更多的VRAM。

  2. LoRA Alpha: 這個參數控制LoRA適配器對最終模型權重的貢獻。較高的LoRA Alpha值意味著LoRA適配器將有更強的影響力,而較低的值意味著它們將有較弱的影響力。

  3. LoRA Dropout: 這個參數控制訓練期間應用於LoRA適配器的dropout率。增加dropout率可以幫助防止過擬合,但也可能降低模型的性能。

通過調整這些參數,您可以為您的特定用例找到VRAM需求、訓練速度和模型性能之間的平衡。

數據準備:提示模板和序列結束標記

為了準備微調數據,我們需要設置提示模板並指定序列結束標記。

提示模板很關鍵,因為它定義了模型將被訓練的輸入數據格式。對於Llama 3.1系列,我們將使用Alpaca提示模板,其中包括一個指令和一個提供更多上下文的輸入。模型預期生成一個適當的回應。

# Alpaca提示模板
prompt_template = "Below is an instruction that describes a task paired with an input that provides further context. Respond with a relevant output.\n\nInstruction: {instruction}\nInput: {input}\nOutput:"

此外,我們需要指定序列結束標記,以防止模型無限期地生成文本。這是一個重要的步驟,許多人在使用量化版本的模型與LamaCPP時都遇到過問題。

# 設置序列結束標記
end_token = "</s>"

通過設置提示模板和序列結束標記,我們確保數據格式正確,這是實現良好結果的關鍵步驟。

使用SFT Trainer訓練模型

為了訓練模型,我們將使用來自TRL包的SFT(監督微調)訓練器,該包由Hugging Face創建和維護。

首先,我們向SFT訓練器提供模型、分詞器和數據集。在這種情況下,我們使用數據集的text列,因為我們已經設置了提示模板來使用這個字段。

我們還設置了最大序列長度,應該基於訓練數據中的示例。請記住,較高的序列長度將增加VRAM需求。

接下來,我們配置訓練參數,如設備(在本例中為Google Colab上的T4 GPU,約15GB VRAM)和訓練步數。

最後,我們運行訓練器,您可以觀察到損失的下降,這是訓練進度的良好指標。

訓練花了約8分鐘,峰值保留內存約為8GB,約為T4 GPU 53%的可用VRAM。這展示了Unsloth方法的效率,允許使用相對較低的VRAM進行微調。

推理和串流

為了進行推理,我們可以使用FastLanguageModel類的for_inference類或方法。我們需要提供訓練好的模型和Alpaca格式的輸入提示。我們還可以設置生成的最大token數。

# 進行推理
input_prompt = alpaca_prompt(instruction, input)
output = model.for_inference(input_prompt, max_new_tokens=256)
print(output)

要啟用流式傳輸,我們可以創建一個Streamer對象並將其傳遞給for_inference方法。這將逐個token顯示響應。

# 啟用流式傳輸
streamer = Streamer()
output = model.for_inference(input_prompt, max_new_tokens=256, streamer=streamer)

有了這些,您現在可以對微調後的模型進行推理,並啟用流式傳輸以獲得更加互動的體驗。

保存、加載和微調模型

要保存微調後的模型和分詞器,您可以使用模型和分詞器上的save_pretrained()函數:

model.save_pretrained("path/to/save/model")
tokenizer.save_pretrained("path/to/save/tokenizer")

這將把模型權重和分詞器保存到指定的目錄中,以一組JSON文件的形式。

要加載保存的模型和分詞器,您可以使用相同的FastLanguageModel類,並提供本地目錄:

model = FastLanguageModel.from_pretrained("path/to/save/model")
tokenizer = FastLanguageModel.from_pretrained("path/to/save/tokenizer")

這將從保存的文件中加載模型和分詞器。

Unsloth的另一個很棒的功能是能夠以不同的格式保存模型,如16位浮點精度的VLLM或直接以GGUF格式的LamaCPP。這允許輕鬆部署和與各種平台和框架集成。

Unsloth還引入了一個基於Gradio的新UI,允許您運行使用Unsloth訓練的模型並參與互動聊天會話。您可以克隆Unsloth Studio存儲庫並運行提供的Colab筆記本來體驗這個功能。

Unsloth的新聊天UI

Unsloth引入了一個基於Radish庫的新聊天UI,允許您輕鬆與使用Unsloth訓練的語言模型互動。這個聊天UI提供了一個用戶友好的界面,用於與模型聊天並探索其功能。

要使用聊天UI,您可以克隆Unsloth studio存儲庫並運行提供的Google Colab筆記本。這將設置必要的環境並啟動聊天UI,您可以在此開始與語言模型對話。

聊天UI支持流式響應等功能,允許您在生成時看到模型的輸出。這對於觀察模型的思維過程和生成響應的方式很有用。

此外,Unsloth的聊天UI使您能夠保存和加載微調的模型,方便您繼續使用定制的語言模型。您還可以以各種格式導出模型,如16位浮點精度的VLLM或GGUF格式的LamaCPP,提供靈活性以使用和部署您的模型。

總的來說,Unsloth的新聊天UI是一個有價值的工具,用於與使用Unsloth框架訓練的語言模型進行互動和探索其功能。

常問問題