Azure Machine Learning スタジオを使用して AI21 の Jamba ファミリ モデルをデプロイする方法
重要
現在、この機能はパブリック プレビュー段階にあります。 このプレビュー バージョンはサービス レベル アグリーメントなしで提供されており、運用環境のワークロードに使用することは推奨されません。 特定の機能はサポート対象ではなく、機能が制限されることがあります。
詳しくは、Microsoft Azure プレビューの追加使用条件に関するページをご覧ください。
この記事では、Azure Machine Learning スタジオを使って、AI21 の Jamba ファミリ モデルを従量課金制のサーバーレス API としてデプロイする方法を説明します。
Jamba ファミリ モデルは、AI21 のハイブリッド Mamba-Transformer アーキテクチャを利用した AI21 の運用環境グレードの Mamba ベースの大規模言語モデル (LLM) です。 これは、AI21 のハイブリッド構造状態空間モデル (SSM) トランスフォーマー Jamba モデルのインストラクションチューニングされたバージョンです。 Jamba ファミリ モデルは、品質とパフォーマンスに関して商業利用できる信頼性を持つように構築されています。
ヒント
AI21 のブログと Microsoft Tech Community ブログを通して、Azure AI モデル カタログで現在利用可能な AI21 の Jamba ファミリ モデルに関するお知らせを確認してください。
Jamba ファミリ モデルをサーバーレス API としてデプロイする
モデル カタログ内の特定のモデルは、従量課金制の請求でサーバーレス API としてデプロイでき、企業のセキュリティとコンプライアンス組織のニーズを維持しながら、サブスクリプションでホストせずに API として使用する方法が提供されます。 このデプロイ オプションでは、サブスクリプションからのクォータを必要としません。
従量課金制のサーバーレス API としてデプロイされる AI21-Jamba 1.5 Large モデルは、Microsoft Azure Marketplace で AI21 が提供しているものです。 AI21 は、このモデルの使用条件と価格を変更または更新する可能性があります。
サーバーレス API としてデプロイされた Jamba 1.5 large の使用を開始するには、LangChain、LiteLLM、OpenAI、Azure API との統合を検討してください。
前提条件
有効な支払い方法を持つ Azure サブスクリプション。 無料または試用版の Azure サブスクリプションは機能しません。 Azure サブスクリプションを持っていない場合は、始めるために有料の Azure アカウントを作成してください。
Azure Machine Learning ワークスペースとコンピューティング インスタンス。 これらを所有していない場合は、クイックスタート: ワークスペース リソースの作成に関する記事の手順に従って作成してください。 Jamba モデル ファミリ用のサーバーレス API モデル デプロイ オファリングは、次のリージョンに作成されたワークスペースでのみ使用できます。
- 米国東部
- 米国東部 2
- 米国中北部
- 米国中南部
- 米国西部
- 米国西部 3
- スウェーデン中部
サーバーレス API エンドポイントのデプロイをサポートする各モデルが利用できるリージョンの一覧については、「サーバーレス API エンドポイントのモデルが利用できるリージョン」を参照してください。
Azure ロールベースのアクセス制御 (Azure RBAC) は、Azure Machine Learning の操作に対するアクセスを許可するために使用されます。 この記事の手順を実行するには、ユーザー アカウントに、Azure サブスクリプションの所有者か共同作成者ロールを割り当てる必要があります。 別の方法として、アカウントに、次のアクセス許可を持つカスタム ロールを割り当てることができます。
Azure サブスクリプションで - ワークスペースを Azure Marketplace オファリングにサブスクライブするため、各ワークスペースに対して 1 回、オファリングごと:
Microsoft.MarketplaceOrdering/agreements/offers/plans/read
Microsoft.MarketplaceOrdering/agreements/offers/plans/sign/action
Microsoft.MarketplaceOrdering/offerTypes/publishers/offers/plans/agreements/read
Microsoft.Marketplace/offerTypes/publishers/offers/plans/agreements/read
Microsoft.SaaS/register/action
リソース グループで - SaaS リソースを作成して使用するため:
Microsoft.SaaS/resources/read
Microsoft.SaaS/resources/write
ワークスペースで - エンドポイントをデプロイするため (Azure Machine Learning データ サイエンティスト ロールには、既に次のアクセス許可が含まれています):
Microsoft.MachineLearningServices/workspaces/marketplaceModelSubscriptions/*
Microsoft.MachineLearningServices/workspaces/serverlessEndpoints/*
アクセス許可の詳細については、「Azure Machine Learning ワークスペースへのアクセスの管理」を参照してください。
新しいデプロイを作成する
これらの手順は AI21 Jamba 1.5 Large
または AI21 Jamba 1.5 Mini
モデルのデプロイを示したものです。 デプロイを作成するには:
[Azure Machine Learning Studio] に移動します。
モデルをデプロイするワークスペースを選択します。 サーバーレス API モデル デプロイ オファリングを使うには、前提条件の一覧で示されているサポート対象リージョンのいずれかにワークスペースが属している必要があります。
モデル カタログから
AI21 Jamba 1.5 Large
、AI21 Jamba 1.5 Mini
、AI21 Jamba Instruct
などの AI21 モデルを検索して選びます。別の方法として、ワークスペースに移動し、[エンドポイント]>[Serverless endpoints] (サーバーレス エンドポイント)>[作成] を選択して、デプロイを開始することもできます。
モデル カタログ内のモデルの概要ページで、[デプロイ] を選択し、次に [Azure AI Content Safety を使用したサーバーレス API] を選びます。
デプロイ ウィザードで、[Azure Marketplace の使用条件] へのリンクを選び、使用条件の詳細を確認します。
[Marketplace オファーの詳細] タブを選択して、選択したモデルの価格について確認することもできます。
これが初めてワークスペースにモデルをデプロイする機会である場合は、Azure Marketplace の特定のオファリングに対し、ワークスペースをサブスクライブする必要があります。 この手順では、前提条件に記載されている Azure サブスクリプションのアクセス許可とリソース グループのアクセス許可がアカウントに付与されていることが必要です。 各ワークスペースには、特定の Azure Marketplace オファリングへのそれぞれのサブスクリプションがあり、これにより支出を制御および監視できます。 [サブスクライブしてデプロイ] を選択します。 現在、ワークスペース内の各モデルに対して 1 つのデプロイしかできません。
特定の Azure Marketplace オファリングにワークスペースをサインアップすると、"同じ" ワークスペース内の "同じ" オファリングの以降のデプロイで再度サブスクライブする必要はありません。 そのため、以降のデプロイに対するサブスクリプション レベルのアクセス許可を持つ必要はありません。 このシナリオが該当する場合は、[デプロイを続行] を選択します。
デプロイに名前を付けます。 この名前は、デプロイ API URL の一部になります。 この URL は、Azure リージョンごとに一意である必要があります。
展開 を選択します。 デプロイが完了し、サーバーレス エンドポイント ページにリダイレクトされるまで待ちます。
エンドポイントを選択してその [詳細] ページを開きます。
[テスト] タブを選択して、モデルの操作を開始します。
デプロイを呼び出して予測変換を生成する [ターゲット] URL と [秘密鍵] をメモすることもできます。
エンドポイントの詳細、URL、アクセス キーは、[ワークスペース]>[エンドポイント]>[Serverless endpoints] (サーバーレス エンドポイント) に移動することでいつでも確認できます。
従量課金制トークンベースの課金を使用してサーバーレス API としてデプロイされた AI21-Jamba ファミリ モデルの課金については、「サーバーレス API としてデプロイされる Jamba ファミリ モデルのコストとクォータに関する考慮事項」を参照してください。
Jamba ファミリ モデルをサーバーレス API として使用する
Jamba ファミリ モデルは次のように使用できます。
- [ワークスペース] で、[エンドポイント]>[Serverless endpoints] (サーバーレス エンドポイント) を選択します。
- 作成した のデプロイを見つけて選びます。
- [ターゲット] URL と [キー] のトークン値をコピーします。
- ルート
/chat/completions
上の Azure AI Model Inference API または/v1/chat/completions
上の AI21 の Azure クライアントを使用して API 要求を行います。
API の使用方法の詳細については、リファレンスのセクションを参照してください。
サーバーレス API としてデプロイされた Jamba ファミリ モデルに関するリファレンス
Jamba ファミリ モデルは、以下の API の両方を受け入れます。
- 複数ターン チャットまたは単一ターン質問回答用のルート
/chat/completions
上の Azure AI モデル推論 API [Azure AI Model Inference API]。 この API がサポートされているのは、Jamba ファミリ モデルがチャット補完用に微調整されているからです。 - AI21 の Azure クライアント。 呼び出される REST エンドポイントの詳細については、「AI21 の REST ドキュメント」を参照してください。
Azure AI モデル推論 API
Azure AI Model Inference API スキーマについては、チャット入力候補のリファレンス記事を参照してください。OpenAPI 仕様は、エンドポイント自体から取得できます。
単一ターン チャットとマルチターン チャットは同じ要求と応答の形式を持ちますが、質問回答 (単一ターン) で要求内に含まれるのは 1 つのユーザー メッセージだけであるのに対し、マルチターン チャットでは各要求でチャット メッセージ履歴全体を送信する必要があるという点が異なります。
マルチターン チャットにおいて、メッセージ スレッドは以下の性質を持ちます。
- ユーザーとモデルからのすべてのメッセージを古いものから新しいものの順で保持します。
- メッセージは
user
とassistant
のロール メッセージに交互に切り替わります - 必要に応じて、メッセージ スレッドは、コンテキストを提供するシステム メッセージで始まります。
次の擬似コードは、最初のシステム メッセージを含むチャット要求の 4 番目の呼び出しのメッセージ スタックの例です。
[
{"role": "system", "message": "Some contextual information here"},
{"role": "user", "message": "User message 1"},
{"role": "assistant", "message": "System response 1"},
{"role": "user", "message": "User message 2"},
{"role": "assistant"; "message": "System response 2"},
{"role": "user", "message": "User message 3"},
{"role": "assistant", "message": "System response 3"},
{"role": "user", "message": "User message 4"}
]
AI21 の Azure クライアント
メソッド POST
を使用して、/v1/chat/completions
ルートに要求を送信します。
Request
POST /v1/chat/completions HTTP/1.1
Host: <DEPLOYMENT_URI>
Authorization: Bearer <TOKEN>
Content-type: application/json
要求スキーマ
ペイロードは、次のパラメーターを含む JSON 形式の文字列です:
キー | Type | 必須であるか/既定値 | 使用できる値 | 説明 |
---|---|---|---|---|
model |
string |
年 | jamba-instruct 、AI21 Jamba 1.5 Large または AI21 Jamba 1.5 Mini |
|
messages |
list[object] |
年 | オブジェクトのリスト (メッセージごとに 1 つ、古いものから新しいものの順)。 最も古いメッセージはロールが system である可能性があります。 それ以降のすべてのメッセージは、ユーザー ロールとアシスタント ロールの間で交互に切り替わる必要があります。 以下のメッセージ オブジェクト定義を参照してください。 |
|
max_tokens |
integer |
N4096 |
0 – 4096 | 生成された各応答メッセージに対して許可するトークンの最大数。 通常、出力の長さを制限する最善の方法は、システム プロンプトで長さの制限を指定することです (たとえば、"回答を 3 つの文までに制限する" など) |
temperature |
float |
N1 |
0.0 – 2.0 | 各回答でどの程度の変動を提供するか。 この値を 0 に設定すると、同じ質問に対して毎回同じ応答が行われることが保証されます。 高い値を設定すると、変動幅が増えます。 トークンのサンプリング元の分布を変更します。 これと top_p の両方ではなく、いずれかを変更することをお勧めします。 |
top_p |
float |
N1 |
0 <value<=1.0 | 各ステップの次のトークンのプールを、考えられるトークンの上位 N パーセンタイルに制限します。1.0 は考えられるトークンすべてのプールを意味し、0.01 は最も可能性の高い次のトークンのみのプールを意味します。 |
stop |
string またはlist[string] |
N |
"" | API がそこで出力の生成を停止する必要がある (複数の) 単語を含む文字列または文字列のリスト。 改行は "\n" として使用できます。 返されるテキストに停止シーケンスは含まれません。 |
n |
integer |
N1 |
1 – 16 | 各プロンプトに対して何個の応答を生成するべきか。 Azure AI Studio のプレイグラウンドでは、マルチ応答プレイグラウンドを使用するため n=1 となります。 |
stream |
boolean |
NFalse |
True またはFalse |
ストリーミングを有効にするかどうか。 true の場合、結果は一度に 1 つのトークンとして返されます。 true に設定した場合、n は 1 である必要がありますが、これは自動的に設定されます。 |
messages
オブジェクトには次のフィールドがあります:
role
: ["文字列、必須"] メッセージの作成者または目的。 次のいずれかの値です。user
: ユーザーによって指定された入力。 ここで指定された、system
プロンプト内で指定された命令と競合する命令は、system
プロンプトの命令よりも優先されます。assistant
: そのモデルによって生成される応答。system
: 生成されるメッセージのトーンと音声に関する一般的なガイダンスを提供する初期命令。 初期システム メッセージは省略可能ですが、チャットのトーンに関するガイダンスを提供するために推奨されています。 たとえば、"あなたは地球科学のバックグラウンドと魅力的なフランス訛りを持つ親切なチャットボットです" などです。
content
: ["文字列、必須"] メッセージの内容。
要求の例
単一ターンの例
{
"model": "jamba-instruct",
"messages": [
{
"role":"user",
"content":"Who was the first emperor of rome?"}
],
"temperature": 0.8,
"max_tokens": 512
}
チャットの例 (3 番目のユーザー応答を含む 4 番目の要求)
{
"model": "jamba-instruct",
"messages": [
{"role": "system",
"content": "You are a helpful genie just released from a bottle. You start the conversation with 'Thank you for freeing me! I grant you one wish.'"},
{"role":"user",
"content":"I want a new car"},
{"role":"assistant",
"content":"🚗 Great choice, I can definitely help you with that! Before I grant your wish, can you tell me what kind of car you're looking for?"},
{"role":"user",
"content":"A corvette"},
{"role":"assistant",
"content":"Great choice! What color and year?"},
{"role":"user",
"content":"1963 black split window Corvette"}
],
"n":3
}
応答スキーマ
応答は、結果がストリーミングされるか否かに若干左右されます。
"ストリーミングされていない結果" では、すべての応答が 1 つの応答内にまとめて提供されます。これには usage
プロパティも含まれます。
"ストリーミングされた結果" では、
- 各応答は
choices
フィールド内に 1 つのトークンを含んでいます。 choices
オブジェクトの構造が異なります。usage
オブジェクトを含むのは最後の応答だけです。- 応答全体が
data
オブジェクト内にラップされます。 - 最後の応答オブジェクトは
data: [DONE]
です。
応答ペイロードは、次のフィールドを持つディクショナリです。
キー | Type | 説明 |
---|---|---|
id |
string |
要求の一意の識別子。 |
model |
string |
使用されるモデルの名前。 |
choices |
list[object |
モデルによって生成された応答テキスト。 非ストリーミング応答の場合、これは n 個の項目を含むリストです。 ストリーミングされた応答の場合、これは 1 つのトークンを含む 1 つのオブジェクトです。 以下のオブジェクトの説明を参照してください。 |
created |
integer |
入力候補が作成されたときの Unix タイムスタンプ (秒単位)。 |
object |
string |
オブジェクトの種類。これは常に chat.completion です。 |
usage |
object |
入力候補要求の使用状況の統計情報。 詳細については以下を参照してください。 |
choices
応答オブジェクトには、モデルによって生成された応答が含まれています。 オブジェクトには次のフィールドがあります:
キー | Type | 説明 |
---|---|---|
index |
integer |
メッセージのリスト内の 0 から始まるメッセージのインデックス。 リスト内の位置に対応していない場合があります。 ストリーミングされたメッセージの場合、これは常に 0 です。 |
message またはdelta |
object |
生成されたメッセージ (またはストリーミング応答内のトークン)。 要求内での記述と同じオブジェクトの種類で、以下の 2 つの違いがあります。 - 非ストリーミング応答では、このオブジェクトは message と呼ばれます。 - ストリーミング応答では、これは delta と呼ばれ、message または role のどちらかだけを含みます。 |
finish_reason |
string |
モデルがトークンの生成を停止した理由。 - stop : モデルが自然な停止点、または指定された停止シーケンスに到達した。 - length : トークンの最大数に到達した。 - content_filter : 生成された応答が責任ある AI のポリシーに違反した。 - null : ストリーミングのみ。 ストリーミング応答では、最後の応答を除くすべての応答が null になります。 |
usage
応答オブジェクトには以下のフィールドが含まれます。
キー | Type | Value |
---|---|---|
prompt_tokens |
integer |
プロンプト内のトークンの数。 プロンプト トークンの数には、必要に応じてモデルがプロンプト リストを 1 つの文字列の形式にできるように、システムによって追加される余分なトークンが含まれていることに注意してください。 通常、余分なトークンの数はスレッド内のメッセージの数に比例するため、比較的少ないはずです。 |
completion_tokens |
integer |
入力候補に生成されたトークンの数。 |
total_tokens |
integer |
トークンの合計数。 |
非ストリーミング応答の例
{
"id":"cmpl-524c73beb8714d878e18c3b5abd09f2a",
"choices":[
{
"index":0,
"message":{
"role":"assistant",
"content":"The human nose can detect over 1 trillion different scents, making it one of the most sensitive smell organs in the animal kingdom."
},
"finishReason":"stop"
}
],
"created": 1717487036,
"usage":{
"promptTokens":116,
"completionTokens":30,
"totalTokens":146
}
}
ストリーミング応答の例
data: {"id": "cmpl-8e8b2f6556f94714b0cd5cfe3eeb45fc", "choices": [{"index": 0, "delta": {"role": "assistant"}, "created": 1717487336, "finish_reason": null}]}
data: {"id": "cmpl-8e8b2f6556f94714b0cd5cfe3eeb45fc", "choices": [{"index": 0, "delta": {"content": ""}, "created": 1717487336, "finish_reason": null}]}
data: {"id": "cmpl-8e8b2f6556f94714b0cd5cfe3eeb45fc", "choices": [{"index": 0, "delta": {"content": " The"}, "created": 1717487336, "finish_reason": null}]}
data: {"id": "cmpl-8e8b2f6556f94714b0cd5cfe3eeb45fc", "choices": [{"index": 0, "delta": {"content": " first e"}, "created": 1717487336, "finish_reason": null}]}
data: {"id": "cmpl-8e8b2f6556f94714b0cd5cfe3eeb45fc", "choices": [{"index": 0, "delta": {"content": "mpe"}, "created": 1717487336, "finish_reason": null}]}
... 115 responses omitted for sanity ...
data: {"id": "cmpl-8e8b2f6556f94714b0cd5cfe3eeb45fc", "choices": [{"index": 0, "delta": {"content": "me"}, "created": 1717487336, "finish_reason": null}]}
data: {"id": "cmpl-8e8b2f6556f94714b0cd5cfe3eeb45fc", "choices": [{"index": 0, "delta": {"content": "."}, "created": 1717487336,"finish_reason": "stop"}], "usage": {"prompt_tokens": 107, "completion_tokens": 121, "total_tokens": 228}}
data: [DONE]
コストとクォータ
サーバーレス API としてデプロイされる Jamba ファミリ モデルのコストとクォータに関する考慮事項
Jamba ファミリ モデルはサーバーレス API としてデプロイされ、Azure Marketplace で AI21 が提供しており、Azure AI Studio と統合して使用されます。 モデルをデプロイまたは微調整するときに、Azure Marketplace の価格を確認できます。
ワークスペースが Azure Marketplace から特定のモデル オファリングにサブスクライブするたびに、その消費に関連するコストを追跡するための新しいリソースが作成されます。 推論と微調整に関連するコストを追跡するために同じリソースが使用されますが、各シナリオを個別に追跡するために複数の測定値を使用できます。
コストを追跡する方法の詳細については、「Azure Marketplace を通じて提供されるモデルのコストを監視する」を参照してください。
クォータはデプロイごとに管理されます。 各デプロイのレート制限は、1 分あたり 200,000 トークン、1 分あたり 1,000 個の API 要求です。 ただし、現在、プロジェクトのモデルごとに 1 つのデプロイに制限しています。 現在のレート制限がシナリオに十分でない場合は、Microsoft Azure サポートにお問い合わせください。
コンテンツのフィルター処理
サーバーレス API としてデプロイされたモデルは、Azure AI Content Safety によって保護されます。 Azure AI Content Safety を有効にすると、プロンプトと入力候補の両方が、有害なコンテンツ出力の検出と防止を目的とした一連の分類モデルを通過します。 コンテンツ フィルタリング (プレビュー) システムは、入力プロンプトと出力される入力候補の両方で、有害な可能性があるコンテンツ特有のカテゴリを検出し、アクションを実行します。 Azure AI Content Safety の詳細を確認します。