使用 Azure 網路安全性保護 MLOps 解決方案

Azure DevOps
Azure DNS
Azure Machine Learning
Azure Private Link
Azure 虛擬網路

機器學習 DevOps (MLOps),第一次反白顯示於2015年 機器學習 系統隱藏的技術債務正在快速增長。 MLOps 的市場預計到2025年將達到40億美元。 同時,努力保護 MLOps 解決方案變得越來越重要。

本文說明如何使用 Azure 虛擬網絡、網路對等互連、Azure Private Link 和 Azure DNS 等 Azure 網路安全性功能,協助保護 MLOps 解決方案。 它也會介紹如何使用:

  • 用來存取虛擬網路中資源的 Azure Pipelines
  • Azure Container Registry 和 Azure 的必要設定 機器學習 虛擬網路中的計算實例和叢集。

最後,本文說明使用網路安全性服務的成本。

架構

Diagram of the stages in the MLOps process, from preparing data to monitoring the model.

下載此架構的 Visio 檔案

資料流程

架構圖顯示範例 MLOps 解決方案。

  • 名為 AML VNET 的虛擬網路可協助保護 Azure 機器學習 工作區及其相關聯的資源。

  • 跳躍主機、Azure Bastion 和自我裝載代理程式屬於另一個名為 BASTION VNET 的虛擬網路。 此安排會模擬有另一個解決方案,需要存取 AML VNET 內的資源。

  • 透過虛擬網路對等互連和私人 DNS 區域的支援,Azure Pipelines 可以在自我主機代理程式上執行,並觸發 Azure 機器學習 工作區中發佈的 Azure 機器學習 管線,以定型、評估和註冊機器學習模型。

  • 最後,模型會部署到 Azure 機器學習 計算或 Azure Kubernetes Service 叢集所支援的在線端點或批次端點。

元件

MLOps 解決方案範例包含下列元件:

此範例案例也會使用下列服務來協助保護 MLOps 解決方案:

案例詳細資料

MLOps 是 機器學習、DevOps 和數據工程交集的一組做法,旨在以可靠且有效率的方式在生產環境中部署和維護機器學習模型。

下圖顯示簡化的 MLOps 程式模型。 此模型提供一個解決方案,可將數據準備、模型定型、模型評估、模型註冊、模型部署和監視自動化。

Diagram of the stages in the MLOps process, from preparing data to monitoring the model.

當您實作 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 原則和 適用於雲端的 Microsoft Defender 來強制執行原則。
    • 使用 Azure 監視器 ,從各種來源收集及匯總數據(例如計量和記錄),並將其匯總到一般數據平臺,以進行分析、視覺效果和警示。

Azure 機器學習 工作區是 Azure 機器學習 的最上層資源,也是 MLOps 解決方案的核心元件。 工作區提供集中位置,讓您在使用 Azure 機器學習 時,使用您建立的所有成品。

當您建立新的工作區時,會自動建立工作區所使用的下列 Azure 資源:

  • Azure Application Insights
  • Azure Container Registry
  • Azure Key Vault
  • Azure 儲存體帳戶

潛在的使用案例

此解決方案適用於客戶使用 MLOps 解決方案在更安全的環境中部署和維護機器學習模型的情況。 客戶可以來自各種產業,例如製造、電信、零售、醫療保健等。 例如:

  • 電信業者在其零售商店的影片監視系統中,協助保護客戶的圖片、數據和機器學習模型。

  • 引擎製造商需要更安全的解決方案,以協助保護其工廠和產品的數據和機器學習模型,使其系統使用計算機視覺來偵測零件中的缺陷。

這些案例和其他案例的 MLOps 解決方案可能會使用 Azure 機器學習 工作區、Azure Blob 儲存體、Azure Kubernetes Service、Container Registry 和其他 Azure 服務。

針對在 Azure 上部署的 MLOps 環境,並使用 Azure 安全性功能來協助保護相關資源的任何類似案例,您可以使用此範例的所有或部分。 此解決方案的原始客戶位於電信業。

考量

這些考慮會實作 Azure Well-Architected Framework 的要素,這是一組指導原則,可改善套用時工作負載的品質。 如需詳細資訊,請參閱 Microsoft Azure Well-Architected Framework

安全性

安全性可針對蓄意攻擊和濫用寶貴的數據和系統提供更多保證。 如需詳細資訊,請參閱 安全性要素概觀。

請考慮如何協助保護 MLOps 解決方案,從架構設計開始。 開發環境可能不需要重要的安全性,但在預備和生產環境中很重要。 

成本最佳化

成本優化是考慮如何減少不必要的費用,並提升營運效率。 如需詳細資訊,請參閱 成本優化要素概觀。

設定 虛擬網絡 是免費的,但您的案例可能需要的其他服務收費,例如私人連結、DNS 區域和虛擬網路對等互連。 下表說明這些服務和其他可能需要的費用。

Azure Service 定價
虛擬網路 免費。
Private Link 只需支付私人端點資源時數,以及透過私人端點處理的數據。
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 機器學習 工作區及其相關聯的資源。 有效的保護方法是使用 虛擬網絡。 虛擬網絡 是 Azure 中專用網的基本建置組塊。 虛擬網絡 可讓許多類型的 Azure 資源更安全地彼此通訊、因特網和內部部署網路。

將 Azure 機器學習 工作區及其相關聯的資源放入虛擬網路有助於確保元件可以彼此通訊,而不需將其公開至公用因特網。 這樣做可減少其受攻擊面,並協助防止數據外洩。

下列 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"
  }
}

Private Link 可讓您透過虛擬網路中的私人端點存取 Azure 平臺即服務 (PaaS) 選項,例如 Azure 機器學習 工作區和 Azure 儲存體,以及 Azure 裝載的客戶擁有和合作夥伴擁有的服務。 私人端點是只連線到特定資源的網路介面,因此有助於防止數據外流。

在此範例案例中,有四個私人端點會系結至 Azure PaaS 選項,並由 AML VNET 中的子網管理,如架構圖所示。 因此,這些服務只能供相同虛擬網路 AML VNET 內的資源存取。 這些服務包括:

  • Azure Machine Learning 工作區
  • Azure Blob 儲存體
  • Azure Container Registry
  • Azure Key Vault

下列 Terraform 代碼段示範如何使用私人端點連結至 Azure 機器學習 工作區,如此一來,虛擬網路會受到更保護。 代碼段也會示範使用私人 DNS 區域,如 私用 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 參數,如下列代碼段所示。 啟用時,此參數會停用工作區的 v2 API。

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

私人 DNS 區域

Azure DNS 提供可靠、更安全的 DNS 服務,以管理及解析虛擬網路中的功能變數名稱,而不需要新增自定義 DNS 解決方案。 藉由使用私人 DNS 區域,您可以使用自訂功能變數名稱,而不是 Azure 所提供的名稱。 針對私人 DNS 區域的 DNS 解析只能從與其連結的虛擬網路運作。

此範例解決方案會針對 Azure 機器學習 工作區及其相關聯的資源使用私人端點,例如 Azure 儲存體、Azure 金鑰保存庫 或 Container Registry。 因此,您必須設定 DNS 設定,以從 連接字串 的完整功能變數名稱 (FQDN) 解析私人端點的 IP 位址。

您可以將私人 DNS 區域連結至虛擬網路,以解析特定網域。

Private Link 和 Azure 私人端點中的 Terraform 代碼段會使用 Azure 服務 DNS 區域組態建議的區域名稱來建立兩個私人 DNS 區域:

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

虛擬網路對等互連

虛擬網路對等互連可讓您存取 BASTION VNET 中的 Jump-host 虛擬機器(VM)或自我裝載代理程式 VM,以存取 AML VNET 中的資源。 為了進行連線,這兩個虛擬網路會以一個身分運作。 對等互連虛擬網路中的 VM 與 Azure 機器學習 資源之間的流量會使用 Azure 骨幹基礎結構。 虛擬網路之間的流量會透過 Azure 的專用網路由傳送。

下列 Terraform 代碼段會設定 AML VNET 與 BASTION VNET 之間的虛擬網路對等互連。

# 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 機器學習 工作區,例如此案例中的 AML VNET,請使用下列其中一種方法:

  • 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

在虛擬網路中使用 Container Registry

在虛擬網路中保護 Azure 機器學習 工作區有一些必要條件。 如需詳細資訊,請參閱必要條件。 當您使用 Azure 機器學習 工作區來定型和部署模型時,Container Registry 是必要服務。

在此範例案例中,為了確保自我裝載代理程式可以存取虛擬網路中的容器登錄,我們會使用虛擬網路對等互連,並新增虛擬網路連結,將私人 DNS 區域 privatelink.azurecr.io 連結至 BASTION VNET。 下列 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 維護。 原始投稿人如下。

主要作者:

其他投稿人:

若要查看非公用LinkedIn配置檔,請登入LinkedIn。

下一步