使用 Azure Machine Learning SDK (v1) 大規模將 TensorFlow 模型定型

適用於:Python SDK azureml v1

在本文中,了解如何使用 Azure Machine Learning 大規模執行您的 TensorFlow 定型指令碼。

此範例會定型並註冊 TensorFlow 模型,使用深度神經網路 (DNN) 將手寫數字分類。

無論您是從頭開始開發 TensorFlow 模型,或是將現有的模型帶入雲端,您都可以使用 Azure Machine Learning 來擴增開放原始碼定型作業,以建立、部署、設定版本和監視生產等級的模型。

必要條件

在下列任一環境中執行此程式碼:

  • Azure Machine Learning 計算執行個體 - 不需要下載或安裝

    • 完成快速入門:開始使用 Azure Machine Learning,以透過 SDK 和範例存放庫建立預先載入的專用筆記本伺服器。
    • 在筆記本伺服器上的範例深度學習資料夾中,藉由瀏覽至下列目錄來尋找完整和擴充的筆記本:how-to-use-azureml > ml-frameworks > tensorflow > train-hyperparameter-tune-deploy-with-tensorflow 資料夾。
  • 您自己的 Jupyter Notebook 伺服器

    您也可以在 GitHub 範例頁面上找到本指南的完整 Jupyter Notebook 版本。 筆記本包含擴充的章節,涵蓋智慧型超參數微調、模型部署和筆記本小工具。

您必須先要求增加工作區的配額,才能執行本文中的程式碼以建立 GPU 叢集。

設定實驗

本節會藉由載入所需的 Python 套件、初始化工作區、建立計算目標,以及定義定型環境,來設定訓練實驗。

匯入套件

首先,匯入必要的 Python 程式庫。

import os
import urllib
import shutil
import azureml

from azureml.core import Experiment
from azureml.core import Workspace, Run
from azureml.core import Environment

from azureml.core.compute import ComputeTarget, AmlCompute
from azureml.core.compute_target import ComputeTargetException

初始化工作區

Azure Machine Learning 工作區是服務的最上層資源。 其可提供集中式位置以處理您建立的所有成品。 在 Python SDK 中,您可以藉由建立 workspace 物件來存取工作區成品。

必要條件區段建立的 config.json 檔案建立工作區物件。

ws = Workspace.from_config()

建立檔案資料集

FileDataset 物件會參考您工作區資料存放區中的一個或多個檔案或公用 URL。 檔案可以是任何格式,而類別可讓您將檔案下載或掛接至您的計算。 您可以藉由建立 FileDataset 來建立來源位置的參考。 如果您對資料集套用任何轉換,這些轉換也會儲存在資料集中。 資料會保留在現有的位置,因此不會產生額外的儲存成本。 如需 Dataset 套件的詳細資訊,請參閱如何建立註冊資料集一文

from azureml.core.dataset import Dataset

web_paths = [
            'http://yann.lecun.com/exdb/mnist/train-images-idx3-ubyte.gz',
            'http://yann.lecun.com/exdb/mnist/train-labels-idx1-ubyte.gz',
            'http://yann.lecun.com/exdb/mnist/t10k-images-idx3-ubyte.gz',
            'http://yann.lecun.com/exdb/mnist/t10k-labels-idx1-ubyte.gz'
            ]
dataset = Dataset.File.from_files(path = web_paths)

使用 register() 方法將資料集註冊到您的工作區,使其可以與其他人共用、在各種不同的實驗中重複使用,以及讓定型指令碼中的名稱參照。

dataset = dataset.register(workspace=ws,
                           name='mnist-dataset',
                           description='training and test dataset',
                           create_new_version=True)

# list the files referenced by dataset
dataset.to_path()

建立計算目標

建立要在其上執行 TensorFlow 作業的計算目標。 在此範例中,建立已啟用 GPU 的 Azure Machine Learning 計算叢集。

重要

您必須先要求增加工作區的配額,才能建立 GPU 叢集。

cluster_name = "gpu-cluster"

try:
    compute_target = ComputeTarget(workspace=ws, name=cluster_name)
    print('Found existing compute target')
except ComputeTargetException:
    print('Creating a new compute target...')
    compute_config = AmlCompute.provisioning_configuration(vm_size='STANDARD_NC6', 
                                                           max_nodes=4)

    compute_target = ComputeTarget.create(ws, cluster_name, compute_config)

    compute_target.wait_for_completion(show_output=True, min_node_count=None, timeout_in_minutes=20)

如需計算目標的詳細資訊,請參閱什麼是計算目標一文。

定義環境

若要定義 Azure Machine Learning 環境,以封裝定型指令碼的相依性,您可以定義自訂環境,或使用 Azure Machine Learning 策展環境。

使用策展的環境

如果您不想要定義自己的環境,Azure Machine Learning 可提供預先建置的策展環境。 Azure Machine Learning 有數個 CPU 和 GPU 策展環境,讓 TensorFlow 對應至不同 TensorFlow 版本。 您可以透過使用 @latest 指示詞使用此環境的最新版本。 如需詳細資訊,請參閱 Azure Machine Learning 策展環境

如果您想要使用策劃的環境,程式碼會類似下列範例:

curated_env_name = 'AzureML-tensorflow-2.7-ubuntu20.04-py38-cuda11-gpu'
tf_env = Environment.get(workspace=ws, name=curated_env_name)

若要查看策展環境中包含的套件,您可以將 conda 相依性寫出至磁碟:


tf_env.save_to_directory(path=curated_env_name)

請確定策展環境包含定型指令碼所需的所有相依性。 如果沒有,您就必須修改環境以包含遺漏的相依性。 如果環境已修改,您必須為其指定新的名稱,因為 'AzureML' 首碼已保留給策展環境。 如果您修改了 conda 相依性 YAML 檔案,您可以使用新名稱來建立新的環境,例如:


tf_env = Environment.from_conda_specification(name='AzureML-tensorflow-2.7-ubuntu20.04-py38-cuda11-gpu', file_path='./conda_dependencies.yml')

如果您改為直接修改策展環境物件,您可以使用新的名稱來複製該環境:


tf_env = tf_env.clone(new_name='my-AzureML-tensorflow-2.7-ubuntu20.04-py38-cuda11-gpu')

建立自訂環境

您也可以建立自己的 Azure Machine Learning 環境,以封裝定型指令碼的相依性。

首先,在 YAML 檔案中定義您的 conda 相依性;在此範例中,會將檔案命名為 conda_dependencies.yml

channels:
- conda-forge
dependencies:
- python=3.7
- pip:
  - azureml-defaults
  - tensorflow-gpu==2.2.0

從這個 Conda 環境規格建立 Azure Machine Learning 環境。 環境會在執行階段封裝至 Docker 容器。

根據預設,如果未指定基礎映像,Azure Machine Learning 會使用 CPU 映像 azureml.core.environment.DEFAULT_CPU_IMAGE 作為基礎映像。 因為此範例會在 GPU 叢集上執行定型,所以您必須指定具有必要 GPU 驅動程式和相依性的 GPU 基礎映像。 Azure Machine Learning 會維護一組在 Microsoft Container Registry (MCR) 上發佈且可供您使用的基礎映像,如需詳細資訊,請參閱 Azure/AzureML 容器 GitHub 存放庫 (英文)。

tf_env = Environment.from_conda_specification(name='AzureML-tensorflow-2.7-ubuntu20.04-py38-cuda11-gpu', file_path='./conda_dependencies.yml')

# Specify a GPU base image
tf_env.docker.enabled = True
tf_env.docker.base_image = 'mcr.microsoft.com/azureml/openmpi3.1.2-cuda10.1-cudnn7-ubuntu18.04'

提示

您可以選擇性地直接在自訂 Docker 映像或 Dockerfile 中擷取所有相依性,並從該映像建立您的環境。 如需詳細資訊,請參閱使用自訂映像定型

如需有關建立和使用環境的詳細資訊,請參閱在 Azure Machine Learning 中建立和使用軟體環境

設定並提交您的定型執行

建立 ScriptRunConfig

建立 ScriptRunConfig 物件,以指定定型作業的組態詳細資料,包括您的定型指令碼、要使用的環境,以及要在其上執行的計算目標。 如果在 arguments 參數中指定,您定型指令碼的任何引數將透過命令列傳遞。

from azureml.core import ScriptRunConfig

args = ['--data-folder', dataset.as_mount(),
        '--batch-size', 64,
        '--first-layer-neurons', 256,
        '--second-layer-neurons', 128,
        '--learning-rate', 0.01]

src = ScriptRunConfig(source_directory=script_folder,
                      script='tf_mnist.py',
                      arguments=args,
                      compute_target=compute_target,
                      environment=tf_env)

警告

Azure Machine Learning 藉由複製整個來源目錄來執行定型指令碼。 如果您有不想要上傳的敏感性資料,請使用 .ignore 檔案,或不要將其包含在來源目錄中。 相反地,請使用 Azure Machine Learning 資料集來存取您的資料。

如需使用 ScriptRunConfig 來設定作業的詳細資訊,請參閱設定和提交定型執行

警告

如果您先前使用 TensorFlow 估算器來設定 TensorFlow 定型作業,請注意估算器已在 1.19.0 SDK 版本被取代。 有了 Azure Machine Learning SDK >= 1.15.0,ScriptRunConfig 會是設定定型作業 (包括使用深度學習架構的作業) 的建議方式。 針對常見的遷移問題,請參閱估算器至 ScriptRunConfig 遷移指南

提交執行

當作業正在執行時,執行物件會提供介面給執行歷程記錄,並在完成後提供。

run = Experiment(workspace=ws, name='Tutorial-TF-Mnist').submit(src)
run.wait_for_completion(show_output=True)

執行期間發生的情況

流程執行時,會經歷下列階段:

  • 準備:根據定義的環境來建置 Docker 映像。 映像上傳至工作區的容器登錄,並快取以供稍後執行。 記錄也會串流至執行歷程記錄,並可檢視以監視進度。 如果改為指定策展環境,則會使用支援該策展環境的快取映像。

  • 縮放:如果 Batch AI 叢集需要更多節點來執行執行比目前可用的節點,則叢集會嘗試擴大規模。

  • 執行中:指令碼資料夾中的所有指令碼都會上傳至計算目標、掛接或複製資料存放區,並執行 script。 stdout 和 ./logs 資料夾的輸出都會串流到執行歷程記錄,並且可用來監視執行。

  • 後置處理:執行的 ./outputs 資料夾會複製到執行歷程記錄。

註冊或下載模型

將模型定型之後,您可以將其註冊到您的工作區。 註冊模型可讓您在工作區中儲存模型並設定其版本,以簡化模型管理和部署

選擇性:藉由指定參數 model_frameworkmodel_framework_versionresource_configuration,將無程式碼模型部署變成可用狀態。 這可讓您直接將模型從已註冊的模型部署為 Web 服務,而 ResourceConfiguration 物件會定義 Web 服務的計算資源。

from azureml.core import Model
from azureml.core.resource_configuration import ResourceConfiguration

model = run.register_model(model_name='tf-mnist', 
                           model_path='outputs/model',
                           model_framework=Model.Framework.TENSORFLOW,
                           model_framework_version='2.0',
                           resource_configuration=ResourceConfiguration(cpu=1, memory_in_gb=0.5))

您也可以使用 Run 物件來下載模型的本機複本。 在定型指令碼 tf_mnist.py 中,TensorFlow 儲存物件會將模型保存到本機資料夾 (對於計算目標是本機)。 您可以使用 Run 物件下載複本。

# Create a model folder in the current directory
os.makedirs('./model', exist_ok=True)
run.download_files(prefix='outputs/model', output_directory='./model', append_prefix=False)

分散式訓練

Azure Machine Learning 也支援多節點分散式 TensorFlow 作業,讓您可以調整定型工作負載。 您可以輕鬆地執行分散式 TensorFlow 作業,Azure Machine Learning 會為您管理協調流程。

Azure Machine Learning 支援使用 Horovod 和 TensorFlow 的內建分散式定型 API 來執行分散式 TensorFlow 作業。

如需分散式定型的詳細資訊,請參閱分散式 GPU 定型指南

部署 TensorFlow 模型

部署操作說明包含註冊模型區段,但您可以針對部署直接跳到建立計算目標,因為您已經有註冊的模型。

(預覽版) 無程式碼模型部署

重要

此功能目前處於公開預覽。 此預覽版本沒有服務等級協定,不建議用於處理生產工作負載。 可能不支援特定功能,或可能已經限制功能。

如需詳細資訊,請參閱 Microsoft Azure 預覽版增補使用條款

除了傳統的部署路由之外,您也可以使用無程式碼部署功能 (預覽版) 進行 TensorFlow。 藉由使用 model_frameworkmodel_framework_versionresource_configuration 參數來註冊您的模型 (如上所示),您可以使用 deploy() 靜態函式來部署您的模型。

service = Model.deploy(ws, "tensorflow-web-service", [model])

完整的操作說明涵蓋 Azure Machine Learning 中更深入的部署。

下一步

在本文中,您已定型並註冊 TensorFlow 模型,並了解部署選項。 若要深入了解 Azure Machine Learning,請參閱下列其他文章。