🐡

各AIベンダーのratelimit-remaining tokensの増減を調べてみました

2024/04/08に公開

各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サービスのレート制限の仕組みについて以下のような考察ができます。

  1. OpenAI:
    • リクエストを実行すると、残りのトークン数が消費されたトークン数だけ素直に減少する。
    • トークンの回復は1秒あたり約25,000トークンの割合で行われている。
    • OpenAIのレート制限の仕組みは比較的シンプルで予測しやすい。
  2. Anthropic:
    • リクエストを実行すると、残りのトークン数が消費されたトークン数だけ減少する。
    • レスポンス時に出力Token(今回はmax_tokens:1024で実行)分消費される
    • トークンの回復は分の切れ目で行われ、その時点までに処理されたリクエストの消費トークン数が一括で回復される。
    • Anthropicのレート制限の仕組みは、OpenAIと比べるとやや複雑だが、一定の規則性がある。
  3. Azure:
    • リクエストを実行しても、消費されたトークン数ではなく、実行されたリクエスト数に16トークンを乗じた値だけ残りのトークン数が減少する。
    • トークンの回復も速やかに行われ、ratelimit-tokens-remainingの値が実際の残りトークン数を正確に反映していない可能性がある。
    • Azureのレート制限の仕組みは、この実験結果だけでは完全に理解することが難しく、より詳細な調査が必要である。

全体として、OpenAIとAnthropicについては、残りのトークン数の推移からレート制限の仕組みをある程度把握することができました。

一方、Azureについては、この実験だけでは挙動が謎に包まれており、APIドキュメントや追加の実験による確認が必要だと考えられます。

今後、AIサービスを利用する際には、各サービスのレート制限の特性を理解し、適切にトークンを管理することが重要です。また、Azureのようにレート制限の仕組みが不明確なサービスについては、注意深くモニタリングを行い、予期せぬ制限によるサービス停止を防ぐ必要があるでしょう。

ご参考になれば幸いです!

株式会社ガラパゴス(有志)

Discussion