Machine Learning DevOps (MLOps):於 2015 年第一次醒目提示機器學習系統的隱藏技術債務,正在快速增長。 MLOps 的市場預計於 2025 年達到 40 億美元。 同時,努力保護 MLOps 解決方案變得越來越重要。
本文說明如何使用 Azure 虛擬網路、網路對等互連、Azure Private Link 和 Azure DNS 等 Azure 網路安全功能,協助保護 MLOps 解決方案。 同時也會介紹如何使用:
- 用於存取虛擬網路中的資源的 Azure Pipelines
- Azure Container Registry 的必要組態設定,以及虛擬網路中 Azure Machine Learning compute 執行個體和叢集。
本文最後會說明使用網路安全服務的成本。
架構
下載此架構的 Visio 檔案。
資料流程
架構圖顯示範例 MLOps 解決方案。
名為 AML VNET 的虛擬網路,協助保護 Azure Machine Learning 工作區及其相關聯的資源。
跳板機、Azure Bastion 和自我裝載代理程式,,均屬於另一個名為 BASTION VNET 的虛擬網路。 此安排模擬有另一個解決方案,需要存取 Azure Machine Learning 虛擬網路內的資源。
透過虛擬網路對等互連和私人 DNS 區域的支援,Azure Pipelines 可以在自我裝載代理程式上執行,並觸發 Azure Machine Learning 工作區中發佈的 Azure Machine Learning 管線,以定型、評估和註冊機器學習模型。
最後,模型會部署到 Azure Machine Learning compute 或 Azure Kubernetes Service 叢集所支援的線上端點或批次端點。
元件
MLOps 解決方案範例包含下列元件:
- 資料儲存體:適用於資料儲存體的 Azure Blob 儲存體。
- 模型定型、驗證和註冊:Azure Machine Learning 工作區
- 模型部署:Azure Machine Learning 端點和 Azure Kubernetes Service
- 模型監視器:適用於 Application Insights 的 Azure 監視器
- MLOps 管線:Azure DevOps 和 Azure Pipelines
此範例案例也會使用下列服務來協助保護 MLOps 解決方案:
案例詳細資料
MLOps 是 Machine Learning、DevOps 和資料工程交集的一組做法,旨在可靠且有效率地在生產環境中部署和維護機器學習模型。
下圖顯示簡化的 MLOps 程序模型。 此模型提供一種解決方案,可將資料準備、模型定型、模型評估、模型註冊、模型部署和監視作業自動化。
當您實作 MLOps 解決方案時,建議您協助保護這些資源:
- DevOps 管線
- 機器學習定型資料
- 機器學習管線
- 機器學習模型
若要協助保護資源,請考慮下列方法:
驗證與授權
網路安全性
- 使用 虛擬網路 部分或完全隔離環境與公用網際網路,以減少受攻擊面和資料外洩的可能性。
- 在 Azure Machine Learning 工作區中,如果您仍在使用 Azure Machine Learning CLI v1 和 Azure Machine Learning Python SDK v1 (例如 v1 API),請將私人端點新增至工作區,以提供工作區的網路隔離,除了在工作區或計算資源上建立、讀取、更新和刪除 #CRUD 作業以外的一切。
- 若要利用 Azure Machine Learning 工作區的新功能,請使用 Azure Machine Learning CLI v2 和 Azure Machine Learning Python SDK v2 (例如 v2 API),在您的工作區上啟用私人端點不會提供相同層級的網路隔離。 不過,虛擬網路仍有助於保護定型資料和機器學習模型。 建議您先評估 v2 API,再於企業解決方案中採用。 如需詳細資訊,請參閱 Azure Resource Manager 上的新 API 平台為何。
- 使用 虛擬網路 部分或完全隔離環境與公用網際網路,以減少受攻擊面和資料外洩的可能性。
資料加密
原則和監視
- 使用 Azure 原則和適用於雲端的 Microsoft Defender 強制執行原則。
- 使用 Azure Monitor 從各種源收集資料 (例如指標和記錄),並將其聚合到一個通用資料平台,以進行分析、可視化和警示。
Azure Machine Learning 工作區是 Azure Machine Learning 的最上層資源,也是 MLOps 解決方案的核心元件。 工作區可以在您使用 Azure Machine Learning 服務時,提供集中式位置來處理您建立的所有成品。
當您建立新的工作區時,會自動建立工作區所使用的 Azure 資源,如下所列:
- Azure Application Insights
- Azure Container Registry
- Azure Key Vault
- Azure 儲存體帳戶
潛在使用案例
此解決方案適用於客戶使用 MLOps 解決方案在更安全的環境中部署和維護機器學習模型的情況。 客戶可能來自各種產業,例如製造、電信、零售、醫療保健等。 例如:
電信業者在其零售商店的影片監視系統中,協助保護客戶的圖片、資料和機器學習模型。
引擎製造商需要更安全的解決方案,以協助保護其工廠和產品的資料和機器學習模型,使其系統使用電腦視覺來偵測零件中的缺陷。
這些案例和其他案例的 MLOps 解決方案,可能會使用 Azure Machine Learning 工作區、Azure Blob 儲存體、Azure Kubernetes Service、Container Registry 和其他 Azure 服務。
針對在 Azure 上部署的 MLOps 環境,並使用 Azure 安全功能來協助保護相關資源的任何類似案例,您可以使用此範例的所有或部分。 此解決方案的原始客戶來自電信業。
考量
這些考量能實作 Azure Well-Architected Framework 的支柱,其為一組指導原則,採用後可改善工作負載的品質。 如需更多資訊,請參閱 Microsoft Azure 結構完善的架構。
安全性
安全性可提供更大的保障,防止刻意攻擊和濫用您寶貴的資料和系統。 如需詳細資訊,請參閱安全性的設計檢閱檢查清單。
請考慮如何協助保護 MLOps 解決方案——從架構設計開始。 開發環境可能不需要重要的安全性,但資安在預備和生產環境中非常重要。
成本最佳化
成本最佳化是關於考慮如何減少不必要的費用,並提升營運效率。 如需詳細資訊,請參閱成本最佳化的設計檢閱檢查清單。
設定虛擬網路是免費的,但您的案例可能會有其他服務費用,例如私人連結、DNS 區域和虛擬網路對等互連。 下表說明這些服務和其他可能需要的費用。
Azure Service | 定價 |
---|---|
虛擬網路 | 免費。 |
私人連結 | 只需就私人端點資源時數以及透過私人端點處理的資料量支付費用。 |
Azure DNS 私人區域 | 計費將依據 Azure 上所裝載的 DNS 區域數量,以及所接收的 DNS 查詢數量。 |
虛擬網路對等互連 | 輸入和輸出流量會在對等互連網路的兩端計費。 |
VPN 閘道 | 費用是依所佈建且可用的閘道時間量計費。 |
ExpressRoute | ExpressRoute 和 ExpressRoute 閘道的費用。 |
Azure Bastion | 計費牽涉到以 SKU、縮放單位和數據傳輸費率為基礎的每小時價格組合。 |
卓越營運
卓越營運涵蓋部署應用程式並使其持續在生產環境中執行的作業流程。 如需詳細資訊,請參閱卓越營運的設計檢閱檢查清單。
為了簡化持續整合和持續傳遞 (CI/CD),最佳做法是使用工具和服務做為基礎結構即程式碼 (IaC),例如 Terraform 或 Azure Resource Manager 範本、Azure DevOps 和 Azure Pipelines。
部署此案例
下列各節說明如何部署、存取及協助保護此範例案例中的資源。
虛擬網路
協助保護 MLOps 環境的第一個步驟是,協助保護 Azure Machine Learning 工作區及其相關聯的資源。 有效的保護方法是使用虛擬網路。 虛擬網路是私人網路在 Azure 中的基本建置組塊。 虛擬網路可讓多種類型的 Azure 資源更加安全地彼此通訊,包括網際網路和內部部署網路。
將 Azure Machine Learning 工作區及其相關聯的資源放入虛擬網路,有助於確保元件彼此通訊,而不需將其公開至公用網際網路。 這樣做可減少受攻擊面,並有助於防止資料外洩。
下列 Terraform 程式碼片段示範如何建立 Azure Machine Learning 的計算叢集、將其連結至工作區,並將其放入虛擬網路的子網中。
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 Machine Learning 工作區和 Azure 儲存體),以及 Azure 裝載的客戶擁有和合作夥伴擁有的服務。 私人端點是只連線到特定資源的網路介面,因此有助於防止資料外流。
在此範例案例中,有四個私人端點會繫結至 Azure PaaS 選項,並由 Azure Machine Learning 虛擬網路中的子網管理,如架構圖所示。 因此,這些服務只能存取相同虛擬網路內的資源,Azure Machine Learning 虛擬網路。 這些服務為:
- Azure Machine Learning 工作區
- Azure Blob 儲存體
- Azure Container Registry
- Azure Key Vault
下列 Terraform 程式碼片段示範如何使用私人端點連結至 Azure Machine Learning 工作區,如此一來,虛擬網路會更受到保護。 程式碼片段也會示範私人 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 Machine Learning 工作區及其關聯的資源,例如 Azure 存儲存體、Azure Key Vault 或 Container Registry。 因此,您必須正確指定您的 DNS 設定,以將私人端點 IP 位址解析為連接字串的完整網域名稱 (FQDN)。
您可以將私人 DNS 區域連結至虛擬網路,以解析特定網域。
私人連結和 Azure 私人端點中的 Terraform 程式碼片段,會使用 Azure 服務 DNS 區域組態中建議的區域名稱來建立兩個私人 DNS 區域:
privatelink.api.azureml.ms
privatelink.notebooks.azure.net
虛擬網路對等互連
虛擬網路對等互連可讓您存取 Azure Bastion 虛擬網路中的跳板機虛擬機器 (VM) 或自我裝載代理程式 VM,以存取 Azure Machine Learning 虛擬網路中的資源。 基於連線目的,兩個虛擬網路會當成一個來運作。 對等互連虛擬網路中 VM 與 Azure Machine Learning 資源之間的流量使用 Azure 骨幹基礎結構。 虛擬網路之間的流量會透過 Azure 私人網路進行路由。
下列 Terraform 程式碼片段會設定 Azure Machine Learning 虛擬網路與 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 Machine Learning 工作區,例如此案例中的 Azure Machine Learning 虛擬網路,請使用下列其中一種方法:
- Azure VPN 閘道
- Azure ExpressRoute
- Azure Bastion 和跳板機 VM
如需詳細資訊,請參閱連線到工作區。
執行 Azure Pipelines 以存取虛擬網路中的資源
了解 Azure Pipelines 如何自動建置及測試程式碼專案,以供其他人使用。 Azure Pipelines 結合 CI/CD 測試及建置您的程式碼,並將其寄送至任何目標。
Azure 裝載的代理程式與自我裝載代理程式
此範例案例中的 MLOps 解決方案包含兩個管線,可觸發 Azure Machine Learning 管線,並存取相關聯的資源。 由於 Azure Machine Learning 工作區及其相關聯的資源位於虛擬網路中,因此這個案例必須提供 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 Machine Learning 管線。
若要設定自我裝載代理程式,您有下列選項:
在 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
# 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
在虛擬網路中使用 Container Registry
在虛擬網路中保護 Azure Machine Learning 工作區,有一些必要條件。 如需詳細資訊,請參閱必要條件。 當您使用 Azure Machine Learning 工作區來定型和部署模型時,Container Registry 是必要服務。
在此範例案例中,為了確保自我裝載代理程式可以存取虛擬網路中的容器登錄,我們使用虛擬網路對等互連,並新增虛擬網路連結,將私人 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 Machine Learning 工作區系統指派受控識別的參與者角色。
在虛擬網路中使用計算集群或執行個體
虛擬網路中的 Azure Machine Learning 計算叢集或實例需要網路安全組 (NSG), 其子網有一些特定規則。 如需這些規則的清單,請參閱限制。
另請注意,針對計算叢集或執行個體,現在已經可以移除公用 IP 位址,這有助於為 MLOps 解決方案中的計算資源提供更好的保護。 如需詳細資訊,請參閱沒有計算執行個體的公用 IP。
參與者
本文由 Microsoft 維護。 原始投稿人如下。
主要作者:
- Gary Wang | 首席軟體工程師
其他投稿人:
- Gary Moore | 程式設計師/作家
若要查看非公開的 LinkedIn 設定檔,請登入 LinkedIn。
下一步
- Terraform on Azure 文件
- Azure 機器學習 Enterprise Terraform 範例
- Azure MLOps v2 GitHub 存放庫
- Azure 虛擬網路定價
- Azure DevOps 的定價