你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

在 Azure AI Foundry 中使用标准部署微调模型

重要

本文中标记了“(预览版)”的项目目前为公共预览版。 此预览版未提供服务级别协议,不建议将其用于生产工作负载。 某些功能可能不受支持或者受限。 有关详细信息,请参阅 Microsoft Azure 预览版补充使用条款

使用 Azure AI Foundry,可以通过一个名为微调的过程,将大型语言模型自定义到特定数据集。 此过程通过允许针对特定任务和应用程序定制的自定义和优化来提供显著优势。 优点包括提高性能、成本效益、降低延迟和定制输出。

成本效益:由于标准定价,Azure AI Foundry 的微调可能更具成本效益,尤其是在大规模部署中。

模型多样性:Azure AI Foundry 的标准部署微调为专有模型和开源模型提供支持,使用户能够灵活地选择最适合其需求的模型,而不受限制为单个类型。

自定义和控制:Azure AI Foundry 提供对微调过程的更大自定义和控制,使用户能够更准确地根据自己的特定要求定制模型。

本文介绍如何微调使用 Azure AI Foundry 中的标准部署部署的模型。

先决条件

  • 具有有效付款方式的 Azure 订阅。 免费或试用的 Azure 订阅将不起作用。 如果没有 Azure 订阅,请先创建一个付费的 Azure 帐户

  • Azure 门户的访问权限。

  • 一个 Azure AI Foundry 项目

  • Azure 基于角色的访问控制 (Azure RBAC) 用于授予对 Azure AI Foundry 门户中的操作的访问权限。 要执行本文中的步骤,必须为用户帐户分配 Azure 订阅的所有者参与者角色。 有关权限详细信息,请参阅 Azure AI Foundry 门户中基于角色的访问控制

验证订阅提供程序的注册

验证订阅是否已注册到 Microsoft.Network 资源提供程序。

  1. 登录到 Azure 门户
  2. 在左侧菜单中选择“订阅”
  3. 选择要使用的订阅。
  4. 在左侧菜单中选择“设置”“资源提供程序”>
  5. 如果资源提供程序不在列表中,请将 Microsoft.Network 添加到资源提供程序列表中。

查找支持微调的模型

AI Foundry 模型目录为多种类型的模型(包括聊天补全和文本生成)提供微调支持。 有关支持微调的模型列表,以及支持微调的 Azure 区域,请参阅 模型的区域可用性作为标准部署。 微调任务仅适用于其 Azure 订阅属于模型提供程序提供套餐的国家/地区的计费帐户的用户。 如果该产品/服务在相关区域中提供,则用户必须在可部署或微调该模型(如果适用)的 Azure 区域拥有一个项目资源。

还可以转到 Azure AI Foundry 门户,查看包含微调支持的所有模型:

  1. 登录到 Azure AI Foundry

  2. 如果你尚未进入项目,请选择它。

  3. 导航到模型目录。

  4. 选择微调任务筛选器。

    模型目录微调筛选器选项的屏幕截图。

  5. 选择“所有”或选择特定任务。

准备数据进行微调

准备训练和验证数据以微调模型。 训练和验证数据由输入和输出示例组成,这些示例表示你希望模型如何执行。

确保所有训练示例遵循预期格式以进行推理。 若要有效地优化模型,请通过维护数据平衡(包括各种方案)并定期优化训练数据,以符合实际预期来确保不同的数据集。 这些操作最终会使模型的响应更加准确和均衡。

小窍门

不同的模型类型需要不同格式的训练数据。

示例文件格式

受支持的文件类型为 JSON 行。 文件将上传到默认数据存储,并在项目中可用。

    {"messages": [{"role": "system", "content": "You are an Xbox customer support agent whose primary goal is to help users with issues they are experiencing with their Xbox devices. You are friendly and concise. You only provide factual answers to queries, and do not provide answers that are not related to Xbox."}, {"role": "user", "content": "Is Xbox better than PlayStation?"}, {"role": "assistant", "content": "I apologize, but I cannot provide personal opinions. My primary job is to assist you with any issues related to your Xbox device. Do you have any Xbox-related issues that need addressing?"}]}
    {"messages": [{"role": "system", "content": "You are an Xbox customer support agent whose primary goal is to help users with issues they are experiencing with their Xbox devices. You are friendly and concise. You only provide factual answers to queries, and do not provide answers that are not related to Xbox."}, {"role": "user", "content": "Can I play PC games on my Xbox?"}, {"role": "assistant", "content": "While Xbox consoles don't natively support PC games, they can play an array of Xbox games, many of which are also available on PC. Can I assist you with finding games compatible with your Xbox device?"}]}
    {"messages": [{"role": "system", "content": "You are an Xbox customer support agent whose primary goal is to help users with issues they are experiencing with their Xbox devices. You are friendly and concise. You only provide factual answers to queries, and do not provide answers that are not related to Xbox."}, {"role": "user", "content": "I'm having trouble connecting my Xbox to the Wi-Fi."}, {"role": "assistant", "content": "No worries, let's go through the network settings on your Xbox. Can you please tell me what happens when you try to connect it to the Wi-Fi?"}]}

使用微调模型向导

Azure AI Foundry 门户提供了“创建自定义模型向导”,因此,你可以以交互方式为 Azure 资源创建和训练微调的模型。

选择基础模型

  1. 从 Azure AI Foundry 的模型目录中选择要微调的模型。
  2. 在模型的 “详细信息”页上,选择 微调。 某些基础模型支持 标准部署托管计算,而另一些模型则支持一个或另一个。
  3. 如果显示 标准部署托管计算的选项,请选择 标准部署 进行微调。 此操作将打开一个向导,显示有关模型标准微调的信息。

选择训练数据

下一步是选择已准备好的现有训练数据或上传已准备好的新训练数据,以便在自定义模型时使用。 “训练数据”窗格显示了任何现有的和以前上传的数据集,并提供了用于上传新训练数据的选项。

  • 如果训练数据已上传到服务,请选择 Azure AI Foundry 中的文件
    • 从显示的下拉列表中选择文件。
  • 若要上传新的训练数据,请使用以下选项之一:
    • 选择 “本地文件 ”,从本地文件上传训练数据。
    • 选择 Azure Blob 或其他共享 Web 位置 ,从 Azure Blob 或其他共享 Web 位置导入训练数据。

对于大型数据文件,建议从 Azure Blob 存储导入数据。 有关 Azure Blob 存储的详细信息,请参阅什么是 Azure Blob 存储?

从本地文件上传训练数据

可使用以下方法之一将新的训练数据集从本地文件上传到服务:

  • 将文件拖放到 “训练数据”窗格的工作区中,然后选择“ 上传文件”。
  • “训练数据”窗格的工作区中选择“浏览”文件,从“打开”对话框中选择要上传的文件,然后选择“上传文件”。 选择并上传训练数据集后,选择“下一步”继续。

选择验证数据

下一步提供配置模型以在训练过程中使用验证数据的选项。 如果你不想使用验证数据,可以选择“下一步”为模型选择高级选项。 否则,如果你有验证数据集,可以选择已准备好的现有验证数据或上传已准备好的新验证数据,以便在自定义模型时使用。 “验证数据”窗格显示了任何现有的及以前上传的训练和验证数据集,并提供了用于上传新验证数据的选项。

拆分训练数据

可以自动划分训练数据以生成验证数据集。 选择“自动拆分训练数据”后,选择“ 下一步 ”继续。

在 Azure AI Foundry 中使用现有数据

  • 如果验证数据已上传到服务,请选择“选择数据集”。
    • 从“验证数据”窗格中显示的列表中选择文件。
  • 若要上传新的验证数据,请使用以下选项之一:
    • 选择 “本地文件 ”,从本地文件上传验证数据。
    • 选择 Azure Blob 或其他共享 Web 位置 ,从 Azure Blob 或其他共享 Web 位置导入验证数据。 对于大型数据文件,建议从 Azure Blob 存储导入数据。 大型文件在通过多部分表单上传时可能会变得不稳定,因为请求是原子化的,无法重试或继续。

注释

  • 与训练数据文件类似,验证数据文件必须格式化为 JSONL 文件,
  • 使用字节顺序标记 (BOM) 以 UTF-8 编码。 文件大小必须小于 512 MB。

从本地文件上传验证数据

可使用以下方法之一将新的验证数据集从本地文件上传到服务:

  • 将文件拖放到“验证数据”窗格的工作区中,然后选择“上传文件”。
  • “验证数据”窗格的工作区中选择“浏览文件”,从 Open 对话框中选择要上传的文件,然后选择“上传文件”。 选择并上传验证数据集后,选择“下一步”继续。

配置任务参数

微调模型向导显示用于在“任务参数”窗格上训练微调模型的参数。 提供了以下参数:

名称 类型 说明
batch_size 整数 要用于训练的批大小。 批大小是用于训练单个向前和向后传递的训练示例数。 一般情况下,我们发现较大的批大小往往更适合较大的数据集。 此属性的默认值和最大值特定于基本模型。 较大的批大小意味着模型参数的更新频率较低,但差异较低。
learning_rate_multiplier 数字 用于训练的学习速率乘数。 微调学习速率是用于预先训练的原始学习速率乘以此值。 较大的学习速率往往在较大的批大小下表现更好。 建议试验 0.02 到 0.2 范围内的值,以查看产生最佳结果的内容。 较小的学习率可以用于避免过度拟合。
n_epochs 整数 要为其训练模型的纪元数。 纪元是指通过训练数据集的一个完整周期。

选择“默认”以便对微调作业使用默认值,或选择“自定义”以显示并编辑超参数值。 选择默认值后,我们会根据训练数据通过算法确定正确的值。 配置高级选项后,选择“下一步”以审阅所做的选择并训练已微调的模型

查看所做的选择并训练模型

向导的“审阅”窗格显示有关配置选项的信息。

如果已准备好训练模型,请选择“ 开始训练”作业 以启动微调作业并返回到“ 模型 ”选项卡。

检查自定义模型的状态

“微调”选项卡显示有关自定义模型的信息。 该选项卡包含有关自定义模型的微调作业的状态和作业 ID 的信息。 作业完成后,选项卡会显示结果文件的文件 ID。 可能需要选择“刷新”才能看到模型训练作业的更新状态。

正在运行的项目仪表板的屏幕截图。

启动微调作业后,可能需要一些时间才能完成。 你的作业可能排在系统上的其他作业后面。 训练模型可能需要几分钟或几小时,具体取决于模型和数据集大小。 下面是可在“ 模型 ”选项卡上执行的一些任务:

  • 在“自定义模型”选项卡的“状态”列中检查自定义模型的微调作业的状态。
  • 在“模型名称”列中,选择模型的名称以查看有关自定义模型的详细信息。 可以查看微调作业的状态、训练结果、训练事件和作业中使用的超参数。
  • 选择“刷新”更新页面信息。

微调详细信息仪表板的屏幕截图。

支持微调的企业方案

支持多种企业方案,实现标准部署微调。 下表概述了受支持的用户存储网络和身份验证配置,以确保在企业方案中顺利运行:

注释

  • 可以通过 AI Foundry 更改数据连接身份验证,方法是单击数据集存储到的数据存储连接,并导航到 “访问详细信息>身份验证方法 ”设置。
  • 可以在“Azure 存储”>“设置”>“配置”页 >“允许存储帐户密钥访问”中更改存储身份验证。
  • 可以在“Azure 存储”>“网络”页中更改存储网络。
存储网络 存储身份验证 数据连接身份验证 支持
公用网络访问 = 已启用 帐户密钥已启用 SAS/帐户密钥 是,UX 和 SDK
公用网络访问 = 已启用 帐户密钥已禁用 基于 Entra 的身份验证(无凭据) 是,UX 和 SDK

注意:对于 UX,可能需要为存储帐户上的用户 ID 添加存储 Blob 数据读取者或存储 Blob 数据参与者,或者将连接的身份验证更改为使用帐户密钥/SAS 令牌
已从所选虚拟网络和 IP 地址启用 帐户密钥已启用 帐户密钥 是,UX 和 SDK

注意: 对于 UX,运行浏览器的计算的 IP 必须位于所选列表中
已从所选虚拟网络和 IP 地址启用 帐户密钥已启用 SAS 是,UX 和 SDK

注意: 对于 UX,运行浏览器的计算的 IP 必须位于所选列表中
已从所选虚拟网络和 IP 地址启用 帐户密钥已禁用 基于 Entra 的身份验证(无凭据) 是,UX 和 SDK。

注意:对于 UX,可能需要为存储帐户上的用户 ID 添加存储 Blob 数据读取者或存储 Blob 数据参与者,或者将连接的身份验证更改为使用帐户密钥/SAS 令牌。 此外,请确保运行浏览器的计算的 IP 必须位于所选列表中
公用网络访问 = 已禁用 帐户密钥已启用 SAS/帐户密钥 是,UX 和 SDK。

注意:若要使 UX 数据上传和提交正常工作,需要从对存储具有适当访问权限的 Vnet 中访问工作区
公用网络访问 = 已禁用 帐户密钥已禁用 基于 Entra 的身份验证(无凭据) 是,UX 和 SDK。

注意:若要使 UX 数据上传和提交正常工作,需要从对存储具有适当访问权限的 Vnet 中访问工作区

上述方案也适用于托管 Vnet 工作区。 请参阅此处的托管 Vnet AI Foundry 中心的设置: 如何为 Azure AI Foundry 中心配置托管网络

客户管理的密钥 (CMK) 不是支持标准部署微调的企业方案。

在工作区和存储上对唯一网络设置进行微调所涉及的问题通常由网络设置问题所引发。


部署微调模型

微调作业成功后,可以从 “微调 ”选项卡部署自定义模型。必须部署自定义模型,使其可用于完成调用。

重要

部署自定义模型并完成终结点后,请记得清理任何非活动终结点。 删除非活动状态的部署时,不会删除或影响基础自定义模型,并且可以随时重新部署自定义模型。 如 Azure AI Foundry 定价中所述,所部署的每个自定义(微调)模型都会产生每小时托管成本,而无论是否对模型进行补全或聊天补全调用。 若要详细了解如何使用 Azure AI Foundry 规划和管理成本,请参阅 计划管理 Azure AI Foundry 服务成本的指南。

注释

自定义模型只允许一个部署。 如果选择已部署的自定义模型,会显示错误消息。 若要部署自定义模型,请选择要部署的自定义模型,然后选择“部署模型”。

此时会打开“部署模型”对话框。 在对话框中,输入 部署名称 ,然后选择“ 部署 ”以启动自定义模型的部署。

还可以通过“ 模型 + 终结点 ”选项卡部署微调模型,方法是选择“ 部署模型 ”按钮,然后从下拉列表中选择“ 部署微调模型

微调管理部署仪表板的屏幕截图。

接下来,选择要部署的微调模型,然后选择“ 部署”。

跨区域部署

微调支持将微调后的模型部署到与模型最初进行微调时所在的区域不同的区域。 还可以部署到其他订阅/区域。 唯一的限制是,新区域还必须支持微调,在部署跨订阅时,为部署生成授权令牌的帐户必须同时有权访问源订阅和目标订阅。 可以通过 Python 完成跨订阅/区域部署

使用已部署的自定义模型

部署自定义模型后,可像使用任何其他已部署的模型一样使用它。 可使用 Azure AI Foundry 门户中的“操场”来试验新部署。 可以继续将相同的参数用于自定义模型,例如温度和max_tokens,就像与其他已部署模型一样。

清理已微调的模型

可以从 Azure AI Foundry 中的微调模型列表或模型详细信息页中删除已微调模型。 若要从“微调”页面删除已微调的模型,

  1. 从 Azure AI Foundry 项目的左侧导航中选择“微调”。
  2. 选择“删除”按钮以删除已微调的模型。

注释

如果自定义模型具有现有部署,则无法删除它。 必须先删除模型部署,然后才能删除自定义模型。

创建客户端以使用模型

以下部分将指导你了解如何在 python 中微调模型。 要查找此代码的笔记本示例,请参阅使用模型即服务微调 LLM

  1. 确保安装依赖项以开始微调模型。
%pip install azure-ai-ml
%pip install azure-identity

%pip install mlflow
%pip install azureml-mlflow
  1. 创建客户端以使用模型。 以下代码使用存储在环境变量中的终结点 URL 和密钥。
from azure.ai.ml import MLClient
from azure.identity import (
    DefaultAzureCredential,
    InteractiveBrowserCredential,
)

try:
    credential = DefaultAzureCredential()
    credential.get_token("https://management.azure.com/.default")
except Exception as ex:
    credential = InteractiveBrowserCredential()

try:
    workspace_ml_client = MLClient.from_config(credential=credential)
except:
    workspace_ml_client = MLClient(
        credential,
        subscription_id="<SUBSCRIPTION_ID>",
        resource_group_name="<RESOURCE_GROUP_NAME>",
        workspace_name="<PROJECT_NAME OR WORKSPACE_NAME>",
    )

# the models, fine tuning pipelines and environments are available in various AzureML system registries,
# Example: Phi family of models are in "azureml", Llama family of models are in "azureml-meta" registry.
registry_ml_client = MLClient(credential, registry_name="azureml")

# Get AzureML workspace object.
workspace = workspace_ml_client._workspaces.get(workspace_ml_client.workspace_name)
workspace.id

查找支持微调的模型

AI Foundry 模型目录为多种类型的模型(包括聊天补全和文本生成)提供微调支持。 有关支持微调的模型列表,以及支持微调的 Azure 区域,请参阅 标准部署中模型的区域可用性。 微调任务仅适用于其 Azure 订阅属于模型提供程序提供套餐的国家/地区的计费帐户的用户。 如果该产品/服务在相关区域中提供,则用户必须在可部署或微调该模型(如果适用)的 Azure 区域拥有一个项目资源。

对于此示例,我们使用 Phi-4-mini-instruct 模型。 在此代码片段中,模型的模型 ID 属性将作为输入传递给微调作业。 此字段也可用作 Azure AI Foundry 模型目录中模型详细信息页中的“资产 ID”字段。

model_name = "Phi-4-mini-instruct"
model_to_finetune = registry_ml_client.models.get(model_name, label="latest")
print(
    "\n\nUsing model name: {0}, version: {1}, id: {2} for fine tuning".format(
        model_to_finetune.name, model_to_finetune.version, model_to_finetune.id
    )
)

准备数据进行微调

准备训练和验证数据以微调模型。 训练和验证数据由输入和输出示例组成,这些示例表示你希望模型如何执行。

确保所有训练示例遵循预期格式以进行推理。 若要有效地优化模型,请通过维护数据平衡(包括各种方案)并定期优化训练数据,以符合实际预期来确保不同的数据集。 这些操作最终会使模型的响应更加准确和均衡。

小窍门

不同的模型类型需要不同格式的训练数据。

示例文件格式

受支持的文件类型为 JSON 行。 文件将上传到默认数据存储,并在项目中可用。

    {"messages": [{"role": "system", "content": "You are an Xbox customer support agent whose primary goal is to help users with issues they are experiencing with their Xbox devices. You are friendly and concise. You only provide factual answers to queries, and do not provide answers that are not related to Xbox."}, {"role": "user", "content": "Is Xbox better than PlayStation?"}, {"role": "assistant", "content": "I apologize, but I cannot provide personal opinions. My primary job is to assist you with any issues related to your Xbox device. Do you have any Xbox-related issues that need addressing?"}]}
    {"messages": [{"role": "system", "content": "You are an Xbox customer support agent whose primary goal is to help users with issues they are experiencing with their Xbox devices. You are friendly and concise. You only provide factual answers to queries, and do not provide answers that are not related to Xbox."}, {"role": "user", "content": "Can I play PC games on my Xbox?"}, {"role": "assistant", "content": "While Xbox consoles don't natively support PC games, they can play an array of Xbox games, many of which are also available on PC. Can I assist you with finding games compatible with your Xbox device?"}]}
    {"messages": [{"role": "system", "content": "You are an Xbox customer support agent whose primary goal is to help users with issues they are experiencing with their Xbox devices. You are friendly and concise. You only provide factual answers to queries, and do not provide answers that are not related to Xbox."}, {"role": "user", "content": "I'm having trouble connecting my Xbox to the Wi-Fi."}, {"role": "assistant", "content": "No worries, let's go through the network settings on your Xbox. Can you please tell me what happens when you try to connect it to the Wi-Fi?"}]}

创建训练数据输入

此代码片段演示如何定义训练数据集。

from azure.ai.ml.constants import AssetTypes
from azure.ai.ml.entities import Data

dataset_version = "1"
train_dataset_name = "chat_training_small"
try:
    train_data_asset = workspace_ml_client.data.get(
        train_dataset_name, version=dataset_version
    )
    print(f"Dataset {train_dataset_name} already exists")
except:
    print("creating dataset")
    train_data = Data(
        path=f"./train.jsonl",
        type=AssetTypes.URI_FILE,
        description="Training dataset",
        name=train_dataset_name,
        version="1",
    )
    train_data_asset = workspace_ml_client.data.create_or_update(train_data)

创建验证数据

下一步提供配置模型以在训练过程中使用验证数据的选项。 如果不想使用验证数据,可以选择跳过此步骤以继续下一部分。 否则,如果你有验证数据集,可以选择已准备好的现有验证数据或上传已准备好的新验证数据,以便在自定义模型时使用。

from azure.ai.ml.entities import Data

dataset_version = "1"
validation_dataset_name = "chat_validation_small"
try:
    validation_data_asset = workspace_ml_client.data.get(
        validation_dataset_name, version=dataset_version
    )
    print(f"Dataset {validation_dataset_name} already exists")
except:
    print("creating dataset")
    validation_data = Data(
        path=f"./validation.jsonl",
        type=AssetTypes.URI_FILE,
        description="Validation dataset",
        name=validation_dataset_name,
        version="1",
    )
    validation_data_asset = workspace_ml_client.data.create_or_update(validation_data)

为第三方模型创建市场订阅服务

所有非Microsoft模型都需要此步骤。 Microsoft模型的一个示例是 Phi 系列模型。

model_id_to_subscribe = "/".join(model_to_finetune.id.split("/")[:-2])
print(model_id_to_subscribe)

normalized_model_name = model_name.replace(".", "-")

from azure.ai.ml.entities import MarketplaceSubscription


subscription_name = f"{normalized_model_name}-sub"

marketplace_subscription = MarketplaceSubscription(
    model_id=model_id_to_subscribe,
    name=subscription_name,
)

# note: this will throw exception if the subscription already exists or subscription is not required (for example, if the model is not in the marketplace like Phi family)
try:
    marketplace_subscription = (
        workspace_ml_client.marketplace_subscriptions.begin_create_or_update(
            marketplace_subscription
        ).result()
    )
except Exception as ex:
    print(ex)

使用模型和数据作为输入来提交微调作业

需要以下一组参数来微调模型。 每个参数在以下项中定义:

  • 模型:要微调的基础模型。
  • training_data:用于微调基本模型的训练数据。
  • validation_data:用于微调基本模型的验证数据。
  • 任务:要执行的微调任务。 例如 用于聊天完成微调作业的 CHAT_COMPLETION。
  • outputs:输出已注册的模型名称。

以下参数是可选的:

  • 超参数:控制运行时微调行为的参数。
  • 名称:微调作业名称
  • experiment_name:微调作业的试验名称。
  • display_name:微调作业显示名称。
from azure.ai.ml.finetuning import FineTuningTaskType, create_finetuning_job
import uuid

guid = uuid.uuid4()
short_guid = str(guid)[:8]
display_name = f"{model_name}-display-name-{short_guid}-from-sdk"
name = f"{model_name}t-{short_guid}-from-sdk"
output_model_name_prefix = f"{model_name}-{short_guid}-from-sdk-finetuned"
experiment_name = f"{model_name}-from-sdk"

finetuning_job = create_finetuning_job(
    task=FineTuningTaskType.CHAT_COMPLETION,
    training_data=train_data_asset.id,
    validation_data=validation_data_asset.id,
    hyperparameters={
        "per_device_train_batch_size": "1",
        "learning_rate": "0.00002",
        "num_train_epochs": "1",
    },
    model=model_to_finetune.id,
    display_name=display_name,
    name=name,
    experiment_name=experiment_name,
    tags={"foo_tag": "bar"},
    properties={"my_property": "my_value"},
    output_model_name_prefix=output_model_name_prefix,
created_job = workspace_ml_client.jobs.create_or_update(finetuning_job)
workspace_ml_client.jobs.get(created_job.name)

status = workspace_ml_client.jobs.get(created_job.name).status

import time

while True:
    status = workspace_ml_client.jobs.get(created_job.name).status
    print(f"Current job status: {status}")
    if status in ["Failed", "Completed", "Canceled"]:
        print("Job has finished with status: {0}".format(status))
        break
    else:
        print("Job is still running. Checking again in 30 seconds.")
        time.sleep(30)
finetune_model_name = created_job.outputs["registered_model"]["name"]
finetune_model_name

部署微调模型

微调作业成功后,可以部署自定义模型。

重要

部署自定义模型并完成终结点后,请记得清理任何非活动终结点。 删除非活动状态的部署时,不会删除或影响基础自定义模型,并且可以随时重新部署自定义模型。 如 Azure AI Foundry 定价中所述,所部署的每个自定义(微调)模型都会产生每小时托管成本,而无论是否对模型进行补全或聊天补全调用。 若要详细了解如何使用 Azure AI Foundry 规划和管理成本,请参阅 计划管理 Azure AI Foundry 服务成本的指南。

# Deploy the model as a serverless endpoint

endpoint_name = f"{normalized_model_name}-ft-{short_guid}"  # Name must be unique
model_id = f"azureml://locations/{workspace.___location}/workspaces/{workspace._workspace_id}/models/{finetune_model_name}/versions/1"

支持微调的企业方案

支持多种企业方案,实现标准部署微调。 下表概述了受支持的用户存储网络和身份验证配置,以确保在企业方案中顺利运行:

注释

  • 可以通过 AI Foundry 更改数据连接身份验证,方法是单击数据集存储到的数据存储连接,并导航到 “访问详细信息>身份验证方法 ”设置。
  • 可以在“Azure 存储”>“设置”>“配置”页 >“允许存储帐户密钥访问”中更改存储身份验证。
  • 可以在“Azure 存储”>“网络”页中更改存储网络。
存储网络 存储身份验证 数据连接身份验证 支持
公用网络访问 = 已启用 帐户密钥已启用 SAS/帐户密钥 是,UX 和 SDK
公用网络访问 = 已启用 帐户密钥已禁用 基于 Entra 的身份验证(无凭据) 是,UX 和 SDK

注意:对于 UX,可能需要为存储帐户上的用户 ID 添加存储 Blob 数据读取者或存储 Blob 数据参与者,或者将连接的身份验证更改为使用帐户密钥/SAS 令牌
已从所选虚拟网络和 IP 地址启用 帐户密钥已启用 帐户密钥 是,UX 和 SDK

注意: 对于 UX,运行浏览器的计算的 IP 必须位于所选列表中
已从所选虚拟网络和 IP 地址启用 帐户密钥已启用 SAS 是,UX 和 SDK

注意: 对于 UX,运行浏览器的计算的 IP 必须位于所选列表中
已从所选虚拟网络和 IP 地址启用 帐户密钥已禁用 基于 Entra 的身份验证(无凭据) 是,UX 和 SDK。

注意:对于 UX,可能需要为存储帐户上的用户 ID 添加存储 Blob 数据读取者或存储 Blob 数据参与者,或者将连接的身份验证更改为使用帐户密钥/SAS 令牌。 此外,请确保运行浏览器的计算的 IP 必须位于所选列表中
公用网络访问 = 已禁用 帐户密钥已启用 SAS/帐户密钥 是,UX 和 SDK。

注意:若要使 UX 数据上传和提交正常工作,需要从对存储具有适当访问权限的 Vnet 中访问工作区
公用网络访问 = 已禁用 帐户密钥已禁用 基于 Entra 的身份验证(无凭据) 是,UX 和 SDK。

注意:若要使 UX 数据上传和提交正常工作,需要从对存储具有适当访问权限的 Vnet 中访问工作区

上述方案也适用于托管 Vnet 工作区。 请参阅此处的托管 Vnet AI Foundry 中心的设置: 如何为 Azure AI Foundry 中心配置托管网络

客户管理的密钥 (CMK) 不是支持标准部署微调的企业方案。

在工作区和存储上对唯一网络设置进行微调所涉及的问题通常由网络设置问题所引发。

跨区域部署

微调支持将微调后的模型部署到与模型最初进行微调时所在的区域不同的区域。 还可以部署到其他订阅/区域。 唯一的限制是,新区域还必须支持微调,在部署跨订阅时,为部署生成授权令牌的帐户必须同时有权访问源订阅和目标订阅。 可以通过 Python 完成跨订阅/区域部署


# Create Cross region FT deployment client
from azure.ai.ml.entities import ServerlessEndpoint
from azure.ai.ml import MLClient
from azure.identity import (
    DefaultAzureCredential,
    InteractiveBrowserCredential,
)

try:
    credential = DefaultAzureCredential()
    credential.get_token("https://management.azure.com/.default")
except Exception as ex:
    credential = InteractiveBrowserCredential()
try:
    workspace_ml_client = MLClient.from_config(credential=credential)
except:
    workspace_ml_client = MLClient(
        credential,
        subscription_id="<TARGET_SUBSCRIPTION_ID>",
        resource_group_name="<TARGET_RESOURCE_GROUP_NAME>",
        workspace_name="<TARGET_PROJECT_NAME>",
    )

workspace = workspace_ml_client._workspaces.get(workspace_ml_client.workspace_name)
workspace_region = workspace.___location
model_to_finetune.tags
supported_regions = model_to_finetune.tags["maas-finetuning-deploy-regions"]
supported_regions
if workspace_region in supported_regions:
    print(f"Creating endpoint in the region:{workspace_region}")
    serverless_endpoint = ServerlessEndpoint(name=endpoint_name, model_id=model_id)
    created_endpoint = workspace_ml_client.serverless_endpoints.begin_create_or_update(
        serverless_endpoint
    ).result()
else:
    raise ValueError(
        f"For the model : {model_to_finetune}, the target region: {workspace_region} is not supported for deployment, the supported regions: {supported_regions}"
    )

使用已部署的自定义模型

部署自定义模型后,可像使用任何其他已部署的模型一样使用它。 可以继续将相同的参数用于自定义模型,例如温度和max_tokens,就像与其他已部署模型一样。

endpoint = workspace_ml_client.serverless_endpoints.get(endpoint_name)
endpoint_keys = workspace_ml_client.serverless_endpoints.get_keys(endpoint_name)
auth_key = endpoint_keys.primary_key

import requests

url = f"{endpoint.scoring_uri}/v1/chat/completions"

payload = {
    "max_tokens": 1024,
    "messages": [
        {
            "content": "This script is great so far. Can you add more dialogue between Amanda and Thierry to build up their chemistry and connection?",
            "role": "user",
        }
    ],
}
headers = {"Content-Type": "application/json", "Authorization": f"{auth_key}"}

response = requests.post(url, json=payload, headers=headers)

response.json()

清理已微调的模型

完成模型后,请运行以下代码来清理优化后的模型。

workspace_ml_client.serverless_endpoints.begin_delete(endpoint_name).result()

标准部署模型的成本与配额考量

配额是按部署管理的。 每个部署的速率限制为每分钟 200,000 个令牌和每分钟 1,000 个 API 请求。 但是,我们目前的限制为每个项目每个模型一个部署。 如果当前速率限制不能满足你的方案,请联系 Microsoft Azure 支持部门。

Microsoft 模型的成本

部署Microsoft模型(如 Phi-3 模型)作为标准部署时,可以在部署向导的 “定价和条款 ”选项卡上找到定价信息。

非 Microsoft 模型的成本

非Microsoft模型作为标准部署通过 Azure 市场提供,并已集成到 Azure AI Foundry 以供使用。 部署或微调这些模型时,可找到 Azure 市场定价。

每次项目从 Azure 市场订阅给定套餐时,都会创建一个新资源来跟踪与其消耗相关的成本。 同一资源用于跟踪与推理和微调相关的成本。但是,可以使用多个计量器来独立跟踪每个方案。

有关如何跟踪成本的详细信息,请参阅监视通过 Azure 市场提供的模型的成本

显示与不同模型产品/服务及其关联计量对应的不同资源的屏幕截图。

示例笔记本

可以使用此示例笔记本创建独立的微调作业,以增强模型使用 Samsum 数据集汇总两个人之间的对话的能力。 使用的训练数据是 ultrachat_200k 数据集,它分为四个拆分,适合监督微调 (sft) 和生成排名 (gen)。 笔记本为聊天完成任务使用可用的 Azure AI 模型(如果要使用与笔记本中使用的模型不同的模型,可以替换模型名称)。 笔记本包括设置先决条件、选择要微调的模型、创建训练和验证数据集、配置和提交微调作业,最后,使用微调模型创建无服务器部署,以便进行示例推理。

示例 CLI

此外,可以使用此示例 CLI 创建独立的微调作业,以增强模型使用数据集汇总两个人之间的对话的能力。

type: finetuning

name: "Phi-3-mini-4k-instruct-with-amlcompute"
experiment_name: "Phi-3-mini-4k-instruct-finetuning-experiment"
display_name: "Phi-3-mini-4k-instruct-display-name"
task: chat_completion
model_provider: custom
model: 
  path: "azureml://registries/azureml/models/Phi-3-mini-4k-instruct/versions/14"
  type: mlflow_model
training_data: train.jsonl
validation_data:
  path: validation.jsonl
  type: uri_file
hyperparameters:
  num_train_epochs: "1"
  per_device_train_batch_size: "1"
  learning_rate: "0.00002"
properties:
  my_property: "my_value"
tags:
  foo_tag: "bar"
outputs:
  registered_model:
    name: "Phi-3-mini-4k-instruct-finetuned-model"
    type: mlflow_model 

使用的训练数据与 SDK 笔记本中所示相同。 CLI 为聊天补全任务使用可用的 Azure AI 模型。 如果希望使用不同于 CLI 示例中的模型,可以相应地更新参数,例如“模型路径”。

内容筛选

标准部署模型受 Azure AI 内容安全保护。 部署到实时终结点时,可以选择退出此功能。 启用 Azure AI 内容安全后,提示和完成都通过一组分类模型,旨在检测和防止输出有害内容。 内容筛选系统会在输入提示和输出补全中检测特定类别的潜在有害内容并对其采取措施。 详细了解 Azure AI 内容安全

后续步骤