OpenAI APIのFine-tuningを試してみる

2023.04.18

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

OpenAI APIで色々遊ぶために課金できるように登録してみました。

APIを使ってできることとしてFine-tuningというものがあり、これはアプリケーションのモデルをカスタマイズして利用できるようになるものです。

Fine-tuningでモデルに追加のデータを学習させることにより以下のような効果が見込めるとのことです。

  1. プロンプト設計よりも質の高い結果
  2. プロンプトに収まりきらないほど多くの例をトレーニングする能力
  3. プロンプトの短縮によるトークン節約
  4. レイテンシリクエストの削減

自分好みの画像を生成させるようにしたり、とある特定の情報を加味した上でタスクを実行させたりすることができるのでは? 

chatGPTであーだこーだとプロンプトから情報を与える時間を減らせるのでは?

と思ったので試してみようと思った次第。

利用料金

モデルのトレーニングにかかる料金と、そのモデルを使用する料金とに別れているようです。

Model Training Usage
Ada $0.0004 / 1K tokens $0.0016 / 1K tokens
Babbage $0.0006 / 1K tokens $0.0024 / 1K tokens
Curie $0.0030 / 1K tokens $0.0120 / 1K tokens
Davinci $0.0300 / 1K tokens $0.1200 / 1K tokens

モデルについて

davinci, curie, babbage, および ada という基本のモデルをチューニングできます。

GPT-3のベースモデルで、以下の特徴があるます。

Model Description Max Tokens Date Released
davinci GPT-3の中で最も高性能なモデルです。他のモデルで可能なあらゆるタスクをこなし、多くの場合、より高い品質でこなすことができます。 2,049 tokens Up to Oct 2019
curie 非常に高機能だが、Davinciより高速で低価格 2,049 tokens Up to Oct 2019
babbage シンプルな作業ができる、非常に速い、コストが安い 2,049 tokens Up to Oct 2019
ada 非常にシンプルな作業が可能で、通常GPT-3シリーズの中で最も高速なモデルであり、最も低価格です。 2,049 tokens Up to Oct 2019

手順

  1. トレーニングデータを準備してアップロードする
  2. 新しいFine-tuningされたモデルをトレーニングする
  3. Fine-tuningモデルを使用する

ドキュメントに沿って行っていくので、APIの利用はOpenAIのCLIを使って実行してきます。

以下のコマンドでインストール。・

pip install --upgrade openai

openaiのAPI keyを環境変数にセットします。

export OPENAI_API_KEY="<OPENAI_API_KEY>"

サンプルとして、ゲーム内のとある名称がスキルなのか爆発なのか分類させてみます。

chatGPTではこのように間違った回答を返していたので、正しい情報を学習させてみます。

1. トレーニングデータを準備してアップロードする

トレーニングデータは、GPT-3に言いたいことを教える方法です

データセットの準備 に書いてあるベストプラクティスを読むことを推奨されているので、必ず読んでおきましょう。

与えるトレーニングデータの形式はJSONLドキュメントです。

例)

{"prompt": "<prompt text>", "completion": "<ideal generated text>"}
{"prompt": "<prompt text>", "completion": "<ideal generated text>"}
{"prompt": "<prompt text>", "completion": "<ideal generated text>"}
...

CSVやTSVのデータをCLIで変換できるので、試してみます。

このように質問をprompt, 回答をcompletionに記載し、CSVにしてダウンロードしたものをコマンドで変換してもらいます。

※ 今回はサンプルで2件しか用意しませんでしたが、本来は

トレーニングの例が多いほど良いです。少なくとも数百の例を持つことをお勧めします。一般に、データセットサイズが2倍になるたびに、モデルの品質が直線的に向上することがわかりました

とされています。

コマンドは以下)

openai tools fine_tunes.prepare_data -f <LOCAL_FILE>

実行後、以下の内容のJSONLができました。

2. 新しいFine-tuningされたモデルをトレーニングする

作成したトレーニングデータを使用し、モデルを作成してみます。

コマンドは以下。

openai api fine_tunes.create -t <TRAIN_FILE_ID_OR_PATH> -m <BASE_MODEL>

BASE_MODEL ( ada、babbage、curie、またはdavinci )から開始するベースモデルの名前です。

実行していると、Stream interrupted (client disconnected). というメッセージが出てコマンドが終了しました。

システムの他のジョブの背後にジョブがキューに入れられる可能性があり、モデルのトレーニングには、モデルとデータセットのサイズに応じて数分または数時間かかることがあります。イベントストリームが何らかの理由で中断された場合は、次の操作を実行して再開できます

とのことなので、

openai api fine_tunes.follow -i <YOUR_FINE_TUNE_JOB_ID>

というコマンドで再開できます

ただ、このコマンドを実行しても

$ openai api fine_tunes.follow -i ft-GLXS8T1hG02iyPAKBh3A9pNl
[2023-04-18 16:49:59] Created fine-tune: ft-GLXS8T1hG02iyPAKBh3A9pNl

Stream interrupted (client disconnected).
To resume the stream, run:

  openai api fine_tunes.follow -i ft-GLXS8T1hG02iyPAKBh3A9pNl

と同じエラーが返ってくることがほとんどでした。

キューを待っている? のかもしれませんが、

[2023-04-18 16:53:20] Fine-tune costs $0.00
[2023-04-18 16:53:20] Fine-tune enqueued. Queue number: 4
[2023-04-18 16:53:49] Fine-tune is in the queue. Queue number: 3
[2023-04-18 16:54:04] Fine-tune is in the queue. Queue number: 2

何度か同じコマンドを実行したら成功しました。

$ openai api fine_tunes.follow -i ft-iM0nRyvpOMYhjbCV1tbP1xFR
[2023-04-18 17:06:51] Created fine-tune: ft-iM0nRyvpOMYhjbCV1tbP1xFR
[2023-04-18 17:09:14] Fine-tune costs $0.04
[2023-04-18 17:09:15] Fine-tune enqueued. Queue number: 8
[2023-04-18 17:09:17] Fine-tune is in the queue. Queue number: 7
[2023-04-18 17:09:47] Fine-tune is in the queue. Queue number: 6
[2023-04-18 17:12:16] Fine-tune is in the queue. Queue number: 5
[2023-04-18 17:12:34] Fine-tune is in the queue. Queue number: 4
[2023-04-18 17:12:46] Fine-tune is in the queue. Queue number: 3
[2023-04-18 17:14:42] Fine-tune is in the queue. Queue number: 2
[2023-04-18 17:14:44] Fine-tune is in the queue. Queue number: 1
[2023-04-18 17:15:33] Fine-tune is in the queue. Queue number: 0
[2023-04-18 17:15:55] Fine-tune started
[2023-04-18 17:17:46] Completed epoch 1/4
[2023-04-18 17:17:47] Completed epoch 2/4
[2023-04-18 17:17:48] Completed epoch 3/4
[2023-04-18 17:17:49] Completed epoch 4/4
[2023-04-18 17:18:29] Uploaded model: davinci:ft-personal-2023-04-18-08-18-29
[2023-04-18 17:18:30] Uploaded result file: file-mW6hMKi4cvgwgddqLt5YRCOo
[2023-04-18 17:18:30] Fine-tune succeeded

Job complete! Status: succeeded ?
Try out your fine-tuned model:

openai api completions.create -m davinci:ft-personal-2023-04-18-08-18-29 -p <YOUR_PROMPT>

3. Fine-tuningモデルを使用する

では実際にチューニングされたモデルを使用してみましょう。

コマンドは以下・

openai api completions.create -m <FINE_TUNED_MODEL> -p <YOUR_PROMPT>

-mにチューニングしたモデル名を渡して使用します。

用意したトレーニングデータの数も内容も貧弱だったためろくな答えは返ってきませんでしたが、チューニングしたモデルの実行はできました。

トレーニングデータを再度用意し、Fine-tuningしたモデルをさらにトレーニングすることもできます。

openai api fine_tunes.create -t <TRAIN_FILE_ID_OR_PATH> -m < FINE_TUNED_MODEL >

-mにチューニングしたモデル名を指定して再度実行するだけでできます。

〜〜〜

トレーニングデータをたくさん用意し、いい感じのモデルの作成をするのは大変そうですが今後必要になるケースが出てきそうなので引き続き自身の学習が必要ですね。

GPT-3.5でもFine-tuningできるようにならんかな。。。