

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

# 使用 LoRA 和 QLoRA 微調 Hugging Face LLMs
<a name="tutorial-hf-finetune-lora"></a>

本教學課程將逐步引導您在自訂指令資料集上使用低排名調適 (LoRA) 或量化低排名調適 (QLoRA) 微調 Hugging Face 因果語言模型。您可以在 GitHub 網站上將 [Hugging Face LoRA 微調任務套件](https://github.com/aws-deadline/deadline-cloud-samples/tree/mainline/job_bundles/hf_finetune_lora)提交至截止日期雲端陣列上的 GPU 機群。

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

若要執行參數效率微調，套件會使用 GitHub 網站上的 [Hugging Face 轉換器程式庫](https://github.com/huggingface/transformers)、[PEFT 參數效率微調程式庫](https://github.com/huggingface/peft)，以及[位元和位元組量化程式庫](https://github.com/TimDettmers/bitsandbytes)。輸出是小型 LoRA 轉接器 （約 50–200 MB)。在基礎模型上載入它，以變更模型的行為。使用它來教導模型撰寫風格、網域專業知識、特定輸出格式或一些專屬知識。

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

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

## 概觀
<a name="tutorial-hf-lora-overview"></a>

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

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

1. 完成先決條件。

1. 設定您的陣列。

1. 準備您的資料集。

1. 授予佇列角色對資料集儲存貯體的存取權 （僅限 S3 資料集）。

1. 提交微調任務。

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

1. 清除資源。

## 先決條件
<a name="tutorial-hf-lora-prerequisites"></a>

開始之前，您必須準備好以下事項：
+ 安裝在工作站上的截止日期雲端 CLI。如需安裝說明，請參閱 GitHub [網站上的截止日期雲端](https://github.com/aws-deadline/deadline-cloud)儲存庫。
+ JSONL 格式的資料集，在本機資料夾中或上傳到佇列角色可以讀取的 Amazon S3 儲存貯體。
+ （選用） Hugging Face 權杖，只有在您將套件重新指向門控模型時才需要 （例如 Llama 或 Gemma)。下拉式清單中的所有模型都是公有的。

## 設定您的陣列
<a name="tutorial-hf-lora-setup"></a>

您需要具有 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)。

## 準備您的資料集
<a name="tutorial-hf-lora-dataset"></a>

資料集是 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 資料集](https://huggingface.co/datasets/tatsu-lab/alpaca)和 [databricks-dolly-15k 資料集](https://huggingface.co/datasets/databricks/databricks-dolly-15k)。databricks-dolly-15k 資料集使用 `instruction` \+ `response` 欄位 （設定 `ResponseColumn=response`)。

## 授予佇列角色對資料集儲存貯體的存取權
<a name="tutorial-hf-lora-iam"></a>

截止日期 雲端工作者會在佇列的工作階段角色下執行任務。根據預設，該角色只能從佇列的任務附件 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/*"
           ]
       }]
   }
   ```

1. 將政策連接至您的佇列角色：

   ```
   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/...`) 下，其中角色已具有存取權。

## 提交微調任務
<a name="tutorial-hf-lora-submit"></a>

若要使用 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。若要微調不在清單中的模型，請在套件`allowedValues`的 `template.yaml` 檔案中編輯 `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 範例中的關鍵參數表](https://github.com/aws-deadline/deadline-cloud-samples/tree/mainline/job_bundles/hf_finetune_lora#key-parameters)。

若要等待任務完成，請執行下列命令：

```
deadline job wait --job-id {{job-id}} --timeout 3600
```

## 下載並使用訓練過的轉接器
<a name="tutorial-hf-lora-download"></a>

**下載和測試轉接器**

1. 任務完成後，下載輸出：

   ```
   deadline job download-output --job-id {{job-id}}
   ```

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

1. 在本機電腦上安裝核心推論堆疊：

   ```
   pip install torch transformers peft
   ```

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

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

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

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

1. 如需在瀏覽器中使用聊天泡泡的更易於示範的 Web UI，請安裝 Gradio 並執行 Web 聊天工具：

   ```
   pip install gradio
   python3 inference/gradio_chat.py --adapter-path {{/path/to/downloaded/my-adapter}}
   ```

如需這兩種工具和使用 PEFT 以程式設計方式載入轉接器的詳細資訊，請參閱 GitHub 網站上的[推論工具 README](https://github.com/aws-deadline/deadline-cloud-samples/tree/mainline/job_bundles/hf_finetune_lora/inference)。

## 提示
<a name="tutorial-hf-lora-tips"></a>
+ **損失應該會單調降低** – 如果沒有，請降低學習率 （嘗試 `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`預設，套件會使用 ，其會駐留在工作者的持久性磁碟區上。快取會保留跨任務的基本模型，因此後續執行速度會更快。

## 清除
<a name="tutorial-hf-lora-cleanup"></a>

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

**清除教學課程資源**

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

1. 如果您已將`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
   ```

1. 如果您不再需要本機輸出檔案，請將其移除。

## 相關資源
<a name="tutorial-hf-lora-related"></a>

下列資源涵蓋 GitHub 網站、Hugging Face 網站和 arXiv 網站上的範例套件、其使用的程式庫和 LoRA 方法本身：
+ [範例原始程式碼](https://github.com/aws-deadline/deadline-cloud-samples/tree/mainline/job_bundles/hf_finetune_lora)
+ [Hugging Face PEFT 文件](https://huggingface.co/docs/peft)
+ [QLoRA 論文 (Dettmers et al.， 2023)](https://arxiv.org/abs/2305.14314)
+ [LoRA 論文 (Hu et al.， 2021)](https://arxiv.org/abs/2106.09685)
+ [使用 vLLM 和 lm-evaluation-harness 為 LLMs 建立基準](tutorial-vllm-leaderboard.md)
+ [FLUX.2 Klein LoRA 微調和產生影像](flux2-klein-lora.md)