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 のデベロパーコミュニティのこちらの回答にたどり着きました。曰く、
ということで非常に納得いく回答でした。
納得も行ったので、この回答をもとに `retry` ライブラリを使って timeout を管理することにしようと思った矢先、こちらの OpenAI Cookbookも見つけました。内容は似た内容だったので本記事では割愛します。
色々読み進めていくと、`request_timeout` のパラメーターはドキュメント化されていないため使わないほうが良いと思っていたのですが、とても重要だと言っているコメントもありました。
ソースコードをたどると Python の一般的な `requests` ライブラリの `requests.Session` に注ぎ込まれているパラメーターのようです。
Source1 Source2
一旦私のユースケースでは設定しておいて損はなさそうだったので設定することにしました。
また、同コメントはリクエストのパラレル化についても述べていたのですが今回は割愛しました。
結論
OpenAI の API を叩く際には①`retry` のライブラリなどを使ってAPIリクエストを管理しましょう。 ②`request_timeout` も使っておきましょう。
以上、お読みいただきありがとうございます。少しでも参考になればと思います。
もし似たようなコンテンツに興味があれば、フォローしていただけると嬉しいです。
この記事が気に入ったらサポートをしてみませんか?