使用虛擬網路保護 Azure 機器學習 訓練環境 (SDKv1)

適用於:Python SDK azureml v1

在本文中,您將瞭解如何使用 Python SDK v1 在 Azure 機器學習 中使用虛擬網路來保護定型環境。

Azure 機器學習 計算實例和計算叢集可用來在虛擬網路中安全地定型模型。 規劃環境時,您可以使用或不使用公用IP位址來設定計算實例/叢集。 兩者之間的一般差異如下:

  • 沒有公用IP:降低成本,因為它沒有相同的網路資源需求。 藉由移除來自因特網的輸入流量需求來改善安全性。 不過,啟用必要資源的輸出存取所需的其他組態變更(Microsoft Entra ID、Azure Resource Manager 等)。
  • 公用IP:預設可運作,但由於額外的 Azure 網路資源,因此成本較高。 需要透過公用因特網從 Azure 機器學習 服務的輸入通訊。

下表包含這些組態之間的差異:

組態 使用公用IP 沒有公用IP
輸入流量 AzureMachineLearning 服務標籤。
輸出流量 根據預設,可以存取沒有限制的公用因特網。
您可以使用網路安全組或防火牆來限制其存取的內容。
根據預設,它無法存取因特網。 如果仍然可以將輸出流量傳送至因特網,這是因為 Azure 預設的輸出存取 ,而且您有一個允許輸出到因特網的 NSG。 我們 不建議 使用預設的輸出存取。
如果您需要對因特網的輸出存取,建議您改用 虛擬網絡 NAT 閘道或防火牆,如果您需要將輸出流量路由傳送至因特網上所需的資源。
Azure 網路資源 公用IP位址、負載平衡器、網路介面

您也可以使用 Azure Databricks 或 HDInsight 在虛擬網路中定型模型。

提示

Microsoft 建議使用 Azure 機器學習 受控虛擬網路,而不是本文中的步驟。 使用受控虛擬網路,Azure Machine Learning 會處理工作區和受控計算的網路隔離作業。 您也可以為工作區所需的資源新增私人端點,例如 Azure 儲存體帳戶。 如需詳細資訊,請參閱工作區受管理的網路隔離

注意

如需使用 Azure 機器學習 Studio 和 Python SDK v2 的詳細資訊,請參閱保護定型環境 (v2)

如需建立安全工作區的教學課程,請參閱教學課程:在 Azure 入口網站 中建立安全工作區或教學課程:使用範本建立安全工作區。

在本文中,您將瞭解如何保護虛擬網路中的下列定型計算資源:

  • Azure Machine Learning 計算叢集
  • Azure Machine Learning 計算執行個體
  • Azure Databricks
  • 虛擬機器
  • HDInsight 叢集

重要

本文中標示為「預覽」的項目目前處於公開預覽狀態。 此預覽版本會在沒有服務等級協定的情況下提供,不建議用於實際執行工作負載。 可能不支援特定功能,或可能已經限制功能。 如需詳細資訊,請參閱 Microsoft Azure 預覽版增補使用條款

必要條件

  • 請參閱網路安全性概觀,以了解常見的虛擬網路情節和整體虛擬網路架構。

  • 用於計算資源的現有虛擬網路和子網路。 此 VNet 必須與 Azure 機器學習 工作區位於相同的訂用帳戶中。

    • 建議您將工作區所使用的記憶體帳戶和定型作業放在您打算用於計算實例和叢集的相同 Azure 區域中。 如果它們不在相同的 Azure 區域中,您可能會產生資料傳輸成本並增加網路等待時間。
    • 請確定 VNet 中的 *.instances.azureml.net*.instances.azureml.ms 允許使用 WebSocket 通訊。 Jupyter 會在計算執行個體上使用 WebSocket。
  • 虛擬網路中的現有子網。 建立計算實例和叢集時會使用此子網。

    • 請確定子網未委派給其他 Azure 服務。
    • 請確定子網包含足夠的可用IP位址。 每個計算實例都需要一個IP位址。 計算叢集中的每個 節點 都需要一個IP位址。
  • 如果您有自己的 DNS 伺服器,建議您使用 DNS 轉送來解析計算實例和叢集的完整功能變數名稱 (FQDN)。 如需詳細資訊,請參閱搭配 Azure 機器學習 使用自定義 DNS。

  • 若要將資源部署到虛擬網路或子網路,在 Azure 角色型存取控制 (Azure RBAC) 中,您的使用者帳戶必須具有下列動作的權限:

    • 虛擬網路資源上的 "Microsoft.Network/*/read"。 Azure Resource Manager (ARM) 範本部署不需要此權限。
    • 虛擬網路資源上的 "Microsoft.Network/virtualNetworks/join/action"。
    • 子網路資源上的 "Microsoft.Network/virtualNetworks/subnets/join/action"。

    如需 Azure RBAC 搭配網路的詳細資訊,請參閱網路內建角色

限制

Azure 機器學習 計算叢集/實例

  • 計算叢集 可以建立在與工作區不同的區域和 VNet 中。 不過,此功能僅適用於 SDK v2、CLI v2 或 Studio。 如需詳細資訊,請參閱 v2 版的安全定型環境

  • Azure Lighthouse 不支援虛擬網路中的計算叢集/實例部署。

  • 在定型期間,您的計算執行個體與預設儲存體帳戶之間的私人網路通訊必須開啟埠 445。 例如,如果您的計算位於一個 VNet 中,而儲存體帳戶位於另一個 VNet 中,請勿封鎖儲存體帳戶 VNet 的埠 445。

Azure Databricks

  • 虛擬網路必須與 Azure 機器學習 工作區位於相同的訂用帳戶和區域中。
  • 如果工作區的 Azure 儲存體 帳戶在虛擬網路中也受到保護,則必須位於與 Azure Databricks 叢集相同的虛擬網路中。
  • 除了 Azure Databricks 所使用的 databricks-privatedatabricks-public 子網之外, 也需要為虛擬網路建立的預設 子網。
  • Azure Databricks 不會使用私人端點與虛擬網路通訊。

如需在虛擬網路中使用 Azure Databricks 的詳細資訊,請參閱在 Azure 虛擬網絡 中部署 Azure Databricks。

Azure HDInsight 或虛擬機

  • Azure 機器學習 僅支持執行 Ubuntu 的虛擬機。

沒有公用IP的計算實例/叢集

重要

如果您已使用未選擇加入預覽的公用IP所設定的計算實例或計算叢集,則必須在2023年1月20日之後刪除並重新建立它們(功能正式推出時)。

如果您先前未使用任何公用 IP 的預覽版,您可能也需要修改允許輸入和輸出的流量,因為正式運作的需求已變更:

  • 輸出需求 - 另外兩個輸出,僅用於計算實例和叢集的管理。 這些服務標籤的目的地是由 Microsoft 所擁有:
    • AzureMachineLearning UDP 埠 5831 上的服務標籤。
    • BatchNodeManagement TCP 連接埠 443 上的服務標籤。

除了必要條件一節所列的組態之外,下列組態是針對未設定公用IP而建立計算實例/叢集的特定設定:

  • 您必須針對計算資源使用工作區私人端點,才能從 VNet 與 Azure 機器學習 服務通訊。 如需詳細資訊,請參閱設定 Azure 機器學習 工作區的私人端點。

  • 在您的 VNet 中,允許下列服務標籤或完整網域名稱的輸出流量 (FQDN)

    服務標記 通訊協定 連接埠 注意
    AzureMachineLearning TCP
    UDP
    443/8787/18881
    5831
    與 Azure Machine Learning 服務通訊。
    BatchNodeManagement.<region> ANY 443 <region> 取代為包含 Azure Machine Learning 工作區的 Azure 區域。 與 Azure Batch 通訊。 計算執行個體和計算叢集均使用 Azure Batch 服務實作。
    Storage.<region> TCP 443 <region> 取代為包含 Azure Machine Learning 工作區的 Azure 區域。 此服務標籤可用來與 Azure Batch 所使用的 Azure 儲存體帳戶通訊。

    重要

    的輸出存取 Storage.<region> 可能會用來從工作區外泄數據。 藉由使用服務端點原則,您可以降低此弱點。 如需詳細資訊,請參閱 Azure 機器學習 數據外洩防護一文。

    FQDN 通訊協定 連接埠 注意
    <region>.tundra.azureml.ms UDP 5831 <region> 取代為包含 Azure Machine Learning 工作區的 Azure 區域。
    graph.windows.net TCP 443 與 Microsoft Graph API 通訊。
    *.instances.azureml.ms TCP 443/8787/18881 與 Azure Machine Learning 通訊。
    *.<region>.batch.azure.com ANY 443 <region> 取代為包含 Azure Machine Learning 工作區的 Azure 區域。 與 Azure Batch 通訊。
    *.<region>.service.batch.azure.com ANY 443 <region> 取代為包含 Azure Machine Learning 工作區的 Azure 區域。 與 Azure Batch 通訊。
    *.blob.core.windows.net TCP 443 與 Azure Blob 儲存體通訊。
    *.queue.core.windows.net TCP 443 與 Azure 佇列儲存體通訊。
    *.table.core.windows.net TCP 443 與 Azure 資料表儲存體通訊。
  • 建立防火牆和輸出規則或 NAT 閘道和網路服務群組,以允許輸出流量。 由於計算沒有公用IP位址,因此若沒有此設定,就無法與公用因特網上的資源通訊。 例如,它無法與 Microsoft Entra ID 或 Azure Resource Manager 通訊。 從公用來源安裝 Python 套件也需要此設定。

    如需 Azure Machine Learning 所使用的輸出流量詳細資訊,請參閱下列文章:

使用下列資訊來建立不含公用 IP 位址的計算實例或叢集:

若要建立不含公用IP的計算實例或計算叢集,請使用 Azure Machine Learning 工作室 UI 來建立資源:

  1. 登入 Azure Machine Learning 工作室,然後選取您的訂用帳戶和工作區。

  2. 從左側導覽列選取 [ 計算 ] 頁面。

  3. 從計算實例或計算叢集的導覽列中選取 [ + 新增 ]。

  4. 設定您需要的 VM 大小和設定,然後選取 [ 下一步]。

  5. 從 [進階 設定],選取 [啟用虛擬網络]、您的虛擬網络和子網,最後選取 [VNet/子網] 區段下的 [無公用 IP] 選項。

    A screenshot of how to configure no public IP for compute instance and compute cluster.

提示

您也可以使用適用於 ML v2 的 Azure 機器學習 SDK v2 或 Azure CLI 擴充功能。 如需建立不含公用IP的計算實例或叢集的詳細資訊,請參閱保護 Azure 機器學習 定型環境的 v2 版本一文。

使用公用IP計算實例/叢集

除了必要條件一節所列的組態之外,下列組態也專屬於建立具有公用IP的計算實例/叢集:

  • 如果您將多個計算實例/叢集放在一個虛擬網路中,您可能需要要求增加一或多個資源的配額。 機器學習計算實例或叢集會自動在包含虛擬網路的資源群組中配置網路資源。 針對每個計算實例或叢集,服務會配置下列資源:

    • 會自動建立網路安全組 (NSG)。 此 NSG 允許來自服務標籤的 AzureMachineLearning 埠 44224 上的輸入 TCP 流量。

      重要

      計算實例和計算叢集會自動建立具有必要規則的NSG。

      如果您在子網層級有另一個 NSG,子網層級 NSG 中的規則不得與自動建立 NSG 中的規則衝突。

      若要瞭解 NSG 如何篩選您的網路流量,請參閱 網路安全組如何篩選網路流量

    • 一個負載平衡器

    針對計算叢集,每當叢集相應減少為 0 個節點,並在相應增加時建立時,就會刪除這些資源。

    若是計算執行個體,這些資源則會保留到刪除執行個體為止。 停止實例並不會移除資源。

    重要

    這些資源受限於訂用帳戶 的資源配額。 如果虛擬網路資源群組已鎖定,則刪除計算叢集/實例將會失敗。 在刪除計算叢集/實例之前,無法刪除負載平衡器。 此外,請確定沒有禁止建立網路安全組的 Azure 原則 指派。

  • 在您的 VNet 中,允許來自服務卷標的埠 44224 上的AzureMachineLearning輸入 TCP 流量。

    重要

    建立計算實例/叢集時會動態指派IP位址。 由於在建立之前不知道位址,而且在建立過程中需要輸入存取權,所以您無法在防火牆上以靜態方式指派它。 相反地,如果您使用具有 VNet 的防火牆,則必須建立使用者定義的路由,以允許此輸入流量。

  • 在您的 VNet 中,允許下列服務標籤的輸出流量

    服務標記 通訊協定 連接埠 注意
    AzureMachineLearning TCP
    UDP
    443/8787/18881
    5831
    與 Azure Machine Learning 服務通訊。
    BatchNodeManagement.<region> ANY 443 <region> 取代為包含 Azure Machine Learning 工作區的 Azure 區域。 與 Azure Batch 通訊。 計算執行個體和計算叢集均使用 Azure Batch 服務實作。
    Storage.<region> TCP 443 <region> 取代為包含 Azure Machine Learning 工作區的 Azure 區域。 此服務標籤可用來與 Azure Batch 所使用的 Azure 儲存體帳戶通訊。

    重要

    的輸出存取 Storage.<region> 可能會用來從工作區外泄數據。 藉由使用服務端點原則,您可以降低此弱點。 如需詳細資訊,請參閱 Azure 機器學習 數據外洩防護一文。

    FQDN 通訊協定 連接埠 注意
    <region>.tundra.azureml.ms UDP 5831 <region> 取代為包含 Azure Machine Learning 工作區的 Azure 區域。
    graph.windows.net TCP 443 與 Microsoft Graph API 通訊。
    *.instances.azureml.ms TCP 443/8787/18881 與 Azure Machine Learning 通訊。
    *.<region>.batch.azure.com ANY 443 <region> 取代為包含 Azure Machine Learning 工作區的 Azure 區域。 與 Azure Batch 通訊。
    *.<region>.service.batch.azure.com ANY 443 <region> 取代為包含 Azure Machine Learning 工作區的 Azure 區域。 與 Azure Batch 通訊。
    *.blob.core.windows.net TCP 443 與 Azure Blob 儲存體通訊。
    *.queue.core.windows.net TCP 443 與 Azure 佇列儲存體通訊。
    *.table.core.windows.net 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 子網之外, 也需要為虛擬網路建立的預設 子網。
  • Azure Databricks 不會使用私人端點與虛擬網路通訊。

如需搭配虛擬網路使用 Azure Databricks 的特定資訊,請參閱在 Azure 虛擬網絡 中部署 Azure Databricks。

定型模型所需的公用因特網存取

重要

雖然本文先前各節描述建立計算資源所需的設定,但本節中的組態資訊需要使用這些資源來定型模型。

Azure Machine Learning 需要對公用網際網路進行輸入和輸出存取。 下表提供必要存取權的概觀及其用途。 針對結尾為 .region的服務標籤,將 取代 region 為包含工作區的 Azure 區域。 例如: Storage.westus

提示

必要的索引標籤會列出必要的輸入和輸出組態。 情況索引標籤會列出您可能想要啟用之特定組態所需的選擇性輸入和輸出組態。

方向 通訊協定 &
連接埠
服務標記 目的
輸出 TCP:80、443 AzureActiveDirectory 使用 Microsoft Entra ID 進行驗證。
輸出 TCP:443、18881
UDP: 5831
AzureMachineLearning 使用 Azure Machine Learning 服務。
筆記本中的 Python Intellisense 使用埠 18881。
建立、更新和刪除 Azure 機器學習 計算實例會使用埠 5831。
輸出 ANY: 443 BatchNodeManagement.region 針對 Azure 機器學習 計算實例/叢集與 Azure Batch 後端通訊。
輸出 TCP:443 AzureResourceManager 使用 Azure 機器學習、Azure CLI 和 Azure 機器學習 SDK 建立 Azure 資源。
輸出 TCP:443 Storage.region 存取儲存在計算叢集和計算實例 Azure 儲存體帳戶中的資料。 如需防止此輸出數據外泄的資訊,請參閱 數據外泄保護
輸出 TCP:443 AzureFrontDoor.FrontEnd
* 在由 21Vianet 運作的 Microsoft Azure 中不需要。
Azure Machine Learning 工作室全域進入點。 儲存 AutoML 的映像和環境。 如需防止此輸出數據外泄的資訊,請參閱 數據外泄保護
輸出 TCP:443 MicrosoftContainerRegistry.region
請注意 ,此標籤相 AzureFrontDoor.FirstParty 依於標記
存取 Microsoft 提供的 Docker 映像。 為 Azure Kubernetes Service 設定 Azure 機器學習 路由器。

提示

如果您需要IP位址而非服務標籤,請使用下列其中一個選項:

IP 位址可能會定期變更。

您可能也需要允許輸出流量到 Visual Studio Code 和非 Microsoft 網站,以安裝機器學習專案所需的套件。 下表列出機器學習的常用存放庫:

主機名稱 目的
anaconda.com
*.anaconda.com
用來安裝預設封裝。
*.anaconda.org 用來取得存放庫資料。
pypi.org 用來列出來自預設索引的相依性 (如果有的話),而且使用者設定不會覆寫索引。 如果覆寫索引,您也必須允許 *.pythonhosted.org
cloud.r-project.org 安裝CRAN套件以進行 R 開發時使用。
*.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.windows.net
*.gallerycdn.vsassets.io
下載並安裝 Visual Studio Code 延伸模組的必要專案。 這些主機可讓遠端連線到適用於Visual StudioCode的 Azure ML 擴充功能所提供的計算實例。 如需詳細資訊,請參閱在 Visual Studio Code 中連線至 Azure Machine Learning 運算執行個體
raw.githubusercontent.com/microsoft/vscode-tools-for-ai/master/azureml_remote_websocket_server/* 用來擷取安裝在計算實例上的Websocket伺服器位。 Websocket 伺服器用來將 Visual Studio Code 用戶端 (桌面應用程式) 的要求,傳輸至運算執行個體上執行的 Visual Studio Code 伺服器。

注意

使用 Azure 機器學習 VS Code 擴充功能時,遠端計算實例將需要存取公用存放庫,才能安裝擴充功能所需的套件。 如果計算實例需要 Proxy 才能存取這些公用存放庫或因特網,您必須在計算實例的檔案中~/.bashrc設定和匯出 HTTP_PROXYHTTPS_PROXY 環境變數。 此程式可以在布建時使用 自定義腳本自動化。

搭配 Azure 機器學習 使用 Azure Kubernetes Service (AKS) 時,允許下列 AKS VNet 流量:

  • AKS 的一般輸入/輸出需求,如限制 Azure Kubernetes Service 中的輸出流量一文所述
  • 輸出 至 mcr.microsoft.com。
  • 將模型部署至 AKS 叢集時,請使用將 ML 模型部署至 Azure Kubernetes Service 一文中的指引。

如需使用防火牆解決方案的詳細資訊,請參閱搭配 Azure 機器學習 使用防火牆。

下一步

本文是關於保護 Azure Machine Learning 工作流程系列文章的一部分。 請參閱本系列的其他文章: