
OpenAI DevDay 2024 |蒸留による強力な小型モデルのチューニング
7,457 文字
(スティーブン)
皆さん、こんにちは。Dev Day Londonへようこそ。ご存じのように、この1年は生成系AIにとって非常にエキサイティングな年でした。2023年にはGPT-4oをリリースし、多くの方が初めて強力な人工知能と直接やり取りする機会を得ました。そして、皆さんのような開発者は、素早くAIを受け入れ、プロトタイプを構築し、この新たなテクノロジーを探求しました。あの時期は、急速な実験と反復の時代でした。
ところが2024年になると、状況は変わりました。開発者たちはこれまで以上にAIへの投資を行いつつありましたが、もはや単純なプロトタイプを作っているわけではありません。開発者たちは本番品質のAIアプリケーションを出荷し始めたのです。本番環境にデプロイする段階では、ただ動かせばいいというものではありません。すべてをスムーズに、低コストで、そして大規模に運用することが求められます。
(ジョン)
皆さん、こんにちは。私の名前はJohn Allardです。
(スティーブン)
そして私がSteven Heidelです。私たちは二人で、OpenAIのモデルカスタマイズプラットフォームに携わっています。つまり、あなた方のような開発者がAIをプロトタイプからスケールへと進め、その恩恵をできる限り広く行き渡らせる手助けをしているのです。
今日は、AIアプリケーションのスケールアップを変える新たなテクノロジーについてお話しします。そのテクニックとは、「ディスティレーション(distillation)」です。ディスティレーションは、高性能で小型なモデルを生み出すことを可能にします。
本日は、ディスティレーションがなぜ重要なのか、その仕組み、そして適用例やベストプラクティスについてお伝えします。ではまず、なぜディスティレーションが重要なのか、Johnにバトンタッチします。
(ジョン)
ありがとう、Steven。
AIプロトタイプを開発する段階では、あなたが本当に気にするのはただ一つ、「とりあえず動かす」ことです。見た目がきれいでなくても、エレガントでなくても、信頼性が今ひとつでも構いません。ただ概念実証を示したいだけです。
しかし、そのAIプロトタイプを本番運用へと移すときには、「動く」以上のことが重要になります。「スケールさせる」ことが求められ、そこには新たな課題が生まれます。
大規模運用時には、単に動くだけでは不十分です。例えばアップタイムが重要になります。大規模になればダウンタイムは許されません。また、レートリミットにも気を配る必要があります。モデルプロバイダが、あなたのアプリが軌道に乗り始め、バイラル化しそうなタイミングでアクセスを制限してしまうような事態は避けたいですよね。
さらにはレイテンシが問題になります。特にリアルタイムアプリケーションや複数のLLM呼び出しを連続で行う場合、待ち時間は極力短くしたいところです。そして何よりコストです。本番では、動くだけでなく、効率的に動かす必要があります。つまり、経済的に成り立つユニットエコノミクスが求められ、ユーザ1人あたりのLLMコールにかかる費用が収益を上回ってしまっては意味がありません。結局、LLM使用は持続可能でなければなりません。
さて、アプリケーションに適したモデルを選ぶとき、あなたが主に重視するのは「価格」と「知能」(intelligence)の2点です。
まずは価格について考えてみましょう。ここではGPT-4oとGPT-4o Miniを例にとります。GPT-4oは100万トークンあたり約4ドル、一方、GPT-4o Miniは100万トークンあたり約0.24ドルと、約15倍も安価です。グラフを見れば、「じゃあGPT-4o Miniでいいじゃないか」と思うかもしれません。しかし落とし穴があります。小型モデルが、あなたのアプリケーションに必要な知能レベルを満たせるでしょうか?
つまり、高額なGPT-4oがもたらす追加コストに見合うインテリジェンスは何なのか?という問いです。
知能面を考えると、GPT-4oはたしかに高価ですが、その代わり非常に幅広いドメインで極めて高い知性を発揮します。大学院レベルの物理や高度な数学、それからChatGPTのような汎用チャットボットまで、さまざまな分野でGPT-4oは輝かしい性能を示します。MMLUやGPQA、GSM8Kといった難易度の高い学術系ベンチマークでも卓越した結果を残します。しかし、もう一つ考えるべき点があります。それは、あなたが求めるのは本当にこの種の広範な知能なのか、ということです。
(スティーブン)
今、Johnが言った通り、GPT-4oとGPT-4o Miniのどちらを使うかで、コストと知能のトレードオフがあります。どうやって判断すればよいのでしょうか。
ここでお伝えしたいのは、MMLUのような学術的ベンチマークは、モデルを総合的に比較する上では参考になりますが、あまり真に受け過ぎてはいけないということです。
オンラインで公開されているこうしたベンチマークは、モデルの大まかな能力比較には使えますが、実際のアプリケーションが求めるタスクとは異なります。公開されている数値は単なる指標に過ぎず、ユーザがあなたのアプリを通じて体験する現実には直接対応しません。
学術ベンチマークはたしかに幅広い知能を測るのに有効ですが、アプリケーションが直面する現実の課題は往々にしてずっと狭い領域に特化しています。例えばレビュー分類や財務情報の抽出、メール返信文の生成といったものです。MMLUのスコアなどは、レビュー分類の場面ではほとんど意味を持ちません。重要なのは、正しくレビューのカテゴリを判断できるかどうかです。
では、どうすれば特定タスクで非常に高いスコアを出せるモデルを作れるのでしょう?あるいは、広範な知能を必ずしも必要とせず、狭い範囲の知能で十分な場合はどうすればよいのでしょうか。
ここで活躍するのがディスティレーション(distillation)です。
ディスティレーションとは、大きなモデルの知能をより小さなモデルへと転移させる技術です。具体的には、大きなモデルの出力結果を小さなモデルへファインチューニングすることで、小さなモデルが大きなモデルと同様の振る舞いを身につけられるようにするのです。
要は、大規模モデルの能力を「圧縮」し、特定のタスク領域に特化した小型モデルにするイメージです。
必要なのは大きなモデルの全ての知能ではなく、そのタスクに必要な分だけの知能なのです。
ディスティレーションの手順は3段階あります。
まず最初は、タスク固有の評価指標(eval)を作成すること。何を改善し、何を測りたいのかを明確にします。先ほどのレビュー分類を例にとると、「正しくレビューカテゴリを判定する割合」などが分かりやすい評価指標です。評価指標がなければ、何をどのように改善すべきか分かりません。
次に、大きなモデルから得られる優れた回答例を多数収集します。つまり、実際のアプリで使われるような入力に対して、大きなモデルがどう回答するかを大量に記録するのです。これで入力と理想的な出力がペアになったデータセットが手に入ります。
最後に、そのデータセットを用いて小さなモデルをファインチューニングします。これで小さなモデルは大きなモデルが示した優れた応答スタイルを学習し、狭い領域のタスクで大モデルと近いパフォーマンスを発揮できるようになります。
実は、これまでも私たちのファインチューニングAPIを使えばディスティレーションは可能でした。しかし、データセットの準備や評価など、多くの手間がかかっていました。
ここで質問ですが、この中でOpenAIのファインチューニングAPIを試したことがある方はどれくらいいらっしゃいますか?
(会場で挙手)
素晴らしいですね、半数ほどでしょうか。皆さんの中にはファインチューニングやディスティレーションにすでに成功している方もいますが、これまではやや複雑でした。
ディスティレーションを行うためには、まずプロダクションでモデルが返した回答例を蓄積する仕組みが必要でした。そのうえでJSONLファイルを生成し、アップロードし、ファインチューニングジョブを走らせ… さらに評価用のエバリュエーションフレームワークを構築し、どのモデルがどのデータで学習されたかを追跡し、そのパフォーマンスを比較する必要があります。
これらの手順が面倒で、「実際、ファインチューニングで一番難しいのはファインチューニングではなく、そこまでの準備作業だ」という声も聞こえていました。
そこで私たちは最近、ディスティレーションをより容易にするため、OpenAIプラットフォームに2つの新機能を追加しました。
1つ目は「stored completions(ストアドコンプリーション)」です。これはchat completions APIにstoreパラメータをtrueにすることで、入力と出力を永続化できる機能です。これで応答例の蓄積が簡単になります。
2つ目は「evals(評価機能)」です。カスタムテストを定義してモデル同士を比較できる新しいページで、アプリケーション固有の評価指標を定義し、それに基づいてモデルを比較可能です。
つまり、stored completions、evals、そしてファインチューニングAPIを組み合わせることで、ディスティレーションを最初から最後まで、OpenAIプラットフォーム上で完結できるようになりました。
ここで、これらの機能を使ったデモをご覧いただきたいと思います。
今回のデモでは、SuperHumanというメールアプリを例にします。SuperHumanには、受信メールに対して素早く返信案を生成する「クイックリプライ」機能があります。これはGPT-4oの豊富な知能を活用すれば簡単に実装できますが、何千万、何億といったメールを処理する段階になると、コスト面で問題が発生するでしょう。
そこで、コスト削減のためGPT-4o Miniを使いたいところですが、ユーザ体験を損ないたくはありません。理想的にはGPT-4o並みの品質を、GPT-4o Miniの低コストで実現したいわけです。
この理想をディスティレーションで実現できるか、実例をお見せします。
(スティーブン)
こちらがLLMへの入力と出力のイメージです。ユーザーのメールスレッドを渡し、返ってきた出力として返信案が3パターン生成されます。
ディスティレーションの第一歩は、「良いクイックリプライ」とはどのようなものか、その例を大量に集めることです。そのため、コードにstore = trueを追加します。これにより、生成結果が自動的に記録されます。また、メタデータでタグを付けることも可能です。今回はtest setやtrain setというタグを付けて、評価用と学習用を区別します。
こうしてアプリを少し回せば、大量の応答例が蓄積され、ダッシュボードで確認できます。モデルや日付、テキスト検索などでフィルタ可能です。これにより、デバッグや運用中のアプリケーション可視化にも役立ちます。
今回はtest setタグでフィルタします。すると、半分くらいの結果が得られました。
次に「evaluate」ボタンを押すと、新しいevalsのUIが表示され、ここで評価基準を定義できます。
例えば、今回のタスクでは「最後にメールを書いた人に正しく返信できているか」が重要な評価ポイントです。LLMを用いて、入力と出力を元に、この返信案が適切な相手に向いているかどうかを判定させることができます。さらに、「返信内容が筋の通るものか」など他の基準も追加可能です。
これらの基準を設定し、GPT-4oの出力を評価すると、非常に良好な結果が得られます。90%を超える品質で、適切な人物へ、妥当な返信案が生成されていることがわかります。
では、GPT-4o Miniではどうでしょう?
同じ評価基準でGPT-4o Miniをテストしてみると、パフォーマンスが落ち込みます。直前の問いかけに正しく応じられないケースが増え、品質は76%程度へと低下しました。
このままGPT-4o Miniを本番投入すればユーザ体験が悪化します。そこで、ディスティレーションの出番です。GPT-4oの出力例を元にGPT-4o Miniをファインチューニングし、パフォーマンスを引き上げます。
(ジョン)
GPT-4oでは91%、GPT-4o Miniは76%でしたが、これをディスティレーションで改善します。
既に評定用のエバリュエーションを定義し、GPT-4oの応答例を蓄積済みですから、後は学習用データセットを作ってファインチューニングするだけです。
test setではなくtrain setタグでフィルタした後、今度は「distill」ボタンを押します。すると、表示中の補完結果が自動的にJSONLファイル化され、ファインチューニングジョブのフォームが自動で埋め込まれます。
ベースモデルはGPT-4o Miniを選択し、OpenAIが用意したデフォルトのハイパーパラメータをそのまま使い、「create」を押せば、ファインチューニングジョブが開始されます。
ファインチューニングには15分から4時間程度かかりますので、ここでは事前に学習済みのモデルを用意しました。
ファインチューニング後のモデルを、さきほどと同じ評価基準でテストします。同じevalを回すと、ディスティレーション後のGPT-4o Miniは76%から88%へと性能が向上し、ほぼGPT-4oに迫る品質を実現しました。これで、15倍安価なモデルでも高品質な体験を提供できるわけです。
ここまでの流れを振り返りましょう。
もともとGPT-4oで91%のパフォーマンスを得ていましたが、コストを抑えたくてGPT-4o Miniに切り替えたら76%まで落ちました。しかし、GPT-4oからディスティレーションでGPT-4o Miniをファインチューニングすることで、パフォーマンスを88%まで引き上げることができました。これでコストと品質の両立が可能になります。
さて、ディスティレーションがどんな場面で有効なのか、また難しい課題はどこにあるかを考えましょう。
タスクは、カバー範囲の広さ(タスクの広狭)と要求精度の高さ(高精度か低精度か)という2軸で分類できます。
下部左側の領域は、狭い領域で低精度要求のタスクです。例えば感情分析やエンティティ抽出など。こうしたタスクはディスティレーションが非常に得意です。小さなモデルでも十分で、多少表現が違っても正解とみなせるゆるやかな基準があるからです。
上部左側は狭い領域だが高い精度が求められる分類タスクです。これらも比較的ディスティレーションは可能ですが、やや難易度が上がります。
下部右側は広い領域だが低精度要求のタスク、例えばコピーライティングやドラフト支援、テキスト言い換え、簡易な翻訳などです。ここでは、ある程度高性能な小型モデルと大規模で多様なデータセットがあればディスティレーションは可能です。
しかし、右上の領域、つまり広範な知識が必要で、高い精度が求められるタスク、例を挙げれば汎用チャットボットや事実確認、複雑な推論などは、大規模モデルでも難しく、ディスティレーションには非常に手強い領域です。MMLUやGSM8Kなどはまさにこの領域に該当します。
もしあなたのタスクが、これらの「ディスティレーションが有望」な3象限に当てはまるなら、試してみる価値は大いにあります。その際に気をつけるべき落とし穴もあります。
1つ目はデータ分布の偏りです。学習データは本番データの分布を正しく反映している必要があります。特定の期間や偏った条件で収集したデータでは、本番環境でのパフォーマンスが損なわれる可能性があります。
2つ目は稀な重要事例の扱いです。例えば詐欺検知のように、発生頻度が極めて低いが重大なケースがある場合、トレーニングデータにほとんど含まれないとモデルが学習できません。必要に応じてそうした例を適量に補強する必要があります。
ディスティレーションを最大限に活用するコツも3つお伝えします。
まず、大規模モデル側の性能を最適化することです。ディスティレーションの前に、大きなモデルがあなたのタスクに対して正しく振る舞うよう、プロンプト設計や設定をしっかり行っておきましょう。
次に、学習用データセットを適切にキュレーションします。全てを手動で精査する必要はありませんが、質の高い例を十分かつバランス良く集めることが大切です。数千件程度のデータが目安となります。
最後に、反復的なアプローチを取ることです。評価指標の見直しやデータセットの変更、ハイパーパラメータの調整、モデル選択など、何度も試行錯誤を繰り返すことで、徐々に理想的なモデルに近づけていきます。
こうした手順を踏めば、あなたは最終的に本番投入に耐えうる高品質で低コストな小型モデルを手にすることができ、ユーザーは高い満足度を得られるでしょう。
2024年は、AIがプロトタイプから本番スケールへと移行した年でした。これからは、1つのモデルで全てをまかなうのではなく、タスクごとに最適なモデルを組み合わせる時代になります。
つまり、アプリケーションごとに数十個のモデルを使い分ける世界です。大きなモデル、小さなモデル、そしてディスティレーションによってタスク特化された小さなモデルが共存します。要約用、顧客サポートの振り分け用、など用途に合わせた多数の小型モデルが用いられ、広範で高精度なタスクには依然として大規模モデルやO1のような推論能力の高いモデルが必要になります。
私たちは、このディスティレーションを活用した多数のタスク特化型小型モデルが生まれる新たな世界に大きな期待を寄せています。
今日デモでお見せした機能はすべてAPIダッシュボードから利用可能です。皆さんがスケール可能なAIアプリケーションをどのように構築するのか、楽しみにしています。
ご清聴ありがとうございました。Dev Day Londonをお楽しみください。