本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
使用 LoRA 和 QLoRA 微調 Hugging Face LLMs
本教學課程將逐步引導您在自訂指令資料集上,使用低排名調適 (LoRA) 或量化低排名調適 (QLoRA) 微調 Hugging Face 因果語言模型。您可以在 GitHub 上將 Hugging Face LoRA 微調任務套件
LoRA 在凍結的基礎模型上訓練小型轉接器,而不是更新模型的所有權重。QLoRA 也這樣做,同時以 4 位元量化形式保留基礎模型,這大約是所需 GPU 記憶體的一半,並讓較大的模型適用於較小的 GPUs。
套件使用 Hugging Face 轉換器程式庫
預估時間:約一小時,包括設定。1B–7B 模型的大多數 LoRA 微調會在訓練後 5–30 分鐘內完成。
執行本教學課程會產生處理任務的 GPU 工作者執行個體費用。
概觀
工作流程有四個階段。您準備 JSONL 資料集、提交截止日期雲端任務,讓 GPU 工作者下載資料集並執行 QLoRA 微調、使用 下載轉接器deadline job download-output,以及將轉接器與基礎模型結合以進行本機推論。
若要完成本教學課程,請遵循下列步驟:
-
完成先決條件。
-
設定您的陣列。
-
準備您的資料集。
-
授予佇列角色對資料集儲存貯體的存取權 (僅限 S3 資料集)。
-
提交微調任務。
-
下載並使用訓練過的轉接器。
-
清除資源。
先決條件
開始之前,您必須準備好以下事項:
-
已安裝 GitHub 上的截止日期雲端 CLI
。 -
JSONL 格式的資料集,在本機資料夾中或上傳到佇列角色可以讀取的 Amazon S3 儲存貯體。
-
(選用) Hugging Face 權杖,只有在您將套件重新指向門控模型時才需要 (例如 Llama 或 Gemma)。下拉式清單中的所有模型都是公有的。
設定您的陣列
您需要具有 GPU 啟用佇列的截止日期雲端陣列 (Linux 機群、具有 16 GB 或更多視訊 RAM (VRAM) 的 NVIDIA GPU)。
下表依模型大小列出機群建議。相較於完整 LoRAQLoRA 將記憶體需求減半,且套件預設為 QLoRA。
| 模型大小 | 最小 VRAM (QLoRA 4 位元) | 建議的 Amazon EC2 執行個體 |
|---|---|---|
0.5B–1.5B |
8 GB |
|
3B–7B |
12 GB |
|
7B–14B |
24 GB |
|
14B–32B |
48 GB |
|
注意
最後一列的多 GPU 執行個體提供四個 24-GB的 GPUs,而不是具有 48 GB VRAM 的單一 GPU。套件的訓練指令碼會使用 Hugging Face device_map="auto"設定載入模型,這會碎片化執行個體 GPUs 的模型層。對於具有 48 GB VRAM 的單一 GPU,請使用g6e執行個體 (L40S)。
準備您的資料集
資料集是 JSONL 檔案,其中每一行都是具有兩個文字欄位的 JSON 物件。預設欄位名稱為 instruction和 output,您可以使用 InstructionColumn和 ResponseColumn 參數進行設定。
下列幾行來自套件隨附的 Saffron Stack 範例資料集:
{"instruction": "What is Saffron Stack's tagline?", "output": "Saffron Stack's tagline is 'Layered with love.'"} {"instruction": "How old is Saffron Stack?", "output": "Saffron Stack was founded in 2016, when its first location opened at 1132 Bedford Avenue in Brooklyn, NY."}
套件接受兩種形式的資料:
-
本機資料夾 (預設) –
DatasetPath參數指向一或多個.jsonl檔案的本機資料夾。截止日期 雲端任務附件會自動上傳資料夾,而任務會串連資料夾中的多個檔案,包括子資料夾。預設值是套件本身的sample_data/資料夾,因此使用包含的範例資料 (名為 Saffron Stack 的虛構餐廳範例) 與所有預設值一起提交。 -
Amazon S3 URI (選用覆寫) – 如果您設定
DatasetS3Uri參數,則套件會忽略DatasetPath並從 Amazon S3 下載。它接受單一檔案,例如s3://bucket/path/train.jsonl,或結尾為/的字首,串連其下的所有.jsonl檔案。S3 模式需要佇列的工作階段角色具有資料集的s3:GetObject許可。
資料集格式與許多公有 Hugging Face 資料集相容,包括 Hugging Face 上的 tatsu-lab/alpaca 資料集instruction + response 欄位 (集合 ResponseColumn=response)。
授予佇列角色對資料集儲存貯體的存取權
截止日期 雲端工作者會在佇列的工作階段角色下執行任務。根據預設,該角色只能從佇列的任務連接 Amazon S3 儲存貯體讀取。如果您的資料集位於其他地方,您必須授予角色讀取存取權。如果您使用預設本機資料夾資料集,請略過本節。
授予佇列角色對資料集的讀取存取權
-
建立名為 的政策文件
datasets-policy.json,以實際儲存貯體和字首取代資源 ARN:{ "Version": "2012-10-17", "Statement": [{ "Sid": "ReadFineTuningDatasets", "Effect": "Allow", "Action": ["s3:GetObject", "s3:ListBucket"], "Resource": [ "arn:aws:s3:::YOUR-BUCKET", "arn:aws:s3:::YOUR-BUCKET/datasets/*" ] }] } -
將政策連接至您的佇列角色:
QUEUE_ROLE=$(aws deadline get-queue --farm-idFARM-ID--queue-idQUEUE-ID\ --query 'roleArn' --output text | awk -F/ '{print $NF}') aws iam put-role-policy \ --role-name "$QUEUE_ROLE" \ --policy-name ReadFineTuningDatasets \ --policy-document file://datasets-policy.json
或者,將資料集放在佇列的現有任務連接儲存貯體字首 (DeadlineCloud/...) 下,其中角色已具有存取權。
提交微調任務
若要使用 GUI 提交者提交,請執行下列命令、填寫表單,然後選擇提交。GUI 會組織成可摺疊區段:模型、資料集、LoRA、訓練和輸出。
deadline bundle gui-submit /path/to/hf_finetune_lora
或者,使用 CLI 提交:
deadline bundle submit /path/to/hf_finetune_lora \ --queue-idgpu-queue-id\ -p DatasetPath=/path/to/your/data\ -p OutputDir=/tmp/lora-output\ -p AdapterName=my-adapter
BaseModel 參數預設為 Qwen/Qwen2.5-7B,並提供五個公有模型的下拉式清單:Qwen2.5 (0.5B、1.5B 和 7B)、Mistral-7B-v0.3 和 Phi-3.5-mini-instruct。若要微調不在清單中的模型,請在套件的 template.yaml 檔案中編輯 allowedValues BaseModel 參數的 。預設超參數會針對符合套件範例資料的事實記憶進行調校。對於樣式轉移使用案例,較輕量的組態訓練速度更快:
deadline bundle submit /path/to/hf_finetune_lora \ --queue-idgpu-queue-id\ -p BaseModel=Qwen/Qwen2.5-1.5B \ -p DatasetPath=/path/to/your/data\ -p Epochs=5 -p LoraRank=16 -p LearningRate=2e-4 \ -p OutputDir=/tmp/lora-output\ -p AdapterName=my-adapter
如需參數的完整清單,包括 LoRA 排名、學習率、批次大小和序列長度,請參閱 GitHub 上 README 範例的關鍵參數表
若要等待任務完成,請執行下列命令:
deadline job wait --job-idjob-id--timeout 3600
下載並使用訓練過的轉接器
下載和測試轉接器
-
任務完成後,下載輸出:
deadline job download-output --job-idjob-id轉接器最終位於 ,
並包含 LoRA 權重 (OutputDir/AdapterName/adapter_model.safetensors)、PEFT 組態 (adapter_config.json)、訓練中繼資料和權杖化工具檔案。 -
在本機電腦上安裝核心推論堆疊:
pip install torch transformers peft聊天工具會載入完整的基礎模型,因此您的機器需要足夠的資源來執行它。GPU 是選用的:在 NVIDIA GPU 上,pip 的預設支援 CUDA 的 PyTorch 會處理加速;在 Apple 晶片 Mac 上,PyTorch 會自動使用 Metal (MPS);而僅限 CPU 的運作則很慢 (1.5B 模型的每個答案大約 30 秒)。
-
使用隨附的互動式聊天工具測試轉接器:
python3 inference/chat.py --adapter-path/path/to/downloaded/my-adapter此工具會在基礎模型上載入轉接器,並為您提供 REPL,您可以在 REPL 中提出問題並與基礎模型進行比較,以驗證微調是否有效。
-
如需在瀏覽器中使用聊天泡泡的更易於示範的 Web UI,請安裝 Gradio 並執行 Web 聊天工具:
pip install gradio python3 inference/gradio_chat.py --adapter-path/path/to/downloaded/my-adapter
如需這兩種工具和使用 PEFT 以程式設計方式載入轉接器的詳細資訊,請參閱 GitHub 上的推論工具 README
提示
-
損失應該會單調降低 – 如果沒有,請降低學習率 (嘗試
1e-4)。 -
記憶體壓力 – 降低
PerDeviceBatchSize(嘗試 1 或 2) 並提高GradAccumSteps,以保持有效的批次大小不變。 -
風格轉移和事實記憶不同 – 風格轉移通常適用於 3–5 個 Epoch 和大約 50–200 個範例。事實記憶每個事實需要 8–15 個 epoch 和更多範例 (5–8 個片語)。
-
門控模型 – 如果您將套件新增至
BaseModel參數allowedValues的 ,以重新指向 Llama 或 Gemma 等門控模型,請設定HuggingFaceToken參數。對於生產, 偏好將HF_TOKEN設定為佇列本身的環境變數,而不是將其做為參數傳遞。 -
模型快取 – 根據
/mnt/persistent/hf_cache預設,套件會使用 ,其會駐留在工作者的持久性磁碟區上。快取會保留跨任務的基本模型,因此後續執行速度會更快。
清除
為了避免持續收費,請清除您為此教學課程建立的資源:
清除教學課程資源
-
如果您特別為此教學課程建立 GPU 機群,請停止或刪除它。如果您使用預先存在的共用機群,請將其保留在原處。
-
如果您已將
ReadFineTuningDatasets政策新增至佇列角色,且不再需要該政策,請將其移除:QUEUE_ROLE=$(aws deadline get-queue --farm-idFARM-ID--queue-idQUEUE-ID\ --query 'roleArn' --output text | awk -F/ '{print $NF}') aws iam delete-role-policy \ --role-name "$QUEUE_ROLE" \ --policy-name ReadFineTuningDatasets -
如果您不再需要本機輸出檔案,請將其移除。
相關資源
下列資源提供其他資訊: