「.NET 開発基盤部会 Wiki」は、「Open棟梁Project」,「OSSコンソーシアム .NET開発基盤部会」によって運営されています。
目次 †
概要 †
LLMのファイン・チューニング(FT)は既存LLMを特定の用途や業界向けに最適化するための手法
- ここでは、SaaS形式のLLMサービスのFTではなく、
- 主に、ローカルにダウンロードしたLLMのFTと、その取り回し方法について言及する。
- コレは、モデルのリリースに伴う事前学習とタスクへ適応させるためのFT(GPT-n、BERT)ではなく、
- 作成後のLLMの精度を上げるために行われる追加学習(フル・ファインチューニング)や、転移学習(ReFT、PEFT、LoRA)に近い。
基本概念 †
- 一般的なLLMが持つ汎用的な知識を特定の専門分野や業務プロセスに特化させるために追加の学習。
- これにより、より正確で一貫性のある回答が可能になる。
適用場面 †
FTは、以下のような場面で活用される。
場面 | 使途 |
カスタマーサポート | 自社独自のFAQや業界特有の表現に適応させる。 |
医療や法律分野 | 専門用語や規制対応の正確な知識を学習させる。 |
文書生成や翻訳 | 高精度な自然言語処理を必要とする場面。 |
手法の種類 †
主に以下の手法がある。
分類 | 種類 | 解説 |
フル・ファインチューニング | 全体調整型 | LLM全体を再学習させる方法。高いカスタマイズ性があるが、学習に大量のデータと計算リソースが必要。 |
軽量ファイン・チューニング | 表現調整型・パラメタ効率型 | 一部のパラメタや特定の層に限定して調整を加える方法。計算コストを抑えつつ高いカスタマイズ性を維持。 |
トレードオフ †
メリット †
- 精度向上: 特定の用途に特化したモデルを構築できる。
- カスタマイズ性: 企業独自のデータやノウハウを学習させることで、ブランド固有の表現や業界標準に沿った応答が可能。
デメリット †
- コスト: 高性能なGPUやクラウド環境が必要で、運用コストが増加。
- データ量: 大量の学習データが求められ、データ収集・整理の負担が発生。
技法 †
全体調整型 †
- モデル全体のパラメータを調整する手法。
- データセット全体を使ってモデルを再学習させる。
Full Fine-Tuning †
モデルの全パラメタを特定のタスクやドメインに合わせて調整するプロセス
- 一般的に通常のFTの様に元のモデルに対して層(パラメタ)の追加を行わない。
- 全体のパラメタを調整することで、特定のタスクに対して高い精度を達成できるが、 大量の計算資源が必要となる。
部分調整型 †
PEFT:Parameter-Efficient Fine-Tuning
- モデルの部分(埋め込み層、隠れ層、アテンション機構など既存パラメタの一部)を調整する手法
- 既存のデータセットを使ったモデルの精度向上が目的で、新しい事実を覚えさせることには向いていない。
ReFT †
- ReFT:Representation Fine-Tuning
- モデルの内部表現(≒埋め込み層)を微調整する。
- 特定のタスクに対する性能を向上させることを目的とする。
- 手法
- 初期段階: モデルは通常の教師あり学習(SFT)でウォームアップ
- 強化学習: その後、オンライン強化学習(例えばPPO)を使用してモデルをさらに微調整。
- 結果
- 質問に対して複数の推論パスが自動的にサンプリングされ、真の答えから自然に報酬が得られる。
- 方策(埋め込みモデルの部分)を最適化する強化学習を採用し、回答精度を上げることができる。
Reward Fine-Tuning †
モデルの内部(≒埋め込み層、隠れ層、アテンション機構)を報酬を使って微調整する。
- モデルの出力を評価し、そのフィードバックを基に行う強化学習。
- これにより、モデルは高品質な出力を生成するように学習する。
パラメタ効率型 †
- モデルの一部のパラメタのみを調整
- 低ランク適応層を追加:LoRAやQLoRA
- 特定の層を調整:AdapterやPrefix Tuning
- バイアス・パラメタのみを調整:BitFit?
LoRA †
LoRA:Low-Rank Adaptation(低ランク適応)
- 主に大規模な機械学習モデル(特にLLMや画像生成モデル)に対して、追加の知識やスタイルを効率的に学習させる技術
- 通常のFTの様に出力層側に層を追加するのではなく、スキップ接続された線形結合層を追加しそこだけ転移学習する。
- 線形結合層は「低ランク近似行列」は元来の行列を二つの小さな行列の積として近似するものでココでは入出力がX次元である場合、XX行列とせず、Xr行列 * rX行列(rは低ランクの次元)とする。
- 具体的には、W_new = W_old + W_b W_a とした場合、W_b W_a がそれぞれ低ランクの行列で、W_b のサイズが (X, r) で W_a のサイズが (r, X) となり、パラメタ数を削減できる。
- 効率性:少ないデータで高い性能を達成できる。
- 柔軟性:既存のモデルを様々なタスクに適応させやすい。
- 計算資源の節約
- モデル全体を再学習する必要がないため、計算コストが低い。
- LLM/SLMに適用する際、LLMの方が学習コストが大きい理由は順/逆伝播のコストが高いため
- 得意なケース
「既存の知識の補強」の目的で使う事に適している。
- 特定のドメインに適応させる。
- 新しい言葉や概念を学習させる。
- 特定の文章スタイルやキャラクターの言い回し。
- 不得意なケース
- 完全に未知の知識をゼロから学習する。
- 長大なデータを一度に追加する。
- 補足
- HuggingFace?のPEFT(Parameter-Efficient Fine-Tuning)ライブラリで簡単に試すことができる。
- 言語モデルだけでなく、画像生成モデル(例:StableDiffusion?)にも適用されている。
- LoRAの適用(ベース・モデルにLoRAを組み込んで学習)
- ファイン・チューニング(追加の知識やスタイルを反映)
- モデルの評価・テスト(意図した知識やスタイルが反映されているか確認)
QLoRA †
QLoRA:Quantized Low-Rank Adaptation
- QLoRAはLoRAのアップグレード版で、量子化手法を取り入れ、さらにメモリ効率を高めている。
- 新しいデータ型「4-bit NormalFloat?(NF4)」を導入し、メモリ効率、計算速度をも改善。
※ 余談だが、
- Hugging Faceなどでリリースされている同シリーズ&バージョンのサイズ大/小のLLMは量子化/サイズの小さいモデルで学習させたものの両方がある。
- ちなみに、SLMは、量子化したものではなく、特定のタスクに特化して効率的に動作するように設計されたサイズの小さいモデルとのこと。
Adapter †
LoRA:Low-Rank Adaptationの「スキップ接続された線形結合層」(Adapter)を追加(Adaptation)するような方法、全般。
Prefix Tuning †
- 入力の先頭に特別なprefixトークンを追加し、元のモデル本体のパラメタは固定
- prefixトークンに対応する少量の追加パラメタのみ学習させる(同様に転移学習的)。
- タスク毎に異なるprefixベクトルを付加することで効率的に適応させることができる。
- Faster Transformerなどの実装に対応している(追加パラメタに効率的に対応する機構を持っているらしい)
- LoRAと比較して「学習コストは低い」が「新しい事実を覚えさせるのは苦手」とのこと。
- 「この後は医療系の話をします:」のような前置きを付けるイメージ
- ただし、これだけの説明だとPrompt Tuning的、
Prompt Tuningとの違いは、各層のアクティベーション系列のPrefixが学習プロセスを通じて最適化される点。
- 追加トークンの位置: Prompt Tuningは入力系列の先頭に追加トークンを付加するのに対し、Prefix Tuningは各層の入力に追加トークンを付加。
- 追加パラメタの学習: Prefix Tuningは各層にPrefixに対応した学習可能なパラメタを付加し、さらにPrefix付のアクティベーション系列を生成する。
BitFit? †
BitFit?:Bias-only fine-tuning
- 重み(weight)パラメタは固定し、バイアス(bias)項のみ微調整する非常に軽量なファインチューニング技法
- 特徴
- バイアス(bias)項のみの微調整なので学習が高速でメモリ消費も少ない。
- テキスト分類などのタスクにおいては、フルファインチューニングに匹敵する性能を示すこともある。
- 特別なレイヤ追加や新しい訓練戦略は不要で、既存のモデルのオリジナル性を維持しながら、簡単に調整可能。
指示・強化学習型 †
Instruction Tuning †
指示に基づいてモデルを調整する教師あり学習(Supervised Fine-Tuning, SFT)
- モデルに「明示的な指示(instruction)」を与えて、それに従った応答を生成させるように学習させる手法。
- 例:指示「以下のテキストを要約してください」「○○について説明してください」と結果「望ましい応答」を学習データとして与える。
RLHF †
RLHF:Reinforcement Learning from Human Feedback
- 人間の好みに基づいてモデルの応答を調整する強化学習ベースのアプローチ
- 「どちらの応答が望ましいか」という人間の評価のフィードバックを元に学習を行い改善する。
- 報酬モデルを用いて、LLMを人間の好みに合うように方策最適化する強化学習。
実地 †
構築 †
アウトライン †
- GPU付きVMの準備
- 使用可能なVMサイズを表示
- VMサイズを使用してCreateVM
- インストレーション
- NVIDIAドライバ
- CUDAツールキット
- cuDNN(任意だが推奨)
実際の手順 †
- 以下は、上記リンクを参考に、
Standard_NV36ads_A10_v5、CUDA Toolkit 11.3 の環境を構築
- {japaneast}が確認できたので、料金計算ツールでも再確認する。
すると{eastasia}の方が安かったので、必要に応じて変更しても良いかも。
- Ubuntuの基本的な構成
以下、差異のメモ
・Authentication is required to create a color managed device. 問題
・一先ずログイン中のsudo権限のある自分のユーザーアカウントのパスワードを入力すればOK。
- NVIDIAドライバのインストール
以下、差異のメモ
・「sudo apt install -y nvidia-driver-575」でエラーになった
・libssl1.1をインストールするのではなく「sudo apt install nvidia-driver-535」でインストール
実装 †
アウトライン †
- 何処のサイトを見れば新規から組み立てられるのか不明。
- と言うのも、以下のように、環境のバージョンを上げるとすぐ動かなくなるため。
以下のような問題があり、先ずは上手く動作しなかった。
(暫くは実績のある環境&コードで実行、環境を合わせるのに苦労する)。
- ハードウェア:学習資源の準備とCUDA等の環境構築
- ソフトウェア:モデルやライブラリのバージョンの不一致
- コンフィグレーション系のI/F変更
- データ系のフォーマット変更
- 構造・形式
- 使用するモデルの構造差異でtarget_modulesが異なる。
- データの正確な形式のDatasetやTokenizer処理が不可欠
- 訓練条件(低リソース環境・量子化)との不整合、
- 4bit/8bit量子化(bnb_config)を使うときは、特定のモデルでしか動作しなかったり
- LoRA適用時に特別な設定(例:device_map="auto", gradient_checkpointing=True)が必要だったり
- 実験コードがプロダクションレベルでない
- GitHubで共有されるコードは、個人の実験コードであることが多く、エラー処理や汎用性がなく、前提条件を明記していない場合がある。
- ブラックボックスの抽象化レイヤーが多過ぎてエラーメッセージが「根本原因」を教えない(バージョン不一致だがバージョンの明記はない)。
- ライブラリのエラーメッセージをベースにトラブルシュートしようとしても対応が難しい。下位スタックの情報だけを返すことが多いため。
運用 †
アウトライン †
- ファインチューニングしたLoRAモデルをマージ
from peft import PeftModel
base_model = AutoModelForCausalLM.from_pretrained("meta-llama/Llama-2-7b-hf", device_map="auto")
model = PeftModel.from_pretrained(base_model, "path/to/lora_adapter")
merged_model = model.merge_and_unload()
merged_model.save_pretrained("merged_model")
tokenizer.save_pretrained("merged_model")
- 変換処理に使用するllama.cppの準備
- llama.cppを取得&ビルド
- Pythonラッパーのパッケージをインストール
- 変換処理を実行する。
- BFloat16のGGUF形式モデルに変換:convert_hf_to_gguf.py
- Q4_K_Mで量子化:llama-quantize(CLIっぽい)
- ファインチューニングしたLoRAモデルをOllamaで実行
- ビルドしたモデルを実行
ollama run my-llama2-qa
実際のスクリプト †
参考 †
LoRA †
環境 †
実装 †
phi3 †
Llama2-3 †
その他 †
運用 †
モデル取り回し †