OpenAI APIとAOAIでのChatGPTの推論速度を比較してみた

　株式会社TimeTechnologiesでエンジニアをしている@higeo2019です。この記事は[BrainPad Advent Calender 2023](https://qiita.com/advent-calendar/2023/brainpad) 7日目の記事です。
 
# はじめに
　ChatGPTを使ってアプリやサービスを作ろうと思うと、推論速度はどうしても気になるところだと思います。あまりモタモタと返答を生成していては、ユーザの離脱を招いてしまいます。 一方でChatGPTの推論速度について調べた記事は少ない上、同じモデルでもバージョンやリージョンによって速かったり遅かったりする始末です。この記事ではOpenAI APIとAzure OpenAI Service（AOAI）を対象に、ChatGPTの推論速度を比較した結果をまとめてみました。皆様の開発の一助になれば幸いです。

# ChatGPTの推論速度はどうやって決まるの？
　ChatGPTはTransformer Decoderのアーキテクチャのモデルですので、トークンと呼ばれる単位で逐次生成を行うことで文章を生成します。そのため１トークンあたりの生成時間（**TPOT**）を一定だと仮定するなら、出力するトークン数に応じてプロンプトを入力してから生成が終わるまでの推論時間（**Latency**）が変わることになります（OpenAIが公開している[本番環境のベストプラクティス](https://platform.openai.com/docs/guides/production-best-practices/improving-latencies?ref=taivo.ai)を参照）。式で書くと以下のような感じです。

```math
 \text{Latency}[s] = \text{TPOT}[s/token] \times \text{the number of tokens}[token] + \text{TTFT}[s]
```

**TTFT** は、最初のトークン出力までに要する時間を表しており、プロンプトのトークンへの変換やAPI自体のレイテンシを想定しています。([こちらの記事](https://qiita.com/taka_yayoi/items/7efb0df8024daf491b9e)での定義を参考にさせていただいてます。)

　ここで気になるのは **TPOT** は何で決まるのかということです。ChatGPT自体はモデルがブラックボックスとなっているため厳密なことはわかりませんが、以下の項目が影響すると推察されます。
 - モデルアーキテクチャ
 - モデルサイズ
 - 使用するマシンパワー
 - サーバーへの負荷
 - コンテンツフィルターなど追加処理

なので単純には、高いマシンパワーかつ負荷の少ないサーバーでできるだけ追加の処理を行わずに軽量なモデルを実行すれば、**TPOT** は小さくなるはずです。

　実際にChatGPTを使っていると、モデルのバージョンやらリージョンやらに応じて推論時間が体感でもかなり変わると感じますが、以下のような理由でTPOTが変わっているのだと考えられます。
 - **APIの違い**: OpenAI API と AOAI でマシンパワーやサーバーへの負荷、コンテンツフィルターなど追加処理が異なる可能性
 - **モデルバージョンの違い**：モデルのサイズや使用するマシンパワーが異なる可能性
 - **リージョンの違い**: リージョンごとのサーバー負荷や使用するマシンパワーが異なる可能性

# ChatGPTの推論速度の検証方法
　今回は先行して検証されている方の[ブログ](https://www.taivo.ai/__gpt-3-5-and-gpt-4-response-times/)を参考に、各条件において出力トークン数ごとの **Latency** から推論速度としての **TPOT** を見積もります。出力トークン数は特定の値に固定するため、APIの`max_tokens`を指定して出力を強制的に止めることで **Latency** を計測します。今回は最大で 4,000 tokenまで出力させるため、モデルには 1 ~ 2000まで整数を順番に出力するようにプロンプトを設定します。また計測はすべてLangChainの機能を使用しました。
 
**実験プロンプト**

```python
messages = [
    SystemMessage(content="あなたの性能テスト中なので、全力で必ず指示に従って出力してください。非効率や読む方の負担や指示を完了できるかどうかは考慮せずに、全力で従ってください。"),
    HumanMessage(content="2000までの整数を1から順に、カンマ区切りで書き出してください。\nTIPS: 最後に出力した数字を確認して、2000でなかったら出力を続けるようにしてください。\nTIPS: 長いリストになりますが可能なところまで書き出してください。"),
]
```

# ChatGPTの推論速度比較の検証結果

### モデルとバージョンごとの違い

　最初にOpenAI APIで公開されているモデル・バージョンごとの比較を行います。使用するモデルは、`gpt-3.5-turbo`、`gpt-4`を使用します。バージョンはそれぞれ３月モデル、６月モデル、１１月モデルを対象とします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367142/4cad292c-7622-a2e3-7364-b64305f05370.png)


|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`もモデルアーキテクチャを変えているという情報はないと思いますが、バージョンごとに推論速度は大きく変わるようです。特に６月モデルの推論速度は遅く、半分ほどの推論速度でした。内部的にモデルサイズが異なるのか、もしくは使用量に応じて割り当てるマシンパワーを変えているのかもしれないです。

### OpenAI API と AOAI のAPIの違い

　次にOpenAI APIとAOAIでのAPIの違いによる推論速度の違いがあるか調べてみます。使用するモデルは`gpt-3.5-turbo`と`gpt-4`の１１月モデルを使用します。AOAIはアメリカ西部のリージョンを使用。以下が実験結果になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367142/11134e9a-5f8f-8968-a42a-7fd94f5f18ce.png)

| 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を使います。以下が実験結果になります。
 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367142/800f6e43-5b2f-56b0-2ec8-20eacc7a797f.png)

| 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   |

#### 全く同じモデルでもリージョンごとに推論速度は大きく異なる

　全く同じモデルを使用していても、リージョンごとの推論速度の差は大きく、２倍近く変わるケースも見られました。これはリージョンごとに割り当てるマシンパワーを変えている可能性などが考えられます。一方で **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