用Azure ML训练一个ML.NET模型教学

142 阅读3分钟

模型生成器使你很容易开始使用机器学习并创建你的第一个模型。随着时间的推移,你收集了更多的数据,你可能想不断完善或重新训练你的模型。使用CLI和Azure工具的组合,你可以训练一个新的ML.NET模型,并将训练集成到一个管道中。这篇博文展示了一个训练管道的例子,它可以使用Azure轻松地重新运行。

我们将使用Azure机器学习数据集来跟踪数据,并使用Azure ML管道来训练一个新模型。然后,这个重新训练的管道可以由Azure DevOps触发。 在这篇文章中,我们将介绍:

  1. 创建一个Azure机器学习数据集
  2. 通过Azure机器学习CLI(v2)训练一个ML.NET模型
  3. 在Azure DevOps中创建一个用于重新训练的管道

先决条件

  1. Azure机器学习工作区
  2. 工作区中的计算集群

创建一个Azure机器学习数据集

  1. Microsoft Azure机器学习工作室中打开工作区。

  2. 我们需要创建一个文件数据集。导航到数据集。点击 +创建数据集

  3. 选择数据源。我们将上传一份从Kaggle获得的这个歌曲流行度数据集的副本。这是一个相当大的数据集,我不想在本地维护。

  4. 给数据集一个独特的名字,确保选择 "文件 "作为数据集类型:Screenshot of Azure ML Create Dataset Basic Info step

  5. 从本地文件上传至默认的工作区blobstore。记住文件名:Screenshot of Azure ML Create Dataset Datastore and file selection step

  6. 当数据上传完成后,创建数据集。

  7. 点击已完成的数据集来查看它。确认 "探索"选项卡中的预览看起来是正确的。

  8. 记下数据集名称、文件名称,如果你上传了多个版本,记下版本号。我们将在下一步中使用这些值。

通过Azure机器学习训练一个ML.NET模型

现在我们有一个数据集上传到Azure ML,我们可以创建一个Azure ML训练管道,并使用Azure CLI v2来运行它。下面的管道将创建一个带有ML.NET CLI实例的Docker容器,用来进行训练:

  1. 创建Docker文件,并将其保存在一个新的文件夹中,用于本实验。如果不熟悉Dockerfiles,这些文件类型没有扩展名。该文件应称为 "Dockerfile",没有扩展名,并包含以下内容:

    FROM mcr.microsoft.com/dotnet/sdk:6.0
    RUN dotnet tool install -g microsoft.mlnet-linux-x64
    ENV PATH="$PATH:/root/.dotnet/tools"
    
  2. 我们需要弄清楚我们的ML.NET CLI命令来训练我们的模型。如果需要,请参阅ML.NET CLI的安装说明ML.NET CLI Regression command information

    我们正在做回归,并将指定一个数据集和标签列。对于表格文件也支持文本分类和推荐。查看命令信息或ML.NET CLI文档,了解其他训练场景的更多细节。

    确保包括选项--verbosity q ,因为CLI的一些功能在Linux环境下会导致问题。

    mlnet regression --dataset <YOUR_DATA_FILE_NAME> --label-col <YOUR_LABEL> --output outputs --log-file-path outputs/logs --verbosity q

  3. 在与Docker文件相同的文件夹中创建AzureTrain.yml文件。这就是将被传递给Azure CLI的内容。 通过在管道中使用输入数据,Azure ML将下载文件数据集到我们的计算中。然后可以直接引用该训练文件。我们只需要在命令中指定ML.NET CLI的路径。 做好以下工作:

    • 替换成唯一的数据集名称,以及版本号(可能是1)。这两个值在数据集标签中都是可见的。在这个例子中,这个值是dataset: azureml:song_popularity:1
    • 用本地的ML.NET CLI命令替换命令。我们将使用{inputs.data}来代替本地文件路径,告诉管道使用Azure计算上的下载路径。添加数据文件名。在这个例子中,它是--dataset {inputs.data}/song_data.csv
    • 用我们的计算名称替换计算。工作区中可用的计算集群在Computes->Compute clusters下可见。

更多信息见命令作业YAML模式文档

inputs:
  data:
    dataset: azureml:<DATASET_NAME>:<VERSION>
    mode: download
experiment_name: mldotnet-training
code:
  local_path: .
command: mlnet regression --dataset {inputs.data}/<YOUR_DATA_FILE_NAME> --label-col <YOUR_LABEL_COLUMN> --output outputs --log-file-path outputs/logs --verbosity q
compute: azureml:<YOUR-COMPUTE-NAME>
environment: 
  build:
    local_path: .
    dockerfile_path: Dockerfile

手动运行

为了从本地机器上启动训练,或者只是测试运行的功能,我们可以安装和设置带有ML扩展的Azure CLI(v2)。在这些说明中,我运行的是ml扩展2.0.7版:

  1. 机器学习子命令需要-workspace/-w和-resource-group/-g参数。配置数据集的组和工作空间的默认值:

    az configure –-defaults group=<YOUR_RESOURCE_GROUP> workspace=<YOUR_WORKSPACE>

  2. 运行上一步创建的再训练管道:
    az ml job create –-file AzureTrain.yml

  3. 在Azure机器学习工作室的Experiments->mldotnet-training下在线检查运行结果。

用Azure DevOps服务管道自动进行训练

我们可以通过Azure DevOps管道来运行Azure ML训练。这允许使用任何触发器,包括基于时间或文件变化。

下面是让Azure ML管道运行的步骤。更多细节,请看设置Azure DevOps和Azure ML的分步说明

  1. 将Dockerfile和AzureTrain.yml检查到源控制中。最好是创建一个新的子文件夹,把这些文件放进去。Azure CLI会在运行实验时上传整个包含文件夹。
  2. 在Azure ML和Azure DevOps之间建立一个服务连接。在Azure DevOps中。
    1. 转到项目设置。选择管道->服务连接
    2. 创建一个新的Azure资源管理器类型的连接
    3. 选择服务主体(自动)和范围级机器学习工作区。把它配置到你的机器学习工作区的资源组。将其命名为aml-ws。
  3. 在Azure DevOps中创建一个新的管道,使用以下文件作为模板。替换变量和触发器(如果适用)。ml-ws-connection是步骤2中创建的连接。根据文件签入的地方,将AzureTrain.yml文件路径添加到 "创建训练作业 "步骤中。
variables:
  ml-ws-connection: 'aml-ws' # Workspace Service Connection name
  ml-ws: '<YOUR_VALUE>' # AML Workspace name
  ml-rg: '<YOUR_VALUE>' # AML resource Group name

trigger:
  <YOUR_TRIGGER>

pool:
  vmImage: ubuntu-latest

steps:

- task: AzureCLI@2
  displayName: 'Set config functionality'
  inputs:
    azureSubscription: $(ml-ws-connection)
    scriptLocation: inlineScript
    scriptType: 'bash'
    inlineScript: 'az config set extension.use_dynamic_install=yes_without_prompt'

- task: AzureCLI@2
  displayName: 'Install AML CLI (azureml-v2-preview)'
  inputs:
    azureSubscription: $(ml-ws-connection)
    scriptLocation: inlineScript
    scriptType: 'bash'
    inlineScript: 'az extension add -n ml'

- task: AzureCLI@2
  displayName: 'Setup default config values'
  inputs:
    azureSubscription: $(ml-ws-connection)
    scriptLocation: inlineScript
    scriptType: 'bash'
    inlineScript: 'az configure --defaults group=$(ml-rg) workspace=$(ml-ws)'

- task: AzureCLI@2
  displayName: 'Create training job'
  inputs:
    azureSubscription: $(ml-ws-connection)
    scriptLocation: inlineScript
    scriptType: 'bash'
    inlineScript: 'az ml job create --file <YOUR_PATH>/AzureTrain.yml'

在本地或从Azure DevOps运行Azure CLI作业将在Azure中创建一个输出模型。要看到这个模型,请到微软Azure机器学习工作室,导航到你的ML工作区。点击实验->mldotnet-training。切换 "仅查看我的运行",以查看由Azure管道服务负责人启动的运行。完成的训练运行应该是可见的。训练后的模型和示例代码会在输出文件夹中的 "输出 +日志"部分生成。

在这篇文章中,我们通过Azure ML创建了一种灵活的方式来跟踪我们的数据和模型。 Azure ML数据集可以被添加和更新,同时保持历史数据。这个Azure ML再训练管道可以在Azure DevOps中手动或自动运行。 一旦你的模型得到训练,你就可以使用Azure ML自定义容器进行部署。

用Azure机器学习数据集和Azure DevOps建立你自己的ML.NET再训练管道?如果有任何问题、功能要求或一般反馈,请在ML.NET工具(模型生成器和ML.NET CLI)GitHub repo中提交问题,让我们知道。

用Azure ML训练ML.NET模型一文首次出现在.NET博客上。