Share via


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

適用於:Python SDK azureml v1

在本文中,了解如何使用 Azure Machine Learning 以企業級規模執行您的 PyTorch 定型指令碼。

本文中的範例指令碼可用來將雞和火雞影像分類,以根據 PyTorch 的傳輸學習教學課程,建立深度學習神經網路 (DNN)。 傳輸學習是一種技術,可將從解決一個問題所獲得的知識運用到不同但相關的問題。 傳輸學習可以藉由要求比從頭訓練更少的資料、時間和計算資源,來縮短定型流程。 若要深入了解傳輸學習,請參閱深度學習與機器學習一文。

無論您是從頭開始定型深度學習 PyTorch 模型,或是將現有的模型帶到雲端,您都可以使用 Azure Machine Learning,利用彈性的雲端計算資源來擴增開放原始碼定型作業。 您可以使用 Azure Machine Learning 建立、部署、版本設定和監視生產等級的模型。

必要條件

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

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

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

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

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

設定實驗

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

匯入套件

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

import os
import shutil

from azureml.core.workspace import Workspace
from azureml.core import Experiment
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()

取得資料

此資料集包含火雞和雞各有大約 120 個定型影像,每個類別都有 100 個驗證影像。 我們會將資料集下載並解壓縮,作為定型指令碼 pytorch_train.py 的一部分。 影像是 Open Images v5 資料集的子集。 如需建立 JSONL 以使用您自己的資料定型的更多步驟,請參閱此 Jupyter Notebook

建立定型指令碼

在本教學課程中,已提供定型指令碼 pytorch_train.py。 實際上,您可以採用任何自訂定型指令碼,依原樣使用以及與 Azure Machine Learning 搭配執行。

為您的定型指令碼建立資料夾。

project_folder = './pytorch-birds'
os.makedirs(project_folder, exist_ok=True)
shutil.copy('pytorch_train.py', project_folder)

建立計算目標

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

重要

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


# Choose a name for your CPU cluster
cluster_name = "gpu-cluster"

# Verify that cluster does not exist already
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)

    # Create the cluster with the specified name and configuration
    compute_target = ComputeTarget.create(ws, cluster_name, compute_config)

    # Wait for the cluster to complete, show the output log
    compute_target.wait_for_completion(show_output=True, min_node_count=None, timeout_in_minutes=20)

如果您想要改為建立 CPU 叢集,請對 vm_size 參數提供不同的 VM 大小,例如 STANDARD_D2_V2。

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

定義環境

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

使用策展的環境

如果您不想要定義自己的環境,Azure Machine Learning 可提供預先建置的策展環境。 有數個 CPU 和 GPU 策展環境,讓 PyTorch 對應至不同 PyTorch 版本。

如果您想要使用策展環境,可以改為執行下列命令:

curated_env_name = 'AzureML-PyTorch-1.6-GPU'
pytorch_env = Environment.get(workspace=ws, name=curated_env_name)

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

pytorch_env.save_to_directory(path=curated_env_name)

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

pytorch_env = Environment.from_conda_specification(name='pytorch-1.6-gpu', file_path='./conda_dependencies.yml')

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

pytorch_env = pytorch_env.clone(new_name='pytorch-1.6-gpu')

建立自訂環境

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

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

channels:
- conda-forge
dependencies:
- python=3.7
- pip=21.3.1
- pip:
  - azureml-defaults
  - torch==1.6.0
  - torchvision==0.7.0
  - future==0.17.1
  - pillow

從這個 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) 上發佈的基礎映像。 如需詳細資訊,請參閱 AzureML-容器 GitHub 存放庫

pytorch_env = Environment.from_conda_specification(name='pytorch-1.6-gpu', file_path='./conda_dependencies.yml')

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

提示

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

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

設定並提交您的定型執行

建立 ScriptRunConfig

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

from azureml.core import ScriptRunConfig

src = ScriptRunConfig(source_directory=project_folder,
                      script='pytorch_train.py',
                      arguments=['--num_epochs', 30, '--output_dir', './outputs'],
                      compute_target=compute_target,
                      environment=pytorch_env)

警告

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

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

警告

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

提交您的執行

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

run = Experiment(ws, name='Tutorial-pytorch-birds').submit(src)
run.wait_for_completion(show_output=True)

執行期間發生的情況

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

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

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

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

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

註冊或下載模型

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

model = run.register_model(model_name='pytorch-birds', model_path='outputs/model.pt')

提示

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

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

# Create a model folder in the current directory
os.makedirs('./model', exist_ok=True)

# Download the model from run history
run.download_file(name='outputs/model.pt', output_file_path='./model/model.pt'), 

分散式訓練

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

Azure Machine Learning 支援使用 Horovod 和 PyTorch 的內建 DistributedDataParallel 模組來執行分散式 PyTorch 作業。

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

匯出至 ONNX

若要使用 ONNX 執行階段將推斷最佳化,請將您的已定型 PyTorch 模型轉換為 ONNX 格式。 推斷 (或模型評分) 是將部署的模型用於預測的階段,通常用於生產資料。 如需範例,請參閱將模型從 PyTorch 匯出至 ONNX 教學課程

下一步

在本文中,您已在 Azure Machine Learning 上使用 PyTorch 來定型和註冊深度學習和神經網路。 若要了解如何部署模型,請繼續進行我們的模型部署文章。