しりとりぼっと開発。
16万語の名詞リストからゲームに使ったらまずい単語を除くべく、 ChatGPT (gpt-4o, API) で単語分類をやってみた。
難しかったのは、フィルタリングの基準を設定することと、大量のデータを小分けにして投入することの2つ。
今回は2つ目、主に Batch API について。
今回どう使ったか
- completions
model: gpt-4o-2024-08-06role: systemのcontentに、system instructions を書くrole: userのcontentに、評価対象データを入れる- csv 形式、1 completion あたり 100語
- アウトプットも csv 形式
- Batch API でリクエストを投げる
- 1 batch あたり 100 completions とした
- 16万語ちょい = 100 words * 100 completions * 17 batches
Batch API を使う手順
- batch input file を作る(jsonl、 1 行につき 1 completion request)
- ユニークなリクエストIDを振るのをわすれずに
- batch input file をアップロードする
- アップロードだけでは実行されない
- batch を作成する
- validation がうまくいけば、24 時間以内に処理される
- 「24時間」よりも早くとか遅くとかは指定できない
- batch のステータスを確認する
in_progress→completed
- 処理結果をダウンロードする
- どれくらいの期間保存されてるんだろ?
大量のデータを小分けにする
(completion あたりの単語数) * (batch あたりの completions 数)
completion あたりの単語数を決める
- system instructions をつくりながら、playground と chat completions で試してみる
- 単語数を増やしたり減らしたりして、アウトプットが期待通りか、壊れてないかを確認
- 1 user content に 100 words 入れることに決めた
- 入力する単語数が多すぎると(200 words とかでもう)、アウトプットが壊れ(途中から意味不明のめちゃくちゃになり)やすくなった
- どうしてなのかよくわからん
- gpt-4o-2024-08-06
- context window = 128,000 tokens
- max output tokens = 16,384 tokens
- Models - OpenAI API
- なので、最近のでかい context window に比べて、今の入出力はぜんぜん短いと思うんだけどねぇ
- attention が直近の部分のほうがききやすいから?
- 入出力 token 数をざっくり計算
- system instructions: 400 tokens
- 1 completion あたりの token 数の見積もり(10 completion で平均)
| prompt_tokens (system instructions + user content) |
completion_tokens (output) |
total_tokens |
|---|---|---|
| 1470 | 1200 | 2670 |
batch あたりの completions 数を決める
- 先に投入した batch がまだ完了していない状態で新しい batch を投入したら、新しいほうの batch が失敗した(
status='failed')- エラーは
token_limit_exceeded - 処理待ち prompt_token の上限 (Usage tier 1) を超過したということ
- エラーは
Enqueued token limit reached for gpt-4o in organization org-xxxx. Limit: 90,000 enqueued tokens. Please try again once some in_progress batches have been completed.
- 情報があちこちに散らばっているが
- 処理が終われば新しい batch を投入できる(1日ごとの上限ではない)ので、待って再投入する
- 1 batch に入れる completions の数を減らす必要があると考え、100 completions ずつ投入することにした
- でもよく考えてみたら、上記の見積もりだと 1 batch に 150k tokens ぐらい入ってる計算になる
- 90k tokens のリミットを超過しているのでは?なんでいけたんだろう?(もっといけたのか?)
- なんか柔軟なのだろうか?(なにもわからん)
- 16万語ちょい = 100 words * 100 completions * 17 batches となった
ぼちぼち実行
- batch は、validation がうまくいけば、24 時間以内に処理される
- 実際にはさまざま
- 週末に投げたとき、10時間ぐらいかかって心配になった(週末は混むのかな?)
- 平日夜に (JST) 投げたとき、1時間もかからずすぐ完了してたりした(すいてたのかな、米国時間で忙しい時間帯と違うのかも?)
- 4日ぐらいで全部終わった
- status 確認から次の batch 作成まで自動化したかったが、未知のトラブルが起きるかもしれないと心配しながら、片手間に手で実行して様子を見ているうちに完了〜
- 最初の試行錯誤(system instructions 書くの含めて)と実際の処理あわせて $11.72 かかった(1年前よりだいぶ安くなったよねえ、2桁違う?)
- gpt-4o with Batch API (Pricing - OpenAI 2024/10 現在)
- $1.25 / 1M input tokens
- $5.00 / 1M output tokens
- gpt-4o with Batch API (Pricing - OpenAI 2024/10 現在)
次回は分類結果について書くつもり。
