使用虚拟网络保护 Azure 机器学习训练环境 (SDKv1)

适用于:Python SDK azureml v1

本文介绍如何使用 Python SDK v1 在 Azure 机器学习中通过虚拟网络保护训练环境。

Azure 机器学习计算实例和计算群集可用于在虚拟网络中安全地训练模型。 规划环境时,可以使用或不使用公共 IP 地址配置计算实例/群集。 两者之间的一般区别如下:

  • 无公共 IP:可降低成本,因为它不具有相同的网络资源要求。 通过删除来自 Internet 的入站流量的要求来提高安全性。 但是,若要启用对所需资源(Microsoft Entra ID、Azure 资源管理器等)的出站访问,还需要进行其他配置更改。
  • 公共 IP:默认有效,但由于额外的 Azure 网络资源,成本更高。 需要通过公共 Internet 从 Azure 机器学习服务进行入站通信。

下表包含这些配置之间的差异:

配置 使用公共 IP 不使用公共 IP
入站流量 AzureMachineLearning 服务标记。
出站流量 默认情况下,可以不受限制地访问公共 Internet。
可以使用网络安全组或防火墙限制其访问的内容。
默认情况下,它无法访问 Internet。 如果它仍然可以将出站流量发送到 Internet,那是因为 Azure 默认出站访问,并且你有一个允许出站到 Internet 的 NSG。 我们不建议使用默认出站访问。
如果你需要出站访问 Internet,并且需要将出站流量路由到 Internet 上所需的资源,建议你改用虚拟网络 NAT 网关或防火墙。
Azure 网络资源 公共 IP 地址、负载均衡器、网络接口

还可以使用 Azure Databricks 或 HDInsight 在虚拟网络中训练模型。

提示

Azure 建议使用 Azure 机器学习托管虚拟网络,而不是执行本文中的步骤。 使用托管虚拟网络,Azure 机器学习可处理工作区和托管计算的网络隔离作业。 还可以为工作区所需的资源(例如 Azure 存储帐户)添加专用终结点。 有关详细信息,请参阅工作区托管网络隔离

注意

有关使用 Azure 机器学习工作室和 Python SDK v2 的信息,请参阅保护训练环境 (v2)

有关创建安全工作区的教程,请参阅教程:在 Azure 门户中创建安全工作区教程:使用模板创建安全工作区

本文介绍如何在虚拟网络中保护以下训练计算资源:

  • Azure 机器学习计算群集
  • Azure 机器学习计算实例
  • Azure Databricks
  • 虚拟机
  • HDInsight 群集

重要

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

先决条件

  • 阅读网络安全概述一文,了解常见的虚拟网络方案和总体虚拟网络体系结构。

  • 用于计算资源的现有虚拟网络和子网。 该 VNet 必须与 Azure 机器学习工作区位于同一订阅。

    • 建议将工作区和训练作业使用的存储帐户放在计划用于计算实例和群集的同一 Azure 区域中。 如果它们不在同一 Azure 区域中,可能会产生数据传输成本并增加网络延迟。
    • 确保 VNet 中的 *.instances.ml.azure.cn*.instances.ml.azure.cn 允许 WebSocket 通信。 WebSocket 由 Jupyter 在计算实例上使用。
  • 虚拟网络中的现有子网。 创建计算实例和群集时使用此子网。

    • 请确保该子网未委托给其他 Azure 服务。
    • 请确保该子网包含足够的可用 IP 地址。 每个计算实例只需要一个 IP 地址。 计算群集中的每个节点都需要一个 IP 地址。
  • 如果你有自己的 DNS 服务器,建议使用 DNS 转发来解析计算实例和群集的完全限定的域名 (FQDN)。 有关详细信息,请参阅将自定义 DNS 与 Azure 机器学习配合使用

  • 若要将资源部署到虚拟网络或子网中,你的用户帐户必须在 Azure 基于角色的访问控制 (Azure RBAC) 中具有以下操作的权限:

    • 虚拟网络资源上的“Microsoft.Network/*/read”。 对于 Azure 资源管理器 (ARM) 模板部署,不需要此权限。
    • “Microsoft.Network/virtualNetworks/join/action”(在虚拟网络资源上)。
    • "Microsoft.Network/virtualNetworks/subnets/join/action"(在子网资源上)。

    若要详细了解如何将 Azure RBAC 与网络配合使用,请参阅网络内置角色

限制

Azure 机器学习计算群集/实例

  • 可以在不包含你的工作区的其他区域和 VNet 中创建计算群集。 但是,此功能仅适用于 SDK v2、CLI v2 或工作室。 有关详细信息,请参阅安全训练环境的 v2 版本

  • Azure Lighthouse 不支持虚拟网络中的计算群集/实例部署。

  • 在训练期间,必须打开端口 445,以便在计算实例与默认存储帐户之间进行专用网络通信。 例如,如果计算在一个 VNet 中,存储帐户在另一个 VNet 中,请不要阻止存储帐户 VNet 的端口 445。

Azure Databricks

  • 该虚拟网络必须与 Azure 机器学习工作区位于同一订阅和区域。
  • 如果工作区的 Azure 存储帐户也在虚拟网络中受保护,则它们必须与 Azure Databricks 群集位于同一虚拟网络中。
  • 除了 Azure Databricks 使用的 databricks-privatedatabricks-public 子网以外,还需要为虚拟网络创建 default 子网。
  • Azure Databricks 不使用专用终结点来与虚拟网络通信。

有关在虚拟网络中使用 Azure Databricks 的详细信息,请参阅在 Azure 虚拟网络中部署 Azure Databricks

Azure HDInsight 或虚拟机

  • Azure 机器学习只支持运行 Ubuntu 的虚拟机。

没有公共 IP 的计算实例/群集

重要

如果你在未选择加入预览版的情况下一直在使用未配置公共 IP 的计算实例或计算群集,则需要在 2023 年 1 月 20 日(该功能正式发布时)之后删除并重新创建它们。

如果之前一直在使用没有公共 IP 的预览版,可能还需要修改允许入站和出站的流量,因为正式发布版的要求已更改:

  • 出站要求 - 另外两个出站,仅用于管理计算实例和群集。 这些服务标记的目标归 Microsoft 所有:
    • UDP 端口 5831 上的 AzureMachineLearning 服务标记。
    • TCP 端口 443 上的 BatchNodeManagement 服务标记。

以下配置是对先决条件部分所列配置的补充,并且特定于创建没有配置公共 IP 的计算实例/群集:

  • 必须使用计算资源的工作区专用终结点才能从 VNet 与 Azure 机器学习服务进行通信。 有关详细信息,请参阅为 Azure 机器学习工作区配置专用终结点

  • 在 VNet 中,允许流向以下服务标记或完全限定的域名 (FQDN) 的出站流量:

    服务标记 协议 端口 说明
    AzureMachineLearning TCP
    UDP
    443/8787/18881
    5831
    与 Azure 机器学习服务通信。
    BatchNodeManagement.<region> ANY 443 <region> 替换为包含 Azure 机器学习工作区的 Azure 区域。 与 Azure Batch 通信。 计算实例和计算群集是使用 Azure Batch 服务实现的。
    Storage.<region> TCP 443 <region> 替换为包含 Azure 机器学习工作区的 Azure 区域。 此服务标记用于与 Azure Batch 使用的 Azure 存储帐户通信。

    重要

    Storage.<region> 的出站访问可能会导致工作区的数据外泄。 通过使用服务终结点策略,你可以缓解此漏洞的问题。 有关详细信息,请参阅 Azure 机器学习数据外泄防护一文。

    FQDN 协议 端口 说明
    <region>.tundra.ml.azure.cn UDP 5831 <region> 替换为包含 Azure 机器学习工作区的 Azure 区域。
    microsoftgraph.chinacloudapi.cn TCP 443 与 Microsoft Graph API 通信。
    *.instances.ml.azure.cn TCP 443/8787/18881 与 Azure 机器学习进通信。
    *.<region>.batch.chinacloudapi.cn ANY 443 <region> 替换为包含 Azure 机器学习工作区的 Azure 区域。 与 Azure Batch 通信。
    *.<region>.service.batch.com ANY 443 <region> 替换为包含 Azure 机器学习工作区的 Azure 区域。 与 Azure Batch 通信。
    *.blob.core.chinacloudapi.cn TCP 443 与 Azure Blob 存储通信。
    *.queue.core.chinacloudapi.cn TCP 443 与 Azure 队列存储通信。
    *.table.core.chinacloudapi.cn TCP 443 与 Azure 表存储通信。
  • 创建防火墙和出站规则或 NAT 网关和网络服务组以允许出站流量。 由于计算没有公共 IP 地址,因此如果没有此配置,它将无法与公共 Internet 上的资源通信。 例如,它无法与 Microsoft Entra ID 或 Azure 资源管理器通信。 从公共源安装 Python 包也需要此配置。

    若要详细了解如何保护 Azure 机器学习所用的出站流量,请参阅以下文章:

使用以下信息创建没有公共 IP 地址的计算实例或群集:

若要创建没有公共 IP 的计算实例或计算群集,请使用 Azure 机器学习工作室 UI 创建资源:

  1. 登录到 Azure 机器学习工作室,然后选择你的订阅和工作区。

  2. 在左侧导航栏中选择“计算”页面。

  3. 在计算实例或计算群集的导航栏中选择“+ 新建”。

  4. 配置 VM 大小和你的需求,然后选择“下一步”。

  5. 在“高级设置”中,选择“启用虚拟网络”、你的虚拟网络和子网,最后选择“VNet/子网”部分下的“无公共 IP”选项。

    显示如何为计算实例和计算群集配置“无公共 IP”的屏幕截图。

提示

也可以使用 Azure 机器学习 SDK v2 或用于 ML 的 Azure CLI 扩展 v2。 有关创建没有公共 IP 的计算实例或群集的信息,请参阅保护 Azure 机器学习训练环境一文的 v2 版。

具有公共 IP 的计算实例/群集

以下配置是对先决条件部分所列配置的补充,并且特定于创建具有公共 IP 的计算实例/群集:

  • 如果将多个计算实例/群集置于一个虚拟网络中,可能需要请求为一个或多个资源增加配额。 机器学习计算实例或群集自动在包含虚拟网络的资源组中分配网络资源。 对于每个计算实例或群集,此服务分配以下资源:

    • 系统会自动创建网络安全组 (NSG)。 此 NSG 允许 AzureMachineLearning 服务标记中端口 44224 上的入站 TCP 流量。

      重要

      计算实例和计算群集会自动创建具有所需规则的 NSG。

      如果在子网级别具有其他 NSG,则子网级别的 NSG 中的规则不得与自动创建的 NSG 中的规则相冲突。

      若要了解 NSG 如何筛选网络流量,请参阅网络安全组如何筛选网络流量

    • 一个负载均衡器

    对于计算群集,每当群集纵向缩减到 0 个节点时,将删除这些资源,而当群集横向扩展时,将创建这些资源。

    对于计算实例,这些资源将一直保留,直到该实例被删除。 停止实例不会删除资源。

    重要

    这些资源受订阅的资源配额限制。 如果虚拟网络资源组被锁定,则删除计算群集/实例将失败。 在删除计算群集/实例之前,无法删除负载均衡器。 此外,请确保不存在禁止创建网络安全组的 Azure Policy 分配。

  • 在 VNet 中,允许 AzureMachineLearning 服务标记中端口 44224 上的入站 TCP 流量。

    重要

    创建计算实例/群集时,会动态为其分配一个 IP 地址。 由于该地址在创建之前是未知的,并且创建过程中需要入站访问,因此无法在防火墙上静态分配该地址。 相反,如果将防火墙与 VNet 配合使用,则必须创建用户定义的路由以允许此入站流量。

  • 在 VNet 中,允许流向以下服务标记的出站流量:

    服务标记 协议 端口 说明
    AzureMachineLearning TCP
    UDP
    443/8787/18881
    5831
    与 Azure 机器学习服务通信。
    BatchNodeManagement.<region> ANY 443 <region> 替换为包含 Azure 机器学习工作区的 Azure 区域。 与 Azure Batch 通信。 计算实例和计算群集是使用 Azure Batch 服务实现的。
    Storage.<region> TCP 443 <region> 替换为包含 Azure 机器学习工作区的 Azure 区域。 此服务标记用于与 Azure Batch 使用的 Azure 存储帐户通信。

    重要

    Storage.<region> 的出站访问可能会导致工作区的数据外泄。 通过使用服务终结点策略,你可以缓解此漏洞的问题。 有关详细信息,请参阅 Azure 机器学习数据外泄防护一文。

    FQDN 协议 端口 说明
    <region>.tundra.ml.azure.cn UDP 5831 <region> 替换为包含 Azure 机器学习工作区的 Azure 区域。
    microsoftgraph.chinacloudapi.cn TCP 443 与 Microsoft Graph API 通信。
    *.instances.ml.azure.cn TCP 443/8787/18881 与 Azure 机器学习进通信。
    *.<region>.batch.chinacloudapi.cn ANY 443 <region> 替换为包含 Azure 机器学习工作区的 Azure 区域。 与 Azure Batch 通信。
    *.<region>.service.batch.com ANY 443 <region> 替换为包含 Azure 机器学习工作区的 Azure 区域。 与 Azure Batch 通信。
    *.blob.core.chinacloudapi.cn TCP 443 与 Azure Blob 存储通信。
    *.queue.core.chinacloudapi.cn TCP 443 与 Azure 队列存储通信。
    *.table.core.chinacloudapi.cn TCP 443 与 Azure 表存储通信。

适用于:Python SDK azureml v1

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='vnet_resourcegroup_name',
        vnet_name='vnet_name',
        subnet_name='subnet_name',
        # admin_user_ssh_public_key='<my-sshkey>'
    )
    instance = ComputeInstance.create(ws, compute_name, compute_config)
    instance.wait_for_completion(show_output=True)

创建过程完成后,请训练模型。 有关详细信息,请参阅选择并使用用于训练的计算目标

Azure Databricks

  • 该虚拟网络必须与 Azure 机器学习工作区位于同一订阅和区域。
  • 如果工作区的 Azure 存储帐户也在虚拟网络中受保护,则它们必须与 Azure Databricks 群集位于同一虚拟网络中。
  • 除了 Azure Databricks 使用的 databricks-privatedatabricks-public 子网以外,还需要为虚拟网络创建 default 子网。
  • Azure Databricks 不使用专用终结点来与虚拟网络通信。

若要详细了解如何结合使用 Azure Databricks 和虚拟网络,请参阅在 Azure 虚拟网络中部署 Azure Databricks

训练模型所需的公共 Internet 访问权限

重要

虽然本文的前面部分介绍了创建计算资源所需的配置,但需要此部分的配置信息才能使用这些资源训练模型。

Azure 机器学习需要对公共 Internet 进行入站和出站访问。 下表概述了需要的访问权限及其用途。 对于以 .region 结尾的服务标记,请将 region 替换为包含你的工作区的 Azure 区域。 例如,Storage.chinanorth

提示

“必需”选项卡列出了必需的入站和出站配置。 “视情况”选项卡列出了你可能希望启用的特定配置所需的可选入站和出站配置。

方向 协议和
ports
服务标记 目的
出站 TCP:80、443 AzureActiveDirectory 使用 Microsoft Entra ID 进行身份验证。
出站 TCP:443、18881
UDP:5831
AzureMachineLearning 使用 Azure 机器学习服务。
笔记本中的 Python Intellisense 使用端口 18881。
创建、更新和删除 Azure 机器学习计算实例时使用端口 5831。
出站 任何:443 BatchNodeManagement.region 与 Azure 机器学习计算实例/群集的 Azure Batch 后端通信。
出站 TCP:443 AzureResourceManager 使用 Azure 机器学习、Azure CLI 和 Azure 机器学习 SDK 创建 Azure 资源。
出站 TCP:443 Storage.region 访问存储在 Azure 存储帐户中、用于计算群集和计算实例的数据。 有关防止数据通过此出站外泄的信息,请参阅数据外泄保护
出站 TCP:443 AzureFrontDoor.FrontEnd
* 在由世纪互联运营的 Azure 中不需要。
Azure 机器学习工作室的全球入口点。 为 AutoML 存储图像和环境。 有关防止数据通过此出站外泄的信息,请参阅数据外泄保护
出站 TCP:443 注意:此标记依赖于 AzureFrontDoor.FirstParty 标记 访问由 Microsoft 提供的 docker 映像。 为 Azure Kubernetes 服务设置 Azure 机器学习路由器。

提示

如果需要 IP 地址而不是服务标记,请使用下列选项之一:

IP 地址可能会定期改变。

可能还需要允许出站流量发往 Visual Studio Code 和非 Microsoft 站点,以便安装机器学习项目所需的包。 下表列出了用于机器学习的常用存储库:

主机名 目的
anaconda.com
*.anaconda.com
用于安装默认包。
*.anaconda.org 用于获取存储库数据。
pypi.org 用于列出默认索引的依赖项(如果有),索引不会被用户设置覆盖。 如果索引被覆盖,则还必须允许 *.pythonhosted.org
cloud.r-project.org 在安装用于 R 开发的 CRAN 包时使用。
*.pytorch.org 由基于 PyTorch 的一些示例使用。
*.tensorflow.org 由基于 Tensorflow 的一些示例使用。
code.visualstudio.com 下载和安装 Visual Studio Code 桌面时需要。 Visual Studio Code Web 不需要。
update.code.visualstudio.com
*.vo.msecnd.net
用于检索通过安装脚本安装在计算实例上的 Visual Studio Code 服务器位。
marketplace.visualstudio.com
vscode.blob.core.chinacloudapi.cn
*.gallerycdn.vsassets.io
下载和安装 Visual Studio Code 扩展时需要。 这些主机会启用与适用于 Visual Studio Code 的 Azure ML 扩展提供的计算实例的远程连接。 有关详细信息,请参阅在 Visual Studio Code 中连接到 Azure 机器学习计算实例
raw.githubusercontent.com/microsoft/vscode-tools-for-ai/master/azureml_remote_websocket_server/* 用于检索安装在计算实例上的 websocket 服务器位。 websocket 服务器用于将来自 Visual Studio Code 客户端(桌面应用程序)的请求传输到计算实例上运行的 Visual Studio Code 服务器。

注意

使用 Azure 机器学习 VS Code 扩展时,远程计算实例需要访问公共存储库才能安装该扩展所需的包。 如果计算实例需要代理来访问这些公共存储库或 Internet,则需要在计算实例的 ~/.bashrc 文件中设置和导出 HTTP_PROXYHTTPS_PROXY 环境变量。 可以使用自定义脚本在预配时自动执行此过程。

将 Azure Kubernetes Service (AKS) 与 Azure 机器学习一起使用时,请允许将以下流量发送到 AKS VNet:

有关使用防火墙解决方案的信息,请参阅在 Azure 机器学习中使用防火墙

后续步骤

本文是介绍如何保护 Azure 机器学习工作流系列文章的一部分。 请参阅本系列中的其他文章: