使用虛擬網路保護 Azure Machine Learning 訓練環境 (SDKv1)
適用於: Python SDK azureml v1 (部分機器翻譯)
在本文中,您將了解如何使用 Python SDK v1,在 Azure Machine Learning 中使用虛擬網路來保護訓練環境。
Azure Machine Learning 計算執行個體和計算叢集可用來在虛擬網路中安全地將模型定型。 規劃環境時,您可以設定具有公用 IP 位址或無公用 IP 位址的計算執行個體/叢集。 兩者之間的一般差異如下:
- 無公用 IP:由於沒有相同的網路資源需求,因此成本較低。 可藉由移除來自網際網路的輸入流量需求來改善安全性。 不過,如果要針對必要資源 (Microsoft Entra ID、Azure Resource Manager 等等) 啟用輸出存取,則必須進行額外的設定變更。
- 公用 IP:預設使用,但由於需要額外的 Azure 網路資源,因此成本較高。 必須透過公用網際網路從 Azure Machine Learning 服務進行輸入通訊。
下表包含這些設定之間的差異:
組態 | 具有公用 IP | 無公用 IP |
---|---|---|
輸入流量 | AzureMachineLearning 服務標籤。 |
無 |
輸出流量 | 根據預設,可以存取公用網際網路上的資源,而無任何限制。 可使用網路安全性群組或防火牆來限制其存取的內容。 |
根據預設,它無法存取網際網路。 如果仍然可以將輸出流量傳送至網際網路,那是因為有 Azure 預設輸出存取,而且您有一個允許輸出到網際網路的 NSG。 我們不建議使用預設輸出存取。 如果您需要網際網路輸出存取權,而且需要將輸出流量路由至網際網路上的所需資源,則建議您使用虛擬網路 NAT 閘道或防火牆。 |
Azure 網路資源 | 公用 IP 位址、負載平衡器、網路介面 | 無 |
您也可以使用 Azure Databricks 或 HDInsight 在虛擬網路中定型模型。
提示
您可以使用 Azure Machine Learning「受控虛擬網路」,而不是本文中的步驟。 透過受控虛擬網路,Azure Machine Learning 可以處理工作區和受控計算的網路隔離作業。 您也可以為工作區所需的資源 (例如 Azure 儲存體帳戶) 新增私人端點。 如需詳細資訊,請參閱工作區受控網路隔離 (部分機器翻譯)。
注意
如需使用 Azure Machine Learning 工作室 和 Python SDK v2 的相關資訊,請參閱 保護訓練環境 (v2)。
如需了解如何建立安全工作區的教學課程,請參閱教學課程:在 Azure 入口網站中建立安全工作區 (英文)、Bicep 範本 (英文) 或 Terraform 範本 (英文)。
在本文中,您將了解如何在虛擬網路中保護下列訓練計算資源:
- Azure Machine Learning 計算叢集
- Azure Machine Learning 計算執行個體
- Azure Databricks
- 虛擬機器
- HDInsight 叢集
重要
本文中標示為「預覽」的項目,目前處於公開預覽狀態。 此預覽版本會在沒有服務等級協定的情況下提供,不建議用於實際執行工作負載。 可能不支援特定功能,或可能已經限制功能。 如需詳細資訊,請參閱 Microsoft Azure 預覽版增補使用條款。
必要條件
請參閱網路安全性概觀,以了解常見的虛擬網路情節和整體虛擬網路架構。
用於計算資源的現有虛擬網路和子網路。 此 VNet 必須位於與 Azure Machine Learning 工作區相同的訂用帳戶中。
- 建議您將工作區和定型作業所使用的儲存體帳戶放在您打算用於計算執行個體和叢集的相同 Azure 區域中。 如果它們不在相同的 Azure 區域,則可能會產生資料傳輸成本,並導致更嚴重的網路延遲。
- 請確定 VNet 中的
*.instances.azureml.net
和*.instances.azureml.ms
允許使用 WebSocket 通訊。 Jupyter 會在計算執行個體上使用 WebSocket。
虛擬網路中現有的子網路。 建立計算執行個體和叢集時,會使用此子網路。
- 請確認子網路未委派至任何其他 Azure 服務。
- 請確認子網路有足夠可用的 IP 位址。 每個計算執行個體都需要一個 IP 位址。 計算叢集中的每個節點都需要一個 IP 位址。
如果您有自己的 DNS 伺服器,則建議使用 DNS 轉送來解析計算執行個體和叢集的完整網域名稱 (FQDN)。 如需詳細資訊,請參閱如何搭配 Azure Machine Learning 使用自訂 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 Machine Learning 計算叢集/執行個體
您可以在工作區以外的不同區域和 VNet 中建立計算叢集。 不過,此功能僅適用於 SDK v2、CLI v2 或工作室。 如需詳細資訊,請參閱 v2 版的安全定型環境 (部分機器翻譯)。
Azure Lighthouse 不支援虛擬網路中的計算叢集/執行個體部署。
在定型期間,您的計算執行個體與預設儲存體帳戶之間的私人網路通訊必須開啟埠 445。 例如,如果您的計算位於一個 VNet 中,而儲存體帳戶位於另一個 VNet 中,請勿封鎖儲存體帳戶 VNet 的埠 445。
Azure Databricks
- 虛擬網路必須在與 Azure Machine Learning 工作區相同的訂用帳戶和區域中。
- 如果工作區的 Azure 儲存體帳戶也在虛擬網路中受到保護,則這些帳戶必須位於與 Azure Databricks 叢集相同的虛擬網路中。
- 除了 Azure Databricks 所使用的 databricks-private 和 databricks-public 子網路外,還需要有針對虛擬網路所建立的預設子網路。
- Azure Databricks 不會使用私人端點來與虛擬網路通訊。
如需搭在虛擬網路中使用 Azure Databricks 的詳細資訊,請參閱在 Azure 虛擬網路中部署 Azure Databricks。
Azure HDInsight 或虛擬機器
- Azure Machine Learning 僅支援執行 Ubuntu 的虛擬機器。
無公用 IP 的計算執行個體/叢集
重要
如果您已在未選擇加入預覽版的情況下使用未設定公用 IP 的計算執行個體或計算叢集,則需要 2023 年 1 月 20 日 (即此功能正式推出的時間) 之後刪除並重新建立計算執行個體或計算叢集。
如果您先前使用無公用 IP 的預覽版,由於正式發行版本的需求有所變更,因此您可能需要修改允許輸入和輸出的流量,如下所示:
- 輸出需求 - 另外兩個輸出,僅用於管理計算執行個體與叢集。 這些服務標籤的目的地皆由 Microsoft 所擁有:
- UDP 連接埠 5831 上的
AzureMachineLearning
服務標籤。 - TCP 通訊埠 443 上的
BatchNodeManagement
服務標籤。
- UDP 連接埠 5831 上的
除了先決條件一節所列的設定外,下列設定也專門用於建立無公用 IP 的計算執行個體/叢集:
您必須使用計算資源的工作區私人端點,才能從 VNet 與 Azure Machine Learning 服務進行通訊。 如需詳細資訊,請參閱設定 Azure Machine Learning 工作區的私人端點。
在您的 VNet 中,允許下列服務標籤或完整網域名稱的輸出流量 (FQDN):
服務標籤 通訊協定 Port 注意 AzureMachineLearning
TCP
UDP443/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 Machine Learning 資料外流保護一文。FQDN 通訊協定 Port 注意 <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 來建立資源:
登入 Azure Machine Learning 工作室,然後選取您的訂用帳戶和工作區。
從左側導覽列中選取 [計算] 頁面。
從計算執行個體或計算叢集的導覽列中選取 [+ 新增]。
設定所需的 VM 大小和設定,然後選取 [下一步]。
從 [進階設定] 中,選取 [啟用虛擬網路]、您的虛擬網路和子網路,最後選取 [VNet/子網路] 區段下的 [無公用 IP] 選項。
提示
您也可以使用 Azure Machine Learning SDK v2 或適用於 ML v2 的 Azure CLI 延伸模組。 如需有關建立無公用 IP 之計算執行個體或叢集的詳細資訊,請參閱保護 Azure Machine Learning 定型環境一文的 v2 版本 (部分機器翻譯)。
具有公用 IP 的計算執行個體/叢集
除了先決條件一節所列的設定外,下列設定也專門用於建立具有公用 IP 的計算執行個體/叢集:
如果將多個計算執行個體/叢集放在一個虛擬網路中,您可能必須要求為一或多個資源增加配額。 Machine Learning 計算執行個體或叢集會自動將網路資源配置在包含虛擬網路的資源群組中。 針對每個計算執行個體或叢集,服務會配置下列資源:
網路安全性群組 (NSG) 會自動建立。 此 NSG 允許連接埠 44224 上來自
AzureMachineLearning
服務標籤的輸入 TCP 流量。重要
計算執行個體和計算叢集會自動建立包含必要規則的 NSG。
如果子網路層級有另一個 NSG,子網路層級 NSG 中的規即不得與自動建立 NSG 中的規則衝突。
若要了解 NSG 如何篩選網路流量,請參閱網路安全性群組如何篩選網路流量。
一個負載平衡器
若是計算叢集,每次叢集縮小為 0 個節點時,這些資源就會刪除,而擴大時則會建立這些資源。
若是計算執行個體,這些資源則會保留到刪除執行個體為止。 停止執行個體並不會移除資源。
重要
這些資源會被訂用帳戶的資源配額所限制。 如果虛擬網路資源群組遭到鎖定,則刪除計算叢集/執行個體將會失敗。 在刪除計算叢集/執行個體之前,將無法刪除負載平衡器。 此外,請確定沒有任何 Azure 原則指派會禁止建立網路安全性群組。
在 VNet 內,允許連接埠 44224 上來自
AzureMachineLearning
服務標籤的輸入 TCP 流量。重要
建立計算執行個體/叢集時,系統會動態指派公用 IP 位址。 由於在建立之前不知道位址,而且在建立流程中需要輸入存取,因此無法在防火牆上靜態指派該位址。 相反地,如果將 VNet 與防火牆搭配使用,則必須建立使用者定義的路由,以允許此輸入流量。
在您的 VNet 中,允許下列服務標籤的輸出流量:
服務標籤 通訊協定 Port 注意 AzureMachineLearning
TCP
UDP443/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 Machine Learning 資料外流保護一文。FQDN 通訊協定 Port 注意 <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 Machine Learning 工作區相同的訂用帳戶和區域中。
- 如果工作區的 Azure 儲存體帳戶也在虛擬網路中受到保護,則這些帳戶必須位於與 Azure Databricks 叢集相同的虛擬網路中。
- 除了 Azure Databricks 所使用的 databricks-private 和 databricks-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 Machine Learning 計算執行個體會使用連接埠 5831。 |
輸出 | ANY:443 | BatchNodeManagement.region |
與 Azure Machine Learning 計算執行個體/叢集的 Azure Batch 後端進行通訊。 |
輸出 | TCP:443 | AzureResourceManager |
使用 Azure Machine Learning、Azure CLI 與 Azure Machine Learning 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 Machine Learning 路由器。 |
提示
如果您需要 IP 位址而非服務標籤,請使用下列其中一個選項:
- 從 Azure IP 範圍和服務標籤下載清單。
- 使用 Azure CLI az network list-service-tags 命令。
- 使用 Azure PowerShell Get-AzNetworkServiceTag 命令。
IP 位址可能定期變更。
您可能也需要允許輸出流量流向 Visual Studio Code 和非 Microsoft 網站,以安裝機器學習專案所需的封裝。 下表列出機器學習常用的存放庫:
主機名稱 | 目的 |
---|---|
anaconda.com *.anaconda.com |
用來安裝預設封裝。 |
*.anaconda.org |
用來取得存放庫資料。 |
pypi.org |
用來列出來自預設索引的相依性 (如果有的話),而且使用者設定不會覆寫索引。 如果索引遭到覆寫,您也必須允許 *.pythonhosted.org 。 |
cloud.r-project.org |
安裝適用於 R 開發的 CRAN 封裝時使用。 |
*.pytorch.org |
由基於 PyTorch 的一些範例使用。 |
*.tensorflow.org |
由基於 Tensorflow 的一些範例使用。 |
code.visualstudio.com |
下載及安裝 Visual Studio Code 桌面版時所需。 Visual Studio Code 網頁版不需要此設定。 |
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 Studio Code 的 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 Machine Learning VS Code 延伸模組時,遠端計算執行個體需要存取公用存放庫,才能安裝延伸模組所需的封裝。 如果計算執行個體需要 Proxy 才能存取這些公用存放庫或網際網路,則必須在計算執行個體的 ~/.bashrc
檔案中設定並匯出 HTTP_PROXY
和 HTTPS_PROXY
環境變數。 可以使用自訂指令碼在佈建時自動執行此流程。
使用 Azure Kubernetes Service (AKS) 搭配 Azure Machine Learning 時,請允許下列流量流向 AKS VNet:
- AKS 的一般輸入/輸出需求,如在 Azure Kubernetes Service 中限制輸出流量一文所述。
- 輸出至 mcr.microsoft.com.
- 將模型部署至 AKS 叢集時,請使用將 ML 模型部署至 Azure Kubernetes Service 一文中的指導。
如需使用防火牆解決方案的相關資訊,請參閱搭配 Azure Machine Learning 使用防火牆。
下一步
本文是關於保護 Azure Machine Learning 工作流程系列文章的一部分。 請參閱本系列的其他文章: