\n",
+ "
演習: 微調整のためのLoRAパラメータを定義
\n",
+ "
Hugging Faceのハブからデータセットを取得し、それを使用してモデルを微調整します。
\n",
+ "
難易度レベル
\n",
+ "
🐢 一般的なパラメータを使用して任意の微調整を行う
\n",
+ "
🐕 パラメータを調整し、重みとバイアスでレビューする
\n",
+ "
🦁 パラメータを調整し、推論結果の変化を示す
\n",
+ "
"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "blDSs9swouLk"
+ },
+ "outputs": [],
+ "source": [
+ "from peft import LoraConfig\n",
+ "\n",
+ "# TODO: LoRAパラメータを設定\n",
+ "# r: LoRA更新行列のランク次元(小さいほど圧縮率が高い)\n",
+ "rank_dimension = 6\n",
+ "# lora_alpha: LoRA層のスケーリングファクター(高いほど適応が強い)\n",
+ "lora_alpha = 8\n",
+ "# lora_dropout: LoRA層のドロップアウト確率(過学習を防ぐのに役立つ)\n",
+ "lora_dropout = 0.05\n",
+ "\n",
+ "peft_config = LoraConfig(\n",
+ " r=rank_dimension, # ランク次元 - 通常4-32の範囲\n",
+ " lora_alpha=lora_alpha, # LoRAスケーリングファクター - 通常ランクの2倍\n",
+ " lora_dropout=lora_dropout, # LoRA層のドロップアウト確率\n",
+ " bias=\"none\", # LoRAのバイアスタイプ。対応するバイアスはトレーニング中に更新されます。\n",
+ " target_modules=\"all-linear\", # LoRAを適用するモジュール\n",
+ " task_type=\"CAUSAL_LM\", # モデルアーキテクチャのタスクタイプ\n",
+ ")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "l5NUDPcaouLl"
+ },
+ "source": [
+ "トレーニングを開始する前に、使用するハイパーパラメータ(`TrainingArguments`)を定義する必要があります。"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "NqT28VZlouLl"
+ },
+ "outputs": [],
+ "source": [
+ "# トレーニング設定\n",
+ "# QLoRA論文の推奨に基づくハイパーパラメータ\n",
+ "args = SFTConfig(\n",
+ " # 出力設定\n",
+ " output_dir=finetune_name, # モデルチェックポイントを保存するディレクトリ\n",
+ " # トレーニング期間\n",
+ " num_train_epochs=1, # トレーニングエポック数\n",
+ " # バッチサイズ設定\n",
+ " per_device_train_batch_size=2, # GPUごとのバッチサイズ\n",
+ " gradient_accumulation_steps=2, # 大きな効果的なバッチのための勾配蓄積\n",
+ " # メモリ最適化\n",
+ " gradient_checkpointing=True, # メモリ節約のための計算トレードオフ\n",
+ " # オプティマイザ設定\n",
+ " optim=\"adamw_torch_fused\", # 効率のために融合されたAdamWを使用\n",
+ " learning_rate=2e-4, # 学習率(QLoRA論文)\n",
+ " max_grad_norm=0.3, # 勾配クリッピングの閾値\n",
+ " # 学習率スケジュール\n",
+ " warmup_ratio=0.03, # ウォームアップのステップの割合\n",
+ " lr_scheduler_type=\"constant\", # ウォームアップ後に学習率を一定に保つ\n",
+ " # ロギングと保存\n",
+ " logging_steps=10, # Nステップごとにメトリックをログ\n",
+ " save_strategy=\"epoch\", # 各エポックごとにチェックポイントを保存\n",
+ " # 精度設定\n",
+ " bf16=True, # bfloat16精度を使用\n",
+ " # 統合設定\n",
+ " push_to_hub=False, # HuggingFace Hubにプッシュしない\n",
+ " report_to=\"none\", # 外部ロギングを無効化\n",
+ ")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "cGhR7uFBouLl"
+ },
+ "source": [
+ "すべてのビルディングブロックが揃ったので、`SFTTrainer`を作成してモデルのトレーニングを開始します。"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "M00Har2douLl"
+ },
+ "outputs": [],
+ "source": [
+ "max_seq_length = 1512 # モデルとデータセットのパッキングの最大シーケンス長\n",
+ "\n",
+ "# LoRA設定でSFTTrainerを作成\n",
+ "trainer = SFTTrainer(\n",
+ " model=model,\n",
+ " args=args,\n",
+ " train_dataset=dataset[\"train\"],\n",
+ " peft_config=peft_config, # LoRA設定\n",
+ " max_seq_length=max_seq_length, # 最大シーケンス長\n",
+ " tokenizer=tokenizer,\n",
+ " packing=True, # 効率のために入力パッキングを有効化\n",
+ " dataset_kwargs={\n",
+ " \"add_special_tokens\": False, # テンプレートで処理される特殊トークン\n",
+ " \"append_concat_token\": False, # 追加のセパレータは不要\n",
+ " },\n",
+ ")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "zQ_kRN24ouLl"
+ },
+ "source": [
+ "トレーニングを開始するには、`Trainer`インスタンスの`train()`メソッドを呼び出します。これにより、トレーニングループが開始され、モデルが3エポックにわたってトレーニングされます。PEFTメソッドを使用しているため、適応されたモデルの重みのみを保存し、完全なモデルは保存しません。"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "Tq4nIYqKouLl"
+ },
+ "outputs": [
+ {
+ "data": {
+ "application/vnd.jupyter.widget-view+json": {
+ "model_id": "300e5dfbb4b54750b77324345c7591f9",
+ "version_major": 2,
+ "version_minor": 0
+ },
+ "text/plain": [
+ " 0%| | 0/72 [00:00, ?it/s]"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/plain": [
+ "TrainOutput(global_step=72, training_loss=1.6402628521124523, metrics={'train_runtime': 195.2398, 'train_samples_per_second': 1.485, 'train_steps_per_second': 0.369, 'total_flos': 282267289092096.0, 'train_loss': 1.6402628521124523, 'epoch': 0.993103448275862})"
+ ]
+ },
+ "execution_count": 26,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# トレーニングを開始し、モデルは自動的にハブと出力ディレクトリに保存されます\n",
+ "trainer.train()\n",
+ "\n",
+ "# モデルを保存\n",
+ "trainer.save_model()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "y4HHSYYzouLl"
+ },
+ "source": [
+ "Flash Attentionを使用して15kサンプルのデータセットで3エポックのトレーニングを行った結果、`g5.2xlarge`で4:14:36かかりました。このインスタンスのコストは`1.21$/h`で、合計コストは約`5.3$`です。\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "C309KsXjouLl"
+ },
+ "source": [
+ "### LoRAアダプタを元のモデルに統合\n",
+ "\n",
+ "LoRAを使用する場合、トレーニング中はアダプタ重みのみを学習し、ベースモデルは固定されます。トレーニング中は、これらの軽量なアダプタ重み(約2-10MB)のみを保存し、完全なモデルのコピーは保存しません。ただし、デプロイのためにアダプタをベースモデルに統合することを検討するかもしれません:\n",
+ "\n",
+ "1. **デプロイの簡素化**:ベースモデル+アダプタの代わりに単一のモデルファイル\n",
+ "2. **推論速度**:アダプタ計算のオーバーヘッドなし\n",
+ "3. **フレームワークの互換性**:サービングフレームワークとの互換性向上\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from peft import AutoPeftModelForCausalLM\n",
+ "\n",
+ "\n",
+ "# CPU上でPEFTモデルを読み込む\n",
+ "model = AutoPeftModelForCausalLM.from_pretrained(\n",
+ " pretrained_model_name_or_path=args.output_dir,\n",
+ " torch_dtype=torch.float16,\n",
+ " low_cpu_mem_usage=True,\n",
+ ")\n",
+ "\n",
+ "# LoRAとベースモデルを統合して保存\n",
+ "merged_model = model.merge_and_unload()\n",
+ "merged_model.save_pretrained(\n",
+ " args.output_dir, safe_serialization=True, max_shard_size=\"2GB\"\n",
+ ")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "-yO6E9quouLl"
+ },
+ "source": [
+ "## 3. モデルをテストして推論を実行\n",
+ "\n",
+ "トレーニングが完了したら、モデルをテストしたいと思います。元のデータセットから異なるサンプルを読み込み、単純なループと精度をメトリックとして使用してモデルを評価します。\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "
+
参加は無料で、今すぐ始められます!
+
このコースはオープンでピアレビューされています。コースに参加するには、プルリクエストを開くことで、あなたの作業をレビューに提出してください。以下の手順に従ってください:
+
+ - リポジトリをフォークします こちら
+ - 資料を読み、変更を加え、演習を行い、自分の例を追加します。
+ - december_2024ブランチでプルリクエストを開きます
+ - レビューを受けてマージされます
+
+
これにより、学習を助け、常に改善されるコミュニティ主導のコースを構築することができます。
+
+
+このプロセスについては、この[ディスカッションスレッド](https://github.com/huggingface/smol-course/discussions/2#discussion-7602932)で議論できます。
+
+## コース概要
+
+このコースは、小型言語モデルを使用した実践的なアプローチを提供し、初期のトレーニングから本番展開までをカバーします。
+
+| モジュール | 説明 | ステータス | リリース日 |
+|--------|-------------|---------|--------------|
+| [インストラクションチューニング](./1_instruction_tuning) | 教師あり微調整、チャットテンプレート、および基本的な指示に従う方法を学びます | ✅ 準備完了 | 2024年12月3日 |
+| [選好整合](./2_preference_alignment) | DPOおよびORPO技術を探求し、人間の選好にモデルを整合させる方法を学びます | ✅ 準備完了 | 2024年12月6日 |
+| [パラメータ効率の良い微調整](./3_parameter_efficient_finetuning) | LoRA、プロンプトチューニング、および効率的な適応方法を学びます | ✅ 準備完了 | 2024年12月9日 |
+| [評価](./4_evaluation) | 自動ベンチマークを使用し、カスタムドメイン評価を作成する方法を学びます | ✅ 準備完了 | 2024年12月13日 |
+| [ビジョン言語モデル](./5_vision_language_models) | マルチモーダルモデルをビジョン言語タスクに適応させる方法を学びます | ✅ 準備完了 | 2024年12月16日 |
+| [合成データセット](./6_synthetic_datasets) | トレーニング用の合成データセットを作成し、検証する方法を学びます | ✅ 準備完了 | 2024年12月20日 |
+| [推論](./7_inference) | モデルを効率的に推論する方法を学びます | [🚧 作業中](https://github.com/huggingface/smol-course/pull/150) | 2025年1月8日 |
+| [エージェント](./8_agents) | 自分のエージェントAIを構築する方法を学びます | ✅ 準備完了 | 2025年1月13日 ||
+| キャップストーンプロジェクト | 学んだことを使ってリーダーボードを登りましょう! | [🚧 作業中](https://github.com/huggingface/smol-course/pull/97) | 2025年1月10日 |
+
+## なぜ小型言語モデルなのか?
+
+大規模な言語モデルは印象的な能力を示していますが、しばしば多くの計算リソースを必要とし、特定のアプリケーションには過剰な場合があります。小型言語モデルは、ドメイン固有のアプリケーションに対していくつかの利点を提供します:
+
+- **効率性**:トレーニングと展開に必要な計算リソースが大幅に少ない
+- **カスタマイズ**:特定のドメインに簡単に微調整および適応可能
+- **制御**:モデルの動作をよりよく理解し、制御できる
+- **コスト**:トレーニングと推論の運用コストが低い
+- **プライバシー**:データを外部APIに送信せずにローカルで実行可能
+- **グリーンテクノロジー**:リソースの効率的な使用を推進し、炭素排出量を削減
+- **学術研究の容易さ**:最先端のLLMを使用した学術研究のための簡単なスターターを提供し、物流の制約を減らす
+
+## 前提条件
+
+開始する前に、以下を確認してください:
+- 機械学習と自然言語処理の基本的な理解
+- Python、PyTorch、および`transformers`ライブラリに精通していること
+- 事前学習された言語モデルとラベル付きデータセットへのアクセス
+
+## インストール
+
+コースをパッケージとして維持しているため、パッケージマネージャーを使用して依存関係を簡単にインストールできます。`uv`をお勧めしますが、`pip`や`pdm`などの代替手段も使用できます。
+
+### `uv`を使用する場合
+
+`uv`がインストールされている場合、次のようにしてコースをインストールできます:
+
+```bash
+uv venv --python 3.11.0
+uv sync
+```
+
+### `pip`を使用する場合
+
+すべての例は**python 3.11**環境で実行されるため、次のように環境を作成し、依存関係をインストールします:
+
+```bash
+# python -m venv .venv
+# source .venv/bin/activate
+pip install -r requirements.txt
+```
+
+### Google Colab
+
+**Google Colabから**は、使用するハードウェアに基づいて柔軟に依存関係をインストールする必要があります。次のようにします:
+
+```bash
+pip install transformers trl datasets huggingface_hub
+```
+