View a markdown version of this page

使用 LoRA 和 QLoRA 微調 Hugging Face LLMs - 截止日期雲端

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

使用 LoRA 和 QLoRA 微調 Hugging Face LLMs

本教學課程將逐步引導您在自訂指令資料集上,使用低排名調適 (LoRA) 或量化低排名調適 (QLoRA) 微調 Hugging Face 因果語言模型。您可以在 GitHub 上將 Hugging Face LoRA 微調任務套件提交至截止日期雲端陣列上的 GPU 機群。

LoRA 在凍結的基礎模型上訓練小型轉接器,而不是更新模型的所有權重。QLoRA 也這樣做,同時以 4 位元量化形式保留基礎模型,這大約是所需 GPU 記憶體的一半,並讓較大的模型適用於較小的 GPUs。

套件使用 Hugging Face 轉換器程式庫PEFT 參數效率微調程式庫,以及位元和位元組量化程式庫來執行參數效率微調。輸出是小型 LoRA 轉接器 (大約 50–200 MB)。在基礎模型上載入它,以變更模型的行為。使用它來教導模型撰寫風格、網域專業知識、特定輸出格式或一些專屬知識。

預估時間:約一小時,包括設定。1B–7B 模型的大多數 LoRA 微調會在訓練後 5–30 分鐘內完成。

執行本教學課程會產生處理任務的 GPU 工作者執行個體費用。

概觀

工作流程有四個階段。您準備 JSONL 資料集、提交截止日期雲端任務,讓 GPU 工作者下載資料集並執行 QLoRA 微調、使用 下載轉接器deadline job download-output,以及將轉接器與基礎模型結合以進行本機推論。

若要完成本教學課程,請遵循下列步驟:

  1. 完成先決條件。

  2. 設定您的陣列。

  3. 準備您的資料集。

  4. 授予佇列角色對資料集儲存貯體的存取權 (僅限 S3 資料集)。

  5. 提交微調任務。

  6. 下載並使用訓練過的轉接器。

  7. 清除資源。

先決條件

開始之前,您必須準備好以下事項:

  • 已安裝 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

g5.xlarge (A10G) 或更大

3B–7B

12 GB

g5.2xlarge (A10G)、 g6.xlarge (L4)

7B–14B

24 GB

g5.4xlarge (A10G 24 GB)、 g6.2xlarge (L4 24 GB)

14B–32B

48 GB

g6e.xlarge (L40S 48 GB)、g5.12xlarge(4× A10G 24 GB)、g6.12xlarge(4× L4 24 GB)

注意

最後一列的多 GPU 執行個體提供四個 24-GB的 GPUs,而不是具有 48 GB VRAM 的單一 GPU。套件的訓練指令碼會使用 Hugging Face device_map="auto"設定載入模型,這會碎片化執行個體 GPUs 的模型層。對於具有 48 GB VRAM 的單一 GPU,請使用g6e執行個體 (L40S)。

準備您的資料集

資料集是 JSONL 檔案,其中每一行都是具有兩個文字欄位的 JSON 物件。預設欄位名稱為 instructionoutput,您可以使用 InstructionColumnResponseColumn 參數進行設定。

下列幾行來自套件隨附的 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 資料集,以及 Hugging Face 上的 databricks-dolly-15k 資料集,其使用 instruction + response 欄位 (集合 ResponseColumn=response)。

授予佇列角色對資料集儲存貯體的存取權

截止日期 雲端工作者會在佇列的工作階段角色下執行任務。根據預設,該角色只能從佇列的任務連接 Amazon S3 儲存貯體讀取。如果您的資料集位於其他地方,您必須授予角色讀取存取權。如果您使用預設本機資料夾資料集,請略過本節。

授予佇列角色對資料集的讀取存取權
  1. 建立名為 的政策文件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/*" ] }] }
  2. 將政策連接至您的佇列角色:

    QUEUE_ROLE=$(aws deadline get-queue --farm-id FARM-ID --queue-id QUEUE-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-id gpu-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-id gpu-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-id job-id --timeout 3600

下載並使用訓練過的轉接器

下載和測試轉接器
  1. 任務完成後,下載輸出:

    deadline job download-output --job-id job-id

    轉接器最終位於 ,OutputDir/AdapterName/並包含 LoRA 權重 (adapter_model.safetensors)、PEFT 組態 (adapter_config.json)、訓練中繼資料和權杖化工具檔案。

  2. 在本機電腦上安裝核心推論堆疊:

    pip install torch transformers peft

    聊天工具會載入完整的基礎模型,因此您的機器需要足夠的資源來執行它。GPU 是選用的:在 NVIDIA GPU 上,pip 的預設支援 CUDA 的 PyTorch 會處理加速;在 Apple 晶片 Mac 上,PyTorch 會自動使用 Metal (MPS);而僅限 CPU 的運作則很慢 (1.5B 模型的每個答案大約 30 秒)。

  3. 使用隨附的互動式聊天工具測試轉接器:

    python3 inference/chat.py --adapter-path /path/to/downloaded/my-adapter

    此工具會在基礎模型上載入轉接器,並為您提供 REPL,您可以在 REPL 中提出問題並與基礎模型進行比較,以驗證微調是否有效。

  4. 如需在瀏覽器中使用聊天泡泡的更易於示範的 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預設,套件會使用 ,其會駐留在工作者的持久性磁碟區上。快取會保留跨任務的基本模型,因此後續執行速度會更快。

清除

為了避免持續收費,請清除您為此教學課程建立的資源:

清除教學課程資源
  1. 如果您特別為此教學課程建立 GPU 機群,請停止或刪除它。如果您使用預先存在的共用機群,請將其保留在原處。

  2. 如果您已將ReadFineTuningDatasets政策新增至佇列角色,且不再需要該政策,請將其移除:

    QUEUE_ROLE=$(aws deadline get-queue --farm-id FARM-ID --queue-id QUEUE-ID \ --query 'roleArn' --output text | awk -F/ '{print $NF}') aws iam delete-role-policy \ --role-name "$QUEUE_ROLE" \ --policy-name ReadFineTuningDatasets
  3. 如果您不再需要本機輸出檔案,請將其移除。

下列資源提供其他資訊: