見出し画像

OpenAI API を使う際の timeout 処理の仕方について

問題

OpenAI API を使って大量の処理を行っていた際に、API がタイムアウトしてしまうことがあった。適切な時間でタイムアウトを設定することで、この問題を解決したい。

解決策

  • retry ライブラリを使ってAPIへのリクエストを管理

  • `request_timeout` パラメーターを使って timeout を管理

APIへのリクエストはリクエストする側で独自で運用するべき。例えば Python の `retry` ライブラリを使って、

@retry(delay=1, backoff=2, max_delay=60)
def func():
    pass

等とする。

なぜなら、API がタイムアウトが起きている状況というのは API 側のサーバーが高負荷になっている状況であり、API サーバー側がリクエスト自体を見れていない可能性すらあるため。

また、 `request_timeout` パラメーターも入れておくと良い。

res = openai.Completion.create(
    model="gpt-3.5-turbo-instruct",
    prompt=prompt,
    request_timeout=60, # 60秒でタイムアウト
    ...
)

調査

`openai.Completion.create()` を使う際に簡単に `timeout` を設定する方法はないか調査を行った。

こちらのページでは、`openai.Completion.create()` に `timeout` という引数が使えるという報告があったが、
残念ながら実際に使ってみると依然タイムアウトが起き、引数が使えていないことがわかった。

調べるとtimeout が無視されてしまうバグがあるとの報告も報告されていた。こちらでもその内容が書かれておりました。

他にも `request_timeout` という変数があるとのコメントもあった。
ただし、この変数はドキュメントされていないため、今後保守されていくかは不明なため、あまり使うべきじゃないと思われる。

もう少し調べていくと OpenAI のデベロパーコミュニティのこちらの回答にたどり着きました。曰く、

Hi @tdenton8772

Actually, normally managing the timeout for a client-server transitions, like the OpenAPI APIs calls occurs in the client-side code.

This is true of just about every API call (not just OpenAI).

For example when the network is congested, the server might never see the API call, so the timeout will be managed by the client.

Extending this to OpenAI models, when their model is congested, it might not even return an error message (as we have been seeing today), and so it remains the responsibility of the client-side to manage the timeout, which is subtask of overall error and exceptions handling.

HTH

~ 以下GPT-4翻訳 ~

こんにちは @tdenton8772

実際には、クライアントとサーバー間の遷移(OpenAPI APIの呼び出しのような)でタイムアウトを管理するのは通常、クライアント側のコード内で行われます。

これはほぼすべてのAPI呼び出し(OpenAIだけでなく)に当てはまります。

例えば、ネットワークが混雑している場合、サーバーはAPI呼び出しを一切見かけないかもしれませんので、タイムアウトはクライアント側で管理されます。

これをOpenAIのモデルに拡張すると、そのモデルが混雑している場合、エラーメッセージすら返さないかもしれません(今日見てきたように)。したがって、タイムアウトを管理するのは全体のエラーおよび例外処理の一部としてクライアント側の責任となります。

お役に立てれば

ということで非常に納得いく回答でした。

納得も行ったので、この回答をもとに `retry` ライブラリを使って timeout を管理することにしようと思った矢先、こちらの OpenAI Cookbookも見つけました。内容は似た内容だったので本記事では割愛します。

色々読み進めていくと、`request_timeout` のパラメーターはドキュメント化されていないため使わないほうが良いと思っていたのですが、とても重要だと言っているコメントもありました。


ソースコードをたどると Python の一般的な `requests` ライブラリの `requests.Session` に注ぎ込まれているパラメーターのようです。
Source1 Source2
一旦私のユースケースでは設定しておいて損はなさそうだったので設定することにしました。

また、同コメントはリクエストのパラレル化についても述べていたのですが今回は割愛しました。


結論

OpenAI の API を叩く際には①`retry` のライブラリなどを使ってAPIリクエストを管理しましょう②`request_timeout` も使っておきましょう

最終的にこんな感じのコードにしてみました

以上、お読みいただきありがとうございます。少しでも参考になればと思います。

もし似たようなコンテンツに興味があれば、フォローしていただけると嬉しいです。

https://twitter.com/alexweberk

この記事が気に入ったらサポートをしてみませんか?