LLMのFT
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
開始行:
「[[.NET 開発基盤部会 Wiki>http://dotnetdevelopmentinfras...
-[[戻る>テキスト生成系(Transformer系)#j2f01d54]] > [[チ...
--[[LLMのPE]]
--[[LLMのRAG]]
--[[OSSのLLM]] > LLMのFT
---[[huggingface/transformers Trainer]]
---[[huggingface/trl SFTTrainer]]
--[[LLMエージェント]]
*目次 [#u4413184]
#contents
*概要 [#o6adc09b]
LLMのファイン・チューニング(FT)は既存LLMを特定の用途や...
-ここでは、SaaS形式のLLMサービスのFTではなく、主に、ロー...
-モデルのリリースに伴う事前学習とではなく、作成後のLLMの...
**基本概念 [#r833f951]
-一般的な事前学習済みのLLMが持つ汎用的な知識を特定の専門...
-これにより、対象のタスクへ適応させ、より正確で一貫性のあ...
**適用場面 [#mdae5ed6]
FTは、以下のような場面で活用される。
|場面|使途|h
|カスタマーサポート|自社独自のFAQや業界特有の表現に適応さ...
|医療や法律分野|専門用語や規制対応の正確な知識を学習させ...
|文書生成や翻訳|高精度な自然言語処理を必要とする場面。|
**トレードオフ [#oc8b04a2]
***メリット [#xe0713b9]
-精度向上~
特定の用途に特化したモデルを構築できる。
-カスタマイズ性~
企業独自のデータやノウハウを学習させることで、ブランド固...
***デメリット [#w03485e7]
-コスト~
高性能なGPUやクラウド環境が必要で、運用コストが増加。
-データ量~
大量の学習データが求められ、データ収集・整理の負担が発生。
**手法の種類 [#sd57dc5f]
主に以下の手法がある。
***全体・部分の分類 [#n7d28557]
-全体:[[Full Fine-Tuning>#b45c9886]]~
LLMのモデル全体のパラメタを再学習させる方法。高いカスタマ...
-部分:[[PEFT(Parameter-Efficient Fine-Tuning)>#t16de86...
一部のパラメタや特定の層に限定して調整を加える方法。計算...
***教師なし/あり学習、強化学習 [#fcd28885]
-教師なし学習:CLM(次単語予測)、MLM(マスク単語予測)は...
-教師あり学習:指示チューニング([[Instruction Tuning>#m5...
-強化学習:[[RLHF>#f617b1df]]は、[[Instruction Tuning>#m5...
**個々の説明 [#y575a9ad]
***Full Fine-Tuning [#b45c9886]
モデルの全パラメタを特定のタスクやドメインに合わせて調整...
-一般的に[[通常のFT>深層学習のテクニック#ea94272b]]の様に...
-全体のパラメタを調整することで、特定のタスクに対して高い...
***PEFT [#t16de86b]
PEFT:Parameter-Efficient Fine-Tuning
-モデルの部分(埋め込み層、隠れ層、アテンション機構など既...
-既存のデータセットを使ったモデルの精度向上が目的で、新し...
-[[LoRA, QLoRA, Adapter, Prefix Tuning, BitFit, ReFT>#o17...
***RLHF [#f617b1df]
RLHF:Reinforcement Learning from Human Feedback
-人間の好みに基づいてモデルの応答を調整する強化学習ベース...
-「どちらの応答が望ましいか」という人間の評価のフィードバ...
-報酬モデルを用いて、LLMを人間の好みに合うように方策最適...
-以下の3ステップから構成される。
--Supervised Fine-Tuning(SFT)~
人間のデモに基づいて初期モデルを強化する。
---[[Instruction Tuning>#m581916f]]で、ベースLLMを教師あ...
---「基本的に良い応答を出す」能力を得るが、まだ細かな好み...
--Reward Model(報酬モデル)の訓練~
どんな応答が「良い」のかを学習させる。
---人間が複数の応答候補に「好みの順位付け(ランキング)」...
---モデルにプロンプトを与え、複数の応答を生成 → 人間がど...
---このランキングデータを用いて、「良い応答には高い報酬を...
--[[Reward Fine-Tuning>#o361b6ee]](PPOなど)~
***Instruction Tuning [#m581916f]
指示に基づいてモデルを調整する教師あり学習(Supervised Fi...
-モデルに「明示的な指示(instruction)」を与えて、それに...
-例:指示「以下のテキストを要約してください」「○○について...
***Reward Fine-Tuning [#o361b6ee]
報酬モデルを使って、モデルを人間の好みに合わせて強化学習。
-報酬モデルを用いて、モデルの出力に対する「報酬」を計算。
-この報酬を最大化するように、主にPPOを使って言語モデルを...
-これにより、モデルは「人間が望むような応答」を出す傾向が...
*PEFT系 [#o17ec824]
**差分学習型(元の重みに対する差分を学習) [#u6b3648b]
***LoRA [#edcd5d87]
LoRA:Low-Rank Adaptation(低ランク適応)
-主に大規模な機械学習モデル(特にLLMや画像生成モデル)に...
-[[通常のFT>深層学習のテクニック#ea94272b]]の様に出力層側...
-線形結合層は「低ランク近似行列」は元来の行列を二つの小さ...
-具体的には、W_new = W_old + W_b W_a とした場合、W_b W_a ...
-特徴~
従って、転移学習と同じ特徴を持っている。
--効率性:少ないデータで高い性能を達成できる。
--柔軟性:既存のモデルを様々なタスクに適応させやすい。
--計算資源の節約
---モデル全体を再学習する必要がないため、計算コストが低い。
---LLM/SLMに適用する際、LLMの方が学習コストが大きい理由は...
-得意なケース~
「既存の知識の補強」の目的で使う事に適している。
--特定のドメインに適応させる。
--新しい言葉や概念を学習させる。
--特定の文章スタイルやキャラクターの言い回し。
-不得意なケース
--完全に未知の知識をゼロから学習する。
--長大なデータを一度に追加する。
-補足
--HuggingFaceのPEFT(Parameter-Efficient Fine-Tuning)ラ...
--言語モデルだけでなく、画像生成モデル(例:StableDiffusi...
-手順(簡単な流れ)
--学習データの準備(追加したい知識やスタイルのデータセッ...
JSON: {"input": "ユーザーの質問", "output": "AIの回答"}
--LoRAの適用(ベース・モデルにLoRAを組み込んで学習)
--ファイン・チューニング(追加の知識やスタイルを反映)
--モデルの評価・テスト(意図した知識やスタイルが反映され...
***QLoRA [#iee439a7]
QLoRA:量子化 + LoRA、Quantized Low-Rank Adaptation
-QLoRAはLoRAのアップグレード版で、[[量子化>深層学習(deep...
-新しいデータ型「4-bit NormalFloat(NF4)」を導入し、メモ...
※ 余談だが、
-Hugging Faceなどでリリースされている同シリーズ&バージョ...
-ちなみに、SLMは、量子化したものではなく、特定のタスクに...
***ReLoRA [#qbab85eb]
(LoRAの逐次再初期化)
**モジュール追加型(新たな層やブロックを追加) [#o0fb9c0f]
***Adapter [#o48215b0]
「スキップ接続された線形結合層」(Adapter)を追加(Adapta...
***Prefix Tuning [#oc09c52a]
-入力にPrefixベクトルを挿入
--入力の先頭に特別なprefixトークンを追加し、元のモデル本...
--prefixトークンに対応する少量の追加パラメタのみ学習させ...
--タスク毎に異なるprefixベクトルを付加することで効率的に...
--Faster Transformerなどの実装に対応している(追加パラメ...
--[[LoRA>#edcd5d87]]と比較して「学習コストは低い」が「新...
-例えるなら
--「この後は医療系の話をします:」のような前置きを付ける...
--ただし、これだけの説明だとPrompt Tuning的、~
Prompt Tuningとの違いは、各層のアクティベーション系列のPr...
---追加トークンの位置: Prompt Tuningは入力系列の先頭に追...
---追加パラメタの学習: Prefix Tuningは各層にPrefixに対応...
***Prompt Tuning [#o90041d0]
(Embeddingに仮想トークンを追加)
***P-Tuning [#b8aa7b64]
(深層プロンプトを最適化)
**微小パラメタ更新型 [#lda9061b]
(既存パラメタのごく一部を更新)
***BitFit [#j15e942b]
BitFit:Bias-only fine-tuning
-バイアス項のみ更新する非常に軽量なFT技法
--重み(weight)パラメタは固定
--バイアス(bias)項のみ微調整
-特徴
--バイアス(bias)項のみの微調整なので学習が高速でメモリ...
--テキスト分類などのタスクにおいては、フルファインチュー...
--特別なレイヤ追加や新しい訓練戦略は不要で、既存のモデル...
***LayerNorm-tuning [#t337b283]
(LayerNormのみ更新)
***ReFT [#c38bbd0f]
ReFT:Representation Fine-Tuning
-特定のタスクに対する性能を向上させることを目的とする。
-中間層の表現のみに限定して更新
--通常のPEFT(LoRAやAdapter)は追加層や差分重みを挿入する...
--ReFTは既存のモデルの内部表現(≒埋め込み層)の重みを直接...
-手法
--初期段階: モデルは通常の教師あり学習(SFT)でウォームア...
--強化学習: その後、オンライン強化学習(例えばPPO)を使用...
-結果
--質問に対して複数の推論パスが自動的にサンプリングされ、...
--方策(埋め込みモデルの部分)を最適化する強化学習を採用...
**その他・派生手法 [#z357c706]
***Compacter [#x38f8979]
***Adalora(動的に重要な層だけにLoRA適用) [#c58150a1]
***IA³(Attention/FFNにスカラー重みを掛けて調整) [#ka65e...
*実地 [#nac49c56]
**構築 [#a8ccf18b]
***アウトライン [#g063c912]
-GPU付きVMの準備
--使用可能なVMサイズを表示
--VMサイズを使用してCreateVM
-インストレーション
--NVIDIAドライバ
--CUDAツールキット
--cuDNN(任意だが推奨 → 既定であたる)
-Python 環境で確認
-参考
--Llama-3をColabで記事執筆用にファインチューニングしてみた~
https://zenn.dev/carenet/articles/0d2e1100121b0e
***実際の手順 [#l5db1fb1]
-[[Standard_NC8as_T4_v3、CUDA Toolkit 12.8>OSSのLLM#aa81f...
-以下は、上記リンクを参考に、Standard_NV36ads_A10_v5、Ubu...
--GPU付きVMを準備する。
---Standard_NV36ads_A10_v5が利用可能なリージョンを探す。
Get-AzComputeResourceSku | Where-Object { $_.Name -eq "S...
---{japaneast}が確認できたので、料金計算ツールでも再確認...
すると{eastasia}の方が安かったので、必要に応じて変更して...
---[[以下の変数を変更>Ubuntu 24.04 on Azure via Bastion 2...
vmSize=Standard_NV36ads_A10_v5
vmOS=Canonical:0001-com-ubuntu-pro-focal:pro-20_04-lts-g...
vmName=GPU-VM2
vmUser=XXXX
vmPassword=XXXX
※ Ubuntu2004なのは「NVIDIA GPU Driver Extension」の前提条...
※ NVIDIA ... Extensionをデプロイ後、2004アップグレードす...
---有償イメージに同意し、VMを作成する。
az vm image terms accept \
--publisher canonical \
--offer 0001-com-ubuntu-pro-focal \
--plan pro-20_04-lts-gen2
※ 作成後はセキュア ブートと vTPM を無効化する必要がある。
--インストレーション
---NVIDIAドライバ:Linux 用の NVIDIA GPU ドライバー拡張機...
https://learn.microsoft.com/ja-jp/azure/virtual-machines/...
・VMを起動した状態で、VMの「拡張機能とアプリケーション」...
拡張機能 > NVIDIA GPU Driver Extensionをインストールす...
・暫く時間がかかるのでBastion Create完了前に実行してしま...
・「nvidia-smi」で、以下のようにNVIDIAドライバが確認でき...
$ nvidia-smi
Thu Jul 3 03:14:40 2025
+-------------------------------------------------------...
| NVIDIA-SMI 550.144.06 Driver Version: 550....
|-----------------------------------------+-------------...
| GPU Name Persistence-M | Bus-Id ...
| Fan Temp Perf Pwr:Usage/Cap | Me...
| | ...
|=========================================+=============...
| 0 NVIDIA A10-24Q On | 00000002:0...
| N/A N/A P8 N/A / N/A | 1MiB /...
| | ...
+-----------------------------------------+-------------...
+-------------------------------------------------------...
| Processes: ...
| GPU GI CI PID Type Process name ...
| ID ID ...
|=======================================================...
| No running processes found ...
+-------------------------------------------------------...
---前提に準拠し「[[CUDA Toolkit 11.3の手順>https://develo...
以下、差異のメモ~
・「NO_PUBKEY A4B469963BF863CC」と怒られた時の~
対処法(CUDAリポジトリキーのローテーションに起因)~
sudo apt-key adv --fetch-keys https://developer.download...
sudo apt-key adv --fetch-keys https://developer.download...
・nvcc -Vで実際に入ったバージョンを確認すると、~
11.3ではなく最新バージョン(12.9)が入っている。
$ nvcc -V
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2025 NVIDIA Corporation
Built on Tue_May_27_02:21:03_PDT_2025
Cuda compilation tools, release 12.9, V12.9.86
Build cuda_12.9.r12.9/compiler.36037853_0
・一説によると、バージョン指定しない場合、最新のCUDAが入...
sudo apt-get -y install cuda
・その後の手順で&color(red){ドライバ死亡};が確認される。
$ nvidia-smi
NVIDIA-SMI has failed because it couldn't communicate wi...
---nvidia-smiを踏まえ「[[CUDA Toolkit 12.4の手順>https://...
以下、差異のメモ~
・nvcc -Vで実際に入ったバージョンを確認~
$ nvcc -V
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2024 NVIDIA Corporation
Built on Thu_Mar_28_02:18:24_PDT_2024
Cuda compilation tools, release 12.4, V12.4.131
Build cuda_12.4.r12.4/compiler.34097967_0
・こちらの手順で、CUDA Toolkit 11.3をインストール(&color...
・cuda-toolkit-12-4 → cuda-11-3に変更して実行
sudo apt-get -y install cuda-11-3
・nvcc -Vでインストールは確認できるが、~
$ nvcc -V
...
・その後の手順で&color(red){ドライバ死亡};が確認される。
$ nvidia-smi
NVIDIA-SMI has failed because it couldn't communicate wi...
---nvidia-smiでNVIDIAドライバの死活を監視~
・CUDA Toolkitのインストールに成功しても、NVIDIAドライバ...
nvidia-smi
...
・ココまで成功したのは、CUDA Toolkit 12.4の手順でのみ。
--Python 環境で確認~
以下、差異のメモ
---Pythonのバージョンアップ(Python 3.8.10 → 3.12.3)~
システム標準の Python 3.8.10 は「/usr/bin/python3」にバイ...
追加インストールした Python 3.12.3 「/usr/local/bin/pytho...
・依存パッケージをインストール
sudo apt update
sudo apt install -y build-essential zlib1g-dev libncurse...
・Python 3.12.3 のソースコードをダウンロード
cd /usr/src
sudo wget https://www.python.org/ftp/python/3.12.3/Pytho...
sudo tar xzf Python-3.12.3.tgz
cd Python-3.12.3
・コンパイルしてインストール
sudo ./configure --enable-optimizations
sudo make -j$(nproc)
sudo make altinstall
※ --enable-optimizations は高速化オプション~
※ make altinstall で、既存の python3 コマンドを上書きし...
・cdしたので元に戻す
cd ~ # 再ログインでも良い
・実行とバージョン確認(フルパス)
/usr/local/bin/python3.12 --version
/usr/local/bin/python3.12
>>>
・実行とバージョン確認(PATHにある)
python3.12 --version
python3.12
>>>
・pipの扱いはどうなるのか?~
・インストール結果
installed pip-24.0
WARNING: Running pip as the 'root' user can result in br...
・実行結果(Python3に対応)
$ pip
Command 'pip' not found, but can be installed with:
sudo apt install python3-pip
$ pip3 # pip3って訳でもないらしい
Command 'pip3' not found, but can be installed with:
sudo apt install python3-pip
・実行結果(Python3.12に対応)
pip3.12
Usage:
pip3.12 <command> [options]
Commands:
...
General Options:
...
---仮想環境を使う~
・仮想環境を作成
python3.12 -m venv .python312_venv
・activate
source .python312_venv/bin/activate
・deactivate
deactivate
---仮想環境外にpipインストール~
・python3のpipは一先ず不要(だが、入れるなら以下)
sudo apt update
sudo apt install python3-pip
pip3 --version
・python3.12のpipをインストール・アップグレード
sudo python3.12 -m ensurepip --upgrade
sudo python3.12 -m pip install --upgrade pip
※ sudo を付与した pip 周辺で警告が表示されるが、ココで...
・pip3.12 のインストールを(再度)確認する。
python3.12 -m pip --version
pip3.12 --version
・pip3.12 を使って仮想環境外でパッケージをインストール
pip3.12 install --user numpy
※ --user をつけることで、~/.local/ 以下にインストールさ...
※ sudo pip はシステムパッケージマネージャーと競合する可...
---仮想環境(.python312_venv)内にpipインストール~
・仮想環境内で pip 更新~
pip install --upgrade pip
・仮想環境内でパッケージをインストール
pip install numpy
※ pipは仮想環境内での使用が推奨:https://pip.pypa.io/warn...
---フレームワークのpipインストール:https://pytorch.org/g...
仮想環境の「外」でやるか「中」でやるかは要検討だが、「外...
・仮想環境外へはpip3.12を使ってやる。
TMPDIR=/mnt/tmp pip3.12 install torch==2.6.0 torchvision...
・仮想環境(.python312_venv)内へはpipを使ってやる。
TMPDIR=/mnt/tmp pip install torch==2.6.0 torchvision==0....
・実行確認(インタラクティブ実行で)
python3.12
>>> import torch
>>> print(torch.cuda.is_available()) # TrueならOK
True
>>> print(torch.cuda.get_device_name(0)) # GPU名表示
NVIDIA A10-24Q
**実装 [#fbf52eee]
***アウトライン [#pf4385c1]
-[[はじめに参考にしたのは10ヶ月前のMSのphi-3のLORA FTコー...
-以下のように、環境のバージョンを上げるとすぐ動かなくなる~
(また、実績のある環境&コードで実行すると言う手段もある...
--ハードウェア:学習資源の準備とCUDA等の環境構築
--ソフトウェア:モデルやライブラリのバージョンの不一致
---コンフィグレーション系のI/F変更
---データ系のフォーマット変更
--構造・形式
---使用するモデルの構造差異でtarget_modulesが異なる。
---データの正確な形式のDatasetやTokenizer処理が不可欠
--訓練条件(低リソース環境・量子化)との不整合、
---4bit/8bit量子化(bnb_config)を使うときは、特定のモデ...
---LoRA適用時に特別な設定(例:device_map="auto", gradien...
--実験コードがプロダクションレベルでない
---GitHubで共有されるコードは、個人の実験コードであること...
---ブラックボックスの抽象化レイヤーが多過ぎてエラーメッセ...
---ライブラリのエラーメッセージをベースにトラブルシュート...
***実際のコード [#q95d7ca6]
(リンク先の各ライブラリの項に記載)
-使い分けまとめ
|学習形式|入力形式|ライブラリ|クラス|h
|次単語予測(事前学習)|生テキスト|huggingface/transforme...
|SFT / Instruction tuning|JSON形式の会話データ|huggingfac...
-選定目安
|プロジェクト内容|推奨トレーナー|h
|GPTのような汎用LMの事前学習|Trainer(with Causal LM)|
|ChatGPT風の会話モデル|SFTTrainer(またはLoRA + SFTTraine...
|RLHF(報酬学習やPPO)まで進める |trl 内の SFTTrainer → R...
**運用 [#t8bf957d]
***アウトライン [#je919dca]
-ファインチューニングしたLoRAモデルをマージ
from peft import PeftModel
base_model = AutoModelForCausalLM.from_pretrained("meta-...
model = PeftModel.from_pretrained(base_model, "path/to/l...
merged_model = model.merge_and_unload()
merged_model.save_pretrained("merged_model")
tokenizer.save_pretrained("merged_model")
-[[Transformers形式>OSSのLLM#zbe3597d]] → [[GGUF形式>OSS...
--変換処理に使用するllama.cppの準備
---llama.cppを取得&ビルド
---Pythonラッパーのパッケージをインストール
--変換処理を実行する。
---BFloat16のGGUF形式モデルに変換:convert_hf_to_gguf.py
---Q4_K_Mで量子化:llama-quantize(CLIっぽい)
-ファインチューニングしたLoRAモデルをOllamaで実行
--Ollama用のModelfileを定義~
Dockerfile に似ているが、Ollama 独自のミニ構文で、モデル...
FROM llama2
# ファインチューニング済み GGUF を追加
PARAMETER_FILE ./llama-2-7b-q4.gguf
--GGUF形式をポイントしビルド
ollama create my-llama2-qa -f Modelfile
--ビルドしたモデルを実行
ollama run my-llama2-qa
***実際のスクリプト [#r5679d6e]
*参考 [#a6f42034]
**LoRA [#w424841e]
-LoRAによるSLMのファインチューニングのハイパーパラメータ...
https://zenn.dev/headwaters/articles/123f4b68e07ea6
-LoRA(ローラ)とは|今年注目の画像生成AI (Stable Diffusion...
https://ledge.ai/articles/LoRA
**環境 [#oe04b9f8]
***[[VM費用見積もり>OSSのLLM#j66a9045]] [#y54fc6ec]
***[[GPU付きVMを準備>OSSのLLM#we26e9ac]] [#m927f83a]
***[[GPUを認識させる>OSSのLLM#p7fc71c4]] [#b74108a5]
**実装 [#x681d57e]
***phi3 [#ze2c49d8]
-メモ:phi3をLoRaでColab上でファインチューニングしてみる...
https://bwgift.hatenadiary.jp/entry/2024/08/02/200735
-Phi-3のFineTuning方法の違い「通常のファインチューニング...
https://zenn.dev/headwaters/articles/55f648399c1820
-https://github.com/microsoft/PhiCookBook/blob/main/code/...
***Llama2-3 [#v9d9647c]
-Llama2 のファインチューニングに低ランク適応 (LoRA) を使用~
https://zenn.dev/intel_developer/articles/82f74c7e5b80ae
-llama.cppで語尾を”ござる”に変えるloraを作る(ELYZA-japane...
https://zenn.dev/michy/articles/a79d4a4a501bf9
-【Llama2】ファインチューニング | 7b・13b・70b | 業界最安...
https://soroban.highreso.jp/article/article-057#65954616a...
-Google Colab で Llama 3 のファインチューニングを試す |n...
https://note.com/npaka/n/n315c0bdbbf00
-MetaのオープンソースLLM「Llama 3」を日本語版にファインチ...
https://qiita.com/bostonchou/items/bf4a34dcbaf45828f886
***その他 [#qd259e50]
-ラインの日本語LLM
--日本語LLMのファインチューニング入門 – 自作・Hugging Fac...
https://child-programmer.com/llm-ft-tutorial/
**運用 [#a9b4e516]
***モデル取り回し [#ue84b6b5]
-https://x.com/talktoai/status/1836754397340062179
-【llama.cpp】誰でもできるgguf変換~
https://zenn.dev/saldra/articles/2598836233f555
-HuggingFaceのモデルをGGUF変換する|あきら~
https://note.com/mydatastock/n/n0966c7836543
-初心者でもできる!HuggingFaceモデルをGGUF形式に変換しOll...
https://uepon.hatenadiary.com/entry/2024/09/10/153249
-Qiita
--GGUF 変換メモ #llama.cpp~
https://qiita.com/7shi/items/14d24a25aa26dcf97d2d
--ファインチューニングしたモデルをGGUFに変換する。 #LLM~
https://qiita.com/hudebakononaka/items/ca295eae60231d7d025f
--【Llama.cpp】学習したオリジナルLlama2ベースのLLMを量子...
https://qiita.com/keisuke-okb/items/faeaf4b14d7e581707b9
--ファインチューニングしたモデルでGGUFファイル作成した時...
https://qiita.com/kyotoman/items/5d460708d798a6f26cf0
終了行:
「[[.NET 開発基盤部会 Wiki>http://dotnetdevelopmentinfras...
-[[戻る>テキスト生成系(Transformer系)#j2f01d54]] > [[チ...
--[[LLMのPE]]
--[[LLMのRAG]]
--[[OSSのLLM]] > LLMのFT
---[[huggingface/transformers Trainer]]
---[[huggingface/trl SFTTrainer]]
--[[LLMエージェント]]
*目次 [#u4413184]
#contents
*概要 [#o6adc09b]
LLMのファイン・チューニング(FT)は既存LLMを特定の用途や...
-ここでは、SaaS形式のLLMサービスのFTではなく、主に、ロー...
-モデルのリリースに伴う事前学習とではなく、作成後のLLMの...
**基本概念 [#r833f951]
-一般的な事前学習済みのLLMが持つ汎用的な知識を特定の専門...
-これにより、対象のタスクへ適応させ、より正確で一貫性のあ...
**適用場面 [#mdae5ed6]
FTは、以下のような場面で活用される。
|場面|使途|h
|カスタマーサポート|自社独自のFAQや業界特有の表現に適応さ...
|医療や法律分野|専門用語や規制対応の正確な知識を学習させ...
|文書生成や翻訳|高精度な自然言語処理を必要とする場面。|
**トレードオフ [#oc8b04a2]
***メリット [#xe0713b9]
-精度向上~
特定の用途に特化したモデルを構築できる。
-カスタマイズ性~
企業独自のデータやノウハウを学習させることで、ブランド固...
***デメリット [#w03485e7]
-コスト~
高性能なGPUやクラウド環境が必要で、運用コストが増加。
-データ量~
大量の学習データが求められ、データ収集・整理の負担が発生。
**手法の種類 [#sd57dc5f]
主に以下の手法がある。
***全体・部分の分類 [#n7d28557]
-全体:[[Full Fine-Tuning>#b45c9886]]~
LLMのモデル全体のパラメタを再学習させる方法。高いカスタマ...
-部分:[[PEFT(Parameter-Efficient Fine-Tuning)>#t16de86...
一部のパラメタや特定の層に限定して調整を加える方法。計算...
***教師なし/あり学習、強化学習 [#fcd28885]
-教師なし学習:CLM(次単語予測)、MLM(マスク単語予測)は...
-教師あり学習:指示チューニング([[Instruction Tuning>#m5...
-強化学習:[[RLHF>#f617b1df]]は、[[Instruction Tuning>#m5...
**個々の説明 [#y575a9ad]
***Full Fine-Tuning [#b45c9886]
モデルの全パラメタを特定のタスクやドメインに合わせて調整...
-一般的に[[通常のFT>深層学習のテクニック#ea94272b]]の様に...
-全体のパラメタを調整することで、特定のタスクに対して高い...
***PEFT [#t16de86b]
PEFT:Parameter-Efficient Fine-Tuning
-モデルの部分(埋め込み層、隠れ層、アテンション機構など既...
-既存のデータセットを使ったモデルの精度向上が目的で、新し...
-[[LoRA, QLoRA, Adapter, Prefix Tuning, BitFit, ReFT>#o17...
***RLHF [#f617b1df]
RLHF:Reinforcement Learning from Human Feedback
-人間の好みに基づいてモデルの応答を調整する強化学習ベース...
-「どちらの応答が望ましいか」という人間の評価のフィードバ...
-報酬モデルを用いて、LLMを人間の好みに合うように方策最適...
-以下の3ステップから構成される。
--Supervised Fine-Tuning(SFT)~
人間のデモに基づいて初期モデルを強化する。
---[[Instruction Tuning>#m581916f]]で、ベースLLMを教師あ...
---「基本的に良い応答を出す」能力を得るが、まだ細かな好み...
--Reward Model(報酬モデル)の訓練~
どんな応答が「良い」のかを学習させる。
---人間が複数の応答候補に「好みの順位付け(ランキング)」...
---モデルにプロンプトを与え、複数の応答を生成 → 人間がど...
---このランキングデータを用いて、「良い応答には高い報酬を...
--[[Reward Fine-Tuning>#o361b6ee]](PPOなど)~
***Instruction Tuning [#m581916f]
指示に基づいてモデルを調整する教師あり学習(Supervised Fi...
-モデルに「明示的な指示(instruction)」を与えて、それに...
-例:指示「以下のテキストを要約してください」「○○について...
***Reward Fine-Tuning [#o361b6ee]
報酬モデルを使って、モデルを人間の好みに合わせて強化学習。
-報酬モデルを用いて、モデルの出力に対する「報酬」を計算。
-この報酬を最大化するように、主にPPOを使って言語モデルを...
-これにより、モデルは「人間が望むような応答」を出す傾向が...
*PEFT系 [#o17ec824]
**差分学習型(元の重みに対する差分を学習) [#u6b3648b]
***LoRA [#edcd5d87]
LoRA:Low-Rank Adaptation(低ランク適応)
-主に大規模な機械学習モデル(特にLLMや画像生成モデル)に...
-[[通常のFT>深層学習のテクニック#ea94272b]]の様に出力層側...
-線形結合層は「低ランク近似行列」は元来の行列を二つの小さ...
-具体的には、W_new = W_old + W_b W_a とした場合、W_b W_a ...
-特徴~
従って、転移学習と同じ特徴を持っている。
--効率性:少ないデータで高い性能を達成できる。
--柔軟性:既存のモデルを様々なタスクに適応させやすい。
--計算資源の節約
---モデル全体を再学習する必要がないため、計算コストが低い。
---LLM/SLMに適用する際、LLMの方が学習コストが大きい理由は...
-得意なケース~
「既存の知識の補強」の目的で使う事に適している。
--特定のドメインに適応させる。
--新しい言葉や概念を学習させる。
--特定の文章スタイルやキャラクターの言い回し。
-不得意なケース
--完全に未知の知識をゼロから学習する。
--長大なデータを一度に追加する。
-補足
--HuggingFaceのPEFT(Parameter-Efficient Fine-Tuning)ラ...
--言語モデルだけでなく、画像生成モデル(例:StableDiffusi...
-手順(簡単な流れ)
--学習データの準備(追加したい知識やスタイルのデータセッ...
JSON: {"input": "ユーザーの質問", "output": "AIの回答"}
--LoRAの適用(ベース・モデルにLoRAを組み込んで学習)
--ファイン・チューニング(追加の知識やスタイルを反映)
--モデルの評価・テスト(意図した知識やスタイルが反映され...
***QLoRA [#iee439a7]
QLoRA:量子化 + LoRA、Quantized Low-Rank Adaptation
-QLoRAはLoRAのアップグレード版で、[[量子化>深層学習(deep...
-新しいデータ型「4-bit NormalFloat(NF4)」を導入し、メモ...
※ 余談だが、
-Hugging Faceなどでリリースされている同シリーズ&バージョ...
-ちなみに、SLMは、量子化したものではなく、特定のタスクに...
***ReLoRA [#qbab85eb]
(LoRAの逐次再初期化)
**モジュール追加型(新たな層やブロックを追加) [#o0fb9c0f]
***Adapter [#o48215b0]
「スキップ接続された線形結合層」(Adapter)を追加(Adapta...
***Prefix Tuning [#oc09c52a]
-入力にPrefixベクトルを挿入
--入力の先頭に特別なprefixトークンを追加し、元のモデル本...
--prefixトークンに対応する少量の追加パラメタのみ学習させ...
--タスク毎に異なるprefixベクトルを付加することで効率的に...
--Faster Transformerなどの実装に対応している(追加パラメ...
--[[LoRA>#edcd5d87]]と比較して「学習コストは低い」が「新...
-例えるなら
--「この後は医療系の話をします:」のような前置きを付ける...
--ただし、これだけの説明だとPrompt Tuning的、~
Prompt Tuningとの違いは、各層のアクティベーション系列のPr...
---追加トークンの位置: Prompt Tuningは入力系列の先頭に追...
---追加パラメタの学習: Prefix Tuningは各層にPrefixに対応...
***Prompt Tuning [#o90041d0]
(Embeddingに仮想トークンを追加)
***P-Tuning [#b8aa7b64]
(深層プロンプトを最適化)
**微小パラメタ更新型 [#lda9061b]
(既存パラメタのごく一部を更新)
***BitFit [#j15e942b]
BitFit:Bias-only fine-tuning
-バイアス項のみ更新する非常に軽量なFT技法
--重み(weight)パラメタは固定
--バイアス(bias)項のみ微調整
-特徴
--バイアス(bias)項のみの微調整なので学習が高速でメモリ...
--テキスト分類などのタスクにおいては、フルファインチュー...
--特別なレイヤ追加や新しい訓練戦略は不要で、既存のモデル...
***LayerNorm-tuning [#t337b283]
(LayerNormのみ更新)
***ReFT [#c38bbd0f]
ReFT:Representation Fine-Tuning
-特定のタスクに対する性能を向上させることを目的とする。
-中間層の表現のみに限定して更新
--通常のPEFT(LoRAやAdapter)は追加層や差分重みを挿入する...
--ReFTは既存のモデルの内部表現(≒埋め込み層)の重みを直接...
-手法
--初期段階: モデルは通常の教師あり学習(SFT)でウォームア...
--強化学習: その後、オンライン強化学習(例えばPPO)を使用...
-結果
--質問に対して複数の推論パスが自動的にサンプリングされ、...
--方策(埋め込みモデルの部分)を最適化する強化学習を採用...
**その他・派生手法 [#z357c706]
***Compacter [#x38f8979]
***Adalora(動的に重要な層だけにLoRA適用) [#c58150a1]
***IA³(Attention/FFNにスカラー重みを掛けて調整) [#ka65e...
*実地 [#nac49c56]
**構築 [#a8ccf18b]
***アウトライン [#g063c912]
-GPU付きVMの準備
--使用可能なVMサイズを表示
--VMサイズを使用してCreateVM
-インストレーション
--NVIDIAドライバ
--CUDAツールキット
--cuDNN(任意だが推奨 → 既定であたる)
-Python 環境で確認
-参考
--Llama-3をColabで記事執筆用にファインチューニングしてみた~
https://zenn.dev/carenet/articles/0d2e1100121b0e
***実際の手順 [#l5db1fb1]
-[[Standard_NC8as_T4_v3、CUDA Toolkit 12.8>OSSのLLM#aa81f...
-以下は、上記リンクを参考に、Standard_NV36ads_A10_v5、Ubu...
--GPU付きVMを準備する。
---Standard_NV36ads_A10_v5が利用可能なリージョンを探す。
Get-AzComputeResourceSku | Where-Object { $_.Name -eq "S...
---{japaneast}が確認できたので、料金計算ツールでも再確認...
すると{eastasia}の方が安かったので、必要に応じて変更して...
---[[以下の変数を変更>Ubuntu 24.04 on Azure via Bastion 2...
vmSize=Standard_NV36ads_A10_v5
vmOS=Canonical:0001-com-ubuntu-pro-focal:pro-20_04-lts-g...
vmName=GPU-VM2
vmUser=XXXX
vmPassword=XXXX
※ Ubuntu2004なのは「NVIDIA GPU Driver Extension」の前提条...
※ NVIDIA ... Extensionをデプロイ後、2004アップグレードす...
---有償イメージに同意し、VMを作成する。
az vm image terms accept \
--publisher canonical \
--offer 0001-com-ubuntu-pro-focal \
--plan pro-20_04-lts-gen2
※ 作成後はセキュア ブートと vTPM を無効化する必要がある。
--インストレーション
---NVIDIAドライバ:Linux 用の NVIDIA GPU ドライバー拡張機...
https://learn.microsoft.com/ja-jp/azure/virtual-machines/...
・VMを起動した状態で、VMの「拡張機能とアプリケーション」...
拡張機能 > NVIDIA GPU Driver Extensionをインストールす...
・暫く時間がかかるのでBastion Create完了前に実行してしま...
・「nvidia-smi」で、以下のようにNVIDIAドライバが確認でき...
$ nvidia-smi
Thu Jul 3 03:14:40 2025
+-------------------------------------------------------...
| NVIDIA-SMI 550.144.06 Driver Version: 550....
|-----------------------------------------+-------------...
| GPU Name Persistence-M | Bus-Id ...
| Fan Temp Perf Pwr:Usage/Cap | Me...
| | ...
|=========================================+=============...
| 0 NVIDIA A10-24Q On | 00000002:0...
| N/A N/A P8 N/A / N/A | 1MiB /...
| | ...
+-----------------------------------------+-------------...
+-------------------------------------------------------...
| Processes: ...
| GPU GI CI PID Type Process name ...
| ID ID ...
|=======================================================...
| No running processes found ...
+-------------------------------------------------------...
---前提に準拠し「[[CUDA Toolkit 11.3の手順>https://develo...
以下、差異のメモ~
・「NO_PUBKEY A4B469963BF863CC」と怒られた時の~
対処法(CUDAリポジトリキーのローテーションに起因)~
sudo apt-key adv --fetch-keys https://developer.download...
sudo apt-key adv --fetch-keys https://developer.download...
・nvcc -Vで実際に入ったバージョンを確認すると、~
11.3ではなく最新バージョン(12.9)が入っている。
$ nvcc -V
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2025 NVIDIA Corporation
Built on Tue_May_27_02:21:03_PDT_2025
Cuda compilation tools, release 12.9, V12.9.86
Build cuda_12.9.r12.9/compiler.36037853_0
・一説によると、バージョン指定しない場合、最新のCUDAが入...
sudo apt-get -y install cuda
・その後の手順で&color(red){ドライバ死亡};が確認される。
$ nvidia-smi
NVIDIA-SMI has failed because it couldn't communicate wi...
---nvidia-smiを踏まえ「[[CUDA Toolkit 12.4の手順>https://...
以下、差異のメモ~
・nvcc -Vで実際に入ったバージョンを確認~
$ nvcc -V
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2024 NVIDIA Corporation
Built on Thu_Mar_28_02:18:24_PDT_2024
Cuda compilation tools, release 12.4, V12.4.131
Build cuda_12.4.r12.4/compiler.34097967_0
・こちらの手順で、CUDA Toolkit 11.3をインストール(&color...
・cuda-toolkit-12-4 → cuda-11-3に変更して実行
sudo apt-get -y install cuda-11-3
・nvcc -Vでインストールは確認できるが、~
$ nvcc -V
...
・その後の手順で&color(red){ドライバ死亡};が確認される。
$ nvidia-smi
NVIDIA-SMI has failed because it couldn't communicate wi...
---nvidia-smiでNVIDIAドライバの死活を監視~
・CUDA Toolkitのインストールに成功しても、NVIDIAドライバ...
nvidia-smi
...
・ココまで成功したのは、CUDA Toolkit 12.4の手順でのみ。
--Python 環境で確認~
以下、差異のメモ
---Pythonのバージョンアップ(Python 3.8.10 → 3.12.3)~
システム標準の Python 3.8.10 は「/usr/bin/python3」にバイ...
追加インストールした Python 3.12.3 「/usr/local/bin/pytho...
・依存パッケージをインストール
sudo apt update
sudo apt install -y build-essential zlib1g-dev libncurse...
・Python 3.12.3 のソースコードをダウンロード
cd /usr/src
sudo wget https://www.python.org/ftp/python/3.12.3/Pytho...
sudo tar xzf Python-3.12.3.tgz
cd Python-3.12.3
・コンパイルしてインストール
sudo ./configure --enable-optimizations
sudo make -j$(nproc)
sudo make altinstall
※ --enable-optimizations は高速化オプション~
※ make altinstall で、既存の python3 コマンドを上書きし...
・cdしたので元に戻す
cd ~ # 再ログインでも良い
・実行とバージョン確認(フルパス)
/usr/local/bin/python3.12 --version
/usr/local/bin/python3.12
>>>
・実行とバージョン確認(PATHにある)
python3.12 --version
python3.12
>>>
・pipの扱いはどうなるのか?~
・インストール結果
installed pip-24.0
WARNING: Running pip as the 'root' user can result in br...
・実行結果(Python3に対応)
$ pip
Command 'pip' not found, but can be installed with:
sudo apt install python3-pip
$ pip3 # pip3って訳でもないらしい
Command 'pip3' not found, but can be installed with:
sudo apt install python3-pip
・実行結果(Python3.12に対応)
pip3.12
Usage:
pip3.12 <command> [options]
Commands:
...
General Options:
...
---仮想環境を使う~
・仮想環境を作成
python3.12 -m venv .python312_venv
・activate
source .python312_venv/bin/activate
・deactivate
deactivate
---仮想環境外にpipインストール~
・python3のpipは一先ず不要(だが、入れるなら以下)
sudo apt update
sudo apt install python3-pip
pip3 --version
・python3.12のpipをインストール・アップグレード
sudo python3.12 -m ensurepip --upgrade
sudo python3.12 -m pip install --upgrade pip
※ sudo を付与した pip 周辺で警告が表示されるが、ココで...
・pip3.12 のインストールを(再度)確認する。
python3.12 -m pip --version
pip3.12 --version
・pip3.12 を使って仮想環境外でパッケージをインストール
pip3.12 install --user numpy
※ --user をつけることで、~/.local/ 以下にインストールさ...
※ sudo pip はシステムパッケージマネージャーと競合する可...
---仮想環境(.python312_venv)内にpipインストール~
・仮想環境内で pip 更新~
pip install --upgrade pip
・仮想環境内でパッケージをインストール
pip install numpy
※ pipは仮想環境内での使用が推奨:https://pip.pypa.io/warn...
---フレームワークのpipインストール:https://pytorch.org/g...
仮想環境の「外」でやるか「中」でやるかは要検討だが、「外...
・仮想環境外へはpip3.12を使ってやる。
TMPDIR=/mnt/tmp pip3.12 install torch==2.6.0 torchvision...
・仮想環境(.python312_venv)内へはpipを使ってやる。
TMPDIR=/mnt/tmp pip install torch==2.6.0 torchvision==0....
・実行確認(インタラクティブ実行で)
python3.12
>>> import torch
>>> print(torch.cuda.is_available()) # TrueならOK
True
>>> print(torch.cuda.get_device_name(0)) # GPU名表示
NVIDIA A10-24Q
**実装 [#fbf52eee]
***アウトライン [#pf4385c1]
-[[はじめに参考にしたのは10ヶ月前のMSのphi-3のLORA FTコー...
-以下のように、環境のバージョンを上げるとすぐ動かなくなる~
(また、実績のある環境&コードで実行すると言う手段もある...
--ハードウェア:学習資源の準備とCUDA等の環境構築
--ソフトウェア:モデルやライブラリのバージョンの不一致
---コンフィグレーション系のI/F変更
---データ系のフォーマット変更
--構造・形式
---使用するモデルの構造差異でtarget_modulesが異なる。
---データの正確な形式のDatasetやTokenizer処理が不可欠
--訓練条件(低リソース環境・量子化)との不整合、
---4bit/8bit量子化(bnb_config)を使うときは、特定のモデ...
---LoRA適用時に特別な設定(例:device_map="auto", gradien...
--実験コードがプロダクションレベルでない
---GitHubで共有されるコードは、個人の実験コードであること...
---ブラックボックスの抽象化レイヤーが多過ぎてエラーメッセ...
---ライブラリのエラーメッセージをベースにトラブルシュート...
***実際のコード [#q95d7ca6]
(リンク先の各ライブラリの項に記載)
-使い分けまとめ
|学習形式|入力形式|ライブラリ|クラス|h
|次単語予測(事前学習)|生テキスト|huggingface/transforme...
|SFT / Instruction tuning|JSON形式の会話データ|huggingfac...
-選定目安
|プロジェクト内容|推奨トレーナー|h
|GPTのような汎用LMの事前学習|Trainer(with Causal LM)|
|ChatGPT風の会話モデル|SFTTrainer(またはLoRA + SFTTraine...
|RLHF(報酬学習やPPO)まで進める |trl 内の SFTTrainer → R...
**運用 [#t8bf957d]
***アウトライン [#je919dca]
-ファインチューニングしたLoRAモデルをマージ
from peft import PeftModel
base_model = AutoModelForCausalLM.from_pretrained("meta-...
model = PeftModel.from_pretrained(base_model, "path/to/l...
merged_model = model.merge_and_unload()
merged_model.save_pretrained("merged_model")
tokenizer.save_pretrained("merged_model")
-[[Transformers形式>OSSのLLM#zbe3597d]] → [[GGUF形式>OSS...
--変換処理に使用するllama.cppの準備
---llama.cppを取得&ビルド
---Pythonラッパーのパッケージをインストール
--変換処理を実行する。
---BFloat16のGGUF形式モデルに変換:convert_hf_to_gguf.py
---Q4_K_Mで量子化:llama-quantize(CLIっぽい)
-ファインチューニングしたLoRAモデルをOllamaで実行
--Ollama用のModelfileを定義~
Dockerfile に似ているが、Ollama 独自のミニ構文で、モデル...
FROM llama2
# ファインチューニング済み GGUF を追加
PARAMETER_FILE ./llama-2-7b-q4.gguf
--GGUF形式をポイントしビルド
ollama create my-llama2-qa -f Modelfile
--ビルドしたモデルを実行
ollama run my-llama2-qa
***実際のスクリプト [#r5679d6e]
*参考 [#a6f42034]
**LoRA [#w424841e]
-LoRAによるSLMのファインチューニングのハイパーパラメータ...
https://zenn.dev/headwaters/articles/123f4b68e07ea6
-LoRA(ローラ)とは|今年注目の画像生成AI (Stable Diffusion...
https://ledge.ai/articles/LoRA
**環境 [#oe04b9f8]
***[[VM費用見積もり>OSSのLLM#j66a9045]] [#y54fc6ec]
***[[GPU付きVMを準備>OSSのLLM#we26e9ac]] [#m927f83a]
***[[GPUを認識させる>OSSのLLM#p7fc71c4]] [#b74108a5]
**実装 [#x681d57e]
***phi3 [#ze2c49d8]
-メモ:phi3をLoRaでColab上でファインチューニングしてみる...
https://bwgift.hatenadiary.jp/entry/2024/08/02/200735
-Phi-3のFineTuning方法の違い「通常のファインチューニング...
https://zenn.dev/headwaters/articles/55f648399c1820
-https://github.com/microsoft/PhiCookBook/blob/main/code/...
***Llama2-3 [#v9d9647c]
-Llama2 のファインチューニングに低ランク適応 (LoRA) を使用~
https://zenn.dev/intel_developer/articles/82f74c7e5b80ae
-llama.cppで語尾を”ござる”に変えるloraを作る(ELYZA-japane...
https://zenn.dev/michy/articles/a79d4a4a501bf9
-【Llama2】ファインチューニング | 7b・13b・70b | 業界最安...
https://soroban.highreso.jp/article/article-057#65954616a...
-Google Colab で Llama 3 のファインチューニングを試す |n...
https://note.com/npaka/n/n315c0bdbbf00
-MetaのオープンソースLLM「Llama 3」を日本語版にファインチ...
https://qiita.com/bostonchou/items/bf4a34dcbaf45828f886
***その他 [#qd259e50]
-ラインの日本語LLM
--日本語LLMのファインチューニング入門 – 自作・Hugging Fac...
https://child-programmer.com/llm-ft-tutorial/
**運用 [#a9b4e516]
***モデル取り回し [#ue84b6b5]
-https://x.com/talktoai/status/1836754397340062179
-【llama.cpp】誰でもできるgguf変換~
https://zenn.dev/saldra/articles/2598836233f555
-HuggingFaceのモデルをGGUF変換する|あきら~
https://note.com/mydatastock/n/n0966c7836543
-初心者でもできる!HuggingFaceモデルをGGUF形式に変換しOll...
https://uepon.hatenadiary.com/entry/2024/09/10/153249
-Qiita
--GGUF 変換メモ #llama.cpp~
https://qiita.com/7shi/items/14d24a25aa26dcf97d2d
--ファインチューニングしたモデルをGGUFに変換する。 #LLM~
https://qiita.com/hudebakononaka/items/ca295eae60231d7d025f
--【Llama.cpp】学習したオリジナルLlama2ベースのLLMを量子...
https://qiita.com/keisuke-okb/items/faeaf4b14d7e581707b9
--ファインチューニングしたモデルでGGUFファイル作成した時...
https://qiita.com/kyotoman/items/5d460708d798a6f26cf0
ページ名: