

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# 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)を Deadline Cloud ファームの GPU フリートに送信します。

LoRA は、モデルのすべての重みを更新する代わりに、固定されたベースモデルの上に小さなアダプターをトレーニングします。QLoRA は、ベースモデルを 4 ビット量子化された形式で保持しながら同じことを行います。これにより、必要な GPU メモリが約 2 倍になり、より大きなモデルを小さな GPUs。

このバンドルでは、[Hugging Face トランスフォーマーライブラリ](https://github.com/huggingface/transformers)、[PEFT パラメータ効率の高いファインチューニングライブラリ](https://github.com/huggingface/peft)、[ビットサンドバイト量子化ライブラリ](https://github.com/TimDettmers/bitsandbytes)を使用して、パラメータ効率の高いファインチューニングを実行します。出力は小さな LoRA アダプター (約 50～200 MB) です。ベースモデルの上にロードして、モデルの動作を変更します。これを使用して、モデルに記述スタイル、ドメインの専門知識、特定の出力形式、または独自の知識をトレーニングします。

**推定時間:** セットアップを含めて約 1 時間。1B～70 億モデルのほとんどの LoRA ファインチューニングは、5～30 分間のトレーニングで完了します。

このチュートリアルを実行すると、ジョブを処理する GPU ワーカーインスタンスに対して料金が発生します。

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

ワークフローには 4 つのステージがあります。JSONL データセットを準備し、Deadline Cloud ジョブを送信して、GPU ワーカーがデータセットをダウンロードして QLoRA ファインチューニングを実行し、アダプターを でダウンロードして`deadline job download-output`、アダプターをローカル推論のベースモデルと組み合わせます。

このチュートリアルを完了するには、次の手順に従います。

1. 「前提条件」を完了します。

1. ファームをセットアップします。

1. データセットを準備します。

1. データセットバケットへのアクセスをキューロールに付与します (S3 データセットのみ）。

1. ファインチューニングジョブを送信します。

1. トレーニング済みのアダプターをダウンロードして使用します。

1. リソースをクリーンアップします。

## 前提条件
<a name="tutorial-hf-lora-prerequisites"></a>

開始するには、以下が必要です。
+ [GitHub に Deadline Cloud CLI](https://github.com/aws-deadline/deadline-cloud) がインストールされました。
+ JSONL 形式のデータセット。ローカルフォルダにあるか、キューロールが読み取ることができる Amazon S3 バケットにアップロードされます。
+ (オプション) Hugging Face トークン。ゲート付きモデル (Llama や Gemma など) でバンドルを再ポイントする場合にのみ必要です。ドロップダウン内のすべてのモデルはパブリックです。

## ファームをセットアップする
<a name="tutorial-hf-lora-setup"></a>

GPU 対応キューを備えた Deadline Cloud ファーム (Linux フリート、16 GB 以上のビデオ RAM (VRAM) を備えた NVIDIA GPU) が必要です。

次の表に、モデルサイズ別のフリートレコメンデーションを示します。QLoRA はフル LoRA と比較してメモリ要件を半分にし、バンドルのデフォルトは 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` (4X A10G 24 GB)、 `g6.12xlarge` (4X L4 24 GB) | 

**注記**  
最後の行のマルチ GPU インスタンスは、48 24-GB GB GPU を提供します。 GPUs バンドルのトレーニングスクリプトは、Hugging Face `device_map="auto"`設定でモデルをロードし、インスタンスの GPUs。48 GB の VRAM を持つ単一の GPU の場合は、`g6e`インスタンス (L40S) を使用します。

## データセットを準備する
<a name="tutorial-hf-lora-dataset"></a>

データセットは JSONL ファイルで、各行は 2 つのテキストフィールドを持つ 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."}
```

バンドルは 2 つの形式でデータを受け入れます。
+ **ローカルフォルダ (デフォルト)** – `DatasetPath`パラメータは、1 つ以上の`.jsonl`ファイルのローカルフォルダを指します。Deadline Cloud ジョブアタッチメントはフォルダを自動的にアップロードし、ジョブはサブフォルダを含むフォルダ内の複数のファイルを連結します。デフォルト値はバンドル自体の`sample_data/`フォルダであるため、すべてのデフォルトを使用して を送信すると、含まれるサンプルデータ (Saffron スタックという架空のレストランの例) がトレーニングされます。
+ **Amazon S3 URI (オプションオーバーライド)** – `DatasetS3Uri`パラメータを設定すると、バンドルは Amazon S3 を無視`DatasetPath`し、Amazon S3 からダウンロードします。などの 1 つのファイル`s3://bucket/path/train.jsonl`、またはその下のすべての`.jsonl`ファイルを連結`/`する で終わるプレフィックスを受け入れます。S3 モードでは、キューのセッションロールにデータセットに対する`s3:GetObject`アクセス許可が必要です。

データセット形式は、Hugging Face [の tatsu-lab/alpaca](https://huggingface.co/datasets/tatsu-lab/alpaca) データセットや、 `instruction` \+ `response`フィールド (セット ) を使用する Hugging Face [の databricks-dolly-15k データセットなど、多くの公開 Hugging Face](https://huggingface.co/datasets/databricks/databricks-dolly-15k) データセットと互換性があります`ResponseColumn=response`。

## データセットバケットへのアクセス権をキューロールに付与する
<a name="tutorial-hf-lora-iam"></a>

Deadline Cloud ワーカーは、キューのセッションロールでジョブを実行します。デフォルトでは、そのロールはキューのジョブアタッチメント 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 の 5 つのパブリックモデルのドロップダウンを提供します。リストにないモデルを微調整するには、バンドル`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 を提供します。

1. ブラウザにチャットバブルがあるデモフレンドリなウェブ UI については、Gradio をインストールしてウェブチャットツールを実行します。

   ```
   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`)。
+ **メモリプレッシャー** – 有効なバッチサイズを一定に保つ`GradAccumSteps`ために、低く `PerDeviceBatchSize` (1 または 2 を試して) 上げてください。
+ **スタイル転送とファクトの記憶は異なります** – スタイル転送は、多くの場合、3～5 個のエポックと約 50～200 個のサンプルで機能します。ファクトの記憶には、ファクトごとに 8～15 個のエポックとより多くのサンプルが必要です (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 のサンプルソースコード](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)
+ [LLMsを使用して LLM をベンチマークする lm-evaluation-harness](tutorial-vllm-leaderboard.md)
+ [FLUX.2" LoRA ファインチューニングとイメージ生成](flux2-klein-lora.md)