Azure OpenAI Service での Azure API Management サーキット ブレーカーと負荷分散の使用
Azure OpenAI Serviceでは、GPT-4やDALL-Eなどの強力なAIモデルにアクセスして利用できます。これらのモデルは、入力やパラメータに基づいて自然言語、画像、コードなどのさまざまな種類のコンテンツを生成できます。しかし、これらのモデルを効果的に利用するには、Azure OpenAIリソースに適用されるクォータや制限を考慮する必要があります。たとえば、分あたりのトークン数、分あたりのリクエスト数、プロビジョニングされたスループットユニットなどです。また、これらのモデルを呼び出す際に発生する可能性のある障害やエラーに対処する必要もあります。たとえば、ネットワークの問題、タイムアウト、サービスの利用不可などです。
このブログ記事では、Azure API Managementを使ってAzure OpenAI Serviceの回復力と容量を向上させる方法を紹介します。Azure API Managementは、APIを作成、公開、管理、保護するためのサービスです。ルーティング、キャッシング、スロットリング、認証、変換などの機能を提供します。Azure API Managementを使うことで、次のことができます。
- ラウンドロビン負荷分散技術を使って、複数のAzure OpenAI Serviceのインスタンスにリクエストを負荷分散します。これにより、負荷を異なるリソースやリージョンに分散し、サービスの可用性とパフォーマンスを向上させることができます。
- サーキットブレーカーパターンを実装して、バックエンドサービスが過剰なリクエストによって圧倒されるのを防ぎます。これにより、連鎖的な障害を防ぎ、サービスの安定性と回復力を向上させることができます。サーキットブレーカーのプロパティは、バックエンドリソースで設定できます。サーキットブレーカーをトリップするルールを定義できます。たとえば、一定の時間間隔内に発生する障害条件の数や割合、障害を示すステータスコードの範囲などです。
サーキットブレーカーパターン
サーキットブレーカーパターンとは、失敗する可能性の高い操作(たとえば、過負荷や利用不可の外部APIを呼び出すなど)を実行するのを防ぐ方法です。サーキットブレーカーは、操作の成功や失敗を監視し、それに応じてサーキットを開いたり閉じたりします。サーキットが開いているときは、操作は実行されず、代わりにフォールバックのレスポンスが返されます。サーキットが閉じているときは、操作は通常通り実行されます。このようにして、サーキットブレーカーは、リソースの無駄遣いを避け、レイテンシーやエラーを減らしてユーザー体験を向上させることができます。
API Managementでは、バックエンドリソースにサーキットブレーカーのプロパティを公開して、バックエンドサービスを多数のリクエストから保護します。
Azure OpenAIは、呼び出しに対してレート制限を適用します。サービスがレート制限を行っているときは、リクエストに429のレスポンスコードが返されます。API Managementで構成されたAzure OpenAIのバックエンドは、レート制限が発生したときにサーキットブレーカーが有効になるように設定できます。これにより、サーキットが開いたときにバックエンドが正常でないとマークされます。
サーキットが開いたときに10秒間サーキットをブレークするサンプル設定です。バックエンドで429のエラーが発生したときにサーキットをブレークします。
Azure OpenAI Service の複数のインスタンスへの要求の負荷分散
複数のAzure OpenAI Serviceのインスタンスにリクエストを負荷分散するには、各インスタンスに対してバックエンドリソースを作成し、負荷分散ポリシーを使ってリクエストを分散する必要があります。負荷分散ポリシーは、ラウンドロビンアルゴリズムを使って、各リクエストに対するバックエンドリソースを選択します。
エンドポイントがスロットリングしているときにサーキットブレーキングが有効になるように、Azure OpenAIエンドポイントごとにバックエンドリソースを作成します。サーキットブレーキングが有効になっているバックエンドは、サーキットが開いているときに正常でないとマークされます。負荷分散は、正常でないバックエンドを無視し、スロットリングしているOpenAIエンドポイントをスキップします。
複数のバックエンドリソースを負荷分散するサンプル設定です。
サーキットブレーカーと負荷分散のオプションを組み合わせることで、Azure API Managementの組み込み機能を使って、Azure OpenAIの展開の可用性と容量を基本的かつ簡単に向上させることができます。
別の方法として、OpenAIエンドポイントとAzure API Managementのスマート負荷分散を参照して、API Managementのポリシーを使った多様なアプローチを見ることができます。
負荷分散の設定は現在ラウンドロビンのみをサポートしており、高度な負荷分散のニーズには対応できません。
サーキットブレーカーの設定は現在固定時間でサーキットをブレークするだけで、バックエンドの可用性に応じて動的に調整する能力はありません。