LLAMA-3.1を効率的にファインチューンする Unsloth: データ、速度、コストを最適化する

LLAMA-3.1モデルをUnslothの効率的なファインチューニング手法で最適化しましょう。LoRAとQLoRAを活用して、より速い学習、低VRAMの要件、そして改善されたモデルパフォーマンスを実現する方法を学びます。ハイパーパラメーターがファインチューニングしたモデルに与える影響を探ります。UnslothのチャットUIを使えば、カスタムLLMとの滑らかなインタラクションが可能です。

2025年2月16日

party-gif

LLAMA-3.1の微調整の力を解き放ちましょう。これは、特定のニーズに言語モデルを適応させる最も簡単な方法です。Unslothの最先端テクニック、LoRAやQLoRAを使って、最小のGPUリソースで驚くべき結果を得る方法を発見してください。このブログ記事では、データの可能性を最大限に引き出し、ユニークな要件を満たす、カスタマイズされた言語モデルを作成するための、ステップバイステップのガイドをご紹介します。

トレーニングの異なる段階: 事前トレーニング、教師あり微調整、および好みの調整

大規模言語モデルの訓練には通常3つの段階があります:

  1. 事前訓練: この段階では、モデルが大量のテキストデータを使って次のトークンや単語を予測する方法を学習します。その結果、モデルは一般的な知識を獲得しますが、特定のタスクには未だ適していません。

  2. 教師あり微調整: 基本モデルをより有用なものにするために、2つ目の段階では教師あり微調整を行います。ここでは、質問-回答ペアや命令-回答ペアを使ってモデルを訓練し、タスク固有の知識と機能を学習させます。

  3. 嗜好アライメント: オプションの3つ目の段階は嗜好アライメントで、ユーザーの好みに合わせてモデルの出力を調整したり、特定の原則に沿うようにモデルを訓練します。これには強化学習やDebate Policy Optimizationなどの手法が使われます。

このビデオでは、教師あり微調整の段階、特にUnslothライブラリを使ってLlama 3.1モデルを微調整する方法に焦点を当てます。全体微調整、LoRA、QLoRAなどの手法とその性能とメモリ要件のトレードオフについて説明します。

教師あり微調整手法: 完全微調整、LoRA、およびQLoRA

教師あり微調整には3つの主要なオプションがあります:

  1. 全体微調整: 元のモデルの重みを命令微調整データセットで更新する方法です。最高の性能が得られますが、VRAM要件が高くなります。

  2. LoRA (Low-Rank Adaptation): 重みを直接更新する代わりに、モデルに外部アダプターを追加します。これらアダプターのパラメータ数はコントロールできます。アダプターの重み更新は16ビット精度で行い、元のモデル重みに統合します。高速な訓練が可能ですが、16ビット演算のコストがかかります。

  3. QLoRA (Quantized LoRA): LoRAに似ていますが、重み更新を4ビット精度で行い、モデル重みも4ビットで保持します。VRAMが少なくて済みますが、LoRAや全体微調整ほどの性能は得られない可能性があります。

UnslothはLoRAとQLoRAの両方の微調整をサポートしています。LoRAアダプターの階層数、LoRAアルファ、LoRAドロップアウトは、パラメータ数と最終モデル重みへの寄与を制御する重要なハイパーパラメーターです。

LoRA採用者の設定: ランク、LoRA Alpha、およびLoRA Dropout

LoRAアダプターを設定する際の主なパラメーターは以下の通りです:

  1. 階層数: LoRAアダプターの階層数は、微調整中に更新されるパラメータ数を制御します。階層数が低いと少ないパラメータで済むため、VRAM要件が減りますが、モデルの適応性も制限されます。一方、階層数を高くすると柔軟性は増しますが、VRAMも多く必要になります。

  2. LoRAアルファ: このパラメーターは、LoRAアダプターが最終モデル重みに与える影響度を制御します。LoRAアルファが高いほど、アダプターの影響が強くなります。

  3. LoRAドロップアウト: 訓練時にLoRAアダプターに適用されるドロップアウト率を制御します。ドロップアウト率を上げると過学習を防げますが、モデルの性能も低下する可能性があります。

これらのパラメーターを調整することで、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トレーナーによるモデルのトレーニング

モデルの訓練には、Hugging Faceが開発・メンテナンスしているTRLパッケージのSFT (Supervised Fine-Tuning) Trainerを使用します。

まず、モデル、トークナイザー、データセットをSFT Trainerに渡します。この場合、プロンプトテンプレートで使用する'text'列からデータを使用します。

また、最大シーケンス長も設定します。これは、トレーニングデータの例に基づいて決める必要があります。シーケンス長が長いほど、VRAM要件が高くなります。

その後、デバイス (この場合はGoogle ColabのT4 GPUで約15GBのVRAM) や訓練ステップ数などの訓練引数を設定します。

最後に、トレーナーを実行すると、損失の減少を観察できます。これは訓練の進捗を示す良い指標です。

訓練には約8分かかり、ピーク時のメモリ使用量は約8GBで、T4 GPUの利用可能VRAMの約53%でした。これは、Unslothアプローチの効率性を示しています。

推論とストリーミング

推論には、FastLanguageModelクラスのfor_inferenceクラスやメソッドを使用します。訓練済みモデルとAlpacaフォーマットの入力プロンプトを提供する必要があります。生成する最大トークン数も設定できます。

# 推論の実行
input_prompt = alpaca_prompt(instruction, input)
output = model.for_inference(input_prompt, max_new_tokens=256)
print(output)

ストリーミングを有効にするには、Streamerオブジェクトを作成し、for_inferenceメソッドに渡します。これにより、レスポンスがトークンごとに表示されます。

# ストリーミングの有効化
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の優れた機能の1つに、モデルを16ビット浮動小数点精度のVLLMや、LamaCPPのGGUF形式で保存できることがあります。これにより、様々なプラットフォームやフレームワークへの簡単な展開が可能になります。

Unslothはまた、Gradioベースの新しいUIを導入しており、Unslothで訓練したモデルを実行し、対話型のチャットセッションを行うことができます。Unsloth Studioリポジトリをクローンし、提供されているColabノートブックを実行すれば、この機能を体験できます。

Unslothの新しいチャットUI

Unslothは、Radishライブラリに基づく新しいチャットUIを導入しました。これにより、Unslothで訓練したモデルとの対話が簡単になります。このチャットUIは、モデルとのチャットや機能の探索を行うためのユーザーフレンドリーなインターフェイスを提供します。

チャットUIを使うには、Unsloth Studioリポジトリをクローンし、提供されているGoogle Colabノートブックを実行します。これにより、必要な環境が設定され、チャットUIが起動します。そこでモデルと会話を始めることができます。

チャットUIはストリーミングレスポンスに対応しており、モデルの出力を生成過程で表示できます。これにより、モデルの思考プロセスや応答の生成方法を観察できます。

さらに、UnslothのチャットUIでは、微調整したモデルの保存と読み込みが簡単にできます。VLLM用の16ビット浮動小数点精度やLamaCPP用のGGUF形式など、様々な形式でモデルをエクスポートすることもできます。

全体として、Unslothの新しいチャットUIは、Unslothフレームワークで訓練したモデルと対話し、その機能を探索するための便利なツールです。

FAQ