Azure OpenAI Serviceをデプロイした

# 背景・目的
最近、Azure OpenAIを触る機会がありましたので、あらためて基本的な知識と利用開始までの手順をまとめます。

# まとめ
下記に特徴を整理します。

|特徴|説明|
|:--|:--|
|Azure OpenAI Service|下記のモデルに対してのREST APIアクセスを提供します<BR>・GPT-4o<BR>・GPT-4 Turbo with Vision<BR>・GPT-4<BR>・GPT-3.5-Turbo<BR>・Embeddings モデル シリーズなど|
|ユースケース|・コンテンツの生成<BR>・要約<BR>・画像の解釈<BR>・セマンティック検索<BR>・自然言語からコードへの翻訳|
|インタフェイス|下記を提供している<BR>・REST API<BR>・Python SDK<BR>・Azure OpenAI Studio|
|Azure OpenAIとOpenAIの違い|Azure OpenAIを使用により、OpenAIと同等のモデルを実施しながら、Azureのセキュリティ機能を使用できる|
|デプロイのタイプ|・Global-Batch<BR>・グローバル標準<BR>・Standard<BR>・プロビジョニング済み|
|プロビジョニング済み|・デプロイで必要なスループットの量を指定<BR>・スループットは、デプロイのスループットを表す正規化された方法であるプロビジョニング スループット ユニット (PTU) という観点で定義される|
|Standard|・選択されたモデルで呼び出し単位の支払いの課金モデルが提供される<BR><BR>・消費した分だけ支払うので、最も早く使い始めることができる<BR><BR>・各リージョンで使用できるモデルとスループットは、制限される場合がある<BR>・バースト性が高い中程度以下のボリューム用に最適化されてる<BR><BR>・一貫して使用量が多い利用者は、待ち時間の変動が大きくなる可能性がある|
|グローバル標準|・Azure のグローバル インフラストラクチャを利用して、トラフィックを要求ごとに最適な可用性のデータ センターに動的にルーティングされる<BR><BR>・最大の既定クォータが提供され、複数のリソース間での負荷分散の必要ない<BR><BR>・一貫して使用量が多いお客様は、待ち時間の変動が大きくなる可能性がある<BR><BR>・しきい値はモデルごとに設定される<BR><BR>・大規模なワークロードの使用時に、変動の少ない待ち時間を必要とするアプリケーションには、プロビジョニング済みスループットを購入を推奨|
|Global-Batch|・大規模で大量の処理タスクを効率的に処理するように設計されている<BR><BR>・個別のクォータ、24 時間のターゲット ターンアラウンド、Global Standard と比較した場合の 50% 低いコストで要求の非同期グループを処理する<BR><BR>・バッチ処理では、一度に 1 つの要求を送信するのではなく、1 つのファイル内で多数の要求を送信する|


# 概要
下記を基に整理します。

https://learn.microsoft.com/ja-jp/azure/ai-services/openai/overview

> Azure OpenAI Service は、GPT-4o、GPT-4 Turbo with Vision、GPT-4、GPT-3.5-Turbo、Embeddings モデル シリーズなど、OpenAI の強力な言語モデルへの REST API アクセスを提供します。 これらのモデルは、特定のタスクに合わせて簡単に調整できます。たとえば、コンテンツの生成、要約、画像の解釈、セマンティック検索、自然言語からコードへの翻訳などです。 ユーザーは、REST API、Python SDK、または Azure OpenAI Studio の Web ベースのインターフェイスを介してサービスにアクセスできます。

- Azure OpenAI Serviceは、下記のモデルに対してのREST APIアクセスを提供します
    - GPT-4o
    - GPT-4 Turbo with Vision
    - GPT-4
    - GPT-3.5-Turbo
    - Embeddings モデル シリーズなど
- 下記のようなユースケースに利用できる
    - コンテンツの生成
    - 要約
    - 画像の解釈
    - セマンティック検索
    - 自然言語からコードへの翻訳
- 下記のインタフェイスを提供している
    - REST API
    - Python SDK
    - Azure OpenAI Studio 

## 機能の概要
### Price 
下記をご確認ください。

https://azure.microsoft.com/ja-jp/pricing/details/cognitive-services/openai-service/

## Azure OpenAI と OpenAI の比較
> Azure OpenAI Service では、OpenAI GPT-4、GPT-3、Codex、DALL-E、Whisper、テキスト読み上げの各モデルを使用した高度な言語 AI を、Azure のセキュリティとエンタープライズの約束と共にお客様に提供します。 Azure OpenAI は OpenAI と共に API を共同開発し、互換性を確保し、一方から他方へのスムーズな移行を保証します。

> Azure OpenAI を使用すると、顧客は OpenAI と同じモデルを実行しながら、Microsoft Azure のセキュリティ機能を使用できます。 Azure OpenAI では、プライベート ネットワーク、リージョンの可用性、責任ある AI コンテンツのフィルター処理が提供されます。

- Azure OpenAIを使用により、OpenAIと同等のモデルを実施しながら、Azureのセキュリティ機能を使用できる
- 下記を提供している
    - プライベートネットワーク
    - リージョンの可用性
    - AIコンテツフィルター処理

## トークン
### テキスト トークン
> Azure OpenAI では、テキストをトークンに分割して処理します。 トークンには、単語または文字のチャンクのみを指定できます。 たとえば、"hamburger" という単語はトークン "ham"、"bur"、"ger" に分割されますが、"pear" のような短くて一般的な単語は 1 つのトークンです。 多くのトークンは、"hello" や "bye" などの空白で始まります。

> 所与の要求で処理されるトークンの合計数は、入力、出力、および要求パラメーターの長さによって異なります。 処理されるトークンの量は、モデルの応答待機時間とスループットにも影響します。

- テキストをトークンに分割して処理する
- トークンには、単語または文字のチャンクを指定できる
- 例:hamburgerは下記に分割される
    - ham
    - bur
    - ger
- 例:pearは1トークン
- 多くのトークンは、hello、byeなどの空白で始まる

### 画像トークン (GPT-4 Turbo with Vision および GPT-4o)
> 入力画像のトークン コストは、画像のサイズと、各画像に使用される詳細設定 (低または高) の 2 つの主な要因によって異なります。 仕組みの概要を次に示します。

> - 詳細: 低解像度モード
>    - 低詳細度を使用すると、API ではより高速な応答を返し、高詳細度を必要としないユース ケースに使用する入力トークンを減らすことができます。
>    - これらの画像のコストは、画像サイズに関係なくそれぞれ 85 トークンです。
>    - 例: 4096 x 8192 の画像 (低詳細度): コストは固定の 85 トークンです。これは低詳細度の画像であり、このモードではサイズがコストに影響しないためです。

> - 詳細: 高解像度モード
>    - 高詳細度を使用すると、API では画像をより小さな正方形にトリミングすることでより詳細に表示できます。 それぞれの正方形では、テキストを生成するためにより多くのトークンを使用します。
>    - トークン コストは、一連のスケーリング手順によって計算されます。
>       1. 画像は最初に、縦横比を維持しながら、2048 x 2048 の正方形内に収まるようにスケーリングされます。
>       1. その後、最も短い辺が 768 ピクセル長になるように、画像がスケールダウンされます。
>       1. 画像は 512 ピクセルの正方形タイルに分割され、これらのタイルの数 (部分的なタイルでは切り上げ) によって最終的なコストが決まります。 各タイルのコストは 170 トークンです。
>       1. 合計コストには、さらに 85 トークンが追加されます。
>    - 例: 2048 x 4096 の画像 (高詳細度)
>       1. 2048 の正方形に収まるように、最初は 1024 x 2048 にサイズ変更されました。
>       1. さらに 768 x 1536 にサイズ変更されました。
>       1. カバーするには 6 つの 512px タイルが必要です。
>       1. 合計コストは 170 × 6 + 85 = 1105 トークンです。


- 画像サイズと、各画像に使用される詳細設定の要因により変わる
    - 詳細：低解像度モード
        - API ではより高速な応答を返す
        - 高詳細度を必要としないユースケースに使用する入力トークンを減らすことができる
        - 画像のコストは、画像サイズに関係なくそれぞれ 85 トークン
        - 例: 4096 x 8192 の画像 (低詳細度): コストは固定の 85 トークン
    - 詳細: 高解像度モード
        - API では画像をより小さな正方形にトリミングすることでより詳細に表示できる
        - それぞれの正方形では、テキストを生成するためにより多くのトークンを使用する
        - トークン コストは、一連のスケーリング手順によって計算される
            1. 画像は最初に、縦横比を維持しながら、2048 x 2048 の正方形内に収まるようにスケーリングされる
            1. その後、最も短い辺が 768 ピクセル長になるように、画像がスケールダウンされる
            1. 画像は 512 ピクセルの正方形タイルに分割され、これらのタイルの数 (部分的なタイルでは切り上げ) によって最終的なコストが決まる。 各タイルのコストは 170 トークン
            1. 合計コストには、さらに 85 トークンが追加される
        - 例: 2048 x 4096 の画像 (高詳細度)
            -  2048 の正方形に収まるように、最初は 1024 x 2048 にサイズ変更される
            -  さらに 768 x 1536 にサイズ変更
            -  カバーするには 6 つの 512px タイルが必要になる
            -  合計コストは 170 × 6 + 85 = 1105 トークン

## リソース
> Azure OpenAI は、Azure の新しい製品オファリングです。 Azure OpenAI は、他の Azure 製品と同じように、Azure サブスクリプションにこのサービス用のリソースまたはインスタンスを作成して使用を開始できます。 Azure のリソース管理設計について詳しくご覧いただけます。

- 製品オファリング
- Azure サブスクリプションにこのサービス用のリソースまたはインスタンスを作成して使用を開始できる

## デプロイメント
> Azure OpenAI リソースを作成したら、API 呼び出しを開始してテキストを生成する前に、モデルをデプロイする必要があります。 このアクションは、Deployment API を使用して実行できます。 これらの API を使用すると、使用するモデルを指定できます。

-  OpenAI リソース作成後、モデルをデプロイする必要がある
-  Deployment API を使用して実行できる
-  これらの API を使用すると、使用するモデルを指定できる

## Azure OpenAI のデプロイの種類
> Azure OpenAI では、お客様はビジネスと使用のパターンに合ったホスティング構造を選択できます。 このサービスで提供されるデプロイの 2 つの主要な種類は、標準とプロビジョニング済みです。 標準にはグローバル デプロイ オプションが用意されており、トラフィックをグローバルにルーティングしてスループットを向上させます。 実行される推論操作はどのデプロイもまったく同じですが、課金、スケール、パフォーマンスは大きく異なります。 ソリューション設計の一環として、2 つの重要な決定を行う必要があります。

> - データ所在地のニーズ: グローバル リソースまたはリージョン リソース
> - 呼び出しボリューム: 標準またはプロビジョニング済み

- Azure OpenAI では、ビジネスと使用のパターンに合ったホスティング構造を選択できる
- デプロイの種類には、標準とプロビジョンドの2つがある

## グローバルとリージョンのデプロイの種類
> 標準デプロイの場合、リソース内でグローバルまたはリージョンの 2 種類の構成を選択できます。 グローバル標準は、開発と実験で初めて使用する場合に推奨されます。 グローバル デプロイでは、Azure のグローバル インフラストラクチャが利用され、お客様のトラフィックはお客様の推論要求に最適な可用性を持つデータ センターに動的にルーティングされます。 グローバル デプロイでは、初期スループットの制限は高くなりますが、待ち時間は高い使用レベルで異なる場合があります。 大規模なワークロードを使って変化の小さい待ち時間を必要とするお客様には、プロビジョニング済みスループットを購入することをお勧めします。

> グローバル デプロイは、すべての新しいモデルと特徴の最初の場所になります。 非常に大きいスループットが必要なお客様は、プロビジョニングされたデプロイ オファリングを検討する必要があります。

- 標準デプロイ
    - リソース内で下記の2 種類の構成を選択できる
        - グローバル
        - リージョン
    - グローバル標準
        - 開発と実験で初めて使用する場合に推奨
- グローバル デプロイ
    - Azure のグローバル インフラストラクチャが利用される
    - トラフィックは推論要求に最適な可用性を持つデータ センターに動的にルーティングされる
    - 初期スループットの制限は高くなりますが、待ち時間は高い使用レベルで異なる場合がある
- プロビジョニング済みスループット
    - 大規模なワークロードを使って変化の小さい待ち時間を必要とする利用者

## デプロイのタイプ
下記のタイプがある
- Global-Batch
- グローバル標準
- Standard
- プロビジョニング済み

### プロビジョニング済み
> プロビジョニング済みデプロイを使うと、デプロイで必要なスループットの量を指定できます。 その後、サービスは必要なモデル処理容量を割り当て、その準備が整っていることを確認します。 スループットは、デプロイのスループットを表す正規化された方法であるプロビジョニング スループット ユニット (PTU) という観点で定義されます。 各モデルバージョン ペアでは、デプロイして PTU ごとにさまざまな量のスループットを提供するために、さまざまな量の PTU が必要となります。 詳しくは、プロビジョニング済みスループットの概念に関する記事をご覧ください。

- デプロイで必要なスループットの量を指定
-  スループットは、デプロイのスループットを表す正規化された方法であるプロビジョニング スループット ユニット (PTU) という観点で定義される

### Standard
> 標準デプロイでは、選択されたモデルで呼び出し単位の支払いの課金モデルが提供されます。 消費した分だけ支払うので、最も早く使い始めることができます。 各リージョンで使用できるモデルとスループットは、制限される場合があります。

> 標準デプロイは、バースト性が高い中程度以下のボリューム用に最適化されています。 一貫して使用量が多いお客様は、待ち時間の変動が大きくなる可能性があります。


- 選択されたモデルで呼び出し単位の支払いの課金モデルが提供される
- 消費した分だけ支払うので、最も早く使い始めることができる
- 各リージョンで使用できるモデルとスループットは、制限される場合がある
- バースト性が高い中程度以下のボリューム用に最適化されてる
- 一貫して使用量が多い利用者は、待ち時間の変動が大きくなる可能性がある

### グローバル標準
> Global デプロイは、非グローバル デプロイ タイプと同じ Azure OpenAI リソースで利用できます。ただし、Azure のグローバル インフラストラクチャを利用して、トラフィックを要求ごとに最適な可用性のデータ センターに動的にルーティングできます。 グローバル標準では、最大の既定クォータが提供され、複数のリソース間での負荷分散の必要がなくなります。

> 一貫して使用量が多いお客様は、待ち時間の変動が大きくなる可能性があります。 しきい値はモデルごとに設定されます。 詳しくはクォータに関するページを参照してください。 大規模なワークロードの使用時に、変動の少ない待ち時間を必要とするアプリケーションには、プロビジョニング済みスループットを購入することをお勧めします。

- Azure のグローバル インフラストラクチャを利用して、トラフィックを要求ごとに最適な可用性のデータ センターに動的にルーティングされる
- 最大の既定クォータが提供され、複数のリソース間での負荷分散の必要ない
- 一貫して使用量が多いお客様は、待ち時間の変動が大きくなる可能性がある
- しきい値はモデルごとに設定される
- 大規模なワークロードの使用時に、変動の少ない待ち時間を必要とするアプリケーションには、プロビジョニング済みスループットを購入を推奨

### Global Batch
> Global Batch は、大規模で大量の処理タスクを効率的に処理するように設計されています。 個別のクォータ、24 時間のターゲット ターンアラウンド、Global Standard と比較した場合の 50% 低いコストで要求の非同期グループを処理します。 バッチ処理では、一度に 1 つの要求を送信するのではなく、1 つのファイル内で多数の要求を送信します。 グローバル バッチ要求には、オンライン ワークロードの中断を回避する個別のエンキュー トークン クォータがあります。

- 大規模で大量の処理タスクを効率的に処理するように設計されている
- 個別のクォータ、24 時間のターゲット ターンアラウンド、Global Standard と比較した場合の 50% 低いコストで要求の非同期グループを処理する
- バッチ処理では、一度に 1 つの要求を送信するのではなく、1 つのファイル内で多数の要求を送信する
- 主なユースケース
    - 大規模なデータ処理: 広範なデータセットを並列ですばやく分析
    - コンテンツ生成: 製品の説明や記事など、大量のテキストを作成
    - ドキュメントの校閲と要約: 長いドキュメントの校閲と要約を自動化する
    - カスタマー サポートの自動化: 多数の問い合わせを同時に処理して迅速な対応を実現
    - データの抽出と分析: 膨大な量の非構造化データから情報を抽出して分析
    - 自然言語処理 (NLP) タスク: 大規模なデータセットに対して感情分析や翻訳などのタスクを実行
    - マーケティングとパーソナル化: パーソナル化されたコンテンツとレコメンデーションを大規模に生成


# 実践
## Azure OpenAIのセットアップ
### アカウント作成
私はAzureアカウントがないので、アカウントから作成します。

1. [Azure](https://azure.microsoft.com/ja-jp)にアクセスします
1. 「Azureの利用を開始する」をクリックします
1. 「Azureを無料で試す」をクリックします
1. ダイアログが表示されるので、今回はGitHubアカウントでサインインをクリックします
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/f7e2f4a6-48d1-de58-bc9f-db2ce5dac01d.png)

1. 「Authorize Microsoft-corp」をクリックします
1. 諸々設定しアカウントが作成されるとポータルが表示されます
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/8318ded4-0134-6723-524a-283bb1d2689c.png)

### OpenAIの作成

1. ポータルで「リソースの作成」をクリックします
1. ナビゲーションペインで、「AI + Machine Learning」をクリックします
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/b3e03f02-22dd-3064-296f-5ac68eed9a80.png" width=150 />

1. Azure AI servicesをクリックします
1. 下記を入力し、「次へ」をクリックします
    - サブスクリプション：プルダウンから選択
    - リソースグループ：新規作成
    - リージョン：East US
    - 名称：任意の名称を指定
    - 価格レベル：Standard S0を指定
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/c04c8312-6cf9-86f0-8c64-59bbe2d34cdb.png)
1. ネットワーク画面で「インターネットを含むすべてのネットワークがこのリソースにアクセスできます。」を選択し、「次へ」をクリックします
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/0e48bc69-6a63-592c-cd99-2d2fd2eb9518.png)
1. Tags画面で、「次へ」をクリックします
1. レビューおよび送信画面で、「作成」をクリックします
1. しばらくすると完了します
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/4ee0d059-4512-5456-31c3-189495fc382b.png)

### モデルのデプロイ
1. 「リソースに移動」をクリックします
1. 「Azure OpenAI Studioに移動する」をクリックします
1. ナビゲーションペインの「デプロイ」をクリックします
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/378349bc-8431-c0ed-58da-8dc05a8d9a5f.png" width=150 />

1. 「＋モデルのデプロイ」＞「基本モデルをデプロイする」をクリックします
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/ba0f7237-21c7-5877-da23-0d7d10465a77.png)

1. ポップアップが表示されるので、①「gpt-4o」を選択し、②「確認」をクリックします
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/9679dffc-4433-8844-c08c-3cc0e4cd30d0.png)

1. そのままで、「デプロイ」をクリックします
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/c26c62bf-f6c8-887d-30fe-44c33a9a82b4.png)
1. 作成されました
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/fbd4a4c4-c0f7-2023-ef9e-a536387898a3.png)


### 動作確認
1. デプロイした、モデルを選択します
1. 「プレイグラウンドで開く」をクリックします
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/f332f756-f813-659e-c942-34d0691a4ff7.png)

1. 「test」と打ち込んで、レスポンスが返ってきました。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/9841c4f5-62fa-bd3a-4067-5d1e32f93192.png)

# 考察
今回、Azureのアカウント開設から、 OpenAIをデプロイするまでの手順を整理しました。次回以降はAWSからのアクセスを試してみます。

# 参考

https://learn.microsoft.com/ja-jp/azure/ai-services/openai/quotas-limits#gpt-4o--gpt-4-turbo-global-standard

https://azure.microsoft.com/ja-jp/pricing/details/cognitive-services/openai-service/