创建 Azure 机器学习计算实例

适用范围:Azure CLI ml 扩展 v2(最新版)Python SDK azure-ai-ml v2(最新版)

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

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

本文介绍如何创建计算实例。 有关管理启动、停止、重启和删除计算实例的步骤,请参阅管理 Azure 机器学习计算实例

你还可以借助自己的自定义环境使用安装脚本创建计算实例。

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

注意

本文在某些示例中使用 CLI v2。 如果你仍在使用 CLI v1,请参阅使用 CLI v1 创建 Azure 机器学习计算群集

先决条件

  • Azure 机器学习工作区。 有关详细信息,请参阅创建 Azure 机器学习工作区。 在存储帐户中,必须启用“允许存储帐户密钥访问”选项才能成功创建计算实例。

选择用于其他先决条件的环境的选项卡。

  • 若要使用 Python SDK,请使用工作区设置开发环境。 设置环境后,附加到 Python 脚本中的工作区:

    适用于:Python SDK azure-ai-ml v2(当前版本)

    运行此代码以连接到 Azure ML 工作区。

    替换下列代码中的订阅 ID、资源组名称和工作区名称。 若要查找这些值:

    1. 登录到 Azure 机器学习工作室

    2. 打开要使用的工作区。

    3. 在右上方的 Azure 机器学习工作室工具栏中,选择你的工作区名称。

    4. 将工作区、资源组和订阅 ID 的值复制到代码中。

    5. 如果在工作室中使用笔记本,则需要复制一个值、关闭该区域再粘贴该值,然后返回继续复制下一个值。

      # Enter details of your AML workspace
      "subscription_id = \"<SUBSCRIPTION_ID>
      "resource_group = \"<RESOURCE_GROUP>\
      "workspace = \"<AML_WORKSPACE_NAME>\
      
      # get a handle to the workspace
      from azure.ai.ml import MLClient
      from azure.identity import DefaultAzureCredential
      
      ml_client = MLClient(
          DefaultAzureCredential(), subscription_id, resource_group, workspace
      )
      

    ml_client 是用于管理其他资源和作业的工作区处理程序。

创建

时间估计:大约 5 分钟。

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

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

创建计算实例的最快方法是按照创建入门所需的资源中的步骤操作。

或者,使用以下示例创建具有更多选项的计算实例:

适用于:Python SDK azure-ai-ml v2(当前版本)

# Compute Instances need to have a unique name across the region.
# Here we create a unique name with current datetime
from azure.ai.ml.entities import ComputeInstance, AmlCompute
import datetime

ci_basic_name = "basic-ci" + datetime.datetime.now().strftime("%Y%m%d%H%M")
ci_basic = ComputeInstance(name=ci_basic_name, size="STANDARD_DS3_v2")
ml_client.begin_create_or_update(ci_basic).result()

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

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

配置空闲关闭

为避免系统对已打开但不活动的计算实例收费,你可以对何时因计算实例不活动而将其关闭进行配置。

满足以下条件的计算实例将被视为非活动实例:

  • 没有活动的 Jupyter 内核会话(这意味着没有通过 Jupyter、JupyterLab 或交互式笔记本使用笔记本)
  • 没有活动的 Jupyter 终端会话
  • 没有活动的 Azure 机器学习运行或试验
  • 无 SSH 连接
  • 无 VS Code 连接;必须关闭 VS Code 连接,计算实例才会被视为非活动实例。 如果 VS Code 在 3 小时内未检测到任何活动,则会话将自动终止。
  • 计算中未运行任何自定义应用程序

如果有任何自定义应用程序正在运行,则计算实例不会被视为空闲。 围绕非活动时间段也有一些基本限制;计算实例必须处于非活动状态至少 15 分钟,最多 3 天。

此外,如果计算实例已经空闲了一段时间,则如果将空闲关闭设置更新为比当前空闲持续时间短的时间,则空闲时间时钟将重置为 0。 例如,如果计算实例已经闲置了 20 分钟,且关闭设置更新为 15 分钟,则闲置时钟将重置为 0。

重要

如果计算实例还配置了托管标识,则除非托管标识对 Azure 机器学习工作区具有参与者访问权限,否则计算实例不会因不活动而关闭。 有关分配权限的详细信息,请参阅管理对 Azure 机器学习工作区的访问权限

可以在创建计算实例期间为现有计算实例配置设置,也可以通过以下界面这样做:

适用于:Python SDK azure-ai-ml v2(当前版本)

创建新的计算实例时,添加 idle_time_before_shutdown_minutes 参数。

# Note that idle_time_before_shutdown has been deprecated.
ComputeInstance(name=ci_basic_name, size="STANDARD_DS3_v2", idle_time_before_shutdown_minutes="30")

无法使用 Python SDK 更改现有计算实例的空闲时间。

也可使用以下方法更改空闲时间:

  • REST API

    终结点:

    POST https://management.chinacloudapi.cn/subscriptions/{SUB_ID}/resourceGroups/{RG_NAME}/providers/Microsoft.MachineLearningServices/workspaces/{WS_NAME}/computes/{CI_NAME}/updateIdleShutdownSetting?api-version=2021-07-01
    

    正文:

    {
        "idleTimeBeforeShutdown": "PT30M" // this must be a string in ISO 8601 format
    }
    
  • ARM 模板:仅可在新建计算实例时配置

    // Note that this is just a snippet for the idle shutdown property in an ARM template
    {
        "idleTimeBeforeShutdown":"PT30M" // this must be a string in ISO 8601 format
    }
    

计划自动启动和停止

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

还可以为代表他人创建计算实例定义计划。 可以创建一个计划用于在停止状态下创建计算实例。 代表其他用户创建计算实例时,停止的计算实例很有用。

在计划的关闭之前,用户会看到一条通知,提醒他们计算实例即将关闭。 此时,用户可以选择关闭即将发生的关闭事件。 例如,如果它们正在使用其计算实例。

创建计划

适用于:Python SDK azure-ai-ml v2(当前版本)

from azure.ai.ml.entities import ComputeInstance, ComputeSchedules, ComputeStartStopSchedule, RecurrenceTrigger, RecurrencePattern
from azure.ai.ml.constants import TimeZone
from azure.ai.ml import MLClient
from azure.identity import DefaultAzureCredential

# authenticate
credential = DefaultAzureCredential()

# Get a handle to the workspace
ml_client = MLClient(
    credential=credential,
    subscription_id="<SUBSCRIPTION_ID>",
    resource_group_name="<RESOURCE_GROUP>",
    workspace_name="<AML_WORKSPACE_NAME>",
)

ci_minimal_name = "ci-name"
ci_start_time = "2023-06-21T11:47:00" #specify your start time in the format yyyy-mm-ddThh:mm:ss

rec_trigger = RecurrenceTrigger(start_time=ci_start_time, time_zone=TimeZone.INDIA_STANDARD_TIME, frequency="week", interval=1, schedule=RecurrencePattern(week_days=["Friday"], hours=15, minutes=[30]))
myschedule = ComputeStartStopSchedule(trigger=rec_trigger, action="start")
com_sch = ComputeSchedules(compute_start_stop=[myschedule])

my_compute = ComputeInstance(name=ci_minimal_name, schedules=com_sch)
ml_client.compute.begin_create_or_update(my_compute)

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

可以使用资源管理器模板来计划计算实例的自动启动和停止。

在资源管理器模板中,添加:

"schedules": "[parameters('schedules')]"

然后,使用 cron 或 LogicApps 表达式在参数文件中定义启动或停止实例的计划:

  "schedules": {
    "value": {
      "computeStartStop": [
        {
          "triggerType": "Cron",
          "cron": {
            "timeZone": "UTC",
            "expression": "0 18 * * *"
          },
          "action": "Stop",
          "status": "Enabled"
        },
        {
          "triggerType": "Cron",
          "cron": {
            "timeZone": "UTC",
            "expression": "0 8 * * *"
          },
          "action": "Start",
          "status": "Enabled"
        },
        {
          "triggerType": "Recurrence",
          "recurrence": {
            "frequency": "Day",
            "interval": 1,
            "timeZone": "UTC",
            "schedule": {
              "hours": [17],
              "minutes": [0]
            }
          },
          "action": "Stop",
          "status": "Enabled"
        }
      ]
    }
  }
  • “action”的值可以是 StartStop

  • 对于触发类型 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 支持将某个计划设为默认计划

使用 Azure Policy 为订阅中的每个计算实例强制执行已存在的关闭计划;如果不存在任何计划,则强制执行默认设置的某个计划。 下面是一个示例策略,可将一个在太平洋时间晚上 10:10 进行的关闭计划设为默认计划。

{
    "mode": "All",
    "policyRule": {
     "if": {
      "allOf": [
       {
        "field": "Microsoft.MachineLearningServices/workspaces/computes/computeType",
        "equals": "ComputeInstance"
       },
       {
        "field": "Microsoft.MachineLearningServices/workspaces/computes/schedules",
        "exists": "false"
       }
      ]
     },
     "then": {
      "effect": "append",
      "details": [
       {
        "field": "Microsoft.MachineLearningServices/workspaces/computes/schedules",
        "value": {
         "computeStartStop": [
          {
           "triggerType": "Cron",
           "cron": {
            "startTime": "2021-03-10T21:21:07",
            "timeZone": "Pacific Standard Time",
            "expression": "0 22 * * *"
           },
           "action": "Stop",
           "status": "Enabled"
          }
         ]
        }
       }
      ]
     }
    }
}

代表他人创建

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

分配托管标识

可以将系统或用户分配的托管标识分配给计算实例,以针对其他 Azure 资源(例如存储)进行身份验证。 使用托管标识进行身份验证有助于改进工作区安全性和管理。 例如,仅当登录到计算实例时,用户才能访问训练数据。 或者,使用常见的用户分配的托管标识允许访问特定存储帐户。

重要

如果计算实例还配置为空闲关闭,则除非托管标识对 Azure 机器学习工作区具有参与者访问权限,否则计算实例不会因不活动而关闭。 有关分配权限的详细信息,请参阅管理对 Azure 机器学习工作区的访问权限

使用 SDK V2 创建具有系统分配的托管标识的计算实例:

from azure.ai.ml import MLClient
from azure.identity import ManagedIdentityCredential
client_id = os.environ.get("DEFAULT_IDENTITY_CLIENT_ID", None)
credential = ManagedIdentityCredential(client_id=client_id)
ml_client = MLClient(credential, sub_id, rg_name, ws_name)
data = ml_client.data.get(name=data_name, version="1")

也可以使用 SDK V1:

from azureml.core.authentication import MsiAuthentication
from azureml.core import Workspace
client_id = os.environ.get("DEFAULT_IDENTITY_CLIENT_ID", None)
auth = MsiAuthentication(identity_config={"client_id": client_id})
workspace = Workspace.get("chrjia-chinanorth3", auth=auth, subscription_id="381b38e9-9840-4719-a5a0-61d9585e1e91", resource_group="chrjia-rg", location="China North 3")

创建托管标识后,至少向托管标识授予对数据存储的存储帐户的存储 Blob 数据读者角色,请参阅访问存储服务。 然后,在处理计算实例时,托管标识会自动用于对数据存储进行身份验证。

注意

在 Microsoft Entra ID 中,创建的系统托管标识的名称采用 /workspace-name/computes/compute-instance-name 格式。

还可以手动使用托管标识对其他 Azure 资源进行身份验证。 以下示例演示如何使用它来获取 Azure 资源管理器访问令牌:

import requests

def get_access_token_msi(resource):
    client_id = os.environ.get("DEFAULT_IDENTITY_CLIENT_ID", None)
    resp = requests.get(f"{os.environ['MSI_ENDPOINT']}?resource={resource}&clientid={client_id}&api-version=2017-09-01", headers={'Secret': os.environ["MSI_SECRET"]})
    resp.raise_for_status()
    return resp.json()["access_token"]

arm_access_token = get_access_token_msi("https://management.chinacloudapi.cn")

若要将 Azure CLI 与托管标识配合使用进行身份验证,请在登录时将标识客户端 ID 指定为用户名:

az cloud set -n AzureChinaCloud
az login --identity --username $DEFAULT_IDENTITY_CLIENT_ID

注意

尝试使用托管标识时无法使用 azcopyazcopy login --identity 将不起作用。

启用 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 密钥

尽管创建后无法启用或禁用 SSH,但可以选择稍后在启用了 SSH 的计算实例上设置 SSH 密钥。 这样就可以在创建后设置 SSH 密钥。 为此,请选择在计算实例上启用 SSH,然后选择“稍后设置 SSH 密钥”作为 SSH 公钥源。 创建计算实例后,可以访问计算实例的“详细信息”页,然后选择以编辑 SSH 密钥。 在那里,你能够添加 SSH 密钥。

此常见用例的一个示例是,代表其他用户创建计算实例时(请参阅代表创建),代表其他用户预配计算实例时,可以通过选择“稍后设置 SSH 密钥”为新的计算实例所有者启用 SSH。 这样的话,按照之前的步骤创建计算实例并将其分配给新所有者之后,新所有者便可以为其新拥有的计算实例设置 SSH 密钥。

使用 SSH 进行连接

创建启用了 SSH 访问的计算后,请使用以下步骤进行访问。

  1. 在工作区资源中查找计算:

    1. 在左侧选择“计算”。
    2. 使用顶部的选项卡选择“计算实例”或“计算群集”,以查找计算机 。
  2. 在资源列表中选择计算机名称。

  3. 查找连接字符串:

    • 对于“计算实例”,选择“详细信息”部分顶部的“连接” 。

      显示“详细信息”页顶部的“连接”工具的屏幕截图。

    • 对于“计算群集”,选择顶部的“节点”,然后在表中为节点选择“连接字符串” 。 显示计算群集中节点的连接字符串的屏幕截图。

  4. 复制该连接字符串。

  5. 对于 Windows,打开 PowerShell 或命令提示符:

    1. 转到存储密钥的目录或文件夹

    2. 将 -i 标志添加到连接字符串,以查找私钥并指向其存储位置:

      ssh -i <keyname.pem> azureuser@... (rest of connection string)

  6. 对于 Linux 用户,请按照为 Azure 中的 Linux VM 创建和使用 SSH 密钥对中的步骤进行操作

  7. 对于 SCP,请使用:

    scp -i key.pem -P {port} {fileToCopyFromLocal } azureuser@yourComputeInstancePublicIP:~/{destination}

  • REST API

你为其创建计算实例的数据科学家需要拥有针对以下项的 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
  • Posit Workbench(以前称为 RStudio Workbench)
  • 集成式笔记本

添加自定义应用程序,例如 RStudio 或 Posit Workbench

创建计算实例时可以安装其他应用程序,例如 RStudio 或 Posit Workbench(以前称为 RStudio Workbench)。 在工作室中按照这些步骤在计算实例上安装自定义应用程序

  1. 填写表单以创建新的计算实例
  2. 选择“应用程序
  3. 选择“添加应用程序

屏幕截图显示“自定义服务安装程序”。

设置 Posit Workbench(以前称为 RStudio Workbench)

RStudio 是 R 开发人员用来开发 ML 和数据科学项目的最流行 IDE 之一。 你可以轻松设置 Posit Workbench(可以通过它访问 RStudio 和其他开发工具)以使用你自己的 Posit 许可证在计算实例上运行,并访问 Posit Workbench 提供的丰富功能集

  1. 创建计算实例时,请按照上面列出的步骤添加应用程序。
  2. 在“应用程序”下拉列表中选择“Posit Workbench (自带许可证)”,然后在“许可证密钥”字段中输入你的 Posit Workbench 许可证密钥。 你可以从 posit 获取 Posit Workbench 许可证或试用许可证。
  3. 选择“创建”,将 Posit Workbench 应用程序添加到计算实例。

屏幕截图显示了 Posit Workbench 设置。

重要

如果使用专用链接工作区,请确保可以访问 docker 映像 pkg-containers.githubusercontent.com 和 ghcr.io。 此外,请使用 8704-8993 范围内的已发布端口。 对于 Posit Workbench,请通过提供对 https://www.wyday.com 的网络访问来确保许可证可供访问。

注意

  • 尚不支持从 Posit Workbench 访问工作区文件存储。
  • 访问多个 Posit Workbench 实例时,如果看到“400 错误请求。请求标头或 Cookie 过大”错误, 请使用新浏览器或以隐身模式从浏览器访问。

设置 RStudio(开源)

若要使用 RStudio,请如下所述设置一个自定义应用程序:

  1. 创建计算实例时,请按照之前的步骤添加应用程序。

  2. 在“应用程序”下拉列表中选择“自定义应用程序”。

  3. 配置要使用的应用程序名称。

  4. 将应用程序设置为在“目标端口 8787”上运行 - 下面列出的开源 RStudio Docker 映像需要在此目标端口上运行。

  5. 设置为在“已发布端口 8787”上访问应用程序 - 如果需要,可以配置为在其他已发布端口上访问应用程序。

  6. 将 Docker 映像指向 ghcr.io/azure/rocker-rstudio-ml-verse:latest

  7. 选择“创建”以将 RStudio 安装为计算实例上的自定义应用程序。

屏幕截图显示用于将 RStudio 设置为自定义应用程序的窗体

重要

如果使用专用链接工作区,请确保可以访问 docker 映像 pkg-containers.githubusercontent.com 和 ghcr.io。 此外,请使用 8704-8993 范围内的已发布端口。 对于 Posit Workbench,请通过提供对 https://www.wyday.com 的网络访问来确保许可证可供访问。

安装其他自定义应用程序

通过在 Docker 映像中提供应用程序,在计算实例上安装其他自定义应用程序。

  1. 创建计算实例时,请按照之前的步骤添加应用程序。
  2. 在“应用程序”下拉列表中选择“自定义应用程序”。
  3. 配置“应用程序名称”、要在其上运行应用程序的“目标端口”、要在其上访问应用程序的“已发布端口”,以及包含该应用程序的“Docker 映像”。 如果自定义映像存储在 Azure 容器注册表中,请为应用程序的用户分配“参与者”角色。 有关分配角色的信息,请参阅管理对 Azure 机器学习工作区的访问权限
  4. (可选)添加要用于应用程序的“环境变量”。
  5. 使用 Bind 装载添加对默认存储帐户中文件的访问权限:
    • 为“主机路径”指定 /home/azureuser/cloudfiles。
    • 为“容器路径”指定 /home/azureuser/cloudfiles。
    • 选择“添加”以添加此装载。 由于文件已装载,因此对这些文件所做的更改可用于其他计算实例和应用程序。
  6. 选择“创建”以在计算实例上安装该自定义应用程序。

屏幕截图显示自定义应用程序设置。

重要

如果使用专用链接工作区,请确保可以访问 docker 映像 pkg-containers.githubusercontent.com 和 ghcr.io。 此外,请使用 8704-8993 范围内的已发布端口。 对于 Posit Workbench,请通过提供对 https://www.wyday.com 的网络访问来确保许可证可供访问。

在工作室中访问自定义应用程序

在工作室中访问安装的自定义应用程序:

  1. 在左侧选择“计算”。
  2. 在“计算实例”选项卡上,查看“应用程序”列下的应用程序。

屏幕截图显示适用于自定义应用程序的工作室访问。

注意

设置自定义应用程序后可能需要几分钟才能通过链接访问它。 花费的时间取决于自定义应用程序所用映像的大小。 如果在尝试访问该应用程序时看到 502 错误消息,请等待一段时间以便应用程序设置完毕,然后再重试。 如果从 Azure 容器注册表拉取自定义映像,则你需要具有工作区的“参与者”角色。 有关分配角色的信息,请参阅管理对 Azure 机器学习工作区的访问权限

后续步骤