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 上找到完整示例 这里!