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

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

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

先决条件

  • 批处理终结点和部署。 若要创建这些资源,请参阅 Azure Machine Learning 批量部署中的Deploy MLflow 模型。

  • 运行批量端点部署的许可。 可以使用 AzureML Data ScientistContributorOwner 角色运行部署。 对于自定义角色定义,请参阅批处理终结点上的授权以查看所需的特定权限。

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

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

    提示

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

建立身份验证

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

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

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

使用 Azure CLI,通过 交互式设备代码 进行身份验证:

az login

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

创建基础作业

若要通过批处理终结点创建作业,请调用该终结点。 可以使用 Azure Machine Learning CLI、Azure Machine Learning SDK for Python 或 REST API 调用来执行调用。

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

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

az ml batch-endpoint invoke --name $ENDPOINT_NAME \
                            --input https://azuremlexampledata.blob.core.chinacloudapi.cn/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.chinacloudapi.cn/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.chinacloudapi.cn/data/heart-disease-uci/data

了解输入和输出

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

显示输入和输出在批处理端点中如何使用的关系图。

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

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

输入和输出的数量和类型取决于批处理部署的类型。 模型部署始终需要一个数据输入并生成一个数据输出。 模型部署不支持文本输入。

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

部署类型 输入数目 支持的输入类型 输出数目 支持的输出类型
模型部署 1 数据输入 1 数据输出

提示

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

探索数据输入

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

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

重要

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

  • 普遍可用版本的 Azure Machine Learning CLI v2(2.4.0 及更高版本)。
  • 正式发布的 REST API 版本(2022-05-01 及更高版本)。

探索文字输入

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

  • string
  • boolean
  • float
  • integer

浏览数据输出

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

重要

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

利用数据输入创建任务

以下示例演示如何在从 data assetsdata storesAzure Storage 账户中获取数据输入以创建作业。

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

Azure Machine Learning数据资产(以前称为数据集)被支持用作作业的输入。 按照以下步骤运行批处理终结点作业,该作业使用存储在Azure Machine Learning中已注册的数据资产中的输入数据。

警告

目前不支持表类型 (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 Machine Learning已注册数据存储中的数据。 在此示例中,首先将某些数据上传到Azure Machine Learning工作区中的数据存储。 然后,在该数据上运行批处理部署。

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

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

    1. 在Azure Machine Learning studio中,打开默认 Blob 数据存储的数据资产页,然后查找其 Blob 容器的名称。
    2. 使用 Azure Storage Explorer 或 AzCopy 等工具将示例数据上传到该容器中名为 heart-disease-uci-unlabeled 的未标记文件夹。
  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 Storage帐户的输入数据

Azure Machine Learning批处理终结点可以从Azure Storage帐户(公共帐户和专用帐户)中的云位置读取数据。 按以下步骤使用存储帐户中的数据运行批处理终结点作业。

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

  1. 配置输入参数:

    设置 INPUT_DATA 变量:

    INPUT_DATA="https://azuremlexampledata.blob.core.chinacloudapi.cn/data/heart-disease-uci/data"
    

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

    INPUT_DATA="https://azuremlexampledata.blob.core.chinacloudapi.cn/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.chinacloudapi.cn/data/heart-disease-uci/data
    

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

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

    如果数据在一个文件中,请在inputs.yml文件中为数据输入使用uri_file类型。

将输入放到 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 Storage帐户,就可以在工作区中使用任何其他数据存储。 如果要使用不同的数据存储,请将以下步骤中的 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.chinacloudapi.cn/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