本文說明如何以程式設計方式設定服務端點的模型,以提供多個模型,以及它們之間的流量分割。
從單一端點提供多個模型可讓您分割不同模型之間的流量,以比較其效能並加速 A/B 測試。 您也可以同時提供不同版本的模型,讓試驗新版本更容易,同時將目前的版本保留在生產環境中。
你可以在模型服務端點上服務以下任何一種模型類型。 您無法在單一端點中提供不同的模型類型。 例如,您無法在相同的端點中提供自定義模型和外部模型。
需求
若要了解用於模型服務端點的存取控制選項和端點管理的最佳做法指導,請參閱服務端點 ACL。
建立端點並設定初始流量分割
當你使用 Model Serving API 或 Model Serving UI 建立模型服務端點時,也可以設定你想在該端點服務的模型的初始流量分配。 下列各節提供為端點上服務之多個自定義模型或基礎模型設定流量分割的範例。
將多個自訂模型部署到端點
下列 REST API 範例會在 Unity 目錄中建立具有兩個自定義模型的單一端點,並設定這些模型之間的端點流量分割。 服務實體 current 代管 model-A 的第 1 版,並接收 90% 的端點流量;而另一個服務實體 challenger 代管 model-B 的第 1 版,並接收 10% 的端點流量。
POST /api/2.0/serving-endpoints
{
"name":"multi-model"
"config":
{
"served_entities":
[
{
"name":"current",
"entity_name":"catalog.schema.model-A",
"entity_version":"1",
"workload_size":"Small",
"scale_to_zero_enabled":true
},
{
"name":"challenger",
"entity_name":"catalog.schema.model-B",
"entity_version":"1",
"workload_size":"Small",
"scale_to_zero_enabled":true
}
],
"traffic_config":
{
"routes":
[
{
"served_model_name":"current",
"traffic_percentage":"90"
},
{
"served_model_name":"challenger",
"traffic_percentage":"10"
}
]
}
}
}
將多個模型提供至布建的輸送量端點
下列 REST API 範例會建立具有兩個模型的單一基礎模型 API 布建輸送量端點,並設定這些模型之間的端點流量分割。 名為 multi-pt-model 的端點裝載了 meta_llama_v3_1_70b_instruct 的第 2 版,該版本取得 60% 的端點流量,並且也裝載了 meta_llama_v3_1_8b_instruct 的第 3 版,該版本取得 40% 的端點流量。
POST /api/2.0/serving-endpoints
{
"name":"multi-pt-model"
"config":
{
"served_entities":
[
{
"name":"meta_llama_v3_1_70b_instruct",
"entity_name":"system.ai.meta_llama_v3_1_70b_instruct",
"entity_version":"4",
"min_provisioned_throughput":0,
"max_provisioned_throughput":2400
},
{
"name":"meta_llama_v3_1_8b_instruct",
"entity_name":"system.ai.meta_llama_v3_1_8b_instruct",
"entity_version":"4",
"min_provisioned_throughput":0,
"max_provisioned_throughput":1240
}
],
"traffic_config":
{
"routes":
[
{
"served_model_name":"meta_llama_v3_1_8b_instruct",
"traffic_percentage":"60"
},
{
"served_model_name":"meta_llama_v3_1_70b_instruct",
"traffic_percentage":"40"
}
]
}
}
}
將多個外部模型部署到單一端點
您也可以在服務端點中設定多個 外部模型 ,只要它們都有相同的工作類型,而且每個模型都有唯 name一的 。 你不能在相同的服務端點中同時具有外部模型和非外部模型。
下列範例會建立一個服務端點,將 50% 的流量路由至 OpenAI 提供的 gpt-4,並將其餘 50% 路由至 Anthropic 提供的 claude-3-opus-20240229。
import mlflow.deployments
client = mlflow.deployments.get_deploy_client("databricks")
client.create_endpoint(
name="mix-chat-endpoint",
config={
"served_entities": [
{
"name": "served_model_name_1",
"external_model": {
"name": "gpt-4",
"provider": "openai",
"task": "llm/v1/chat",
"openai_config": {
"openai_api_key": "{{secrets/my_openai_secret_scope/openai_api_key}}"
}
}
},
{
"name": "served_model_name_2",
"external_model": {
"name": "claude-3-opus-20240229",
"provider": "anthropic",
"task": "llm/v1/chat",
"anthropic_config": {
"anthropic_api_key": "{{secrets/my_anthropic_secret_scope/anthropic_api_key}}"
}
}
}
],
"traffic_config": {
"routes": [
{"served_model_name": "served_model_name_1", "traffic_percentage": 50},
{"served_model_name": "served_model_name_2", "traffic_percentage": 50}
]
},
}
)
更新服務模型之間的流量分割
您也可以更新服務模型之間的流量分割。 下列 REST API 範例會將服務模型 current設定為取得端點流量的 50%,而其他模型則 challenger,以取得其餘 50% 的流量。
你也可以在Azure Databricks介面的 Serving 分頁使用 Edit configuration 按鈕進行此更新。
PUT /api/2.0/serving-endpoints/{name}/config
{
"served_entities":
[
{
"name":"current",
"entity_name":"catalog.schema.model-A",
"entity_version":"1",
"workload_size":"Small",
"scale_to_zero_enabled":true
},
{
"name":"challenger",
"entity_name":"catalog.schema.model-B",
"entity_version":"1",
"workload_size":"Small",
"scale_to_zero_enabled":true
}
],
"traffic_config":
{
"routes":
[
{
"served_model_name":"current",
"traffic_percentage":"50"
},
{
"served_model_name":"challenger",
"traffic_percentage":"50"
}
]
}
}
查詢端點背後的個別模型
在某些情況下,您可能會想要查詢端點背後的個別模型。
您可以使用下列方法來執行:
POST /serving-endpoints/{endpoint-name}/served-models/{served-model-name}/invocations
此處會查詢特定的提供服務模型。 要求格式與查詢端點相同。 查詢個別服務模型時,會忽略流量設定。
在 multi-model 端點範例的內容中,如果所有要求都傳送至 /serving-endpoints/multi-model/served-models/challenger/invocations,則 challenger 服務模型會提供所有要求。