各AIベンダーのratelimit-remaining tokensの増減を調べてみました
各AIベンダーのratelimit-remaining tokensの増減を調べてみました
共同執筆:
thithi7110
hellohazimeanimalpulas
moon004
D.H氏
概要
弊社でAI実行基盤を再構築するにあたり、各AIサービスのrate-limitの状況を逐次把握し、後どのくらいのtokenをAIサービスに投げれるかを把握する必要がありました。
そこで僕たちはopenai, anthropic, azureの3サービスについてrate-limitの推移をremaining-tokensを観察する実験を行いました。
結果、openaiとanthropicは素直にremaining-tokensが減少および、ルールに基づき回復する様子が見られましたがazureは挙動がこの実験段階では謎ということが分かりました。
仮説
各サービスに軽量な問い合わせをポーリング(5秒)している間に重たい処理を実施すればremaining-tokensの減少具合が観察できるのでは?という仮説を立てました
実験環境と方式
今回は視覚化とデータの記録とその後の利用を簡便にするために、
ポーリングはGoogleのスプレッドシートおよびGASで実行し、裏で重たい処理をpythonで実行するという方式を取りました。
使用したスクリプト(GAS)
function myRepeatedTask() {
var iterations = 1000; // 実行したい繰り返し回数
for (var i = 0; i < iterations; i++) {
Logger.log("Iteration " + (i + 1));
executeCurlAndRecordResults();
SpreadsheetApp.flush()
Utilities.sleep(5000); // 5秒待機
}
}
function executeCurlAndRecordResults() {
var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
var sheet = spreadsheet.getActiveSheet();
var url = "https://api.openai.com/v1/chat/completions";
var headers = {
"Content-Type": "application/json",
"Authorization": "Bearer <OPEN-API-KEY>"
};
var payload = JSON.stringify({
"messages": [
{"content": "hi", "role": "system"},
{"content": "", "role": "user"}
],
"model": "gpt-4-1106-preview",
"max_tokens": null,
"temperature": 0,
"top_p": 0,
"stream": false
});
var options = {
"method": "post",
"headers": headers,
"payload": payload,
"muteHttpExceptions": true,
"followRedirects": true
};
var response = UrlFetchApp.fetch(url, options);
// Extracting the x-ratelimit-remaining-tokens header
console.log(response.getHeaders());
var rateLimitRemaining = response.getHeaders()["x-ratelimit-remaining-tokens"];
// Getting current time as starttime
var startTime = new Date().toTimeString().split(" ")[0];
// Finding the last row in the first column that is not empty
var lastRow = sheet.getLastRow();
var nextRow = lastRow + 1; // We want to start writing in the next empty row
// Writing starttime and x-ratelimit-remaining-tokens to the sheet
sheet.getRange(nextRow, 1).setValue(startTime); // A column
sheet.getRange(nextRow, 2).setValue(rateLimitRemaining); // B column
}
実験結果
サービス: openai
model: gpt4-1109-preview
挙動: リクエスト実行したら素直に残りのtoken数が減る、回復は1秒ごとに25K程度実施されている
datetime | ratelimit-remaining-tokens | up-down | notes |
---|---|---|---|
1,500,000 | スタートは1500K | ||
17:00:48 | 1,499,980 | -20 | |
17:00:58 | 1,283,941 | -216,039 | 大きい処理実行、ramaining-tokensが約216K減少している |
17:01:05 | 1,306,389 | 22,448 | 約7秒で190Kほど回復している、1秒あたり約25K回復するのであっていそう |
17:01:11 | 1,475,112 | 168,723 | |
17:01:19 | 1,499,980 | 24,868 | 約20秒で約216Kが回復 |
17:01:41 | 1,499,980 | 0 |
サービス: anthropic
model: claude3-opus
挙動: リクエスト実行したら素直に残りのtoken数がInputToken分減る、レスポンス時にOutputToken分がまた減る、回復は分の切れ目(00秒)で20kまで回復する模様、現時点で弊社はTier1で実験しているためTPMが20kだが、今後TierがあがりTPMが200k、400kになった時にどうなるかは追加実験したい
datetime | ratelimit-remaining-tokens | up-down | notes |
---|---|---|---|
20,000 | req1(token5K)実行 | ||
8:53:36 | 15,000 | -5,000 | 順調に減る、さらにreq2を実行 |
8:53:40 | 10,000 | -5,000 | また順調に5K減る |
8:53:47 | 10,000 | 0 | |
8:53:53 | 9,000 | -1,000 | req1戻り。出力分のTokenが消費される ratelimit-tokens-resetは2024-04-04T08:54:00Zとのこと |
8:53:58 | 9,000 | 0 | |
8:54:03 | 19,000 | 10,000 | req2戻り。ratelimit-tokens-resetは2024-04-04T08:55:00Zとのこと、req1,2のInputで消費した10Kとreq1の戻りで使った1k分が回復、おそらく毎分 20kに回復すると思われる、ここで19kになっているのは 54:00に20kまで回復して、54:03にreq2のOutputが1k消費しているから |
8:54:08 | 14,000 | -5,000 | req3実行、5K減る |
8:54:13 | 9,000 | -5,000 | req4実行、5K減る |
※時間はGTM
サービス: azure
model: gpt-4-32k
挙動: リクエスト実行しても、実行request数*16tokenが減る謎仕様。回復もすぐ回復して謎。ratelimit-tokens-remainingが実態を表していない??
datetime | ratelimit-remaining-tokens | up-down | notes |
---|---|---|---|
39744 | 最初から減少している状態 | ||
17:50:54 | 39744 | 0 | |
17:50:58 | 39728 | -16 | req1(30K程度)を実行 |
17:51:04 | 39712 | -16 | req2(30K程度)を実行 |
17:51:09 | 39744 | 32 | req1,2が返ってくる前に回復 |
考察
この実験結果から、各AIサービスのレート制限の仕組みについて以下のような考察ができます。
- OpenAI:
- リクエストを実行すると、残りのトークン数が消費されたトークン数だけ素直に減少する。
- トークンの回復は1秒あたり約25,000トークンの割合で行われている。
- OpenAIのレート制限の仕組みは比較的シンプルで予測しやすい。
- Anthropic:
- リクエストを実行すると、残りのトークン数が消費されたトークン数だけ減少する。
- レスポンス時に出力Token(今回はmax_tokens:1024で実行)分消費される
- トークンの回復は分の切れ目で行われ、その時点までに処理されたリクエストの消費トークン数が一括で回復される。
- Anthropicのレート制限の仕組みは、OpenAIと比べるとやや複雑だが、一定の規則性がある。
- Azure:
- リクエストを実行しても、消費されたトークン数ではなく、実行されたリクエスト数に16トークンを乗じた値だけ残りのトークン数が減少する。
- トークンの回復も速やかに行われ、
ratelimit-tokens-remaining
の値が実際の残りトークン数を正確に反映していない可能性がある。 - Azureのレート制限の仕組みは、この実験結果だけでは完全に理解することが難しく、より詳細な調査が必要である。
全体として、OpenAIとAnthropicについては、残りのトークン数の推移からレート制限の仕組みをある程度把握することができました。
一方、Azureについては、この実験だけでは挙動が謎に包まれており、APIドキュメントや追加の実験による確認が必要だと考えられます。
今後、AIサービスを利用する際には、各サービスのレート制限の特性を理解し、適切にトークンを管理することが重要です。また、Azureのようにレート制限の仕組みが不明確なサービスについては、注意深くモニタリングを行い、予期せぬ制限によるサービス停止を防ぐ必要があるでしょう。
ご参考になれば幸いです!
Discussion