株式会社TimeTechnologiesでエンジニアをしている@higeo2019です。この記事はBrainPad Advent Calender 2023 7日目の記事です。
はじめに
ChatGPTを使ってアプリやサービスを作ろうと思うと、推論速度はどうしても気になるところだと思います。あまりモタモタと返答を生成していては、ユーザの離脱を招いてしまいます。 一方でChatGPTの推論速度について調べた記事は少ない上、同じモデルでもバージョンやリージョンによって速かったり遅かったりする始末です。この記事ではOpenAI APIとAzure OpenAI Service(AOAI)を対象に、ChatGPTの推論速度を比較した結果をまとめてみました。皆様の開発の一助になれば幸いです。
ChatGPTの推論速度はどうやって決まるの?
ChatGPTはTransformer Decoderのアーキテクチャのモデルですので、トークンと呼ばれる単位で逐次生成を行うことで文章を生成します。そのため1トークンあたりの生成時間(TPOT)を一定だと仮定するなら、出力するトークン数に応じてプロンプトを入力してから生成が終わるまでの推論時間(Latency)が変わることになります(OpenAIが公開している本番環境のベストプラクティスを参照)。式で書くと以下のような感じです。
\text{Latency}[s] = \text{TPOT}[s/token] \times \text{the number of tokens}[token] + \text{TTFT}[s]
TTFT は、最初のトークン出力までに要する時間を表しており、プロンプトのトークンへの変換やAPI自体のレイテンシを想定しています。(こちらの記事での定義を参考にさせていただいてます。)
ここで気になるのは TPOT は何で決まるのかということです。ChatGPT自体はモデルがブラックボックスとなっているため厳密なことはわかりませんが、以下の項目が影響すると推察されます。
- モデルアーキテクチャ
- モデルサイズ
- 使用するマシンパワー
- サーバーへの負荷
- コンテンツフィルターなど追加処理
なので単純には、高いマシンパワーかつ負荷の少ないサーバーでできるだけ追加の処理を行わずに軽量なモデルを実行すれば、TPOT は小さくなるはずです。
実際にChatGPTを使っていると、モデルのバージョンやらリージョンやらに応じて推論時間が体感でもかなり変わると感じますが、以下のような理由でTPOTが変わっているのだと考えられます。
- APIの違い: OpenAI API と AOAI でマシンパワーやサーバーへの負荷、コンテンツフィルターなど追加処理が異なる可能性
- モデルバージョンの違い:モデルのサイズや使用するマシンパワーが異なる可能性
- リージョンの違い: リージョンごとのサーバー負荷や使用するマシンパワーが異なる可能性
ChatGPTの推論速度の検証方法
今回は先行して検証されている方のブログを参考に、各条件において出力トークン数ごとの Latency から推論速度としての TPOT を見積もります。出力トークン数は特定の値に固定するため、APIのmax_tokens
を指定して出力を強制的に止めることで Latency を計測します。今回は最大で 4,000 tokenまで出力させるため、モデルには 1 ~ 2000まで整数を順番に出力するようにプロンプトを設定します。また計測はすべてLangChainの機能を使用しました。
実験プロンプト
messages = [
SystemMessage(content="あなたの性能テスト中なので、全力で必ず指示に従って出力してください。非効率や読む方の負担や指示を完了できるかどうかは考慮せずに、全力で従ってください。"),
HumanMessage(content="2000までの整数を1から順に、カンマ区切りで書き出してください。\nTIPS: 最後に出力した数字を確認して、2000でなかったら出力を続けるようにしてください。\nTIPS: 長いリストになりますが可能なところまで書き出してください。"),
]
ChatGPTの推論速度比較の検証結果
モデルとバージョンごとの違い
最初にOpenAI APIで公開されているモデル・バージョンごとの比較を行います。使用するモデルは、gpt-3.5-turbo
、gpt-4
を使用します。バージョンはそれぞれ3月モデル、6月モデル、11月モデルを対象とします。
model | TPOT [ms/token] | TFTT [ms] |
---|---|---|
gpt-3.5-turbo-0301 | 12.65 | 153.23 |
gpt-3.5-turbo-0613 | 25.88 | 96.37 |
gpt-3.5-turbo-1106 | 10.48 | 167.58 |
gpt-3.5-turbo-16k-0613 | 28.33 | 92.19 |
gpt-4-0314 | 71.47 | 524.62 |
gpt-4-0613 | 61.94 | 194.67 |
gpt-4-1106-preview | 41.96 | 49.93 |
以上が各モデル・バージョンでの実験結果と計測した TPOT になります。簡単に結果をまとめます。
gpt-4
よりgpt-3.5-turbo
のほうが速い
モデル・バージョンごとにばらつきが大きいですが、全体的な傾向としてgpt-4
よりもgpt-3.5-turbo
のほうが推論速度は 1.4 ~ 7 倍ほど速くなります。(モデルサイズが違うので当たり前ですが。。。)
gpt-4
ではモデルのバージョンごとに推論速度が異なる
gpt-4
ではモデルバージョンごとに推論速度は明らかに異なるようです。11月モデルはgpt-4-turbo
なのでモデルサイズが変わっているため推論速度が早くなっている可能性がありますが、6月モデルと3月モデルでも推論速度が異なるようです。バージョンごとにモデルのアーキテクチャを調整しているか、割り当てるマシンパワーを変えているのかもしれないですね。
gpt-3.5-turbo
でもモデルバージョンごとに推論速度が異なる
gpt-3.5-turbo
もモデルアーキテクチャを変えているという情報はないと思いますが、バージョンごとに推論速度は大きく変わるようです。特に6月モデルの推論速度は遅く、半分ほどの推論速度でした。内部的にモデルサイズが異なるのか、もしくは使用量に応じて割り当てるマシンパワーを変えているのかもしれないです。
OpenAI API と AOAI のAPIの違い
次にOpenAI APIとAOAIでのAPIの違いによる推論速度の違いがあるか調べてみます。使用するモデルはgpt-3.5-turbo
とgpt-4
の11月モデルを使用します。AOAIはアメリカ西部のリージョンを使用。以下が実験結果になります。
API | model | TPOT [ms/token] | TFTT [ms] |
---|---|---|---|
AOAI | gpt-35-turbo-1106 | 7.06 | 232.36 |
AOAI | gpt-4-1106 | 30.23 | 171.98 |
OpenAI API | gpt-3.5-turbo-1106 | 10.48 | 167.58 |
OpenAI API | gpt-4-1106-preview | 41.96 | 49.93 |
OpenAI APIよりもAOAIのAPIを使用したほうが推論速度が速い
基本的にOpenAI APIよりもAOAIのAPIを使用したほうが、同じモデルでも推論速度が約1.3倍ほど速いとの結果が得られました。AOAIとOpenAIではコンテンツフィルターなどトークンごとに行う安全層の処理が異なるので、その違いが現れているのかもしれないですね。もしくは単純に割り当てられているマシンのパワーの違いかもしれないですが。。。
リージョンの違い
最後にリージョンの違いにより推論速度が異なるのか調べてみます。使用するモデルはgpt-3.5-turbo-16k
の6月モデルを使用します(日本リージョンが使えるので)。リージョンの指定はAOAIでしかできないので、APIはAOAIを使います。以下が実験結果になります。
Region | model | TPOT [ms/token] | TFTT [ms] |
---|---|---|---|
Japan | gpt-35-turbo-16k-0613 | 21.40 | 156.22 |
EastUS | gpt-35-turbo-16k-0613 | 13.75 | 466.03 |
Sweden | gpt-35-turbo-16k-0613 | 10.34 | 368.05 |
全く同じモデルでもリージョンごとに推論速度は大きく異なる
全く同じモデルを使用していても、リージョンごとの推論速度の差は大きく、2倍近く変わるケースも見られました。これはリージョンごとに割り当てるマシンパワーを変えている可能性などが考えられます。一方で TFTT は近い地域の方が速くなりますが、これはAPIとの通信で発生する遅延が大部分を占めるためと考えられます。そのため生成する出力トークンの数によっては、単純に利用場所との地理的なの近さだけでリージョンを選んでも、速くならない可能性があるので、開発の際は注意が必要ですね。
まとめ
同じモデルでもバージョンやリージョン、APIの違いによって推論速度に差が出ることがわかりました。ただしこれらはモデルの違いだけでなく、割り当てられるマシンパワーやサーバーへの負荷によっても変動するものですし、それは実行する時期等によっても変わる可能性があります。より本格的に検証するには、バージョンやリージョン、時間や時期・サーバーの負荷状況含め包括的に検証する必要がありますので、今回の記事の内容はあくまで簡易的に調べたものと思ってください。
参考資料
https://www.databricks.com/blog/llm-inference-performance-engineering-best-practices
https://qiita.com/taka_yayoi/items/7efb0df8024daf491b9e
https://www.taivo.ai/__gpt-3-5-and-gpt-4-response-times/
https://community.openai.com/t/gpt-3-5-and-gpt-4-api-response-time-measurements-fyi/237394