1 はじめに
3日前、OpenAIは新機能を発表し、ユーザーがGPT-3.5 Turboをカスタマイズおよび微調整できることを発表した。これはどういう意味ですか?これは、GPT-3.5 Turbo をベンチマーク システムとして使用して、多くのタスクを微調整できることを意味します。ただし、ここで GPT-3.5 Turbo を微調整する機能は、以前に GPT-3 を微調整するために使用されたテクノロジー、つまりパラメータの効率的な微調整と同様である必要があることに注意してください。そうでない場合、各ユーザーは、モデルサイズは、噂のAモデルであっても10B前後のモデルは実現が困難です。
では、どのようなシーンがより適しているのでしょうか?私の個人的な意見は、現在の対話データのほとんどもそこから抽出されたものであるため、対話の微調整に使用する場合、あまり意味がないかもしれないということです。したがって、一部の特定のタスクにより適しており、優れたパフォーマンスのモデルは少量のデータで微調整できます。
2. 操作方法は?
ここ 2 日間、この件についてインターネット上で多くの宣伝が見られましたが、実際に実行している人はまだ比較的少数です。そこで、わざわざ私自身が現地に行ってテストしてみました。前回の機能は Function Calling でしたが、見逃してしまいましたが、今回は見逃せません。トレーニング ステップ全体を見てみましょう。今回は例として中国語の文法エラー修正タスクを使用して、データの準備、ファイルのアップロード、トレーニング モデルとテスト結果の完全なプロセスを実行します。
2.1 書類の準備
OpenAI 公式 Web サイトの要件によれば、微調整 GPT-3.5 Turbo のサンプル入力形式は、元のダイアログ形式と一致しています。次に例を示します。
{
"messages": [{
"role": "system", "content": "你是一个汉语语法纠错器。"}, {
"role": "user", "content": "检测这个句子的语法错误:这件事对我们大家当时震动很大。"}, {
"role": "assistant", "content": "这件事当时对我们大家震动很大。"}]}
元のデータ形式がこのような形式でない場合は、まず変換関数を作成して、上記の形式に変換します。
2.2 ファイルのアップロード
ファイルをアップロードするためのコードも非常に簡単です。以下はファイルをアップロードするための関数です。openai.File のアップロードは非同期操作です。create を実行すると、最初にファイルがクラウドに転送されますが、待つ必要がありますOpenAI によると、これにはコンテンツ フィルタリングの部分が含まれています。
def upload_file(file_name):
# if a train_file is 400KB, it will take about 1 min to upload the file.
file_upload = openai.File.create(file=open(file_name, "rb"), purpose="fine-tune")
print("Uploaded file id", file_upload.id)
while True:
print("Waiting for file to process...")
file_handle = openai.File.retrieve(id=file_upload.id)
if len(file_handle) and file_handle.status == "processed":
print("File processed")
break
time.sleep(3)
return file_upload
ファイルが正常に処理されたら、このファイルを使用して GPT-3.5 を微調整できます。
2.3 トレーニングモデル
モデルをトレーニングするコードは非常にシンプルで、次の 1 文のみです。
job = openai.FineTuningJob.create(training_file=file_upload.id, model="gpt-3.5-turbo")
print(job.id)
これも非同期操作ですが、OpenAI がどのファイルをトレーニングするかを認識できるように、ここで file_upload.id を覚えておく必要があることに注意してください。
もう 1 つ注意すべき点は、モデル トレーニングの進行状況をクエリするために job.id を使用する必要があるため、job.id も覚えておく必要があることです。この ID を忘れても問題ありません。次のコードを使用して既存のジョブをクエリできます。
result = openai.FineTuningJob.list(limit=10)
print(result)
モデルのトレーニングには時間がかかります。以下に示すようにジョブのステータスをクエリすると、モデルが正常にトレーニングされたことを意味します。
"status": "succeeded"
もちろん、OpenAI はモデルのトレーニングが完了した後もメールで通知します。
2.4 テストモデル
モデルのテストは、モデル ID をモデルに入力する必要があることを除き、GPT-3.5 Turbo のオリジナル バージョンを使用する場合と同じです。モデル ID は上記のクエリと通知メールを通じて取得できます。モデル ID を取得したら、次のコードを実行してテストするだけです。
def test_by_case(model_id, message):
"""
Test the model with a given message.
:param model_id: ID of the model to test.
:param message: Message to test the model.
:return: Response from the model.
"""
completion = openai.ChatCompletion.create(
model=model_id,
messages=message
)
return completion.choices[0].message["content"]
全体的には比較的シンプルです。OpenAI によると、1 つのアカウントで 1 日に 12 個のモデルをトレーニングできますが、一度にトレーニングできるモデルは 1 つだけです。
3. 実験結果
モデル | #パラメータ。 | データ | 単語レベル (P/R/F) | Charレベル(P/R/F) |
---|---|---|---|---|
S2S_BART | 375M | 1061 | 21.08/10.54/17.57 | 22.09/10.62/18.16 |
文法GPT | 7B | 1061 | 42.42 /16.87/32.56 | 46.67 /18.58/35.84 _ |
GPT-3.5ターボの微調整 | - | 1061 | 36.16/ 34.75 / 35.87 | 36.17/ 33.69 /35.65 |
上記は GrammarGPT のトレーニング セットとテスト セットに対する評価であり、モデルのパフォーマンスが 7B フル ファインチューニングのパフォーマンスと同様であることがわかります。
上記の手順が理解できなくても心配する必要はありません。完全なコードは、finetune_chatgptで直接表示できます。
4. トレーニングの規模とコスト
例として前の GrammarGPT タスクを使用しているため、主要な指標のほとんどを以下に示します。
トレーニングサンプル数は1061、変換後のファイルサイズは約400KB、ファイルのアップロードにかかる時間は約1分、トレーニングラウンド数はデフォルト値で最後は3ラウンド、トレーニング時間は約1時間、推論速度は1秒、1サンプル程度です。全体として、約 40W のトークンをトレーニングし、500 個のサンプルをテストするには約 9 ドルの費用がかかります。7B サイズの GrammarGPT トレーニングと比較すると、トレーニング時間は 8 カード A100 の消費で数十分程度であり、1 時間あたりの消費量が約 100 元であることから、両者に大きな違いはないようです。
5. まとめ
経験の観点から見ると、GPT-3.5 Turbo の微調整の敷居はまだはるかに低く、コストがオリジナル バージョンを使用する場合の 4 倍以上かかると不満を言う人もいますが、8-カード A100 であり、大規模なモデル機能が必要です。これはまさに福音にほかなりません。前に述べたように、今後の論文では、ゼロショット GPT-3.5 Turbo はベースラインではありませんが、微調整された GPT-3.5 Turbo は強力なベースラインとなります。
これは良いことでもあり、悪いことでもあります。