Microsoft Azure 文件
在 Azure AI 上部署大型語言模型 (LLM)
並獲得增強的文件體驗
開始使用
在 Azure AI 上部署大型語言模型 (LLM)
此示例展示瞭如何將 Hugging Face Collection 中的大型語言模型 (LLM) 部署為 Azure AI Foundry Hub 中的 Azure ML 託管線上終結點。此外,本示例還展示瞭如何使用 Azure ML Python SDK、OpenAI Python SDK 執行推理,甚至如何在本地執行 Gradio 應用程式進行聊天補全。
請注意,本示例將介紹 Python SDK / Azure CLI 的程式設計部署方式。如果您更喜歡使用一鍵部署體驗,請檢視從 Hugging Face Hub 一鍵部署到 Azure ML。但需要注意的是,從 Hugging Face Hub 部署時,終結點和部署將在 Azure ML 中建立,而不是在 Azure AI Foundry 中。而本示例專注於 Azure AI Foundry Hub 的部署(這些部署也可用在 Azure ML 上,但反之則不然)。
簡而言之:Azure AI Foundry 為企業 AI 運營、模型構建者和應用程式開發提供了一個統一的平臺。Azure 機器學習是一項用於加速和管理機器學習 (ML) 專案生命週期的雲服務。
此示例將具體部署 Qwen/Qwen2.5-32B-Instruct
模型,該模型來自 Hugging Face Hub(也可在 AzureML 或 Azure AI Foundry 上檢視),並將其作為 Azure ML 託管線上終結點部署到 Azure AI Foundry Hub 上。
Qwen2.5 是最新的 Qwen 大型語言模型系列之一,在 Qwen2 的基礎上帶來了以下改進:
- 知識量顯著增加,並在編碼和數學方面的能力大幅提升,這得益於我們在這些領域的專業模型。
- 在指令遵循、生成長文字(超過 8K tokens)、理解結構化資料(如表格)以及生成結構化輸出(尤其是 JSON)方面有顯著改進。對系統提示的多樣性更具彈性,增強了聊天機器人的角色扮演實現和條件設定。
- 長上下文支援高達 128K tokens,並可生成高達 8K tokens。
- 多語言支援超過 29 種語言,包括中文、英語、法語、西班牙語、葡萄牙語、德語、義大利語、俄語、日語、韓語、越南語、泰語、阿拉伯語等。
更多資訊,請務必檢視他們在 Hugging Face Hub 上的模型卡。
請注意,您可以選擇 Hugging Face Hub 上任何啟用了“部署到 AzureML”選項的 LLM,或直接從 Azure ML 或 Azure AI Foundry Hub 模型目錄的“HuggingFace”集合中選擇任何可用的 LLM(注意,對於 Azure AI Foundry,Hugging Face 集合僅適用於基於 Hub 的專案)。
先決條件
要執行以下示例,您需要滿足以下先決條件,或者您也可以在 Azure 機器學習教程:建立入門所需資源 中閱讀更多相關資訊。
- 具有活動訂閱的 Azure 帳戶。
- 已安裝並登入 Azure CLI。
- 適用於 Azure CLI 的 Azure 機器學習擴充套件。
- 一個 Azure 資源組。
- 基於 Azure AI Foundry Hub 的專案。
有關更多資訊,請按照 為 Azure AI 配置 Microsoft Azure 中的步驟操作。
設定與安裝
在此示例中,將使用 Azure 機器學習 Python SDK 建立終結點和部署,並呼叫已部署的 API。同時,您還需要安裝 azure-identity
以透過 Python 使用您的 Azure 憑據進行身份驗證。
%pip install azure-ai-ml azure-identity --upgrade --quiet
更多資訊請參見 適用於 Python 的 Azure 機器學習 SDK。
然後,為了方便起見,建議設定以下環境變數,因為它們將在示例中用於 Azure ML 客戶端,因此請務必根據您的 Microsoft Azure 帳戶和資源更新並設定這些值。
%env LOCATION eastus %env SUBSCRIPTION_ID <YOUR_SUBSCRIPTION_ID> %env RESOURCE_GROUP <YOUR_RESOURCE_GROUP> %env AI_FOUNDRY_HUB_PROJECT <YOUR_AI_FOUNDRY_HUB_PROJECT>
最後,您還需要定義終結點和部署名稱,因為它們也將在整個示例中使用。
請注意,終結點名稱在每個區域內必須是全域性唯一的。也就是說,即使您的訂閱下沒有運行同名終結點,如果該名稱已被其他 Azure 客戶保留,您也無法使用。建議在名稱中新增時間戳或自定義識別符號,以防止在嘗試部署已鎖定/保留名稱的終結點時遇到 HTTP 400 驗證問題。此外,終結點名稱的長度必須在 3 到 32 個字元之間。
import os
from uuid import uuid4
os.environ["ENDPOINT_NAME"] = f"qwen-endpoint-{str(uuid4())[:8]}"
os.environ["DEPLOYMENT_NAME"] = f"qwen-deployment-{str(uuid4())[:8]}"
向 Azure ML 進行身份驗證
首先,您需要使用 Azure ML Python SDK 透過 Azure ML 對 Azure AI Foundry Hub 進行身份驗證。稍後將用它來將 Qwen/Qwen2.5-32B-Instruct
作為 Azure ML 託管線上終結點部署到您的 Azure AI Foundry Hub 中。
在標準的 Azure ML 部署中,您需要使用 Azure ML 工作區作為 `workspace_name` 來建立 `MLClient`。而對於 Azure AI Foundry,您需要提供 Azure AI Foundry Hub 的名稱作為 `workspace_name`,這樣終結點也會部署到 Azure AI Foundry 中。
import os
from azure.ai.ml import MLClient
from azure.identity import DefaultAzureCredential
client = MLClient(
credential=DefaultAzureCredential(),
subscription_id=os.getenv("SUBSCRIPTION_ID"),
resource_group_name=os.getenv("RESOURCE_GROUP"),
workspace_name=os.getenv("AI_FOUNDRY_HUB_PROJECT"),
)
建立並部署 Azure AI 終結點
在建立託管線上終結點之前,您需要構建模型 URI,其格式如下:`azureml://registries/HuggingFace/models/
model_id = "Qwen/Qwen2.5-32B-Instruct"
model_uri = (
f"azureml://registries/HuggingFace/models/{model_id.replace('/', '-').replace('_', '-').lower()}/labels/latest"
)
model_uri
要檢查 Hugging Face Hub 中的模型是否在 Azure 上可用,您應閱讀支援的模型中的相關資訊。如果不可用,您隨時可以在 Azure 上的 Hugging Face 集合中請求新增模型。
然後,您需要透過 Azure ML Python SDK 建立 ManagedOnlineEndpoint,如下所示。
Hugging Face 集合中的每個模型都由一個高效的推理後端提供支援,每個後端都可以在多種例項型別上執行(如支援的硬體中所列)。由於模型和推理引擎需要 GPU 加速的例項,您可能需要根據管理和增加 Azure 機器學習的資源配額和限制來申請增加配額。
from azure.ai.ml.entities import ManagedOnlineEndpoint, ManagedOnlineDeployment
endpoint = ManagedOnlineEndpoint(name=os.getenv("ENDPOINT_NAME"))
deployment = ManagedOnlineDeployment(
name=os.getenv("DEPLOYMENT_NAME"),
endpoint_name=os.getenv("ENDPOINT_NAME"),
model=model_uri,
instance_type="Standard_NC40ads_H100_v5",
instance_count=1,
)
client.begin_create_or_update(endpoint).wait()
在 Azure AI Foundry 中,終結點只有在部署建立後才會在“我的資產 -> 模型 + 終結點”選項卡中列出,不像 Azure ML 那樣,即使終結點不包含任何活動或正在進行的部署也會顯示。
client.online_deployments.begin_create_or_update(deployment).wait()
請注意,雖然 Azure AI 終結點的建立相對較快,但部署會花費更長時間,因為它需要在 Azure 上分配資源,所以預計需要大約 10-15 分鐘,但根據例項的配置和可用性,也可能需要更長時間。
部署完成後,您可以透過 Azure AI Foundry 或 Azure ML Studio 檢視終結點的詳細資訊、即時日誌、如何使用終結點,甚至可以使用仍在預覽中的監控功能。更多資訊請參閱Azure ML 託管線上終結點。
向 Azure AI 終結點發送請求
最後,既然 Azure AI 終結點已經部署完畢,您就可以向它傳送請求了。在這種情況下,由於模型的任務是 `text-generation`(也稱為 `chat-completion`),您可以選擇使用預設的評分終結點 `/generate`,這是一個標準的文字生成終結點,不具備聊天功能(如利用聊天模板或擁有與 OpenAI 相容的 OpenAPI 介面)。或者,您也可以利用該模型執行的推理引擎提供了與 OpenAI 相容的路由,如 `/v1/chat/completions`。
請注意,下面只列出了一部分選項。只要您在傳送 HTTP 請求時將 `azureml-model-deployment` 標頭設定為 Azure AI 部署(而非終結點)的名稱,並且擁有向該終結點發送請求所需的身份驗證令牌/金鑰,您就可以向後端引擎暴露的所有路由傳送 HTTP 請求,而不僅僅是評分路由。
Azure Python SDK
您可以透過評分路由呼叫 Azure AI 終結點,在本例中為 `/generate`(更多資訊請參閱 `Qwen/Qwen2.5-32B-Instruct` 在 AzureML 或 Azure AI Foundry 目錄中的頁面),使用之前例項化的 `azure.ai.ml.MLClient`(如果是在不同的會話中工作,則可以例項化一個新的)。
import json
import os
import tempfile
with tempfile.NamedTemporaryFile(mode="w+", delete=True, suffix=".json") as tmp:
json.dump({"inputs": "What is Deep Learning?", "parameters": {"max_new_tokens": 128}}, tmp)
tmp.flush()
response = client.online_endpoints.invoke(
endpoint_name=os.getenv("ENDPOINT_NAME"),
deployment_name=os.getenv("DEPLOYMENT_NAME"),
request_file=tmp.name,
)
print(json.loads(response))
請注意,Azure ML Python SDK 在呼叫終結點時需要一個 JSON 檔案的路徑,這意味著您想要傳送到終結點的任何負載都必須首先轉換成一個 JSON 檔案。不過,這僅適用於透過 Azure ML Python SDK 傳送的請求。
OpenAI Python SDK
由於模型執行的推理引擎提供了與 OpenAI 相容的路由,您也可以利用 OpenAI Python SDK 向已部署的 Azure AI 終結點發送請求。
%pip install openai --upgrade --quiet
要將 OpenAI Python SDK 與 Azure ML 託管線上終結點一起使用,您需要首先檢索
api_url
,帶/v1
路由(包含 OpenAI Python SDK 將向其傳送請求的v1/chat/completions
終結點)api_key
,它是 Azure AI 中的 API 金鑰或 Azure ML 中的主金鑰(除非使用專用的 Azure ML 令牌)
from urllib.parse import urlsplit
api_key = client.online_endpoints.get_keys(os.getenv("ENDPOINT_NAME")).primary_key
url_parts = urlsplit(client.online_endpoints.get(os.getenv("ENDPOINT_NAME")).scoring_uri)
api_url = f"{url_parts.scheme}://{url_parts.netloc}"
或者,您也可以手動構建 API URL,如下所示,因為 URI 在每個區域中都是全域性唯一的,這意味著在同一區域中只會有一個同名終結點。
api_url = f"https://{os.getenv('ENDPOINT_NAME')}.{os.getenv('LOCATION')}.inference.ml.azure.com/v1"
或者直接從 Azure AI Foundry 或 Azure ML Studio 中檢索。
然後,您可以正常使用 OpenAI Python SDK,確保包含包含 Azure AI / ML 部署名稱的額外標頭 azureml-model-deployment
。
透過 OpenAI Python SDK,可以在每次呼叫 `chat.completions.create` 時透過 `extra_headers` 引數設定,如下方註釋所示;或者在例項化 `OpenAI` 客戶端時透過 `default_headers` 引數設定(推薦此方法,因為每個請求都需要此標頭,所以一次性設定更佳)。
import os
from openai import OpenAI
openai_client = OpenAI(
base_url=f"{api_url}/v1",
api_key=api_key,
default_headers={"azureml-model-deployment": os.getenv("DEPLOYMENT_NAME")},
)
completion = openai_client.chat.completions.create(
model="Qwen/Qwen2.5-32B-Instruct",
messages=[
{"role": "system", "content": "You are an assistant that responds like a pirate."},
{
"role": "user",
"content": "What is Deep Learning?",
},
],
max_tokens=128,
# extra_headers={"azureml-model-deployment": os.getenv("DEPLOYMENT_NAME")},
)
print(completion)
cURL
另外,您也可以直接使用 `cURL` 向已部署的終結點發送請求。將在 OpenAI 程式碼片段中以程式設計方式獲取的 `api_url` 和 `api_key` 值設定為環境變數,以便 `cURL` 可以使用它們,如下所示:
os.environ["API_URL"] = api_url
os.environ["API_KEY"] = api_key
!curl -sS $API_URL/v1/chat/completions \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-H "azureml-model-deployment: $DEPLOYMENT_NAME" \
-d '{ \
"messages":[ \
{"role":"system","content":"You are an assistant that replies like a pirate."}, \
{"role":"user","content":"What is Deep Learning?"} \
], \
"max_tokens":128 \
}' | jq
或者,您也可以前往 Azure AI Foundry 中的“我的資產 -> 模型 + 終結點”或 Azure ML Studio 中的“終結點”,找到 Azure AI 終結點,並獲取 URL(注意,預設 URL 將是 `/generate` 終結點,但要使用與 OpenAI 相容的層,您需要使用 `/v1/chat/completions` 終結點)和 API 金鑰值,以及該模型的 Azure AI 部署名稱。
Gradio
Gradio 是用友好的 Web 介面快速演示您的機器學習模型的最快方式,這樣任何人都可以使用它。您也可以利用 OpenAI Python SDK 構建一個簡單的 `ChatInterface`,並在執行它的 Jupyter Notebook 單元格中使用。
理想情況下,您可以按照教程:從原始碼構建並部署到 Azure 容器應用中所述,將連線到您的 Azure ML 託管線上終結點的 Gradio 聊天介面部署為 Azure 容器應用。如果您希望我們特別展示如何為 Gradio 完成此操作,請隨時提出一個 issue 來請求。
%pip install gradio --upgrade --quiet
請看下面一個關於如何利用 Gradio 的 `ChatInterface` 的示例,或在Gradio ChatInterface 文件中查詢更多資訊。
import os
from typing import Dict, Iterator, List, Literal
import gradio as gr
from openai import OpenAI
openai_client = OpenAI(
base_url=api_url,
api_key=api_key,
default_headers={"azureml-model-deployment": os.getenv("DEPLOYMENT_NAME")},
)
def predict(message: str, history: List[Dict[Literal["role", "content"], str]]) -> Iterator[str]:
history.append({"role": "user", "content": message})
stream = openai_client.chat.completions.create(
model="Qwen/Qwen2.5-32B-Instruct",
messages=history,
stream=True,
)
chunks = []
for chunk in stream:
chunks.append(chunk.choices[0].delta.content or "")
yield "".join(chunks)
demo = gr.ChatInterface(predict, type="messages")
demo.launch()
釋放資源
完成 Azure AI 終結點/部署的使用後,您可以按如下方式刪除資源,這意味著您將停止支付模型執行所在的例項費用,並且所有相關費用都將停止。
client.online_endpoints.begin_delete(name=os.getenv("ENDPOINT_NAME")).result()
總結
透過這個示例,您學習瞭如何為 Azure ML 和 Azure AI Foundry 建立和配置您的 Azure 帳戶,如何建立一個執行在 Azure ML / Azure AI Foundry 模型目錄中來自 Hugging Face 集合的開放模型的託管線上終結點,如何之後用不同方式向其傳送推理請求,如何圍繞它構建一個簡單的 Gradio 聊天介面,以及最後,如何停止和釋放資源。
如果您對此示例有任何疑問、問題或疑問,請隨時提出問題,我們將盡力提供幫助!
📍 在 GitHub 上找到完整示例 這裡!