创建和管理 Azure 机器学习计算实例

了解如何在 Azure 机器学习工作区中创建和管理计算实例

可将计算实例用作云中的完全配置、完全托管的开发环境。 对于开发和测试,还可将该实例用作训练计算目标或用于推理目标。 计算实例可以并行运行多个作业,它有一个作业队列。 作为开发环境,不能与工作区中的其他用户共享计算实例。

在本文中,学习如何:

计算实例可以在虚拟网络环境中安全地运行作业,无需企业打开 SSH 端口。 作业在容器化环境中执行,并将模型依赖项打包到 Docker 容器中。

先决条件

创建

重要

下面标记了“(预览版)”的项当前为公共预览版。 该预览版在提供时没有附带服务级别协议,建议不要将其用于生产工作负载。 某些功能可能不受支持或者受限。 有关详细信息,请参阅 Azure 预览版补充使用条款

时间估计:大约 5 分钟。

对于工作区而言,创建计算实例是一次性过程。 可将此计算重复用作开发工作站,或者用作训练的计算目标。 可将多个计算实例附加到工作区。

对于每个区域每个虚拟机 (VM) 系列配额和创建计算实例时应用的区域总配额,专用内核数一致,且该数量与 Azure 机器学习训练计算群集配额共享。 停止计算实例不会释放配额,因此无法确保你能够重启计算实例。 创建计算实例后,无法更改其虚拟机大小。

以下示例演示如何创建计算实例:

import datetime
import time

from azureml.core.compute import ComputeTarget, ComputeInstance
from azureml.core.compute_target import ComputeTargetException

# Choose a name for your instance
# Compute instance name should be unique across the azure region
compute_name = "ci{}".format(ws._workspace_id)[:10]

# Verify that instance does not exist already
try:
    instance = ComputeInstance(workspace=ws, name=compute_name)
    print('Found existing instance, use it.')
except ComputeTargetException:
    compute_config = ComputeInstance.provisioning_configuration(
        vm_size='STANDARD_D3_V2',
        ssh_public_access=False,
        # vnet_resourcegroup_name='<my-resource-group>',
        # vnet_name='<my-vnet-name>',
        # subnet_name='default',
        # admin_user_ssh_public_key='<my-sshkey>'
    )
    instance = ComputeInstance.create(ws, compute_name, compute_config)
    instance.wait_for_completion(show_output=True)

有关此示例中使用的类、方法和参数的详细信息,请参阅以下参考文档:

还可使用 Azure 资源管理器模板创建计算实例。

启用 SSH 访问

默认情况下会禁用 SSH 访问。 SSH 访问在创建后就不能进行更改了。 如果计划使用 VS Code Remote 以交互式方式进行调试,请确保启用访问权限。

选择“下一步: 高级设置”后:

  1. 开启“启用 SSH 访问”。
  2. 在“SSH 公钥源”中,从下拉列表中选择其中一个选项:
    • 如果生成新密钥对:
      1. 在“密钥对名称”中输入密钥的名称。
      2. 选择“创建”。
      3. 选择“下载私钥并创建计算”。 密钥通常下载到“下载”文件夹中。
    • 如果选择“使用存储在 Azure 中的现有公钥”,搜索并选择“存储密钥”中的密钥 。
    • 如果选择“使用现有公钥”,请以单行格式(以“ssh-rsa”开头)或多行 PEM 格式提供 RSA 公钥。 可以在 Linux 和 OS X 上使用 ssh-keygen 生成 SSH 密钥,或在 Windows 上使用 PuTTYGen 生成这些密钥。

创建并运行计算实例后,请参阅使用 SSH 访问进行连接

代表他人创建(预览版)

作为管理员,你可代表数据科学家创建计算实例,并通过以下方式将实例分配给他们:

你为其创建计算实例的数据科学家需要拥有针对以下项的 Azure 基于角色的访问控制 (Azure RBAC) 权限:

  • Microsoft.MachineLearningServices/workspaces/computes/start/action
  • Microsoft.MachineLearningServices/workspaces/computes/stop/action
  • Microsoft.MachineLearningServices/workspaces/computes/restart/action
  • Microsoft.MachineLearningServices/workspaces/computes/applicationaccess/action
  • Microsoft.MachineLearningServices/workspaces/computes/updateSchedules/action

数据科学家可启动、停止和重启计算实例。 他们可将计算实例用于:

  • Jupyter
  • JupyterLab
  • RStudio
  • 集成式笔记本

计划自动启动和停止(预览版)

为自动关闭和自动启动定义多个计划。 例如,创建两个计划,一个在周一至周四每天上午 9 点开始,下午 6 点停止,另一个在周五上午 9 点开始,下午 4 点停止。 对于每个计算实例,总共可以创建四个计划。

还可以为代表他人创建计算实例定义计划。 可以创建计划以创建状态为“已停止”的计算实例。 当用户代表其他用户创建计算实例时,这特别有用。

在工作室中创建计划

  1. 填写表单

  2. 在表单的第二页上,打开“显示高级设置”。

  3. 选择“添加计划”以添加新计划。

    屏幕截图:在“高级设置”中添加计划。

  4. 选择“启动计算实例”或“停止计算实例” 。

  5. 选择“时区”。

  6. 选择“启动时间”或“关闭时间” 。

  7. 选择此计划处于活动状态的天数。

    屏幕截图:计划要关闭的计算实例。

  8. 如果要创建其他计划,请再次选择“添加计划”。

创建计算实例后,可以从计算实例详细信息部分查看、编辑或添加新计划。

使用资源管理器模板创建计划

可以使用资源管理器模板计划计算实例的自动启动和停止。 在资源管理器模板中,使用 cron 或 LogicApps 表达式可定义启动或停止实例的计划。

"schedules": {
    "value": {
    "computeStartStop": [
        {
        "TriggerType": "Cron",
        "Cron": {
            "StartTime": "2021-03-10T21:21:07",
            "TimeZone": "Pacific Standard Time",
            "Expression": "0 18 * * *"
        },
        "Action": "Stop",
        "Status": "Enabled"
        },
        {
        "TriggerType": "Cron",
        "Cron": {
            "StartTime": "2021-03-10T21:21:07",
            "TimeZone": "Pacific Standard Time",
            "Expression": "0 8 * * *"
        },
        "Action": "Start",
        "Status": "Enabled"
        },
        { 
        "triggerType": "Recurrence", 
        "recurrence": { 
            "frequency": "Day", 
            "interval": 1, 
            "timeZone": "Pacific Standard Time", 
          "schedule": { 
            "hours": [18], 
            "minutes": [0], 
            "weekDays": [ 
                "Saturday", 
                "Sunday"
            ] 
            } 
        }, 
        "Action": "Stop", 
        "Status": "Enabled" 
        } 
    ]
  • “action”的值可以是“Start”或“Stop”。

  • 对于触发类型 Recurrence,使用与逻辑应用相同的语法,以及此定期架构

  • 对于触发类型 cron,使用标准 cron 语法:

    // Crontab expression format: 
    // 
    // * * * * * 
    // - - - - - 
    // | | | | | 
    // | | | | +----- day of week (0 - 6) (Sunday=0) 
    // | | | +------- month (1 - 12) 
    // | | +--------- day of month (1 - 31) 
    // | +----------- hour (0 - 23) 
    // +------------- min (0 - 59) 
    // 
    // Star (*) in the value field above means all legal values as in 
    // braces for that column. The value column can have a * or a list 
    // of elements separated by commas. An element is either a number in 
    // the ranges shown above or two numbers in the range separated by a 
    // hyphen (meaning an inclusive range). 
    

使用 Azure Policy 可强制执行订阅中每个计算实例存在的关闭计划,或在不存在任何关闭计划时默认为执行某个计划。

使用脚本自定义计算实例(预览版)

使用安装脚本实现自动方式,以便在预配时自定义并配置计算实例。 作为管理员,你可以编写一个自定义脚本,用于按照要求预配工作区中的所有计算实例。

可以在安装脚本中执行的操作的一些示例:

  • 安装包、工具和软件
  • 装载数据
  • 创建自定义 conda 环境和 Jupyter 内核
  • 克隆 Git 存储库并设置 Git 配置
  • 设置网络代理
  • 设置环境变量。
  • 安装 JupyterLab 扩展

创建安装脚本

安装脚本是以 rootuser 身份运行的 shell 脚本。 创建脚本或将其上传到笔记本文件:

  1. 登录到工作室并选择你的工作区。
  2. 在左侧选择“笔记本”
  3. 使用“添加文件”工具创建或上传安装 shell 脚本。 请确保脚本文件名以“sh”结尾。 创建新文件时,还需要将“文件类型”更改为“bash(.sh)”。

在工作室中创建安装脚本或将其上传到笔记本文件

脚本运行时,脚本的当前工作目录是它上传到的目录。 例如,如果脚本上传到了 Users>admin,则脚本运行时,该脚本在计算实例和当前工作目录中的位置为 /home/azureuser/cloudfiles/code/Users/admin。这样,你便可以在脚本中使用相对路径。

脚本参数可以在脚本中引用为 $1、$2 等。

如果脚本执行了特定于 azureuser 的某项操作(例如安装 Conda 环境或 Jupyter 内核),你必须将它放入 sudo -u azureuser 块中,如下所示

#!/bin/bash

set -e

# This script installs a pip package in compute instance azureml_py38 environment

sudo -u azureuser -i <<'EOF'
# PARAMETERS
PACKAGE=numpy
ENVIRONMENT=azureml_py38 
conda activate "$ENVIRONMENT"
pip install "$PACKAGE"
conda deactivate
EOF

命令 sudo -u azureuser 将当前工作目录更改为 /home/azureuser 。 此外,无法访问此块中的脚本参数。

也可以在脚本中使用以下环境变量:

  1. CI_RESOURCE_GROUP
  2. CI_WORKSPACE
  3. CI_NAME
  4. CI_LOCAL_UBUNTU_USER. 这会指向 azureuser

可以将安装脚本与 Azure Policy 结合使用,以在每次创建计算实例时强制执行或默认执行某个安装脚本。

在工作室中使用脚本

存储脚本后,在计算实例的创建过程中指定该脚本:

  1. 登录到工作室并选择你的工作区。
  2. 在左侧选择“计算”。
  3. 选择“+ 新建”以创建新的计算实例。
  4. 填写表单
  5. 在表单的第二页上,打开“显示高级设置”。
  6. 启用“使用安装脚本进行预配”。
  7. 浏览到所保存的 shell 脚本。 或从计算机上传脚本。
  8. 根据需要添加命令参数。

在工作室中使用安装脚本预配计算实例。

如果工作区存储已附加到虚拟网络,则除非从虚拟网络内部访问工作室,否则你可能无法访问安装脚本文件。

在资源管理器模板中使用脚本

在资源管理器模板中,添加 setupScripts 以在预配计算实例时调用安装脚本。 例如:

"setupScripts":{
    "scripts":{
        "creationScript":{
        "scriptSource":"workspaceStorage",
        "scriptData":"[parameters('creationScript.location')]",
        "scriptArguments":"[parameters('creationScript.cmdArguments')]"
        }
    }
}

上面的 scriptData 指定了笔记本文件共享中创建脚本的位置,例如 Users/admin/testscript.sh。scriptArguments 是可选的,用于指定创建脚本的参数 。

可以改为为资源管理器模板提供内联脚本。 Shell 命令可以引用上传到笔记本文件共享中的任何依赖项。 使用内联字符串时,脚本的工作目录为 /mnt/batch/tasks/shared/LS_root/mounts/clusters/ciname/code/Users。

例如,为 scriptData 指定 base64 编码的命令字符串:

"setupScripts":{
    "scripts":{
        "creationScript":{
        "scriptSource":"inline",
        "scriptData":"[base64(parameters('inlineCommand'))]",
        "scriptArguments":"[parameters('creationScript.cmdArguments')]"
        }
    }
}

安装脚本日志

安装脚本执行的日志显示在计算实例详细信息页的日志文件夹中。 日志将存储回 Logs<compute instance name> 文件夹下的笔记本文件共享中。 特定计算实例的脚本文件和命令参数显示在详细信息页中。

管理

启动、停止、重启和删除计算实例。 计算实例不会自动纵向缩减,因此请确保停止该资源以免产生费用。 停止计算实例会将其解除分配。 然后在需要时重启。 虽然停止计算实例将停止计算时间的计费,但仍会对磁盘、公共 IP 和标准负载均衡器计费。

可以为计算实例创建计划,以基于时间和星期几自动启动和停止。

提示

计算实例具有 120GB 的 OS 磁盘。 如果磁盘空间不足,则在停止或重启计算实例之前,使用终端可至少清空 1-2 GB 空间。 请勿通过从终端分发 sudo shutdown 来停止计算实例。

在下例中,计算实例的名称均为“实例”

  • 获取状态

    # get_status() gets the latest status of the ComputeInstance target
    instance.get_status()
    
  • 停止

    # stop() is used to stop the ComputeInstance
    # Stopping ComputeInstance will stop the billing meter and persist the state on the disk.
    # Available Quota will not be changed with this operation.
    instance.stop(wait_for_completion=True, show_output=True)
    
  • 开始

    # start() is used to start the ComputeInstance if it is in stopped state
    instance.start(wait_for_completion=True, show_output=True)
    
  • 重启

    # restart() is used to restart the ComputeInstance
    instance.restart(wait_for_completion=True, show_output=True)
    
  • Delete

    # delete() is used to delete the ComputeInstance target. Useful if you want to re-use the compute name 
    instance.delete(wait_for_completion=True, show_output=True)
    

使用 Azure RBAC 可以对工作区中的哪些用户能够创建、删除、启动、停止、重启计算实例进行控制。 充当工作区参与者和所有者角色的所有用户可以在整个工作区中创建、删除、启动、停止和重启计算实例。 但是,只有特定计算实例的创建者或分配的用户(如果该计算实例是以其名义创建的)可在该计算实例上访问 Jupyter、JupyterLab 和 RStudio。 计算实例专用于具有 root 用户访问权限的单个用户,并且可通过 Jupyter/JupyterLab/RStudio 进行终端访问。 计算实例将具有单用户登录名,所有操作都将使用该用户的标识进行试验运行的 Azure RBAC 控制和权限划分。 SSH 访问是通过公钥/私钥机制控制的。

可以通过 Azure RBAC 来控制这些操作:

  • Microsoft.MachineLearningServices/workspaces/computes/read
  • Microsoft.MachineLearningServices/workspaces/computes/write
  • Microsoft.MachineLearningServices/workspaces/computes/delete
  • Microsoft.MachineLearningServices/workspaces/computes/start/action
  • Microsoft.MachineLearningServices/workspaces/computes/stop/action
  • Microsoft.MachineLearningServices/workspaces/computes/restart/action
  • Microsoft.MachineLearningServices/workspaces/computes/updateSchedules/action

若要创建计算实例,需要以下操作的权限:

  • Microsoft.MachineLearningServices/workspaces/computes/write
  • Microsoft.MachineLearningServices/workspaces/checkComputeNameAvailability/action

后续步骤