|
原作:ウー・ジンフェン(Datawhale) Datawhaleのヒント 著者: Wu Jinfeng、Datawhale Excellent Learner 早速、小さな調整の前後の効果を見てみましょう。 微調整前: 微調整後: ここでは、微調整後に大型モデルのトーンが変化したことが明らかです。私の経験上、微調整された大型モデルは思考時間が短くなっています。 次に、微調整の練習を段階的に完了し、モデルのパフォーマンスを最適化するために協力していきましょう。 I. 大規模モデルの微調整とは何ですか?微調整は、「トップクラスの生徒」に追加のレッスンを与えて、彼らを「ジェネラリスト」から特定の分野の「専門家」に変えるようなものです。 この記事で微調整した医療データを使った例を挙げましょう。世界中の本を読み(大規模モデルの事前学習段階に相当)、歴史、科学、文学など様々なトピックについてあなたと議論できる、非常に知的な友人がいると想像してみてください。しかし、医療報告書を読む際に彼に手伝ってもらう必要がある場合、彼は基本的な知識は持っているかもしれませんが、専門家ではないかもしれません。このような場合、彼に医学書と症例研究のコレクションを与え、彼がその分野を専門的に学習できるようにします(これが微調整です)。そうすることで、彼は医療問題に関する知識をより深く習得するでしょう。 📖 ストーリー解説:子猫を描けるロボット🤖(これは事前学習済みのモデルです)があると想像してください。そして、このロボットに帽子をかぶった子猫🎩🐱を描くように学習させたいとします。絵を一から教える必要はありません。「帽子をかぶった子猫」の絵をたくさん見せて、「元の描画能力は維持しつつ、帽子を描くように学習させてください!」と指示するだけでいいのです。これが微調整です! 📖 実際の例の説明:ケース1:スマートスピーカーが方言に切り替える - 基本的なスピーカーは中国語(事前トレーニング済みモデル)のみを話します。
- 四川語の文章100個を再生します(データを若干調整)。
- 「話し上手」が理解できるようになりました(方言理解力が向上しました)。
ケース2:カメラフィルターの原理 - オリジナルカメラがあらゆるシーンを撮影します(一般モデル)。
- 「食品フィルター」パラメータ(微調整されたモデル)を読み込みます。
- 食べ物を撮影するときに自動的に彩度を高めます(プロ仕様)。
解説強化:レゴ城が小児病院に変身ステップ1:既存の構造 - ユニバーサルレゴキャッスル【ジェネラル・キャッスル】 ▸ メタファー: ネットで購入した「標準的なお城の積み木セット」と同じように、壁や塔、尖塔などがあり、普通の家として使えます。 ▸ 対応する技術: 事前トレーニング済みのモデル (ChatGPT など) はすでに一般的な言語機能を学習していますが、十分に特化されていません。
ステップ2:部分的な変更 - 低コストの変更①尖頭屋根を撤去→ドーム屋根に交換 【尖頭屋根をドーム屋根に改造】 ▸ 手順: タワーの頂上にある尖ったブロックを丸いブロックに交換して、より優しくてかわいい外観にします。 ▸ 技術的な影響: モデルの最上位パラメータを微調整し (分類ヘッドの変更など)、出力スタイルを子供の会話により適したものにします。 ②回転ドアを設置する【回転ドア】 ▸ 操作: 元のドア構造を損傷することなく、回転可能なビルディングブロックモジュールを出入り口に挿入します。 ▸ 技術的な意味: アダプター モジュールを挿入すると、既存の知識に干渉することなく、モデルに小児医学用語を理解する機能を追加できます。 ③病院の看板にペイントする 【病院ロゴ】 ▸ 手順: 城の外壁に「十字のシンボル」と漫画の動物ステッカーを貼ります。 ▸ 技術的な意味: Feature Shift はモデルの内部表現を調整し、医療関連の語彙や子供っぽい表現にさらに注意を払うようにします。
ステップ3:新機能 - 小児病院に変身[小児病院] ▸ 結果: 改装された城には、おもちゃのエリア、優しい医師 (ドーム)、特殊な医療機器 (回転ドア) が備えられており、幼い患者も収容できます。 ▸技術的影響:軽量な改造により、汎用モデルが子供の健康相談に特化した「小児医療Q&Aロボット」に変身します。 II. 現在試されているハードウェア構成グラフィックカード: NVIDIA GeForce RTX 4060 CPU: インテル Core i7-13700H メモリ:16GB(家庭用なので普段は8.8/15.7GB使用) III. 微調整作業(1)データセットの準備この記事のデータセットは、Moda コミュニティの medical-o1-reasoning-SFT データセットから取得されています。 この記事では主に、データセットの形式について説明します。 DeepSeekの蒸留モデルのファインチューニングプロセスにおいて、データセットへのComplex_CoT(複雑な思考連鎖)の導入は、設計上の重要な違いです。基本的な質問と回答のペアのみを学習に使用した場合、モデルは深層推論能力を完全に習得するのに苦労し、結果として期待値を大幅に下回るパフォーマンスになってしまいます。この特性は、従来の大規模モデルのファインチューニングに必要なデータ要件とは根本的に異なります。 (2)モデルの微調整コード(これはフレームレスで、完全に手書きのコードです) – これがこれです。詳細は後ほど説明します。需要引入的库: `pip install torch transformers peft datasets matplotlib accelerate safetensors`
import torch `import matplotlib.pyplot as plt をインポートしfrom transformers import (` `AutoTokenizer,` `AutoModelForCausalLM,` `TrainingArguments,` `Trainer,` `TrainerCallback ) from peft import LoraConfig, get_peft_model datasets をインポートします load_dataset をインポートします`import os # 配置路径(根据实际路径修改) `model_path = r"your model path" # モデルパスdata_path = r"你的数据集路径" # 数据集路径output_path = r"your path to save the fine-tuned model" # 微調整されたモデルを保存するためのパス` # 强制使用GPU `assert torch.cuda.is_available(), //"トレーニングには GPU を使用する必要があります!" `device = torch.device("cuda") # 自定义回调记录Loss `class LossCallback(TrainerCallback): def __init__(self): 自己損失 = []` `def on_log(self, args, state, control, logs=None, **kwargs):` `if "loss" in logs:` `self.losses.append(logs["loss"])` # 数据预处理函数`def process_data(tokenizer): データセット = load_dataset("json", data_files=data_path, split="train[:1500]")` `def format_example(example):` `instruction = f"诊断问题:{example['Question']}\n详细分析:{example['Complex_CoT']}"` `inputs = tokenizer(` `f"{instruction}\n### 答案:\n{example['Response']}<|endoftext|>",` `padding="max_length",` `truncation=True,` `max_length=512,` `return_tensors="pt"` `)` `return {"input_ids": inputs["input_ids"].squeeze(0), "attention_mask": inputs["attention_mask"].squeeze(0)}` `return dataset.map(format_example, remove_columns=dataset.column_names)` # LoRA配置`peft_config = LoraConfig( r=16, lora_alpha=32, target_modules=["q_proj", "v_proj"], lora_dropout=0.05、 バイアス="なし", タスクタイプ = "CAUSAL_LM" `) # 训练参数配置`training_args = TrainingArguments( output_dir=出力パス、 per_device_train_batch_size=2, # メモリ最適化設定 gradient_accumulation_steps=4, # 勾配の累積はbatch_size=8と同等です num_train_epochs=3, 学習率=3e-4、 fp16=True, # 混合精度を有効にする ログ記録ステップ数=20、 保存戦略="いいえ", report_to="なし", 最適化="adamw_torch", no_cuda=False, # CUDAの使用を強制する dataloader_pin_memory=False, # データの読み込みを高速化 remove_unused_columns=False # 未使用の列が削除されないようにします`) def main(): # 创建输出目录os.makedirs(output_path, exist_ok=True) `# 加载tokenizer` `tokenizer = AutoTokenizer.from_pretrained(model_path)` `tokenizer.pad_token = tokenizer.eos_token` `# 加载模型到GPU` `model = AutoModelForCausalLM.from_pretrained(` `model_path,` `torch_dtype=torch.float16,` `device_map={"": device} # 强制使用指定GPU` `)` `model = get_peft_model(model, peft_config)` `model.print_trainable_parameters()` `# 准备数据` `dataset = process_data(tokenizer)` `# 训练回调` `loss_callback = LossCallback()` `# 数据加载器` `def data_collator(data):` `batch = {` `"input_ids": torch.stack([torch.tensor(d["input_ids"]) for d in data]).to(device),` `"attention_mask": torch.stack([torch.tensor(d["attention_mask"]) for d in data]).to(device),` `"labels": torch.stack([torch.tensor(d["input_ids"]) for d in data]).to(device) # 使用input_ids作为labels` `}` `return batch` `# 创建Trainer` `trainer = Trainer(` `model=model,` `args=training_args,` `train_dataset=dataset,` `data_collator=data_collator,` `callbacks=[loss_callback]` `)` `# 开始训练` `print("开始训练...")` `trainer.train()` `# 保存最终模型` `trainer.model.save_pretrained(output_path)` `print(f"模型已保存至:{output_path}")` `# 绘制训练集损失Loss曲线` `plt.figure(figsize=(10, 6))` `plt.plot(loss_callback.losses)` `plt.title("Training Loss Curve")` `plt.xlabel("Steps")` `plt.ylabel("Loss")` `plt.savefig(os.path.join(output_path, "loss_curve.png"))` `print("Loss曲线已保存")` if __name__ == "__main__": main() (3)コードの詳細な説明1. 必要なライブラリとモジュールをインポートします。機能の概要: PyTorch ベース ライブラリ、HuggingFace ユーティリティ ライブラリ、視覚化ライブラリなど、プロジェクトが依存するサードパーティ ライブラリをインポートします。 import torch `import matplotlib.pyplot as plt from transformers import ( # HuggingFace Transformer模型工具` `AutoTokenizer,` `AutoModelForCausalLM,` `TrainingArguments,` `Trainer,` `TrainerCallback ) from peft import LoraConfig, get_peft_model # 参数高效微调库from datasets import load_dataset # データセット読み込みツール`import os # 系统路径操作 クラス ライブラリの紹介: 1. torch(PyTorchライブラリのコアモジュール)- 機能: テンソル計算とニューラル ネットワーク構築機能を提供するディープラーニング フレームワーク。
- コード内での機能:
- GPU デバイスの管理 (torch.cuda.is_available() は GPU の可用性をチェックします)
- モデルトレーニング中にテンソル演算を定義する
- 混合精度トレーニングの制御 (torch.float16)
2. matplotlib.pyplot (Matplotlib プロットライブラリ)- 機能: データ視覚化ツール ライブラリ。
- コード内での機能:
- トレーニング損失曲線をプロットする(plt.plot(losses))
- トレーニング プロセス中の変化を示す損失曲線グラフ (loss_curve.png) を生成して保存します。
3. トランスフォーマー(HuggingFace トランスフォーマーライブラリ)- コアコンポーネント:
- AutoTokenizer: 事前トレーニング済みモデルに対応するトークナイザーを自動的にロードします。
- テキストをモデルが理解できるトークン ID のシーケンスに変換するために使用されます。
- AutoModelForCausalLM: 因果言語モデル (GPT シリーズなど) を自動的に読み込みます。
- 基本的な大規模言語モデル構造を提供する
- TrainingArguments: トレーニングハイパーパラメータを定義する
- バッチ サイズ、学習率、ログ頻度などを制御します。
- トレーナー: トレーニング プロセスをカプセル化するクラス。
- トレーニング ループ、勾配降下法、ログ記録などを自動的に処理します。
- TrainerCallback: トレーニングコールバックの基本クラス
- カスタム トレーニング監視ロジック (例の損失レコードなど) を実装するために使用されます。
4. peft(パラメータ効率の良い微調整)- 機能: 効率的なパラメータ微調整方法を実装するライブラリ。
- コアコンポーネント:
- LoraConfig: LoRA (Low-Rank Adaptation) の設定クラス
- ランク (r) やターゲット モジュールなどの主要なパラメータを定義します。
- `get_peft_model`: ベースモデルを PEFT モデルに変換します。
- 元のモデルのパラメータの約 0.1% のみをトレーニングすることで、効果的な微調整を実現できます。
- コード内での機能:
- LLaMAなどの大規模モデルの軽量な微調整
- メモリ使用量が約 60 ~ 70% 削減され、コンシューマー グレードの GPU に適しています。
5. データセット(HuggingFace データセットライブラリ)- 機能: 高効率データセットの読み込みおよび処理ツール。
- コア方法論:
- load_dataset: さまざまな形式でデータを読み込みます。
- JSON、CSV、Parquet などの形式をサポートします (例では JSON が使用されています)。
- マップ: データ前処理パイプライン
- カスタム書式設定関数を適用する (format_example)
- コード内での機能:
- ローカル ファイルから医療に関する質問と回答のデータセットを読み込みます。
- 生データをモデルに必要な入力形式に変換します。
6. OS(オペレーティングシステムインターフェース)- 機能: オペレーティング システム関連の機能を提供します。
- コード内での機能:
- 出力ディレクトリを作成する (os.makedirs)
- ファイルパス関連の操作
- モデルの保存パスが有効であることを確認します。
2. 構成パスとハードウェアのチェック機能の概要: モデル/データ パスを構成し、GPU の可用性チェックを強制します。 # 配置路径(根据实际路径修改) `model_path = r"your model path" # 事前トレーニング済みモデルを保存するdata_path = r"你的数据集路径" # 训练数据路径(JSON格式) output_path = r"your path to save the fine-tuned model" # 微調整済みモデルを保存する場所` # 强制使用GPU(确保CUDA可用) `assert torch.cuda.is_available(), "GPU must be used for training!" `device = torch.device("cuda") # 指定使用CUDA设备 3.カスタムトレーニングコールバッククラス
機能概要:モデルのトレーニング中に損失値の変化をリアルタイムで記録するためのカスタムコールバックを実装します。損失値は、モデルの予測値と実際の結果の差を測定します。損失値が小さいほど、モデルのパフォーマンスが優れていることを示します。 class LossCallback(TrainerCallback): def __init__(self): self.losses = [] # 存储损失值的列表 4. データ前処理関数`# 当训练过程中有日志输出时触发` `def on_log(self, args, state, control, logs=None, **kwargs):` `if "loss" in logs: # 过滤并记录损失值` `self.losses.append(logs["loss"])` 機能の概要: トレーニング データを読み込んでフォーマットし、生のデータセットをモデルが理解できる形式に変換します。 def process_data(tokenizer): # 从JSON文件加载数据集(仅取前1500条) dataset = load_dataset("json", data_files=data_path, split="train[:1500]") `# 单条数据格式化函数` `def format_example(example):` `# 拼接指令和答案(固定模板)` `instruction = f"诊断问题:{example['Question']}\n详细分析:{example['Complex_CoT']}"` `inputs = tokenizer(` `f"{instruction}\n### 答案:\n{example['Response']}<|endoftext|>", # 添加结束符` `padding="max_length", # 填充至最大长度` `truncation=True, # 超长截断` `max_length=512, # 最大序列长度` `return_tensors="pt" # 返回PyTorch张量` `)` `# 返回处理后的输入(移除batch维度)` `return {"input_ids": inputs["input_ids"].squeeze(0),`` "attention_mask": inputs["attention_mask"].squeeze(0)}` `# 应用格式化函数并移除原始列` `return dataset.map(format_example, remove_columns=dataset.column_names)`キーコード`# 单条数据格式化函数` `def format_example(example):` `# 拼接指令和答案(固定模板)` `instruction = f"诊断问题:{example['Question']}\n详细分析:{example['Complex_CoT']}"` `inputs = tokenizer(` `f"{instruction}\n### 答案:\n{example['Response']}<|endoftext|>", # 添加结束符` `padding="max_length", # 填充至最大长度` `truncation=True, # 超长截断` `max_length=512, # 最大序列长度` `return_tensors="pt" # 返回PyTorch张量` `)` `# 返回处理后的输入(移除batch维度)` `return {"input_ids": inputs["input_ids"].squeeze(0),`` "attention_mask": inputs["attention_mask"].squeeze(0)}` `# 应用格式化函数并移除原始列` `return dataset.map(format_example, remove_columns=dataset.column_names)` 1. 指示と回答を連結する- 機能: 質問と詳細な分析 (Complex_CoT) を 1 つの指示に結合します。
- 例:
- 入力: Question="熱がある場合はどうすればいいですか?"、Complex_CoT="風邪が原因かもしれません。"
- 出力: 「診断: 発熱の対処法は?\n詳細分析: 風邪が原因である可能性があります。」
- 例え: 問題と分析を一枚の紙に書くようなものです。
instruction = f"诊断问题:{example['Question']}\n详细分析:{example['Complex_CoT']}"
2. 単語セグメンテーションを使用してテキストを処理します。- 機能: 連結されたテキストをモデルが理解できる形式に変換します。
- パラメータの説明:
- padding="max_length": テキストを固定長 (512) にパディングします。
- truncation=True: テキストが 512 トークンを超える場合は切り捨てられます。
- max_length=512: 最大長は512です。
- return_tensors="pt": PyTorch テンソルを返します。
- 例:
- 入力:「診断の質問: 発熱についてはどうすればよいですか?\n詳細な分析: 風邪が原因である可能性があります。\n### 回答:\n水をたくさん飲んで、休みましょう。」
- 出力: input_ids=[101, 234, 345, ..., 102], attention_mask=[1, 1, 1, ..., 1]
- 例え: テキストを機械が理解できる数字に変換するようなものです。
inputs = tokenizer( f"{instruction}\n### 答案:\n{example['Response']}<|endoftext|>", # 添加结束符padding="max_length", # 填充至最大长度truncation=True, # 超长截断max_length=512, # 最大序列长度return_tensors="pt" # 返回PyTorch张量)`
3. 処理された入力を返す- 機能: 処理された入力データを返し、冗長な次元を削除します。
- パラメータの説明:
- input_ids: テキストに対応するトークン ID のシーケンス。
- attention_mask: どの位置が有効なトークンであるかをマークします (1 は有効、0 はパディングを示します)。
- 例え: 翻訳された数字を表に整理するようなものです。
return {"input_ids": inputs["input_ids"].squeeze(0),
4. 書式設定機能を適用する- 機能: データセット全体に書式設定関数を適用し、元の列を削除します。
- パラメータの説明:
- format_example: フォーマット関数。
- `remove_columns=dataset.column_names`: 元の列 (Question、Complex_CoT など) を削除します。
- 例え: 本全体のすべてのページを機械が理解できる形式に翻訳するようなものです。
return dataset.map(format_example, remove_columns=dataset.column_names) 5. LoRAの微調整設定機能の概要: LoRA パラメータを構成して、適応するモデル モジュールを指定します。 peft_config = LoraConfig( r=16, # LoRA秩(矩阵分解维度) lora_alpha=32, # 缩放系数(控制适配器影响强度) target_modules=["q_proj", "v_proj"], # 要适配的注意力模块(查询/值投影) lora_dropout=0.05, # 防止过拟合的Dropout率bias="none", # 不训练偏置参数task_type="CAUSAL_LM" # 任务类型(因果语言模型) ` 1. r=16: LoRAの順位- 機能: 低ランク行列の次元を制御します。ランクが小さいほど、パラメータ数が少なくなり、必要な計算量も少なくなります。
- 説明する:
- ランク (r) は低ランク行列の分解次元であり、低ランク行列のサイズを決定します。
- 例えば、r=16は低ランク行列の次元が16であることを意味します。
- 影響:
- r を小さくするとパラメータの数は減りますが、モデルのパフォーマンスが低下する可能性があります。
- r が大きくなるほどパラメータの数が増えますが、モデルのパフォーマンスが向上する可能性があります。
- 比喩:
「これは、AI の「学習ノート」に 16 ページの制限を設けるのと同じです。」 → ページ数が少ない(r が小さい):早く学習できますが、細かい部分を見逃してしまう可能性があります。 → ページを増やす(rを大きくする):ゆっくりしたペースで詳細に学習します - デフォルト値:通常は8または16に設定されます。高い方が必ずしも良いとは限りません。LoRAランクの選択は、モデルの適応性と計算効率のバランスを考慮する必要があります。ランクが高いほど表現力は高まりますが、計算コストとメモリ使用量が増加し、過学習につながる可能性があります。単純なタスクの場合は、一般的に低いランク(4や8など)が推奨されますが、複雑なタスクの場合は、高いランク(16や32など)が必要になる場合があります。
2. lora_alpha=32: スケーリング係数- 機能: 低ランク行列が元のモデルに与える影響を制御します。
- 説明する:
- lora_alpha は、低ランク行列の出力を調整するために使用されるスケーリング係数です。
- 具体的には、低ランク行列の出力にlora_alpha/rを掛けます。
- 影響:
- lora_alpha が大きくなるほど、低ランク行列の影響が強くなります。
- lora_alpha が小さいほど、低ランク行列の効果が弱くなります。
- 比喩:
音量ノブが音の大きさを決めるのと同じです。ノブを上げすぎると、耳をつんざくような、あるいは耐えられないほどの音量になる可能性があります。一方、ノブを下げすぎると、音が小さすぎて聞こえなくなる可能性があります。 `lora_alpha` が過度に大きいと、モデルの学習が不安定になる可能性があります。これは、大きな騒音が不快に感じるのと同様です。また、モデルが学習データの微調整に過度に敏感になり、過学習につながる可能性もあります。 lora_alpha が小さいほど、モデルはトレーニング中に重みをより慎重に調整するため、トレーニング プロセスはより安定しますが、新しいタスクへの適応が遅くなる可能性があります。
3. target_modules=["q_proj", "v_proj"]: ターゲットモジュール- 目的: 低ランク行列を挿入するモデル モジュールを指定します。
- 説明する:
- q_proj と v_proj は、Transformer モデルの注意メカニズム モジュールです。
- q_proj: 投影行列を照会します。
- v_proj: 値投影行列。
- LoRA は、これらの 2 つのモジュールに低ランク行列を挿入します。
- 影響:
- 異なるモジュールを選択すると、微調整の結果に影響します。
- q_proj と v_proj は、モデルのパフォーマンスに大きな影響を与えるため、通常は選択されます。
4. lora\_dropout=0.05: ドロップアウト率- 機能: 過剰適合を防ぐ。
- 説明する:
- ドロップアウトは、モデルが特定の機能に過度に依存するのを防ぐために、ニューロンの一部をランダムに破棄する正規化手法です。
- lora_dropout=0.05 は、トレーニング中に低ランク行列パラメータの 5% がランダムに破棄されることを意味します。
- 影響:
- ドロップアウト率を大きくするとモデルの堅牢性は高まりますが、トレーニング効率は低下する可能性があります。
- ドロップアウト レートを小さくすると、正規化の効果は減りますが、トレーニング速度は上がる可能性があります。
5. bias="none": バイアスパラメータ- 機能: バイアスパラメータを学習するかどうかを制御します。バイアスパラメータの目的は、モデルの出力にベースラインオフセットを提供し、モデルがデータに適合できるようにすることです。
- 説明する:
- bias="none" は、バイアスパラメータがトレーニングされていないことを意味します。
- その他のオプションには、「all」(すべてのバイアス パラメータをトレーニング)と「lora_only」(LoRA 関連のバイアス パラメータのみをトレーニング)があります。
- 影響:
- バイアス パラメータをトレーニングしないとパラメータの数は減りますが、モデルのパフォーマンスに影響する可能性があります。
6. task_type="CAUSAL_LM": タスクの種類- 機能: タスクの種類を指定します。
- 説明する:
- CAUSAL_LM は因果言語モデルの略で、生成タスク (GPT など) です。
- その他のタスク タイプには、シーケンス分類 (SEQ_CLS)、シーケンス間 (SEQ_2_SEQ) などがあります。
- 影響:
- タスクの種類によって、LoRA の実装方法が変わります。
トレーニングパラメータの設定機能の概要: トレーニングのハイパーパラメータとハードウェア関連のオプションを設定します。 training_args = TrainingArguments( output_dir=output_path, # 输出目录(模型/日志) per_device_train_batch_size=2, # 单GPU批次大小(显存优化) gradient_accumulation_steps=4, # 梯度累积步数(等效batch_size=8) num_train_epochs=3, # 训练轮次learning_rate=3e-4, # 初始学习率fp16=True, # 启用混合精度训练(节省显存) logging_steps=20, # 每隔20步记录日志save_strategy="no", # 不保存中间检查点report_to="none", # 禁用第三方报告(如W&B) optim="adamw_torch", # 优化器类型no_cuda=False, # 强制使用CUDA dataloader_pin_memory=False, # 禁用锁页内存(加速数据加载) remove_unused_columns=False # 保留未使用的列(避免数据错误) ) 1. output_dir=output_path: 出力ディレクトリ- 目的: トレーニング中のモデルとログを保存するパスを指定します。ここでの output_path は、最初に変数で既に指定されています。
- 説明する:
- トレーニング中に生成されたモデルのチェックポイント、ログ ファイル、その他のデータは、このディレクトリに保存されます。
- 例:
- output_path = "./output" の場合、すべてのファイルは ./output ディレクトリに保存されます。
2. per_device_train_batch_size=2: 単一GPUバッチサイズ- 機能: 各 GPU のトレーニング バッチ サイズを設定します。
- 説明する:
- バッチ サイズとは、モデルに毎回入力されるサンプルの数を指します。
- バッチ サイズを小さくすると GPU メモリを節約できますが、トレーニング速度が低下する可能性があります。
- 例:
- 1 つの GPU を使用する場合、トレーニング セッションごとに 2 つのデータ ポイントが入力されます。
3. gradient_accumulation_steps=4: 勾配累積ステップ数
4. num_train_epochs=3: トレーニングエポック数- 機能: データセット全体に対するモデルのトレーニング エポックの数を設定します。
- 説明する:
- 1 エポックは、モデルによるトレーニング データセットの完全な走査を表します。
- ここで 3 に設定すると、モデルは 3 ラウンドトレーニングされることになります。
- 例:
- データセットに 1000 個のデータ ポイントがある場合、モデルはこれらの 1000 個のデータ ポイントを 3 回反復処理します。
5. learning_rate=3e-4: 初期学習率
6. fp16=True: 混合精度トレーニング- 機能: 混合精度トレーニングを可能にし、GPU メモリを節約し、トレーニングを高速化します。
- 説明する:
- 混合精度トレーニングとは、16 ビット (半精度) と 32 ビット (単精度) の浮動小数点数を同時に使用することを指します。
- 16 ビット浮動小数点数はビデオメモリの使用量が少なく、計算が高速です。
- 例:
- ビデオメモリが不足している場合は、fp16 を有効にするとビデオメモリの使用量が大幅に削減されます。
7. logging_steps=20: ログ記録頻度- 機能: ログを記録する間隔を設定します。
- 説明する:
- ログには損失値や学習率などの情報が含まれます。
- ここで 20 に設定すると、20 ステップごとにログが記録されることになります。
- 例:
- トレーニング ステップの合計数が 1000 の場合、50 個のログ エントリが記録されます (1000 / 20 = 50)。
8. save_strategy="no": 保存戦略- 機能: 中間チェックポイントを保存するかどうかを設定します。
- 説明する:
- 「no」は中間チェックポイントを保存しないことを意味します。
- その他のオプションには、「エポック」(ラウンドごとに 1 回保存)や「ステップ」(特定のステップ数ごとに 1 回保存)などがあります。
- 例:
- 「epoch」に設定すると、モデルは各トレーニング ラウンドの後に 1 回保存されます。
9. report_to="none": サードパーティレポートを無効にする- 機能: サードパーティのログ レポート ツール (Weights & Biases など) を無効にします。
- 説明する:
- ログを記録するためにサードパーティ製のツールを使用する必要がない場合は、「なし」に設定できます。
- 例:
- 「wandb」に設定すると、ログは Weights & Biases プラットフォームに同期されます。
10. optim="adamw_torch": オプティマイザーの種類- 目的: オプティマイザーの種類を指定します。
- 説明する:
- adamw_torch は、Adam と重み減衰を組み合わせた、よく使用されるオプティマイザーです。
- ほとんどのディープラーニングタスクに適しています。
- 例:
- トレーニングが不安定な場合は、SGD(確率的勾配降下法)などの他の最適化手法を試すことができます。SGDは、損失関数の勾配を計算し、損失関数を最小化するようにパラメータを更新することで、モデルパラメータを最適化するアルゴリズムです。
11. no_cuda=False: CUDAの使用を強制する- 機能: トレーニングに GPU の使用を強制します。
- 説明する:
- `no_cuda=False` は GPU が使用されていることを示します。
- True に設定すると、CPU が使用されます (非推奨)。
- 例:
- GPU が利用可能な場合、モデルは GPU を使用して自動的にトレーニングされます。
12. dataloader_pin_memory=False: ページロックされたメモリを無効にします。- 機能: データの読み込みを高速化するために固定メモリを使用するかどうかを設定します。
- 説明する:
- これを False に設定すると、ページ ロック メモリが無効になります。
- 例:
- ホストに十分なメモリがある場合は、True に設定してトレーニングを高速化できます。
13. `remove_unused_columns=False`: 未使用の列を保持します。- 機能: データセットから未使用の列を削除するかどうかを設定します。
- 説明する:
- True に設定すると、モデルで使用されていないデータセット内の列が削除されます。
- これを False に設定すると、すべての列が保持されます。
- 例:
- データセットに追加情報 (ID など) が含まれている場合は、これらの列を保持できます。
主な機能(トレーニングプロセス)機能の概要: すべてのコンポーネントを統合して、完全なトレーニング プロセスを実行します。 def main(): キーコード: 1. トークナイザーをロードし、フィラーを設定します。- 機能: 事前トレーニング済みモデルの単語セグメンターを読み込み、パディング文字を設定します。
- 説明する:
- AutoTokenizer.from_pretrained: モデルに一致するトークナイザーを自動的に読み込みます。
- tokenizer.pad_token = tokenizer.eos_token: パッド トークンとしてトークンの末尾 (EOS) を使用します。
- 例:
- 入力シーケンスの長さが十分でない場合は、EOS が埋め込まれます。
tokenizer = AutoTokenizer.from_pretrained(model_path) 2. 事前学習済みモデルをロードする- 機能: 事前トレーニング済みの言語モデルを読み込み、ハードウェア関連の設定を構成します。
- 説明する:
- AutoModelForCausalLM.from_pretrained: 因果言語モデル (GPT など) を読み込みます。
- torch_dtype=torch.float16: 半精度 (16 ビット浮動小数点数) を使用してモデルをロードし、ビデオ メモリを節約します。
- device_map={"": device}: 指定された GPU デバイスにモデルを読み込みます。
- 例:
- device = "cuda:0" の場合、モデルは最初の GPU にロードされます。
model = AutoModelForCausalLM.from_pretrained( 3. データ処理機能- 機能: 複数のデータエントリを 1 つのバッチに整理します。
- 説明する:
- input_ids: 入力シーケンスのトークン ID。
- attention_mask: 有効なトークンの位置をマークします。
- ラベル: 因果言語モデルのラベルは入力と同じです (モデルは次のトークンを予測する必要があります)。
- 例:
- 入力が「「診断の質問:熱はどうしたらいいですか?」「診断の質問:頭痛はどうしたらいいですか?」」の場合、一括処理されます。
def data_collator(data): 4. トレーナーを初期化する- 機能: トレーナー オブジェクトを作成し、トレーニング プロセスを管理します。
- 説明する:
- model: トレーニングするモデル。
- args: トレーニング パラメーター (バッチ サイズ、学習率など)。
- train_dataset: トレーニング データセット。
- data_collator: カスタム データ コレーター関数。
- コールバック: トレーニング コールバック (損失レコードなど)。
trainer = Trainer( IV. 閉会の辞この章のコード修正、データ収集、記事の洗練化に多大な協力をしてくれた Deepseek の公式 Web サイト (完全版) に深く感謝します。 この章の微調整はまだ非常に初歩的なものであり、損失関数の収束が理想的とは言えず、最適化の余地がかなり残されています。例えば、データセットの構築はより洗練させる必要があり、コード構造はさらなる最適化と調整が必要です。皆様からの貴重なご提案や修正を心よりお待ちしております。皆様のご協力により、共に成長し、AI学習の楽しさをさらに探求していくことができます。 ぜひ高評価をお願いします! *トリプルタップ↓* |