• Azure 机器学习:使用 Azure 机器学习 CLI、SDK 和 REST API 训练模型


    Azure 机器学习提供了多种提交 ML 训练作业的方法。 在本文中,你将了解如何使用 Azure 机器学习 CLI、SDK 和 REST API 训练模型

    关注TechLead,分享AI全维度知识。作者拥有10+年互联网服务架构、AI产品研发经验、团队管理经验,同济本复旦硕,复旦机器人智能实验室成员,阿里云认证的资深架构师,项目管理专业人士,上亿营收AI产品研发负责人。

    file

    环境准备

    若要使用 SDK 信息,请安装适用于 Python 的 Azure 机器学习 SDK v2

    若要使用 CLI 信息,请安装适用于机器学习的 Azure CLI 和扩展

    若要使用 REST API 信息,需要以下项:

    • 工作区中的服务主体。 管理 REST 请求使用服务主体身份验证

    • 服务主体身份验证令牌。 请按照检索服务主体身份验证令牌中的步骤检索此令牌。

    • curl 实用工具。 在适用于 Linux 的 Windows 子系统或任何 UNIX 分发版中均已提供了 [curl]程序。

    克隆示例存储库

    本文中的代码片段基于 Azure 机器学习示例 GitHub 存储库中的示例。 若要将存储库克隆到开发环境,请使用以下命令:

    git clone --depth 1 https://github.com/Azure/azureml-examples
    
    • 1

    示例案例

    本文中的示例使用鸢尾花数据集来训练 MLFlow 模型。

    在云中训练

    在云中训练时,必须连接到 Azure 机器学习工作区并选择将用于运行训练作业的计算资源。

    1.连接到工作区

    使用Python时,若要连接到工作区,需要提供标识符参数 - 订阅、资源组和工作区名称。 你将在 azure.ai.ml 命名空间的 MLClient 中使用这些详细信息来获取所需 Azure 机器学习工作区的句柄。 若要进行身份验证,请使用[默认 Azure 身份验证]。 请查看此示例,了解有关如何配置凭据和连接到工作区的更多详细信息。

    Python
    # Python代码
    #import required libraries
    from azure.ai.ml import MLClient
    from azure.identity import DefaultAzureCredential
    
    #Enter details of your Azure Machine Learning workspace
    subscription_id = ''
    resource_group = ''
    workspace = ''
    
    #connect to the workspace
    ml_client = MLClient(DefaultAzureCredential(), subscription_id, resource_group, workspace)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    Azure CLI

    使用 Azure CLI 时,需要提供标识符参数 - 订阅、资源组和工作区名称。 尽管可以为每个命令指定这些参数,但你也可以设置将用于所有命令的默认值。 使用以下命令设置默认值。 将 替换为配置的值:

    # Azure CLI
    az account set --subscription 
    az configure --defaults workspace= group=
    
    • 1
    • 2
    • 3
    REST API

    本文中的 REST API 示例使用 $SUBSCRIPTION_ID$RESOURCE_GROUP$LOCATION$WORKSPACE 占位符。 将占位符替换为自己的值,如下所示:

    • $SUBSCRIPTION_ID:Azure 订阅 ID。
    • $RESOURCE_GROUP:包含你的工作区的 Azure 资源组。
    • $LOCATION:工作区所在的 Azure 区域。
    • $WORKSPACE:Azure 机器学习工作区的名称。
    • $COMPUTE_NAME:Azure 机器学习计算群集的名称。

    管理 REST 请求一个服务主体身份验证令牌。 可使用以下命令检索令牌。 令牌存储在 $TOKEN 环境变量中:

    TOKEN=$(az account get-access-token --query accessToken -o tsv)
    
    • 1

    服务提供商使用 api-version 参数来确保兼容性。 api-version 参数因服务而异。 将 API 版本设置为变量以适应将来的版本:

    API_VERSION="2022-05-01"
    
    • 1

    使用 REST API 进行训练时,必须将数据和训练脚本上传到工作区可以访问的存储帐户。 以下示例获取你的工作区的存储信息,并将其保存到变量中,以便稍后使用:

    # Get values for storage account
    response=$(curl --location --request GET "https://management.azure.com/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.MachineLearningServices/workspaces/$WORKSPACE/datastores?api-version=$API_VERSION&isDefault=true" \
    --header "Authorization: Bearer $TOKEN")
    AZUREML_DEFAULT_DATASTORE=$(echo $response | jq -r '.value[0].name')
    AZUREML_DEFAULT_CONTAINER=$(echo $response | jq -r '.value[0].properties.containerName')
    export AZURE_STORAGE_ACCOUNT=$(echo $response | jq -r '.value[0].properties.accountName')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    2. 创建用于训练的计算资源

    Azure 机器学习计算群集是一种完全托管的计算资源,可用于运行训练作业。 在以下示例中,创建了名为 cpu-compute 的计算群集。

    # Python
    from azure.ai.ml.entities import AmlCompute
    
    # specify aml compute name.
    cpu_compute_target = "cpu-cluster"
    
    try:
        ml_client.compute.get(cpu_compute_target)
    except Exception:
        print("Creating a new cpu compute target...")
        compute = AmlCompute(
            name=cpu_compute_target, size="STANDARD_D2_V2", min_instances=0, max_instances=4
        )
        ml_client.compute.begin_create_or_update(compute).result()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    # Azure CLI
    az ml compute create -n cpu-cluster --type amlcompute --min-instances 0 --max-instances 4
    
    • 1
    • 2
    # REST API
    curl -X PUT \
      "https://management.azure.com/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.MachineLearningServices/workspaces/$WORKSPACE/computes/$COMPUTE_NAME?api-version=$API_VERSION" \
      -H "Authorization:Bearer $TOKEN" \
      -H "Content-Type: application/json" \
      -d '{
        "location": "'$LOCATION'",
        "properties": {
            "computeType": "AmlCompute",
            "properties": {
                "vmSize": "Standard_D2_V2",
                "vmPriority": "Dedicated",
                "scaleSettings": {
                    "maxNodeCount": 4,
                    "minNodeCount": 0,
                    "nodeIdleTimeBeforeScaleDown": "PT30M"
                }
            }
        }
    }'
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    4. 提交训练作业

    Python

    若要运行此脚本,你将使用 ./sdk/python/jobs/single-step/lightgbm/iris/src/ 下用于执行 main.py Python 脚本的 command。 该命令通过将其作为 job 提交到 Azure 机器学习来运行。
    若要使用无服务器计算,请删除此代码中的 compute="cpu-cluster"

    # Python
    from azure.ai.ml import command, Input
    
    # define the command
    command_job = command(
        code="./src",
        command="python main.py --iris-csv ${{inputs.iris_csv}} --learning-rate ${{inputs.learning_rate}} --boosting ${{inputs.boosting}}",
        environment="AzureML-lightgbm-3.2-ubuntu18.04-py37-cpu@latest",
        inputs={
            "iris_csv": Input(
                type="uri_file",
                path="https://azuremlexamples.blob.core.windows.net/datasets/iris.csv",
            ),
            "learning_rate": 0.9,
            "boosting": "gbdt",
        },
        compute="cpu-cluster",
    )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    # submit the command
    returned_job = ml_client.jobs.create_or_update(command_job)
    # get a URL for the status of the job
    returned_job.studio_url
    
    • 1
    • 2
    • 3
    • 4

    在上述示例中,你配置了以下内容:

    • code - 用于运行命令的代码所在的路径
    • command - 需要运行的命令
    • environment - 运行训练脚本所需的环境。 在此示例中,我们使用 Azure 机器学习所提供的名为 AzureML-lightgbm-3.2-ubuntu18.04-py37-cpu 的精选或现成环境。 通过使用 @latest 指令来使用此环境的最新版本。 你还可以通过指定基本 docker 映像并为其指定 conda yaml 来使用自定义环境。
    • inputs - 命令的输入字典,采用名称值对的形式。 键是作业上下文中的输入名称,值是输入值。 在 command 中使用 ${{inputs.}} 表达式引用输入。 若要将文件或文件夹用作输入,可以使用 Input 类。 有关详细信息,请参阅 SDK 和 CLI v2 表达式

    提交作业时,会向 Azure 机器学习工作室中的作业状态返回一个 URL。 使用工作室 UI 查看工作进度。 你还可以使用 returned_job.status 检查作业的当前状态。

    Azure CLI

    此示例中使用的 az ml job create 命令需要 YAML 作业定义文件。 此示例中使用的文件内容如下:

    备注

    若要使用无服务器计算,请删除此代码中的 compute: azureml:cpu-cluster"

    $schema: https://azuremlschemas.azureedge.net/latest/commandJob.schema.json
    code: src
    command: >-
      python main.py 
      --iris-csv ${{inputs.iris_csv}}
      --C ${{inputs.C}}
      --kernel ${{inputs.kernel}}
      --coef0 ${{inputs.coef0}}
    inputs:
      iris_csv: 
        type: uri_file
        path: wasbs://datasets@azuremlexamples.blob.core.windows.net/iris.csv
      C: 0.8
      kernel: "rbf"
      coef0: 0.1
    environment: azureml:AzureML-sklearn-0.24-ubuntu18.04-py37-cpu@latest
    compute: azureml:cpu-cluster
    display_name: sklearn-iris-example
    experiment_name: sklearn-iris-example
    description: Train a scikit-learn SVM on the Iris dataset.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    上面配置了:

    • code - 用于运行命令的代码所在的路径
    • command - 需要运行的命令
    • inputs - 命令的输入字典,采用名称值对的形式。 键是作业上下文中的输入名称,值是输入值。 在 command 中使用 ${{inputs.}} 表达式引用输入。 有关详细信息,请参阅 SDK 和 CLI v2 表达式
    • environment - 运行训练脚本所需的环境。 在此示例中,我们使用 Azure 机器学习所提供的名为 AzureML-sklearn-0.24-ubuntu18.04-py37-cpu 的精选或现成环境。 通过使用 @latest 指令来使用此环境的最新版本。 你还可以通过指定基本 docker 映像并为其指定 conda yaml 来使用自定义环境。 若要提交作业,请使用以下命令。 训练作业的运行 ID(名称)存储在 $run_id 变量中:
    run_id=$(az ml job create -f jobs/single-step/scikit-learn/iris/job.yml --query name -o tsv)
    
    • 1

    你可以使用存储的运行 ID 返回有关作业的信息。 --web 参数打开 Azure 机器学习工作室 Web UI,你可在其中深入了解作业的详细信息:

    az ml job show -n $run_id --web
    
    • 1

    提交作业时,必须将训练脚本和数据上传到 Azure 机器学习工作区可访问的云存储位置。

    1. 使用以下 Azure CLI 命令上传训练脚本。 该命令指定包含训练所需文件的目录,而不是指定单个文件。 若要改用 REST 来上传数据,请参阅放置 Blob 参考:

      az storage blob upload-batch -d $AZUREML_DEFAULT_CONTAINER/testjob -s cli/jobs/single-step/scikit-learn/iris/src/ --account-name $AZURE_STORAGE_ACCOUNT
      
      • 1
    2. 创建对训练数据的版本化参考。 在此示例中,数据已在云中,位于 https://azuremlexamples.blob.core.windows.net/datasets/iris.csv。 有关引用数据的详细信息,请参阅 Azure 机器学习中的数据

      DATA_VERSION=$RANDOM
      curl --location --request PUT "https://management.azure.com/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.MachineLearningServices/workspaces/$WORKSPACE/data/iris-data/versions/$DATA_VERSION?api-version=$API_VERSION" \
      --header "Authorization: Bearer $TOKEN" \
      --header "Content-Type: application/json" \
      --data-raw "{
              \"properties\": {
              \"description\": \"Iris dataset\",
              \"dataType\": \"uri_file\",
              \"dataUri\": \"https://azuremlexamples.blob.core.windows.net/datasets/iris.csv\"
          }
      }"
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
    3. 注册对训练脚本的版本化参考,用于作业。 在此示例中,脚本位置是你在步骤 1 中将数据上传到的默认存储帐户和容器。 将返回带版本训练代码的 ID 并将其存储在 $TRAIN_CODE 变量中:

      TRAIN_CODE=$(curl --location --request PUT "https://management.azure.com/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.MachineLearningServices/workspaces/$WORKSPACE/codes/train-lightgbm/versions/1?api-version=$API_VERSION" \
      --header "Authorization: Bearer $TOKEN" \
      --header "Content-Type: application/json" \
      --data-raw "{
              \"properties\": {
              \"description\": \"Train code\",
              \"codeUri\": \"https://$AZURE_STORAGE_ACCOUNT.blob.core.windows.net/$AZUREML_DEFAULT_CONTAINER/testjob\"
          }
      }" | jq -r '.id')
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
    4. 创建群集将用于运行训练脚本的环境。 在此示例中,我们使用 Azure 机器学习所提供的名为 AzureML-lightgbm-3.2-ubuntu18.04-py37-cpu 的精选或现成环境。 以下命令检索环境版本列表,其中最新版本位于集合顶部。 jq 用于检索最新 ([0]) 版本的 ID,然后将其存储到 $ENVIRONMENT 变量中。

      ENVIRONMENT=$(curl --location --request GET "https://management.azure.com/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.MachineLearningServices/workspaces/$WORKSPACE/environments/AzureML-lightgbm-3.2-ubuntu18.04-py37-cpu/versions?api-version=$API_VERSION" --header "Authorization: Bearer $TOKEN" | jq -r .value[0].id)
      
      • 1
    5. 最后,提交作业。 以下示例介绍如何提交作业,以及如何参考训练代码 ID、环境 ID、输入数据的 URL 和计算群集的 ID。 作业输出位置将存储在 $JOB_OUTPUT 变量中:

    REST API
    ```
    run_id=$(uuidgen)
    curl --location --request PUT "https://management.azure.com/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.MachineLearningServices/workspaces/$WORKSPACE/jobs/$run_id?api-version=$API_VERSION" \
    --header "Authorization: Bearer $TOKEN" \
    --header "Content-Type: application/json" \
    --data-raw "{
        \"properties\": {
            \"jobType\": \"Command\",
            \"codeId\": \"$TRAIN_CODE\",
            \"command\": \"python main.py --iris-csv \$AZURE_ML_INPUT_iris\",
            \"environmentId\": \"$ENVIRONMENT\",
            \"inputs\": {
                \"iris\": {
                    \"jobInputType\": \"uri_file\",
                    \"uri\": \"https://azuremlexamples.blob.core.windows.net/datasets/iris.csv\"
                }
            },
            \"experimentName\": \"lightgbm-iris\",
            \"computeId\": \"/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.MachineLearningServices/workspaces/$WORKSPACE/computes/$COMPUTE_NAME\"
        }
    }"
    ```
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    注册已训练的模型

    以下示例介绍如何在 Azure 机器学习工作区中注册模型。

    Python
    from azure.ai.ml.entities import Model
    from azure.ai.ml.constants import AssetTypes
    
    run_model = Model(
        path="azureml://jobs/{}/outputs/artifacts/paths/model/".format(returned_job.name),
        name="run-model-example",
        description="Model created from run.",
        type=AssetTypes.MLFLOW_MODEL
    )
    
    ml_client.models.create_or_update(run_model)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    Azure CLI
    az ml model create -n sklearn-iris-example -v 1 -p runs:/$run_id/model --type mlflow_model
    
    • 1
    REST API
    curl --location --request PUT "https://management.azure.com/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.MachineLearningServices/workspaces/$WORKSPACE/models/sklearn/versions/1?api-version=$API_VERSION" \
    --header "Authorization: Bearer $TOKEN" \
    --header "Content-Type: application/json" \
    --data-raw "{
        \"properties\": {
            \"modelType\": \"mlflow_model\",
            \"modelUri\":\"runs:/$run_id/model\"
        }
    }"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    关注TechLead,分享AI全维度知识。作者拥有10+年互联网服务架构、AI产品研发经验、团队管理经验,同济本复旦硕,复旦机器人智能实验室成员,阿里云认证的资深架构师,项目管理专业人士,上亿营收AI产品研发负责人。

  • 相关阅读:
    rem 实现自应用屏幕大小
    web概述18
    微服务(基础篇-006-Docker安装-CentOS7)
    【毕业季·进击的技术er】青春不散场
    vmware esxi 7 直通GPU配置
    istio系列:第六章-Sidecar代理规则配置
    Easy EDA #学习笔记09# | ESP32-WROOM-32E模组ESP32-DevKitC-V4开发板 一键下载电路
    基于Web的美食分享平台的设计与实现——HTML+CSS+JavaScript水果介绍网页设计(橙子之家)
    什么是IP 欺骗以及如何防范?
    数据库(mysql)之用户管理
  • 原文地址:https://blog.csdn.net/magicyangjay111/article/details/134457338