category
机器学习DevOps(MLOps)在2015年的《机器学习系统中的隐藏技术债务》中首次被强调,目前正在快速增长。MLOps的市场预计到2025年将达到40亿美元。与此同时,确保MLOps解决方案的安全变得越来越重要。
本文描述了如何通过使用Azure网络安全功能(如Azure虚拟网络、网络对等、Azure私有链接和Azure DNS)来帮助保护MLOps解决方案。它还介绍了如何使用:
- 访问虚拟网络中资源的Azure管道
- 虚拟网络中Azure容器注册表和Azure机器学习计算实例和集群的必需配置。
最后,本文描述了使用网络安全服务的成本。
架构
MLOps过程中各个阶段的示意图,从准备数据到监控模型。
下载此体系结构的Visio文件。
数据流
体系结构图显示了一个示例MLOps解决方案。
- 名为AML VNET的虚拟网络有助于保护Azure机器学习工作区及其相关资源。
- 跳转主机Azure Bastion和自托管代理属于另一个名为Bastion VNET的虚拟网络。这种安排模拟了拥有另一个需要访问Azure机器学习虚拟网络内资源的解决方案。
- 在虚拟网络对等和专用DNS区域的支持下,Azure管道可以在自主机代理上执行,并触发在Azure机器学习工作区中发布的Azure机器学习管道,以训练、评估和注册机器学习模型。
- 最后,将该模型部署到Azure机器学习计算或Azure Kubernetes服务集群支持的在线端点或批处理端点。
组件
示例MLOps解决方案由以下组件组成:
- 数据存储:用于数据存储的Azure Blob存储。
- 模型培训、验证和注册:Azure机器学习工作区
- 模型部署:Azure机器学习端点和Azure Kubernetes服务
- 模型监视器:Azure monitor for Application Insights
- MLOps管道:Azure DevOps和Azure管道
此示例场景还使用以下服务来帮助保护MLOps解决方案:
- Azure密钥保管库
- Azure策略
- 虚拟网络
场景详细信息
MLOps是机器学习、DevOps和数据工程交叉的一组实践,旨在可靠高效地在生产中部署和维护机器学习模型。
下图显示了一个简化的MLOps流程模型。此模型提供了一个自动化数据准备、模型培训、模型评估、模型注册、模型部署和监控的解决方案。
MLOps过程中各个阶段的示意图,从准备数据到监控模型。
当您实施MLOps解决方案时,您可能希望帮助保护这些资源:
- DevOps管道
- 机器学习训练数据
- 机器学习管道
- 机器学习模型
为了确保资源安全,请考虑以下方法:
- 身份验证和授权
- 使用服务主体或托管标识,而不是交互式身份验证。
- 使用基于角色的访问控制来定义用户访问资源的范围。
- 网络安全
- 使用虚拟网络将环境与公共互联网部分或完全隔离,以减少攻击面和数据泄露的可能性。
- 在Azure机器学习工作区中,如果您仍在使用Azure机器学习CLI v1和Azure机器学习Python SDK v1(如v1 API),请将专用端点添加到工作区,以便为工作区或计算资源上的创建、读取、更新和删除(CRUD)操作之外的所有操作提供网络隔离。
- 要利用Azure机器学习工作区的新功能,请使用Azure机器学习CLI v2和Azure机器学习Python SDK v2(如v2 API),其中在工作区上启用专用端点不会提供相同级别的网络隔离。然而,虚拟网络仍将有助于保护训练数据和机器学习模型。我们建议您在企业解决方案中采用v2 API之前对其进行评估。有关更多信息,请参阅Azure Resource Manager上的新API平台是什么。
- 使用虚拟网络将环境与公共互联网部分或完全隔离,以减少攻击面和数据泄露的可能性。
- 数据加密
- 使用平台管理或客户管理的访问密钥,对传输中和休息中的培训数据进行加密。
- 政策和监控
- 使用Azure Policy和Microsoft Defender for Cloud来强制执行策略。
- 使用Azure Monitor将来自各种来源的数据(如指标和日志)收集并聚合到一个通用数据平台中,用于分析、可视化和警报。
Azure机器学习工作区是Azure机器学习的顶级资源,也是MLOps解决方案的核心组件。工作区提供了一个集中的地方来处理您在使用Azure机器学习时创建的所有工件。
创建新工作区时,它会自动创建工作区使用的以下Azure资源:
- Azure应用程序见解
- Azure容器注册表
- Azure密钥保管库
- Azure存储帐户
潜在用例
该解决方案适用于客户使用MLOps解决方案在更安全的环境中部署和维护机器学习模型的场景。客户可以来自各个行业,如制造业、电信、零售、医疗保健等。例如:
- 电信运营商在其零售店视频监控系统中帮助保护客户的图片、数据和机器学习模型。
- 发动机制造商需要一个更安全的解决方案来帮助保护其工厂和产品的数据和机器学习模型,用于其使用计算机视觉检测零件缺陷的系统。
- 这些场景和其他场景的MLOps解决方案可能使用Azure机器学习工作区、Azure Blob存储、Azure Kubernetes服务、容器注册表和其他Azure服务。
- 您可以将此示例的全部或部分用于任何类似的场景,该场景具有部署在Azure上的MLOps环境,并使用Azure安全功能来帮助保护相关资源。此解决方案的原始客户是电信行业。
注意事项
这些注意事项实现了Azure架构良好的框架的支柱,这是一套指导原则,可在应用时提高工作负载的质量。有关详细信息,请参阅Microsoft Azure架构良好的框架。
安全
- 安全性为防止蓄意攻击和滥用您的宝贵数据和系统提供了更多保证。有关更多信息,请参阅安全支柱概述。
- 从架构设计开始,考虑如何帮助保护MLOps解决方案。开发环境可能不需要显著的安全性,但它在阶段和生产环境中很重要。
成本优化
成本优化是指寻找减少不必要费用和提高运营效率的方法。有关更多信息,请参阅成本优化支柱概述。
配置虚拟网络是免费的,但您的场景可能需要的其他服务也会收费,如专用链接、DNS区域和虚拟网络对等。下表介绍了这些服务和其他可能需要的服务的收费。
Azure Service | Pricing |
---|---|
Virtual Network | Free of charge. |
Private Link | Pay only for private endpoint resource hours and the data that is processed through your private endpoint. |
Azure DNS, private zone | Billing is based on the number of DNS zones that are hosted in Azure and the number of DNS queries that are received. |
Virtual Network peering | Inbound and outbound traffic is charged at both ends of the peered networks. |
VPN Gateway | Charges are based on the amount of time that the gateway is provisioned and available. |
ExpressRoute | Charges are for ExpressRoute and ExpressRoute Gateways. |
Azure Bastion | Billing involves a combination of hourly pricing that is based on SKU, scale units, and data transfer rates. |
卓越运营
卓越运营涵盖了部署应用程序并使其在生产中运行的运营过程。有关更多信息,请参阅卓越运营支柱概述。
为了简化持续集成和持续交付(CI/CD),最佳实践是使用基础设施的工具和服务作为代码(IaC),如Terraform或Azure资源管理器模板、Azure DevOps和Azure管道。
部署此场景
以下部分描述了如何在此示例场景中部署、访问和帮助保护资源。
虚拟网络
帮助保护MLOps环境的第一步是帮助保护Azure机器学习工作区及其相关资源。一种有效的保护方法是使用虚拟网络。虚拟网络是Azure中私有网络的基本构建块。虚拟网络使许多类型的Azure资源能够更安全地相互通信、互联网和本地网络。
将Azure机器学习工作区及其相关资源放入虚拟网络有助于确保组件可以在不将其暴露于公共互联网的情况下相互通信。这样做可以减少他们的攻击面,并有助于防止数据泄露。
以下Terraform片段显示了如何为Azure机器学习创建计算集群,将其连接到工作区,并将其放入虚拟网络的子网。
Terraform
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专用端点
私有链接允许通过虚拟网络中的私有端点访问Azure平台即服务(PaaS)选项,如Azure机器学习工作区和Azure存储,以及Azure托管的客户所有和合作伙伴所有的服务。专用端点是一种仅连接到特定资源的网络接口,从而有助于防止数据泄露。
在这个示例场景中,有四个专用端点与Azure PaaS选项绑定,并由Azure机器学习虚拟网络中的子网管理,如架构图所示。因此,这些服务只能访问同一虚拟网络Azure Machine Learning虚拟网络中的资源。这些服务是:
- Azure机器学习工作区
- Azure Blob存储
- Azure容器注册表
- Azure密钥保管库
以下Terraform片段显示了如何使用专用端点链接到Azure机器学习工作区,因此该工作区更受虚拟网络的保护。该片段还显示了专用DNS区域的使用,该区域在Azure专用DNS区域中进行了描述。
Terraform
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平台。如果您仍然希望使用v1neneneba API或公司策略禁止通过公共网络发送通信,则可以启用v1_legacy_mode_enabled参数,如以下代码片段所示。启用时,此参数将禁用工作区的v2 API。
Terraform
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密钥库或容器注册表)使用专用端点。因此,您必须配置DNS设置,以便从连接字符串的完全限定域名(FQDN)解析专用终结点的IP地址。
您可以将专用DNS区域链接到虚拟网络以解析特定域。
Private Link和Azure Private Endpoint中的Terraform片段通过使用Azure服务DNS区域配置中推荐的区域名称创建两个专用DNS区域:
- privatelink.api.azureml.ms
- privatelink.notebooks.azure.net
虚拟网络对等
虚拟网络对等允许Azure Bastion虚拟网络中的跳转主机虚拟机(VM)或自托管代理虚拟机访问Azure machine Learning虚拟网络的资源。出于连接目的,这两个虚拟网络可作为一个网络工作。对等虚拟网络中虚拟机和Azure机器学习资源之间的流量使用Azure骨干基础设施。虚拟网络之间的流量通过Azure专用网络进行路由。
以下Terraform片段设置了Azure机器学习虚拟网络和Azure堡垒虚拟网络之间的虚拟网络对等。
Terraform
# 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 Machine Learning虚拟网络,请使用以下方法之一:
- Azure VPN网关
- Azure ExpressRoute
- Azure堡垒和跳转主机VM
有关详细信息,请参见连接到工作空间。
运行访问虚拟网络中资源的Azure管道
Azure Pipelines自动构建和测试代码项目,使其可供他人使用。Azure Pipelines结合CI/CD来测试和构建您的代码,并将其运送到任何目标。
Azure托管代理与自托管代理
此示例场景中的MLOps解决方案由两个管道组成,它们可以触发Azure机器学习管道并访问相关资源。由于Azure机器学习工作区及其相关资源位于虚拟网络中,因此此场景必须为Azure管道代理提供访问它们的方法。代理是指安装了代理软件的计算基础设施,该软件一次运行一个Azure管道的作业。有多种方法可以实现访问:
- 在同一虚拟网络或对等虚拟网络中使用自托管代理,如体系结构图所示。
- 使用Azure托管代理,并将其IP地址范围添加到目标Azure服务的防火墙设置中的允许列表中。
- 使用Azure托管代理(作为VPN客户端)和VPN网关。
这些选择各有利弊。下表将Azure托管代理与自托管代理进行了比较。
Azure-hosted Agent | Self-hosted Agent |
---|---|
Cost | Start free for one parallel job with 1,800 minutes per month and a charge for each Azure-hosted CI/CD parallel job. |
Maintenance | Taken care of for you by Microsoft. |
Build Time | More time consuming because it completely refreshes every time you start a build, and you always build from scratch. |
笔记有关当前定价,请参阅Azure DevOps的定价。
基于表中的比较以及安全性和复杂性的考虑,此示例场景使用Azure管道的自托管代理来触发虚拟网络中的Azure机器学习管道。
要配置自托管代理,您有以下选项:
- 在Azure虚拟机上安装代理。
- 在Azure虚拟机扩展集上安装代理,该扩展集可以自动扩展以满足需求。
- 在Docker容器上安装代理。这个选项是不可行的,因为这个场景可能需要在代理中运行Docker容器来进行机器学习模型训练。
以下示例代码通过创建Azure虚拟机和扩展来提供两个自托管代理:
Terraform
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上安装代理软件和所需的库。
Bash
#!/bin/sh
# Install other required libraries
...
# Creates directory and downloads Azure DevOps agent installation files
# Find more agent versions at https://github.com/microsoft/azure-pipelines-agent/releases
AGENT_VERSION="3.240.1"
sudo mkdir /myagent
cd /myagent
sudo wget https://vstsagentpackage.azureedge.net/agent/${AGENT_VERSION}/vsts-agent-linux-x64-${AGENT_VERSION}.tar.gz
sudo tar zxvf ./vsts-agent-linux-x64-${AGENT_VERSION}.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片段显示了实现。
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维护。它最初是由以下贡献者撰写的。
主要作者:
Gary Wang |首席软件工程师
其他贡献者:
Gary Moore |程序员/作家
要查看非公开的领英个人资料,请登录领英。
接下来的步骤
- 登录 发表评论
- 15 次浏览
最新内容
- 1 day 22 hours ago
- 1 day 22 hours ago
- 1 day 22 hours ago
- 1 day 22 hours ago
- 2 days 23 hours ago
- 2 days 23 hours ago
- 2 days 23 hours ago
- 2 days 23 hours ago
- 2 days 23 hours ago
- 2 days 23 hours ago