LLama-Factoryを使用してLLama3をトレーニングおよびファインチューニングする
この記事では、2024年3月21日にリリースされるラマファクトリーについて探求し、クラウドGPU上でLlama 3を微調整する方法を学びます。私たちのタスクでは、さまざまなワークステーションセットアップへのシームレスな統合を可能にする、最も強力なシングルスロットGPUの1つと見なされるNVIDIA A4000 GPUを使用します。
NVIDIA Ampereアーキテクチャを活用したRTX A4000は、48の第2世代RTコア、192の第3世代テンソルコア、6,144のCUDAコアを統合し、エラー訂正コード(ECC)付きの16GBのグラフィックスメモリを備えています。これにより、革新的なプロジェクトのための正確で信頼性の高い計算が保証されます。
最近まで、大規模言語モデルのファインチューニングは、主に機械学習や人工知能の専門家のための複雑な作業でした。しかし、この考え方は人工知能の急速に進化する分野の中で急速に変化しています。Llama Factoryのような新しいツールが登場し、ファインチューニングプロセスがよりアクセスしやすく効率的になっています。また、DPO、ORPO、PPO、SFTなどの技術を使用してファインチューニングやモデル最適化ができるようになりました。さらに、Llama、Mistral、Falconなどのモデルを効率的に訓練・ファインチューニングすることができるようになりました。
前提条件
これは、デモを通じてLLaMA 3モデルのファインチューニングプロセスを詳述した中級レベルのチュートリアルです。続行する前に、すべての読者が生成型事前学習トランスフォーマーの一般的な機能について理解していることをお勧めします。
デモを実行するには、十分に強力なNVIDIA GPUが必要です。H100の使用を推奨します。
モデルのファインチューニングとは何ですか?
モデルのファインチューニングとは、特定のタスクやデータセットに使用できる事前に学習されたベースモデルのパラメータを調整することであり、その性能と精度を向上させます。このプロセスでは、新しいデータをモデルに提供し、損失やコストを最小化するために、その重み、バイアス、および特定のパラメータを変更します。これにより、この新しいモデルは、最初から始めることなく、新しいタスクやデータセットで良好に機能することができ、時間とリソースを節約するのに役立ちます。
通常、新しい大規模言語モデル(LLM)が作成されると、それは大規模なテキストデータのコーパスで訓練されます。その中には潜在的に有害または毒性のあるコンテンツが含まれることがあります。事前訓練または初期訓練のフェーズの後、モデルは安全対策で微調整され、有害または毒性のある応答を生成しないようにします。しかし、このアプローチは改善の余地があります。それでも、微調整の概念は、モデルを特定の要件に適応させる必要性に対応しています。
なぜLLama-Factoryを使用するのですか?
Llama Factoryに入ると、100以上のモデルの効率的かつコスト効果の高いファインチューニングを実現するツールです。Llama Factoryはモデルのファインチューニングプロセスを簡素化し、アクセスしやすく使いやすいものにしています。また、Hiyougaによって提供されるハギングフェイススペースを利用して、モデルをファインチューニングすることもできます。
このスペースは、GPUの使用量を減らすためにLoraとGaLoreの設定もサポートしています。簡単なスライダーで、ユーザーはドロップアウト、エポック、バッチサイズなどのパラメータを簡単に変更できます。また、モデルを微調整するために選択できる複数のデータセットオプションも用意されています。この記事で説明されているように、Llama Factoryは、異なるバージョンのLlama、Mistral、Falconを含む多くのモデルをサポートしています。また、フラッシュアテンション、位置エンコーディング、スケーリングなどさまざまな機能を提供するGalore、BadM、Loraなどの高度なアルゴリズムもサポートしています。
さらに、TensorBoard、VanDB、MLflowのようなモニタリングツールを統合することができます。高速な推論のためにGradioやCLIを利用することもできます。要するに、Llama Factoryはモデルの性能を向上させ、微調整プロセスを合理化するための多様なオプションを提供しています。
LLaMAボード:LLaMAファクトリーのための統一インターフェース
LLaMAボードは、コーディングを知らなくても人々が言語モデル(LLM)のパフォーマンスを調整し改善するのを助けるユーザーフレンドリーなツールです。それは、言語モデルが情報を学び処理する方法を簡単にカスタマイズできるダッシュボードのようなものです。
ここにいくつかの重要な特徴があります:
- 簡単なカスタマイズ: ウェブページの設定を調整することで、モデルの学習方法を変更することができます。デフォルトの設定はほとんどの状況でうまく機能します。また、開始する前に、あなたのデータがモデルにどのように見えるかを確認することもできます。
- 進捗の監視: モデルが学習するにつれて、どれだけうまくいっているかを示す更新やグラフを見ることができます。これにより、改善しているかどうかを理解するのに役立ちます。
- 柔軟なテスト: モデルがテキストをどれだけ理解しているかを、既知の回答と比較したり、自分自身で会話をすることで確認できます。これにより、モデルが言語理解が向上しているかどうかを確認することができます。
- 異なる言語へのサポート: LLaMAボードは英語、ロシア語、中国語で動作することができ、異なる言語を話す人々にとって便利です。将来的にはさらに多くの言語を追加することも可能です。
LLama 3を微調整する
プラットフォームにログインして、お好きなGPUを選択し、ノートブックを開始しましょう。ノートブックを開始するために、記事内のリンクをクリックすることもできます。
私たちはリポジトリをクローンし、必要なライブラリをインストールすることから始めます。
!git clone https://github.com/hiyouga/LLaMA-Factory.git
%cd LLaMA-Factory
%ls
次に、モデルを効率的にファインチューニングするためのunslothをインストールします。さらに、xformersとbitsandbytesもインストールします。
install necessary packages
!pip install "unsloth[colab-new] @ git+https://github.com/unslothai/unsloth.git"
!pip install --no-deps xformers==0.0.25
!pip install .[bitsandbytes]
!pip install 'urllib3<2'
すべてがインストールされたら、GPUの仕様を確認します。
!nvidia-smi
次に、torchをインポートしてCUDAを確認します。なぜなら私たちはGPUを使用しているからです。
import torch
try:
assert torch.cuda.is_available() is True
except AssertionError:
print("Your GPU is not setup!")
今から、クローンしたGitHubリポジトリに付属するデータセットをインポートします。また、カスタムデータセットを作成し、それを使用することもできます。
import json
%cd /notebooks/LLaMA-Factory
MODEL_NAME = "Llama-3"
with open("/notebooks/LLaMA-Factory/data/identity.json", "r", encoding="utf-8") as f:
dataset = json.load(f)
for sample in dataset:
sample["output"] = sample["output"].replace("MODEL_NAME", MODEL_NAME).replace("AUTHOR", "LLaMA Factory")
with open("/notebooks/LLaMA-Factory/data/identity.json", "w", encoding="utf-8") as f:
json.dump(dataset, f, indent=2, ensure_ascii=False)
これが完了次第、Llama Factory用のGradioウェブアプリリンクを生成するために、以下のコードを実行します。
#generates the web app link
%cd /notebooks/LLaMA-Factory
!GRADIO_SHARE=1 llamafactory-cli webui
生成されたパブリックリンクをクリックすると、GUIに進むことができます。
モデル選択
- 任意のモデルを選択できますが、ここでは8億パラメータを持つLlama 3を選びます。
アダプターの設定
- アダプターのパスを指定するオプションがあります。
- 利用可能なアダプターには、LoRa、QLoRa、フリーズ、またはフルがあります。
- 必要に応じてアダプターリストを更新できます。
-
トレーニングオプション
- モデルは教師ありファインチューニングを使用して訓練できます。
- あるいは、該当する場合はDPU(データ処理ユニット)またはPPU(並列処理ユニット)を選択することもできます。
データセットの選択
- 選択されたデータセットは、教師ありファインチューニング(SFT)用です。
- 自分自身のデータセットを選択することもできます。
ハイパーパラメータ設定
- エポック数、最大ノルム、最大サンプルサイズなどのハイパーパラメータを調整できます。
ローラ構成
- LoRaモデルの詳細な設定オプションが利用可能です。
トレーニングを開始する
- すべての設定が完了したら、「開始」ボタンをクリックしてトレーニングプロセスを開始できます。
これがトレーニングを開始します。
私たちはCLIコマンドを使用してトレーニングとファインチューニングも開始します。パラメータを指定するために以下のコードを使用できます。
args = dict(
stage="sft", # Specifies the stage of training. Here, it's set to "sft" for supervised fine-tuning
do_train=True,
model_name_or_path="unsloth/llama-3-8b-Instruct-bnb-4bit", # use bnb-4bit-quantized Llama-3-8B-Instruct model
dataset="identity,alpaca_gpt4_en", # use the alpaca and identity datasets
template="llama3", # use llama3 for prompt template
finetuning_type="lora", # use the LoRA adapters which saves up memory
lora_target="all", # attach LoRA adapters to all linear layers
output_dir="llama3_lora", # path to save LoRA adapters
per_device_train_batch_size=2, # specify the batch size
gradient_accumulation_steps=4, # the gradient accumulation steps
lr_scheduler_type="cosine", # use the learning rate as cosine learning rate scheduler
logging_steps=10, # log every 10 steps
warmup_ratio=0.1, # use warmup scheduler
save_steps=1000, # save checkpoint every 1000 steps
learning_rate=5e-5, # the learning rate
num_train_epochs=3.0, # the epochs of training
max_samples=500, # use 500 examples in each dataset
max_grad_norm=1.0, # clip gradient norm to 1.0
quantization_bit=4, # use 4-bit QLoRA
loraplus_lr_ratio=16.0, # use LoRA+ with lambda=16.0
use_unsloth=True, # use UnslothAI's LoRA optimization for 2x faster training
fp16=True, # use float16 mixed precision training
)
json.dump(args, open("train_llama3.json", "w", encoding="utf-8"), indent=2)
次に、ターミナルを開いて以下のコマンドを実行します。
!llamafactory-cli train train_llama3.json
これがトレーニングプロセスを開始します。
モデルのトレーニングが完了したら、モデルを使用して推論を行うことができます。それを試してみて、モデルがどのように機能するかを確認しましょう。
args = dict(
model_name_or_path="unsloth/llama-3-8b-Instruct-bnb-4bit", # Specifies the name or path of the pre-trained model to be used for inference. In this case, it's set to "unsloth/llama-3-8b-Instruct-bnb-4bit".
#adapter_name_or_path="llama3_lora", # load the saved LoRA adapters
finetuning_type="lora", # Specifies the type of fine-tuning. Here, it's set to "lora" for LoRA adapters.
template="llama3", # Specifies the prompt template to be used for inference. Here, it's set to "llama3"
quantization_bit=4, # Specifies the number of bits for quantization. In this case, it's set to 4
use_unsloth=True, # use UnslothAI's LoRA optimization for 2x faster generation
)
json.dump(args, open("infer_llama3.json", "w", encoding="utf-8"), indent=2)
ここでは、保存されたアダプターでモデルを定義し、チャットテンプレートを選択し、ユーザーとアシスタントのインタラクションを指定します。
次に、ターミナルを使用して以下のコードを実行してください。
!llamafactory-cli chat infer_llama3.json
私たちはユーザーに、どのモデルでもLlama-Factoryを試し、パラメータを実験することをお勧めします。
結論
効果的なファインチューニングは、大規模言語モデル(LLM)が特定のタスクに適応するための必要不可欠な要素となっています。しかし、それには一定の労力が必要であり、時には非常に挑戦的です。LLama-Factoryの導入により、ユーザーは高度な効率的トレーニング技術を統合した包括的なフレームワークを利用でき、コーディングの必要なく100以上のLLMのファインチューニングを簡単にカスタマイズできます。
多くの人々が現在、巨大言語モデル(LLM)についてより好奇心を持ち、LLama-Factoryに引き寄せられる傾向があります。これはオープンソースコミュニティの成長と活性化に寄与しています。LLama-Factoryは有名になり、効率的にLLMを微調整するための主要なツールとしてAwesome Transformers3でも取り上げられています。
この記事が、より多くの開発者がこのフレームワークを使用して社会に利益をもたらすLLMを作成することを促すことを願っています。LLama-Factoryを使用してLLMをファインチューニングする際には、モデルのライセンスのルールに従うことが重要であることを忘れないでください。
これでこの記事は終わりです。最近では、モデルを数分で微調整することがどれほど簡単であるかを見ました。また、Hugging FaceのCLIを使用して、このモデルをHugging Faceハブにプッシュすることもできます。
参考文献
- LLAMAFACTORY: 100以上の言語モデルの統一的効率的ファインチューニング
- Github LLaMA-Factory



