🚀 在 VS Code 中

微调模型

微调 AI 模型是一种常见的做法,它允许您使用自定义数据集在具有 GPU 的计算环境中对预训练模型运行 微调 作业。AI Toolkit 目前支持在本地具有 GPU 的机器上或在云端(Azure Container App)使用 GPU 微调 SLM。

微调后的模型可以下载到本地,并使用 GPU 进行推理测试,或者进行量化以在本地 CPU 上运行。微调后的模型也可以作为远程模型部署到云环境。

使用 AI Toolkit for VS Code (预览版) 在 Azure 上微调 AI 模型

用于 VS Code 的 AI Toolkit 现在支持预配 Azure Container App 以在云中运行模型微调和托管推理端点。

设置您的云环境

  1. 要在远程 Azure Container Apps 环境中运行模型微调和推理,请确保您的订阅具有足够的 GPU 容量。提交支持票证以请求您的应用程序所需的容量。获取有关 GPU 容量的更多信息

  2. 如果您正在使用 HuggingFace 上的私有数据集,或者您的基础模型需要访问控制,请确保您拥有 HuggingFace 帐户生成访问令牌

  3. 如果您要微调 Mistral 或 Llama,请接受 HuggingFace 上的 LICENSE。

  4. 在用于 VS Code 的 AI Toolkit 中启用远程微调和推理功能标志

    1. 通过选择文件 -> 首选项 -> 设置打开 VS Code 设置。
    2. 导航到扩展并选择AI Toolkit
    3. 选择“启用在 Azure Container Apps 上运行微调和推理”选项。

    AI Toolkit Settings

    1. 重新加载 VS Code 以使更改生效。

搭建微调项目

  1. 在命令面板中运行 AI Toolkit: Focus on Tools View⇧⌘P (Windows, Linux Ctrl+Shift+P)
  2. 导航到 Fine-tuning 以访问模型目录。选择一个模型进行微调。为您的项目分配一个名称,并在您的机器上选择其位置。然后,点击“配置项目”按钮。面板:选择模型
  3. 项目配置
    1. 避免启用“本地微调”选项。
    2. Olive 配置设置将出现预设的默认值。请根据需要调整和填写这些配置。
    3. 继续到生成项目。此阶段利用 WSL,并涉及设置新的 Conda 环境,为包括开发容器的未来更新做准备。面板:配置模型
    4. 选择“在工作区中重新启动窗口”以打开您的微调项目。面板:生成项目
注意

该项目目前在用于 VS Code 的 AI Toolkit 中本地或远程工作。如果您在项目创建期间选择“本地微调”,它将完全在 WSL 中运行,而无需云资源。否则,该项目将仅限于在远程 Azure Container App 环境中运行。

预配 Azure 资源

要开始使用,您需要为远程微调预配 Azure 资源。从命令面板中查找并执行 AI Toolkit: Provision Azure Container Apps job for fine-tuning。在此过程中,系统将提示您选择您的 Azure 订阅和资源组。

Provision Fine-Tuning

通过输出通道中显示的链接监控预配进度。预配进度

运行微调

要启动远程微调作业,请在命令面板中运行 AI Toolkit: Run fine-tuning 命令。

Run Fine-tuning

然后,扩展执行以下操作

  1. 将您的工作区与 Azure 文件同步。

  2. 使用 ./infra/fintuning.config.json 中指定的命令触发 Azure Container App 作业。

QLoRA 将用于微调,微调过程将创建 LoRA 适配器供模型在推理期间使用。

微调的结果将存储在 Azure 文件中。要浏览 Azure 文件共享中的输出文件,您可以导航到 Azure 门户,使用输出面板中提供的链接。或者,您可以直接访问 Azure 门户,并找到 ./infra/fintuning.config.json 中定义的名为 STORAGE_ACCOUNT_NAME 的存储帐户和 ./infra/fintuning.config.json 中定义的名为 FILE_SHARE_NAME 的文件共享。

file-share

查看日志

微调作业启动后,您可以通过访问 Azure 门户 来访问系统日志和控制台日志。

或者,您可以直接在 VSCode 输出面板中查看控制台日志。

log-button

注意

作业可能需要几分钟才能启动。如果已经有一个正在运行的作业,则当前作业可能会排队稍后启动。

在 Azure 上查看和查询日志

微调作业触发后,您可以通过从 VSCode 通知中选择“在 Azure 门户中打开日志”按钮,在 Azure 上查看日志。

或者,如果您已经打开了 Azure 门户,请从 Azure Container Apps 作业的“执行历史记录”面板中查找作业历史记录。

Job Execution History

有两种类型的日志,“控制台”和“系统”。

  • 控制台日志是来自您的应用程序的消息,包括 stderrstdout 消息。这就是您已经在流式日志部分看到的内容。
  • 系统日志是来自 Azure Container Apps 服务的消息,包括服务级别事件的状态。

要查看和查询您的日志,请选择“控制台”按钮并导航到 Log Analytics 页面,您可以在其中查看所有日志并编写查询。

Job Log Analytics

有关 Azure Container Apps 日志的更多信息,请参阅 Azure Container Apps 中的应用程序日志记录

在 VSCode 中查看流式日志

启动微调作业后,您还可以通过在 VSCode 通知中选择“在 VS Code 中显示流式日志”按钮,在 Azure 上查看日志。

或者,您可以在命令面板中运行命令 AI Toolkit: Show the running fine-tuning job streaming logs

Streaming Log Command

正在运行的微调作业的流式日志将显示在输出面板中。

Streaming Log Output

注意

由于资源不足,作业可能会排队。如果未显示日志,请稍等片刻,然后执行命令以重新连接到流式日志。流式日志可能会超时并断开连接。但是,可以通过再次执行命令重新连接。

使用微调模型进行推理

在远程环境中训练适配器后,使用简单的 Gradio 应用程序与模型进行交互。

Fine-tune complete

预配 Azure 资源

与微调过程类似,您需要通过从命令面板执行 AI Toolkit: Provision Azure Container Apps for inference 来设置用于远程推理的 Azure 资源。在此设置过程中,系统将要求您选择您的 Azure 订阅和资源组。

Provision Inference Resource

默认情况下,用于推理的订阅和资源组应与用于微调的订阅和资源组匹配。推理将使用相同的 Azure Container App 环境,并访问存储在 Azure 文件中的模型和模型适配器,这些模型和模型适配器是在微调步骤中生成的。

推理部署

如果您希望修改推理代码或重新加载推理模型,请执行 AI Toolkit: Deploy for inference 命令。这将使您的最新代码与 ACA 同步并重新启动副本。

Deploy for inference

成功完成部署后,模型现在可以使用此端点进行评估。您可以通过选择 VSCode 通知中显示的“转到推理端点”按钮来访问推理 API。或者,Web API 端点可以在 ./infra/inference.config.json 和输出面板中的 ACA_APP_ENDPOINT 下找到。

App Endpoint

注意

推理端点可能需要几分钟才能完全运行。

高级用法

微调项目组件

文件夹 内容
infra 包含远程操作的所有必要配置。
infra/provision/finetuning.parameters.json 保存 bicep 模板的参数,用于预配用于微调的 Azure 资源。
infra/provision/finetuning.bicep 包含用于预配 Azure 资源以进行微调的模板。
infra/finetuning.config.json 配置文件,由 AI Toolkit: Provision Azure Container Apps job for fine-tuning 命令生成。它用作其他远程命令面板的输入。

在 Azure Container Apps 中配置微调的密钥

Azure Container App 密钥提供了一种安全的方式来存储和管理 Azure Container Apps 中的敏感数据,例如 HuggingFace 令牌和 Weights & Biases API 密钥。使用 AI 工具包的命令面板,您可以将密钥输入到预配的 Azure 容器应用作业(存储在 ./finetuning.config.json 中)。这些密钥随后在所有容器中设置为环境变量

步骤

  1. 在命令面板中,键入并选择 AI Toolkit: Add Azure Container Apps Job secret for fine-tuning

    Add secret

  2. 输入密钥名称和值:系统将提示您输入密钥的名称和值。输入密钥名称 输入密钥 例如,如果您正在使用需要 Hugging Face 访问控制的私有 HuggingFace 数据集或模型,请将您的 HuggingFace 令牌设置为环境变量 HF_TOKEN,以避免需要在 Hugging Face Hub 上手动登录。

设置密钥后,您现在可以在 Azure Container App 中使用它。密钥将设置在您的容器应用的环境变量中。

配置用于微调的 Azure 资源预配

本指南将帮助您配置 AI Toolkit: Provision Azure Container Apps job for fine-tuning 命令。

您可以在 ./infra/provision/finetuning.parameters.json 文件中找到配置参数。以下是详细信息

参数 描述
defaultCommands 这是启动微调作业的默认命令。它可以在 ./infra/finetuning.config.json 中被覆盖。
maximumInstanceCount 此参数设置 GPU 实例的最大容量。
timeout 这设置了 Azure Container App 微调作业的超时时间(秒)。默认值为 10800,相当于 3 小时。如果 Azure Container App 作业达到此超时时间,微调过程将停止。但是,默认情况下会保存检查点,如果再次运行微调过程,则允许从最后一个检查点恢复,而不是重新开始。
location 这是预配 Azure 资源的位置。默认值与所选资源组的位置相同。
storageAccountName, fileShareName acaEnvironmentName, acaEnvironmentStorageName, acaJobName, acaLogAnalyticsName 这些参数用于命名用于预配的 Azure 资源。您可以输入新的、未使用的资源名称来创建您自己的自定义命名资源,或者如果您愿意使用已有的 Azure 资源,则可以输入现有 Azure 资源的名称。有关详细信息,请参阅 使用现有 Azure 资源 部分。

使用现有 Azure 资源

如果您有需要配置用于微调的现有 Azure 资源,您可以在 ./infra/provision/finetuning.parameters.json 文件中指定它们的名称,然后从命令面板运行 AI Toolkit: Provision Azure Container Apps job for fine-tuning。这将更新您指定的资源并创建任何缺少的资源。

例如,如果您有现有的 Azure 容器环境,您的 ./infra/finetuning.parameters.json 应如下所示

{
    "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
      ...
      "acaEnvironmentName": {
        "value": "<your-aca-env-name>"
      },
      "acaEnvironmentStorageName": {
        "value": null
      },
      ...
    }
  }

手动预配

如果您喜欢手动设置 Azure 资源,您可以使用 ./infra/provision 文件夹中提供的 bicep 文件。如果您已经设置和配置了所有 Azure 资源而没有使用 AI Toolkit 命令面板,您可以简单地在 finetune.config.json 文件中输入资源名称。

例如

{
  "SUBSCRIPTION_ID": "<your-subscription-id>",
  "RESOURCE_GROUP_NAME": "<your-resource-group-name>",
  "STORAGE_ACCOUNT_NAME": "<your-storage-account-name>",
  "FILE_SHARE_NAME": "<your-file-share-name>",
  "ACA_JOB_NAME": "<your-aca-job-name>",
  "COMMANDS": [
    "cd /mount",
    "pip install huggingface-hub==0.22.2",
    "huggingface-cli download <your-model-name> --local-dir ./model-cache/<your-model-name> --local-dir-use-symlinks False",
    "pip install -r ./setup/requirements.txt",
    "python3 ./finetuning/invoke_olive.py && find models/ -print | grep adapter/adapter"
  ]
}

模板中包含的推理组件

文件夹 内容
infra 包含远程操作的所有必要配置。
infra/provision/inference.parameters.json 保存 bicep 模板的参数,用于预配用于推理的 Azure 资源。
infra/provision/inference.bicep 包含用于预配 Azure 资源以进行推理的模板。
infra/inference.config.json 配置文件,由 AI Toolkit: Provision Azure Container Apps for inference 命令生成。它用作其他远程命令面板的输入。

配置 Azure 资源预配

本指南将帮助您配置 AI Toolkit: Provision Azure Container Apps for inference 命令。

您可以在 ./infra/provision/inference.parameters.json 文件中找到配置参数。以下是详细信息

参数 描述
defaultCommands 这是启动 Web API 的命令。
maximumInstanceCount 此参数设置 GPU 实例的最大容量。
location 这是预配 Azure 资源的位置。默认值与所选资源组的位置相同。
storageAccountName, fileShareName acaEnvironmentName, acaEnvironmentStorageName, acaAppName, acaLogAnalyticsName 这些参数用于命名用于预配的 Azure 资源。默认情况下,它们将与微调资源名称相同。您可以输入新的、未使用的资源名称来创建您自己的自定义命名资源,或者如果您愿意使用已有的 Azure 资源,则可以输入现有 Azure 资源的名称。有关详细信息,请参阅 使用现有 Azure 资源 部分。

使用现有 Azure 资源

默认情况下,推理预配使用与微调相同的 Azure Container App 环境、存储帐户、Azure 文件共享和 Azure Log Analytics。单独的 Azure Container App 仅为推理 API 创建。

如果您在微调步骤中自定义了 Azure 资源,或者想要使用您自己的现有 Azure 资源进行推理,请在 ./infra/inference.parameters.json 文件中指定它们的名称。然后,从命令面板运行 AI Toolkit: Provision Azure Container Apps for inference 命令。这将更新任何指定的资源并创建任何缺少的资源。

例如,如果您有现有的 Azure 容器环境,您的 ./infra/finetuning.parameters.json 应如下所示

{
    "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
      ...
      "acaEnvironmentName": {
        "value": "<your-aca-env-name>"
      },
      "acaEnvironmentStorageName": {
        "value": null
      },
      ...
    }
  }

手动预配

如果您喜欢手动配置 Azure 资源,您可以使用 ./infra/provision 文件夹中提供的 bicep 文件。如果您已经设置和配置了所有 Azure 资源而没有使用 AI Toolkit 命令面板,您可以简单地在 inference.config.json 文件中输入资源名称。

例如

{
  "SUBSCRIPTION_ID": "<your-subscription-id>",
  "RESOURCE_GROUP_NAME": "<your-resource-group-name>",
  "STORAGE_ACCOUNT_NAME": "<your-storage-account-name>",
  "FILE_SHARE_NAME": "<your-file-share-name>",
  "ACA_APP_NAME": "<your-aca-name>",
  "ACA_APP_ENDPOINT": "<your-aca-endpoint>"
}