你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

使用 Azure 网络安全保护 MLOps 解决方案

Azure DevOps
Azure DNS
Azure 机器学习
Azure 专用链接
Azure 虚拟网络

机器学习 DevOps (MLOps) 于 2015 年在 Hidden Technical Debt in Machine Learning Systems(机器学习系统的隐藏技术债务)中首次被强调,它目前快速发展。 到 2025 年,MLOps 的市场预计将达到 40 亿美元。 与此同时,努力保护 MLOps 解决方案变得越发重要。

本文介绍如何使用 Azure 网络安全功能(例如 Azure 虚拟网络、网络对等互连、Azure 专用链接和 Azure DNS)来帮助保护 MLOps 解决方案。 它还介绍了如何使用:

  • Azure Pipelines 来访问虚拟网络中的资源
  • 虚拟网络中 Azure 容器注册表和 Azure 机器学习计算实例的必需配置。

最后,本文描述了使用网络安全服务的成本。

体系结构

MLOps 过程中从准备数据到监视模型的各个阶段示意图。

下载此体系结构的 Visio 文件

数据流

体系结构图显示了一个示例 MLOps 解决方案。

  • 名为 AML VNET 的虚拟网络帮助保护 Azure 机器学习工作区及其关联资源。

  • 跳板机、Azure Bastion 和自托管代理属于另一个名为 BASTION VNET 的虚拟网络。 这种安排模拟了另一个需要访问 Azure 机器学习虚拟网络中资源的解决方案。

  • 借助虚拟网络对等互连和专用 DNS 区域的支持,Azure Pipelines 可以在自托管代理上执行,并触发在 Azure 机器学习工作区中发布的 Azure 机器学习管道来训练、评估和注册机器学习模型。

  • 最后,将该模型部署到 Azure 机器学习计算或 Azure Kubernetes 服务群集支持的联机终结点或批处理终结点。

组件

示例 MLOps 解决方案由以下组件构成:

此示例方案还使用以下服务来帮助保护 MLOps 解决方案:

方案详细信息

MLOps 是机器学习、DevOps 和数据工程相交的一组实践,旨在可靠高效地在生产中部署和维护机器学习模型。

下图显示了简化的 MLOps 进程模型。 此模型提供一个解决方案,可自动执行数据准备、模型训练、模型评估、模型注册、模型部署和监视。

MLOps 过程中从准备数据到监视模型的各个阶段示意图。

实现 MLOps 解决方案时,可能需要帮助保护以下资源:

  • DevOps 管道
  • 机器学习训练数据
  • 机器学习管道
  • 机器学习模型

请考虑使用以下方法来帮助保护资源:

  • 身份验证和授权

  • 网络安全

    • 使用虚拟网络部分或完全隔离环境与公共 Internet,以减少攻击面和数据外泄的可能性。
      • 在 Azure 机器学习工作区中,如果仍在使用 Azure 机器学习 CLI v1 和 Azure 机器学习 Python SDK v1(例如 v1 API),请为工作区添加一个专用终结点,以便为工作区或计算资源上除创建、读取、更新和删除 (CRUD) 操作之外的所有操作提供网络隔离。
      • 为了利用 Azure 机器学习工作区的新功能,请使用 Azure 机器学习 CLI v2 和 Azure 机器学习 Python SDK v2(例如 v2 API),其中对工作区启用专用终结点不会提供相同级别的网络隔离。 不过,虚拟网络仍将帮助保护训练数据和机器学习模型。 建议在企业解决方案中采用 v2 API 之前对其进行评估。 有关详细信息,请参阅 Azure 资源管理器上的新 API 平台是什么
  • 数据加密

  • 策略和监视

    • 使用 Azure Policy 和 Microsoft Defender for Cloud 来强制执行策略。
    • 使用 Azure Monitor 将各种源中的数据(例如指标和日志)收集并聚合到一个通用数据平台以进行分析、实现可视化和发出警报。

Azure 机器学习工作区是 Azure 机器学习的顶级资源,也是 MLOps 解决方案的核心组件。 工作区提供了一个集中的位置,用于处理使用 Azure 机器学习时创建的所有项目。

创建新工作区时,它会自动创建工作区使用的以下 Azure 资源:

  • Azure Application Insights
  • Azure 容器注册表
  • Azure Key Vault
  • Azure 存储帐户

可能的用例

此解决方案适用于客户使用 MLOps 解决方案在更安全的环境中部署和维护机器学习模型的场景。 客户可以来自制造业、电信、零售、医疗保健等各种行业。 例如:

  • 电信运营商帮助保护其零售店视频监视系统中客户的图片、数据和机器学习模型。

  • 引擎制造商需要一个更安全的解决方案来帮助保护其工厂和产品的数据和机器学习模型,以便其系统使用计算机视觉来检测部件中的缺陷。

这些场景和其他场景的 MLOps 解决方案可能会使用 Azure 机器学习工作区、Azure Blob 存储、Azure Kubernetes 服务、容器注册表和其他 Azure 服务。

对于在 Azure 上部署 MLOps 环境并使用 Azure 安全功能帮助保护相关资源的任何类似场景,你可使用此示例的全部或部分内容。 此解决方案的原始客户来自电信行业。

注意事项

这些注意事项实现 Azure 架构良好的框架的支柱原则,即一套在应用时可改进工作负载质量的指导原则。 有关详细信息,请参阅 Microsoft Azure 架构良好的框架

安全性

安全性针对蓄意攻击及滥用宝贵数据和系统提供更多保障措施。 有关详细信息,请参阅安全性支柱概述

从体系结构设计之初就考虑如何帮助保护 MLOps 解决方案。 开发环境可能不需要重要的安全性,但在过渡环境和生产环境中非常重要。

成本优化

成本优化是关于寻找减少不必要的费用和提高运营效率的方法。 有关详细信息,请参阅成本优化支柱概述

配置虚拟网络无需成本,但你的场景可能需要的其他服务(例如专用链接、DNS 区域和虚拟网络对等互连)会产生费用。 下表描述了这些服务和其他可能需要的服务的费用。

Azure 服务 定价
虚拟网络 免费。
专用链接 只需为专用终结点资源小时数和通过专用终结点处理的数据付费。
Azure DNS,专用区域 计费基于在 Azure 中托管的 DNS 区域数和接收的 DNS 查询数。
虚拟网络对等互连 入站和出站流量在对等互连网络的两端收费。
VPN 网关 费用基于预配和提供网关的时间量。
ExpressRoute ExpressRoute 和 ExpressRoute 网关产生费用。
Azure Bastion 计费包括基于 SKU、缩放单元和数据传输速率的小时定价组合。

卓越运营

卓越运营涵盖了部署应用程序并使其在生产环境中保持运行的运营流程。 有关详细信息,请参阅卓越运营支柱概述

为了简化持续集成和持续交付 (CI/CD),最佳做法是使用基础设施即代码 (IaC) 的工具和服务,例如 Terraform 或 Azure 资源管理器模板、Azure DevOps 和 Azure Pipelines。

部署此方案

以下部分介绍如何在此示例场景中部署、访问和帮助保护资源。

虚拟网络

帮助保护 MLOps 环境的第一步是帮助保护 Azure 机器学习工作区及其关联资源。 一种有效的保护方法是使用虚拟网络。 虚拟网络是 Azure 中专用网络的基本构建块。 借助虚拟网络,多种类型的 Azure 资源可以更安全地彼此通信、与 Internet 和本地网络通信。

将 Azure 机器学习工作区及其关联资源放入虚拟网络有助于确保组件可相互通信,而无需将其向公共 Internet 公开。 这样做减少了攻击面,有助于防止数据外泄。

以下 Terraform 代码片段演示如何为 Azure 机器学习创建计算群集,将其附加到工作区,并将其放入虚拟网络的子网中。

resource "azurerm_machine_learning_compute_cluster" "compute_cluster" {
  name                          = "my_compute_cluster"
  location                      = "eastasia"
  vm_priority                   = "LowPriority"
  vm_size                       = "Standard_NC6s_v3"
  machine_learning_workspace_id = azurerm_machine_learning_workspace.my_workspace.id
  subnet_resource_id            = azurerm_subnet.compute_subnet.id
  ssh_public_access_enabled     = false
  scale_settings {
    min_node_count                       = 0
    max_node_count                       = 3
    scale_down_nodes_after_idle_duration = "PT30S"
  }
  identity {
    type = "SystemAssigned"
  }
}

专用链接支持通过虚拟网络中的专用终结点访问 Azure 平台即服务 (PaaS) 选项(例如 Azure 机器学习工作区和 Azure 存储),以及 Azure 托管的客户拥有和合作伙伴拥有的服务。 专用终结点是一个网络接口,它仅连接到特定资源,因而有助于防止数据外泄。

在此示例场景中,有 4 个专用终结点与 Azure 机器学习虚拟网络中的子网管理的 Azure PaaS 选项相关联,如体系结构图中所示。 因此,只有同一虚拟网络(Azure 机器学习虚拟网络)内的资源才能访问这些服务。 这些服务包括:

  • Azure 机器学习工作区
  • Azure Blob 存储
  • Azure 容器注册表
  • Azure Key Vault

以下 Terraform 代码片段演示如何使用专用终结点链接到 Azure 机器学习工作区,该工作区因此更加受到虚拟网络的保护。 此代码片段还演示了如何使用专用 DNS 区域,详见 Azure 专用 DNS 区域

resource "azurerm_machine_learning_workspace" "aml_ws" {
  name                    = "my_aml_workspace"
  friendly_name           = "my_aml_workspace"
  location                = "eastasia"
  resource_group_name     = "my_resource_group"
  application_insights_id = azurerm_application_insights.my_ai.id
  key_vault_id            = azurerm_key_vault.my_kv.id
  storage_account_id      = azurerm_storage_account.my_sa.id
  container_registry_id   = azurerm_container_registry.my_acr_aml.id

  identity {
    type = "SystemAssigned"
  }
}

# Configure private DNS zones

resource "azurerm_private_dns_zone" "ws_zone_api" {
  name                = "privatelink.api.azureml.ms"
  resource_group_name = var.RESOURCE_GROUP
}

resource "azurerm_private_dns_zone" "ws_zone_notebooks" {
  name                = "privatelink.notebooks.azure.net"
  resource_group_name = var.RESOURCE_GROUP
}

# Link DNS zones to the virtual network

resource "azurerm_private_dns_zone_virtual_network_link" "ws_zone_api_link" {
  name                  = "ws_zone_link_api"
  resource_group_name   = "my_resource_group"
  private_dns_zone_name = azurerm_private_dns_zone.ws_zone_api.name
  virtual_network_id    = azurerm_virtual_network.aml_vnet.id
}

resource "azurerm_private_dns_zone_virtual_network_link" "ws_zone_notebooks_link" {
  name                  = "ws_zone_link_notebooks"
  resource_group_name   = "my_resource_group"
  private_dns_zone_name = azurerm_private_dns_zone.ws_zone_notebooks.name
  virtual_network_id    = azurerm_virtual_network.aml_vnet.id
}

# Configure private endpoints

resource "azurerm_private_endpoint" "ws_pe" {
  name                = "my_aml_ws_pe"
  location            = "eastasia"
  resource_group_name = "my_resource_group"
  subnet_id           = azurerm_subnet.my_subnet.id

  private_service_connection {
    name                           = "my_aml_ws_psc"
    private_connection_resource_id = azurerm_machine_learning_workspace.aml_ws.id
    subresource_names              = ["amlworkspace"]
    is_manual_connection           = false
  }

  private_dns_zone_group {
    name                 = "private-dns-zone-group-ws"
    private_dns_zone_ids = [azurerm_private_dns_zone.ws_zone_api.id, azurerm_private_dns_zone.ws_zone_notebooks.id]
  }

  # Add the private link after configuring the workspace
  depends_on = [azurerm_machine_learning_compute_instance.compute_instance, azurerm_machine_learning_compute_cluster.compute_cluster]
}

上述 azurerm_machine_learning_workspace 代码默认使用 v2 API 平台。 如果你仍然希望使用 v1 API 或公司策略禁止通过公用网络发送通信,你可启用 v1_legacy_mode_enabled 参数,如以下代码片段所示。 启用后,该参数会禁用工作区的 v2 API。

resource "azurerm_machine_learning_workspace" "aml_ws" {
  ...
  public_network_access_enabled = false
  v1_legacy_mode_enabled  = true
}

Azure 专用 DNS 区域

Azure DNS 提供了可靠、更安全的 DNS 服务来管理和解析虚拟网络中的域名,无需添加自定义 DNS 解决方案。 借助专用 DNS 区域,可以使用自定义域名而不使用由 Azure 提供的名称。 针对专用 DNS 区域的 DNS 解析只能在链接到它的虚拟网络中进行。

此示例解决方案将专用终结点用于 Azure 机器学习工作区及其关联资源,例如 Azure 存储、Azure Key Vault 或容器注册表。 因此必须配置 DNS 设置,以便从连接字符串的完全限定的域名 (FQDN) 解析专用终结点的 IP 地址。

可以将专用 DNS 区域链接到虚拟网络以解析特定域。

专用链接和 Azure 专用终结点中的 Terraform 代码片段使用 Azure 服务 DNS 区域配置中建议的区域名称创建两个专用 DNS 区域:

  • privatelink.api.azureml.ms
  • privatelink.notebooks.azure.net

虚拟网络对等互连

虚拟网络对等互连使 Azure Bastion 虚拟网络中的跳转托管虚拟机 (VM) 或自托管代理虚拟机能够访问 Azure 机器学习虚拟网络中的资源。 出于连接目的,这两个虚拟网络合二为一。 对等互连虚拟网络中的 VM 与 Azure 机器学习资源之间的流量使用 Azure 主干基础结构。 虚拟网络之间的流量通过 Azure 的专用网络进行路由。

以下 Terraform 代码片段设置了 Azure 机器学习虚拟网络和 Azure Bastion 虚拟网络之间的虚拟网络对等互连。

# Virtual network peering for AML VNET and BASTION VNET
resource "azurerm_virtual_network_peering" "vp_amlvnet_basvnet" {
  name                      = "vp_amlvnet_basvnet"
  resource_group_name       = "my_resource_group"
  virtual_network_name      = azurerm_virtual_network.amlvnet.name
  remote_virtual_network_id = azurerm_virtual_network.basvnet.id
  allow_virtual_network_access = true
  allow_forwarded_traffic      = true
}

resource "azurerm_virtual_network_peering" "vp_basvnet_amlvnet" {
  name                      = "vp_basvnet_amlvnet"
  resource_group_name       = "my_resource_group"
  virtual_network_name      = azurerm_virtual_network.basvnet.name
  remote_virtual_network_id = azurerm_virtual_network.amlvnet.id
  allow_virtual_network_access = true
  allow_forwarded_traffic      = true
}

访问虚拟网络中的资源

要访问虚拟网络(如此方案中的 Azure 机器学习虚拟网络)中的 Azure 机器学习工作区,请使用以下方法之一:

  • Azure VPN 网关
  • Azure ExpressRoute
  • Azure Bastion 和跳板机 VM

有关详细信息,请参阅连接到工作区

运行访问虚拟网络中的资源的 Azure Pipelines

Azure Pipelines 自动生成和测试代码项目,使其可供他人使用。 Azure Pipelines 合并 CI/CD 来测试和生成代码并将其发送到任何目标。

Azure 托管代理与自托管代理

此示例方案中的 MLOps 解决方案包含两个管道,这些管道可以触发 Azure 机器学习管道并访问关联的资源。 由于 Azure 机器学习工作区及其关联资源位于虚拟网络中,此场景必须为 Azure Pipelines 代理提供访问它们的方法。 代理是计算基础结构,带有已安装的代理软件,该软件每次运行一个 Azure Pipelines 作业。 可通过多种方式实现访问:

  • 在同一虚拟网络或对等互连虚拟网络中使用自托管代理,如体系结构图中所示。

  • 使用 Azure 托管代理并将其 IP 地址范围添加到目标 Azure 服务的防火墙设置中的允许列表。

  • 使用 Azure 托管代理(作为 VPN 客户端)和 VPN 网关。

其中每个选择都各有利弊。 下表将 Azure 托管代理与自托管代理进行比较。

Azure 托管代理 自托管代理
成本 免费开始使用一项每月 1,800 分钟的并行作业,每个 Azure 托管的 CI/CD 并行作业收费。 每月先从一个不限分钟数的并行作业免费开始,每个额外的不限分钟的自托管 CI/CD 并行作业产生费用。 此选项提供成本较低的并行作业。
维护 由 Microsoft 负责。 由你进行维护,更大程度掌控来安装你喜欢的软件。
生成时 更耗时,因为每次开始生成时都会完全刷新,始终从头开始生成。 节省时间,因为保留了所有文件和缓存。

注意

有关当前定价,请参阅 Azure DevOps 定价

根据表中的比较结果以及对安全性和复杂性的考虑,此示例场景使用 Azure Pipelines 的自托管代理来触发虚拟网络中的 Azure 机器学习管道。

可使用以下选项来配置自托管代理:

  • 在 Azure 虚拟机上安装代理。

  • 在 Azure 虚拟机规模集上安装代理,可自动缩放该规模集来满足需求。

  • 在 Docker 容器上安装代理。 此方法不可行,因为此场景可能需要在代理中运行 Docker 容器来训练机器学习模型。

以下示例代码通过创建 Azure VM 和扩展来预配两个自托管代理:

resource "azurerm_linux_virtual_machine" "agent" {
  ...
}

resource "azurerm_virtual_machine_extension" "update-vm" {
  count                = 2
  name                 = "update-vm${format("%02d", count.index)}"
  publisher            = "Microsoft.Azure.Extensions"
  type                 = "CustomScript"
  type_handler_version = "2.1"
  virtual_machine_id   = element(azurerm_linux_virtual_machine.agent.*.id, count.index)

  settings = <<SETTINGS
    {
        "script": "${base64encode(templatefile("../scripts/terraform/agent_init.sh", {
          AGENT_USERNAME      = "${var.AGENT_USERNAME}",
          ADO_PAT             = "${var.ADO_PAT}",
          ADO_ORG_SERVICE_URL = "${var.ADO_ORG_SERVICE_URL}",
          AGENT_POOL          = "${var.AGENT_POOL}"
        }))}"
    }
SETTINGS
}

如前面的代码块所示,Terraform 脚本调用 agent_init.sh,如以下代码块所示,根据客户的要求在代理 VM 上安装代理软件和所需的库。

#!/bin/sh
# Install other required libraries 
...

# Creates directory and downloads Azure DevOps agent installation files
sudo mkdir /myagent 
cd /myagent
sudo wget https://vstsagentpackage.azureedge.net/agent/2.194.0/vsts-agent-linux-x64-2.194.0.tar.gz
sudo tar zxvf ./vsts-agent-linux-x64-2.194.0.tar.gz
sudo chmod -R 777 /myagent

# Unattended installation
sudo runuser -l ${AGENT_USERNAME} -c '/myagent/config.sh --unattended  --url ${ADO_ORG_SERVICE_URL} --auth pat --token ${ADO_PAT} --pool ${AGENT_POOL}'

cd /myagent
#Configure as a service
sudo ./svc.sh install ${AGENT_USERNAME}
#Start service
sudo ./svc.sh start

在虚拟网络中使用容器注册表

在虚拟网络中保护 Azure 机器学习工作区需要满足一些先决条件。 有关详细信息,请参阅先决条件。 使用 Azure 机器学习工作区训练和部署模型时,容器注册表是必需的服务。

在此示例方案中,为了确保自托管代理可以访问虚拟网络中的容器注册表,我们使用虚拟网络对等互连并添加虚拟网络链接以将专用 DNS 区域 privatelink.azurecr.io 链接到 Azure Bastion 虚拟网络。 以下 Terraform 代码片段显示了实现。

# Azure Machine Learning Container Registry is for private access 
# by the Azure Machine Learning workspace
resource "azurerm_container_registry" "acr" {
  name                     = "my_acr"
  resource_group_name      = "my_resource_group"
  location                 = "eastasia"
  sku                      = "Premium"
  admin_enabled            = true
  public_network_access_enabled = false
}

resource "azurerm_private_dns_zone" "acr_zone" {
  name                     = "privatelink.azurecr.io"
  resource_group_name      = "my_resource_group"
}

resource "azurerm_private_dns_zone_virtual_network_link" "acr_zone_link" {
  name                  = "link_acr"
  resource_group_name   = "my_resource_group"
  private_dns_zone_name = azurerm_private_dns_zone.acr_zone.name
  virtual_network_id    = azurerm_virtual_network.amlvnet.id
}

resource "azurerm_private_endpoint" "acr_ep" {
  name                = "acr_pe"
  resource_group_name = "my_resource_group"
  location            = "eastasia"
  subnet_id           = azurerm_subnet.aml_subnet.id

  private_service_connection {
    name                           = "acr_psc"
    private_connection_resource_id = azurerm_container_registry.acr.id
    subresource_names              = ["registry"]
    is_manual_connection           = false
  }

  private_dns_zone_group {
    name                 = "private-dns-zone-group-app-acr"
    private_dns_zone_ids = [azurerm_private_dns_zone.acr_zone.id]
  }
}

此示例方案还确保容器注册表具有 Azure 机器学习工作区系统分配的托管标识的参与者角色。

在虚拟网络中使用计算群集或实例

虚拟网络中的 Azure 机器学习计算群集或实例需要一个网络安全组 (NSG),并为其子网提供一些特定规则。 有关这些规则的列表,请参阅限制

另请注意,对于计算群集或实例,现在可移除公共 IP 地址,这有助于为 MLOps 解决方案中的计算资源提供更好的保护。 有关详细信息,请参阅没有用于计算实例的公共 IP

作者

本文由 Microsoft 维护, 它最初是由以下贡献者撰写的。

主要作者:

其他参与者:

若要查看非公开领英个人资料,请登录领英。

后续步骤