OpenAIのGPTモデルをカスタマイズ(Fine Tuning)してみる with Node

category
date
Jan 28, 2023
slug
fine-tune-openai-with-node
status
Published
summary
NodeでOpenAIのAPIでモデルをFine Tuningしてみた話。
type
Post
(JavaScriptを愛し、意地でもPythonを使いたくない人のためのお試し方法ですが、ちゃんとやるならPythonでやったほうがいいです)

Open AIのFine Tuningについて

OpenAIのFine Tuningは、既存の大規模な言語モデル(例えばGPT-3)を、特定タスク向けに転移学習するための手法です。Fine Tuningを使用することで、新しいタスクに対して高い精度を実現することができます。
Fine Tuningを行うには、以下のステップを踏む必要があります。
  1. OpenAI APIを使用して、既存の言語モデルを取得します。これには、APIキーが必要です。
  1. 新しいタスクに適したデータセットを用意します。このデータセットは、Fine Tuningに使用するために、適切なフォーマットに変換する必要があります。
  1. Fine Tuning用のコードを書きます。このコードは、OpenAI APIを使用して、既存の言語モデルに新しいデータセットを学習させます。

Node CLIでの実行例

node-cliをインストールします。
npm install -g openai-node-cli

# 環境変数にキーを定義
export OPENAI_API_KEY="YOUR_API_KEY_HERE"
まずはトレーニングファイルを作成・アップロードします。
{"prompt": "フランスの首都は?", "completion": "パリス"}
openai createFile --file "/path/to/training.jsonl" --purpose "fine-tune"

// 以下のように返ってきます。
{
  "object": "file",
  "id": "file-Z8MM94T3WnvLd0GHr3fUk8Ee",
  "purpose": "fine-tune",
  "filename": "training.jsonl",
  "bytes": 66,
  "created_at": 1674974712,
  "status": "uploaded",
  "status_details": null
}
↑で帰ってきたファイルIDを元に、fineTuneを作成します。
learning_rate_multiplierには、この学習の適用率を入れます。1以上の値をとり、デフォルトは1です。
openai createFineTune --model "davinci" --training-file file-Z8MM94T3WnvLd0GHr3fUk8Ee --learning-rate-multiplier 1
※ node-cliの問題でうまくいかなくなっていたので、curl版↓↓↓
curl https://api.openai.com/v1/fine-tunes \
  -X POST \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -d '{
  "training_file": "file-Z8MM94T3WnvLd0GHr3fUk8Ee",
	"learning_rate_multiplier": 3,
}
この例では、jsonl形式のデータセットをfs.readFileSyncメソッドを使用して読み込んでいます。jsonl形式のデータセットは、各行に1つのjsonデータを記述したもので、例えば以下のような形式になります。

jsonlファイルの例

{"prompt": "フランスの首都は?", "answer": "パリス"}
 

Fine tunedなモデルを呼び出す

以下のコマンドで学習が完了したモデルを確認できます。
openai listFineTunes

# 返却
{
  "object": "fine-tune",
  "id": "ft-HQmxNHpzOWP8XIVp9IacRMko",
  "hyperparams": {
    "n_epochs": 4,
    "batch_size": 1,
    "prompt_loss_weight": 0.01,
    "learning_rate_multiplier": 0.1
  },
  "organization_id": "org-qUlIngAsF5QG6ACYc05SSS24",
  "model": "curie",
  "training_files": [
    {
      "object": "file",
      "id": "file-Z8MM94T3WnvLd0GHr3fUk8Ee",
      "purpose": "fine-tune",
      "filename": "training.jsonl",
      "bytes": 66,
      "created_at": 1674974712,
      "status": "processed",
      "status_details": null
    }
  ],
  "validation_files": [],
  "result_files": [
    {
      "object": "file",
      "id": "file-tKULG85RP4hFwRaj2ttDmc7E",
      "purpose": "fine-tune-results",
      "filename": "compiled_results.csv",
      "bytes": 346,
      "created_at": 1674975556,
      "status": "processed",
      "status_details": null
    }
  ],
  "created_at": 1674975345,
  "updated_at": 1674975560,
  "status": "succeeded",
  "fine_tuned_model": "curie:ft-personal-2023-01-29-06-59-11"
},
最新バージョンのopenai-nodeでは、通常と同じようにFine Tunedなモデルが指定できるようになっています。上記の "fine_tuned_model": "curie:ft-personal-2023-01-29-06-59-11"を利用して、completionsを取得できます。
openai createCompletion --prompt "The quick brown fox jumps over the lazy" --model "curie:ft-personal-2023-01-29-06-59-11"

© Titch 2022 - 2024