はじめに

以前、MacBookでマルチターン対話のDPO(Direct Preference Optimization)訓練を試みたところ、データ量不足が原因と思われる失敗に終わりました。そこで今回は、クラウドGPUサービス「Lambda Labs」を使って、データ量を2.5倍に増やし、より強力な環境で再挑戦してみました。

Lambda Labsとは?

Lambda Labsは、機械学習向けのクラウドGPUサービスです。主な特徴:
  • シンプルな料金体系: 時間課金、わかりやすい価格設定
  • 高性能GPU: A100、H100、GH200など最新GPUが利用可能
  • 即座に起動: アカウント作成からインスタンス起動まで数分
  • ML向けに最適化: CUDA、PyTorch、TensorFlowなど主要ライブラリがプリインストール

競合と比較すると:

  • RunPod: より安価だが、設定が複雑
  • Vast.ai: 最安値だが、品質にばらつき
  • AWS/GCP: 高機能だが、料金体系が複雑で高額

今回はシンプルさを重視してLambda Labsを選択しました。

今回の実験設定

目的

MacBookでの失敗(20会話、成功率0%)をGPU環境とデータ拡張で克服できるか検証

環境

  • GPU: NVIDIA GH200 480GB (Grace Hopper Superchip)
  • VRAM: 480GB(驚異的な容量!)
  • CUDA: 12.8
  • PyTorch: 2.7.0
  • 料金: 約$4/時間

データ

  • 会話数: 20 → 50会話(2.5倍)
  • 形式: 2-3ターンの日本語マルチターン対話
  • トピック: 結婚式、転職、ヨガ、株式、ブログ、筋トレなど30種類を追加

モデル

  • ベースモデル: rinna/japanese-gpt2-medium (337M parameters)
  • 訓練方法: 2段階アプローチ(SFT → DPO)
  • LoRA: Rank 16、訓練パラメータ0.47%

訓練パラメータ

Stage 1 (SFT): 10エポック、batch_size=4、lr=5e-5
Stage 2 (DPO): 5エポック、batch_size=2、lr=5e-6、beta=0.1

Lambda Labsでの作業フロー

1. インスタンス起動(5分)

  • Webコンソールからワンクリックで起動
  • SSH鍵を登録
  • IPアドレスが即座に発行される

2. 環境セットアップ(30分)

  • Python 3.10、CUDA 12.8が最初から入っている
  • 必要なのはML用ライブラリの追加のみ:
pip3 install transformers==4.38.0 peft==0.9.0 'numpy<2'

3. ファイル転送(10分)

  • ローカルで作成したスクリプトとデータをscp転送
  • tarで圧縮して効率的に転送

4. 訓練実行(20分)

全自動スクリプトで実行:
./run_all_training.sh

内容: 1. SFT訓練(10エポック、約5分) 2. DPO訓練(5エポック、約5分) 3. 検証(約1分)

5. 結果ダウンロード(5分)

  • 訓練済みアダプター(6.0MB × 2)
  • ログファイル(3種類)

訓練結果

SFT訓練: ✅ 成功

損失が順調に減少:

エポック1: 3.1166
エポック5: 2.9723
エポック10: 2.6591
総改善: -14.7%

モデルは会話応答能力を獲得できました。

DPO訓練: ❌ 失敗

驚くべきことに、DPO損失がほぼ横ばい:

エポック1: 0.6927
エポック2: 0.6935
エポック3: 0.6929
エポック4: 0.6928
エポック5: 0.6931

これは選好学習が全く機能していないことを示しています。

検証結果

平均 Chosen 対数確率変化: -0.5273 ❌
平均 Rejected 対数確率変化: -0.6413 ✅
成功率: 0/50 (0%)
Chosenが増加すべきなのに減少しています。完全な失敗です。

衝撃的な発見

最も重要な発見は、データ量を増やしたら逆に悪化したことです:

| 環境 | 会話数 | Chosen変化 | 成功率 | |------|--------|-----------|--------| | MacBook | 20会話 | -0.1320 | 0% | | Lambda Labs | 50会話 | -0.5273 | 0% | | (参考)単一ターン | 52ペア | +0.1355 ✅ | 100% |

2.5倍のデータで4倍悪化という結果に。 これは「データ量不足」という当初の仮説が完全に誤りだったことを示しています。

失敗の原因分析

1. DPO損失の異常

正常なDPO訓練では損失が減少しますが、今回はほぼ横ばい。選好を学習していません。

2. マルチターン対話の複雑性

単一ターンでは完璧に動作するのに、マルチターンで失敗するのは:
  • 会話履歴フォーマットがGPT-2に不適切
  • 長い文脈での位置エンコーディングの問題
  • 文脈依存の選好判断が複雑すぎる

3. データ設計の問題

人工的に作成した会話データの質に問題がある可能性が高いです。

Lambda Labsの使用感

良かった点

  • セットアップが超簡単: アカウント作成から訓練開始まで1時間以内
  • 高性能: GH200の480GB VRAMは驚異的、メモリ不足の心配なし
  • 料金が明確: 時間課金で予算管理しやすい
  • ML環境が完備: CUDA、PyTorchなど主要ツールがプリインストール

改善してほしい点

  • ⚠️ リージョン選択不可: 最寄りのデータセンターを選べない
  • ⚠️ 永続ストレージが高額: インスタンス削除でデータ消失
  • ⚠️ SSH鍵管理: 複数鍵の管理がやや不便

コスト

今回の実験:約1時間 × $4/時間 = 約$4 MacBookで同じ訓練をしようとすると発熱とバッテリー消費で現実的ではないため、この価格は妥当です。

得られた教訓

1. ハードウェアは魔法ではない

高性能GPUを使っても、根本的なアプローチが間違っていれば意味がない。

2. データ量 ≠ データ品質

量を増やすだけでは解決しない。むしろ悪化することもある。

3. 段階的な検証が重要

  • 単一ターン: ✅ 成功
  • マルチターン: ❌ 失敗
この対比が問題の所在を明確にしました。

4. クラウドGPUの有用性

失敗したとはいえ、1時間$4で最先端GPUを使えるのは素晴らしい。ローカル環境では不可能な実験ができました。

今後の方向性

マルチターン対話DPOを成功させるには:

1. 対話専用モデルへ変更 - GPT-2 → rinna/japanese-gpt-neox-instruction-sft - 会話フォーマットに対応したモデル

2. 会話フォーマット改善 - 現在: "User: ... Assistant: ..." - 改善案: "<|user|>...<|assistant|>..."

3. ターン数削減 - 3ターン → 2ターンでシンプル化

4. 実データ使用 - 人工データ → 実際の人間の対話ログ

まとめ

Lambda Labsを使ったマルチターン対話DPO訓練は技術的には失敗でしたが、多くの知見を得られました:
  • ✅ Lambda Labsは使いやすく、ML実験に最適
  • ✅ GH200 480GBの性能は圧倒的
  • ❌ データ量増加は解決策ではない
  • ❌ マルチターンDPOは根本的な見直しが必要
失敗から学ぶことこそが研究の本質です。次は対話専用モデルで再挑戦します。

参考資料

--- 執筆日: 2025-10-16 実験時間: 約5時間 コスト: 約$4 クラウドGPUでの機械学習実験、興味がある方はぜひ試してみてください!