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

为批处理终结点创建作业和输入数据

在 Azure 机器学习中使用批处理终结点时,可以对大量输入数据执行长时间的批处理操作。 数据可以位于不同的位置,例如分布在不同区域中。 某些类型的批处理终结点还可以接收文本参数作为输入。

本文介绍如何为批处理终结点指定参数输入并创建部署作业。 此过程支持处理来自各种源的数据,例如数据资产、数据存储、存储帐户和本地文件。

先决条件

  • 批处理终结点和部署。 要创建这些资源,请参阅使用 Azure 机器学习在批处理部署中部署 MLflow 模型

  • 运行批处理终结点部署的权限。 可使用 AzureML 数据科学家参与者所有者角色可用于运行部署。 对于自定义角色定义,请参阅批处理终结点上的授权以查看所需的特定权限。

  • 用于调用终结点的凭据。 有关详细信息,请参阅建立身份验证

  • 从部署终结点的计算群集对输入数据的读取访问。

    提示

    在某些情况下,需要使用无凭据数据存储或外部 Azure 存储帐户作为数据输入。 在这些方案中,请确保为数据访问配置计算群集,因为计算群集的托管标识用于装载存储帐户。 你仍能进行精细访问控制,因为作业(调用程序)的标识仍用于读取基础数据。

建立身份验证

若要调用终结点,需要有效的 Microsoft Entra 令牌。 调用终结点时,Azure 机器学习会在与令牌关联的标识下创建一个批处理部署作业。

  • 如果使用 Azure 机器学习 CLI (v2) 或适用于 Python 的 Azure 机器学习 SDK (v2) ,则无需手动获取 Microsoft Entra 令牌。 登录期间,系统会对用户标识进行身份验证。 它还会检索并传递令牌。
  • 如果使用 REST API 调用终结点,则需要手动获取令牌。

可以使用自己的凭据进行调用,具体过程如下。

使用 Azure CLI 通过交互式身份验证或设备代码身份验证登录

az login

有关各种类型的凭据的详细信息,请参阅如何使用不同类型的凭据运行作业

创建基础作业

若要通过批处理终结点创建作业,请调用该终结点。 可以使用 Azure 机器学习 CLI、适用于 Python 的 Azure 机器学习 SDK 或 REST API 调用来完成调用。

以下示例显示了接收单个输入数据文件夹进行处理的批处理终结点的调用基础知识。 有关涉及各种输入和输出的示例,请参阅了解输入和输出

在批处理终结点下使用 invoke 操作:

az ml batch-endpoint invoke --name $ENDPOINT_NAME \
                            --input https://azuremlexampledata.blob.core.windows.net/data/heart-disease-uci/data

调用特定部署

Batch 终结点可以在同一终结点下托管多个部署。 除非用户另有指定,否则使用默认终结点。 可以使用以下过程更改所使用的部署。

使用参数--deployment-name-d指定部署的名称:

az ml batch-endpoint invoke --name $ENDPOINT_NAME \
                            --deployment-name $DEPLOYMENT_NAME \
                            --input https://azuremlexampledata.blob.core.windows.net/data/heart-disease-uci/data

配置作业属性

可以在调用时配置某些作业属性。

注意

目前,仅可在包含管道组件部署的批处理终结点中配置作业属性。

配置试验名称

使用以下过程配置试验名称。

使用参数 --experiment-name 指定试验的名称:

az ml batch-endpoint invoke --name $ENDPOINT_NAME \
                            --experiment-name "my-batch-job-experiment" \
                            --input https://azuremlexampledata.blob.core.windows.net/data/heart-disease-uci/data

了解输入和输出

批处理终结点提供使用者可用来创建批处理作业的持久 API。 可使用同一接口指定部署预期的输入和输出。 使用输入传递终结点执行作业所需的任何信息。

显示如何在批处理终结点中使用输入和输出的示意图。

Batch 终结点支持两种类型的输入:

  • 数据输入,或指向特定存储位置或 Azure 机器学习资产的指针
  • 文本输入,或要传递给作业的文本值(如数字或字符串)

输入和输出的数量和类型取决于批处理部署的类型。 模型部署始终需要一个数据输入并生成一个数据输出。 模型部署不支持文本输入。 相比之下,管道组件部署为生成终结点提供了更通用的构造。 在管道组件部署中,可以指定任意数量的数据输入、文本输入和输出。

下表汇总了批处理部署的输入和输出:

部署类型 输入数目 支持的输入类型 输出数目 支持的输出类型
模型部署 1 数据输入 1 数据输出
管道组件部署 0-N 数据输入文本输入 0-N 数据输出

提示

始终对输入和输出命名。 每个名称充当用于标识数据并在调用期间传递值的键。 由于模型部署始终需要一个输入和输出,因此在模型部署中进行调用时会忽略这些名称。 可以指定最能描述用例的名称,如 sales_estimation

浏览数据输入

数据输入是指指向数据放置位置的输入。 由于批处理终结点通常使用大量数据,因此不能在调用请求中传递输入数据。 而是指定批处理终结点查找数据时应转到的位置。 在目标计算实例上装载和流式传输输入数据以提高性能。

Batch 终结点可以读取位于以下存储类型中的文件:

  • Azure 机器学习数据资产,包括文件夹 (uri_folder) 和文件 (uri_file) 类型。
  • Azure 机器学习数据存储,包括 Azure Blob 存储、Azure Data Lake Storage Gen1 和 Azure Data Lake Storage Gen2。
  • Azure 存储帐户,包括 Blob 存储、Data Lake Storage Gen1 和 Data Lake Storage Gen2。
  • 使用面向 Python 的 Azure 机器学习 CLI 或 Azure 机器学习 SDK 调用终结点时的本地数据文件夹和文件。 但本地数据将上传到 Azure 机器学习工作区的默认数据存储。

重要

弃用通知:FileDataset 类型的数据资产 (V1) 已弃用,并且将来会停用。 依赖此功能的现有批处理终结点将继续工作。 但不支持使用以下方法创建的批处理终结点中的 V1 数据集:

  • 正式发布的 Azure 机器学习 CLI v2 版本(2.4.0 及更高版本)。
  • 正式发布的 REST API 版本(2022-05-01 及更高版本)。

浏览文本输入

文本输入是指可以在调用时表示和解析的输入,如字符串、数字和布尔值。 在管道组件部署过程中,通常使用文本输入将参数传递给终结点。 批处理终结点支持以下文本类型:

  • string
  • boolean
  • float
  • integer

仅在管道组件部署中支持文本输入。 要查看如何指定文本终结点,请参阅使用文本输入创建作业

浏览数据输出

数据输出是指批处理作业结果的放置位置。 每个输出都有一个可识别的名称,Azure 机器学习会自动为每个已命名的输出分配唯一路径。 如果需要,可以指定另一个路径。

重要

批处理终结点仅支持在 Blob 存储数据存储中写入输出。 如果需要写入已启用分层命名空间的存储帐户(例如 Data Lake Storage Gen2),可以将存储服务注册为 Blob 存储数据存储,因为这些服务完全兼容。 可以通过这种方式将批处理终结点的输出写入 Data Lake Storage Gen2。

使用数据输入创建作业

以下示例演示如何在从数据资产数据存储Azure 存储帐户获取数据输入时创建作业。

使用数据资产中的输入数据

支持将 Azure 机器学习数据资产(以前称为数据集)作为作业的输入。 按照以下步骤使用 Azure 机器学习中已注册数据资产中存储的输入数据来运行批处理终结点作业。

警告

目前不支持表类型 (MLTable) 的数据资产。

  1. 创建数据资产。 在此示例中,它包含一个文件夹,其中包含多个 CSV 文件。 使用批处理终结点并行处理文件。 如果你的数据已注册为数据资产,则可以跳过此步骤。

    1. 在名为 heart-data.yml 的 YAML 文件中创建数据资产定义:

      $schema: https://azuremlschemas.azureedge.net/latest/data.schema.json
      name: heart-data
      description: An unlabeled data asset for heart classification.
      type: uri_folder
      path: data
      
    2. 创建数据资产:

      az ml data create -f heart-data.yml
      
  2. 设置输入:

    DATA_ASSET_ID=$(az ml data show -n heart-data --label latest | jq -r .id)
    

    数据资产 ID 的格式为 /subscriptions/<subscription-ID>/resourceGroups/<resource-group-name>/providers/Microsoft.MachineLearningServices/workspaces/<workspace-name>/data/<data-asset-name>/versions/<data-asset-version>

  3. 运行终结点:

    使用 --set 参数指定输入。 首先将数据资产名称中的任何连字符替换为下划线字符。 键仅可包含字母数字字符和下划线字符。

    az ml batch-endpoint invoke --name $ENDPOINT_NAME \
        --set inputs.heart_data.type="uri_folder" inputs.heart_data.path=$DATA_ASSET_ID
    

    对于提供模型部署的终结点,可以使用 --input 参数来指定数据输入,因为模型部署始终只需要一个数据输入。

    az ml batch-endpoint invoke --name $ENDPOINT_NAME --input $DATA_ASSET_ID
    

    当指定多个输入时,--set 参数往往会生成长命令。 在这种情况下,可以在文件中列出输入,然后在调用终结点时引用该文件。 例如,可以创建一个名为 inputs.yml 的 YAML 文件,其中包含以下行:

    inputs:
      heart_data:
        type: uri_folder
        path: /subscriptions/<subscription-ID>/resourceGroups/<resource-group-name>/providers/Microsoft.MachineLearningServices/workspaces/<workspace-name>/data/heart-data/versions/1
    

    然后,可以运行以下命令,该命令使用 --file 参数来指定输入:

    az ml batch-endpoint invoke --name $ENDPOINT_NAME --file inputs.yml
    

使用数据存储中的输入数据

批处理部署作业直接引用 Azure 机器学习注册数据存储中的数据。 在此示例中,你会首先将一些数据上传到 Azure 机器学习工作区中的默认数据存储。 然后,在该数据上运行批处理部署。

此示例使用默认数据存储,但可以使用其他数据存储。 在 Azure 机器学习工作区中,默认 Blob 数据存储名为 workspaceblobstore。 如果要在以下步骤中使用其他数据存储,请将 workspaceblobstore 替换为首选数据存储的名称。

  1. 将示例数据上传到数据存储。 示例数据在 azureml-examples 存储库中提供。 可以在该存储库的 sdk/python/endpoints/batch/deploy-models/heart-classifier-mlflow/data 文件夹中找到数据。

    1. 在 Azure 机器学习 工作室中,打开默认 Blob 数据存储的数据资产页,然后查找其 Blob 容器的名称。
    2. 使用 Azure 存储资源管理器或 AzCopy 等工具将示例数据上传到该容器中名为 heart-disease-uci-unlabel 的文件夹。
  2. 设置输入信息:

    将文件路径放在 INPUT_PATH 变量中:

    DATA_PATH="heart-disease-uci-unlabeled"
    INPUT_PATH="azureml://datastores/workspaceblobstore/paths/$DATA_PATH"
    

    请注意 paths 文件夹是如何作为输入路径的一部分的。 此格式指示后面的值是路径。

  3. 运行终结点:

    使用 --set 参数指定输入:

    az ml batch-endpoint invoke --name $ENDPOINT_NAME \
        --set inputs.heart_data.type="uri_folder" inputs.heart_data.path=$INPUT_PATH
    

    对于提供模型部署的终结点,可以使用 --input 参数来指定数据输入,因为模型部署始终只需要一个数据输入。

    az ml batch-endpoint invoke --name $ENDPOINT_NAME --input $INPUT_PATH --input-type uri_folder
    

    当指定多个输入时,--set 参数往往会生成长命令。 在这种情况下,可以在文件中列出输入,然后在调用终结点时引用该文件。 例如,可以创建一个名为 inputs.yml 的 YAML 文件,其中包含以下行:

    inputs:
      heart_data:
        type: uri_folder
        path: azureml://datastores/workspaceblobstore/paths/<data-path>
    

    如果数据位于文件中,请改用 uri_file 类型作为输入。

    然后,可以运行以下命令,该命令使用 --file 参数来指定输入:

    az ml batch-endpoint invoke --name $ENDPOINT_NAME --file inputs.yml
    

使用 Azure 存储帐户中的输入数据

Azure 机器学习批处理终结点可以从 Azure 存储帐户中的云位置(包括公有云和私有云)读取数据。 按以下步骤使用存储帐户中的数据运行批处理终结点作业。

有关从存储帐户读取数据所需的其他配置的详细信息,请参阅配置计算群集以便进行数据访问

  1. 设置输入:

    设置 INPUT_DATA 变量:

    INPUT_DATA="https://azuremlexampledata.blob.core.windows.net/data/heart-disease-uci/data"
    

    如果数据位于文件中,请使用以下类似的格式来定义输入路径:

    INPUT_DATA="https://azuremlexampledata.blob.core.windows.net/data/heart-disease-uci/data/heart.csv"
    
  2. 运行终结点:

    使用 --set 参数指定输入:

    az ml batch-endpoint invoke --name $ENDPOINT_NAME \
        --set inputs.heart_data.type="uri_folder" inputs.heart_data.path=$INPUT_DATA
    

    对于提供模型部署的终结点,可以使用 --input 参数来指定数据输入,因为模型部署始终只需要一个数据输入。

    az ml batch-endpoint invoke --name $ENDPOINT_NAME --input $INPUT_DATA --input-type uri_folder
    

    当指定多个输入时,--set 参数往往会生成长命令。 在这种情况下,可以在文件中列出输入,然后在调用终结点时引用该文件。 例如,可以创建一个名为 inputs.yml 的 YAML 文件,其中包含以下行:

    inputs:
      heart_data:
        type: uri_folder
        path: https://azuremlexampledata.blob.core.windows.net/data/heart-disease-uci/data
    

    然后,可以运行以下命令,该命令使用 --file 参数来指定输入:

    az ml batch-endpoint invoke --name $ENDPOINT_NAME --file inputs.yml
    

    如果数据位于文件中,请使用 uri_file inputs.yml 文件中的类型作为数据输入。

使用文本输入创建作业

管道组件部署可以采用文本输入。 有关包含基本管道的批处理部署示例,请参阅如何使用批处理终结点部署管道

以下示例演示如何指定名为 score_mode 的输入,其类型为 string,值为 append

将输入放到 YAML 文件中,例如名为 inputs.yml 的 YAML 文件:

inputs:
  score_mode:
    type: string
    default: append

运行以下命令,该命令使用 --file 参数指定输入。

az ml batch-endpoint invoke --name $ENDPOINT_NAME --file inputs.yml

还可以使用 --set 参数来指定类型和默认值。 但是,当指定多个输入时,此方法往往会生成长命令:

az ml batch-endpoint invoke --name $ENDPOINT_NAME \
    --set inputs.score_mode.type="string" inputs.score_mode.default="append"

使用数据输出创建作业

以下示例演示如何更改命名为 score 的输出的位置。 为了保持内容完整,该示例还配置了命名为 heart_data 的输入。

此示例使用默认数据存储 workspaceblobstore。 但可以使用工作区中的任何其他数据存储,只要它是 Blob 存储帐户即可。 如果要使用不同的数据存储,请将以下步骤中的 workspaceblobstore 替换为首选数据存储的名称。

  1. 获取数据存储的 ID。

    DATA_STORE_ID=$(az ml datastore show -n workspaceblobstore | jq -r '.id')
    

    数据存储 ID 的格式为 /subscriptions/<subscription-ID>/resourceGroups/<resource-group-name>/providers/Microsoft.MachineLearningServices/workspaces/<workspace-name>/datastores/workspaceblobstore

  2. 创建数据输出:

    在名为 inputs-and-outputs.yml 的文件中定义输入和输出值。 在输出路径中使用数据存储 ID。 为了完整性,还需定义数据输入。

    inputs:
      heart_data:
        type: uri_folder
        path: https://azuremlexampledata.blob.core.windows.net/data/heart-disease-uci/data
    outputs:
      score:
        type: uri_file
        path: <data-store-ID>/paths/batch-jobs/my-unique-path
    

    注意

    请注意 paths 文件夹是如何作为输出路径的一部分的。 此格式指示后面的值是路径。

  3. 运行部署:

    使用 --file 参数指定输入和输出值:

    az ml batch-endpoint invoke --name $ENDPOINT_NAME --file inputs-and-outputs.yml