Bedarfsgerechtes Trainieren von PyTorch-Modellen mit Azure Machine Learning SDK (v1)

GILT FÜR:Python SDK azureml v1

In diesem Artikel erfahren Sie, wie Sie Ihre PyTorch-Trainingsskripts im Unternehmensumfang mit Azure Machine Learning ausführen.

Die Beispielskripts in diesem Artikel werden dazu verwendet, Hühner- und Truthahnbilder zu klassifizieren, um ein neuronales Deep Learning-Netz (DNN) aufzubauen, basierend auf dem Tutorial zum Transferlernen von PyTorch. Lerntransfer ist ein Verfahren, bei dem das bei der Lösung eines Problems gewonnene Wissen auf ein anderes, aber verwandtes Problem angewandt wird. Transferlernen verkürzt den Trainingsprozess, da weniger Daten, Zeit und Computeressourcen benötigt werden als bei einem von Grund auf durchgeführten Training. Weitere Informationen zum Lerntransfer finden Sie im Artikel Deep Learning im Vergleich zu maschinellem Lernen.

Unabhängig davon, ob Sie ein PyTorch-Deep Learning-Modell von Grund auf trainieren, oder ob Sie ein vorhandenes Modell in die Cloud bringen, können Sie Azure Machine Learning zum Aufskalieren von Open-Source-Trainingsaufträgen mithilfe elastischer Cloud-Computeressourcen verwenden. Sie können produktionsgeeignete Modelle mit Azure Machine Learning erstellen, bereitstellen, überwachen sowie die Versionen verwalten.

Voraussetzungen

Führen Sie diesen Code in einer dieser Umgebungen aus:

Bevor Sie den Code in diesem Artikel ausführen können, um einen GPU-Cluster zu erstellen, müssen Sie für Ihren Arbeitsbereich eine Kontingenterhöhung anfordern.

Einrichten des Experiments

In diesem Abschnitt wird das Trainingsexperiment eingerichtet, indem die erforderlichen Python-Pakete geladen, ein Arbeitsbereich initialisiert, das Computeziel erstellt und die Trainingsumgebung definiert wird.

Importieren von Paketen

Importieren Sie zunächst die erforderlichen Python-Bibliotheken.

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

Initialisieren eines Arbeitsbereichs

Der Azure Machine Learning-Arbeitsbereich ist die Ressource der obersten Ebene für den Dienst. Er stellt den zentralen Ort für die Arbeit mit allen erstellten Artefakten dar. Im Python SDK können Sie auf die Arbeitsbereichsartefakte zugreifen, indem Sie ein workspace-Objekt erstellen.

Erstellen Sie ein Arbeitsbereichsobjekt aus der Datei config.json, die im Abschnitt „Voraussetzungen“ erstellt wurde.

ws = Workspace.from_config()

Abrufen von Daten

Das Dataset besteht aus etwa 120 Trainingsbildern, jeweils von Puten und Hühnern, mit 100 Validierungsbildern für jede Klasse. Im Rahmen unseres Trainingsskripts pytorch_train.py laden wir das Dataset herunter und extrahieren es. Die Bilder sind eine Teilmenge des Open Images v5 Dataset. Weitere Schritte zum Erstellen eines JSONL zum Trainieren mit eigenen Daten finden Sie in diesem Jupyter Notebook.

Vorbereiten des Trainingsskripts

In diesem Tutorial ist das Trainingsskript pytorch_train.py bereits bereitgestellt. In der Praxis können Sie jedes benutzerdefinierte Trainingsskript, wie es ist, verwenden und mit Azure Machine Learning ausführen.

Erstellen Sie einen Ordner für Ihre Trainingsskripts.

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

Erstellen eines Computeziels

Erstellen Sie ein Computeziel, auf dem der PyTorch-Auftrag ausgeführt werden soll. In diesem Beispiel erstellen Sie einen GPU-fähigen Azure Machine Learning-Computercluster.

Wichtig

Bevor Sie einen GPU-Cluster erstellen können, müssen Sie für Ihren Arbeitsbereich eine Kontingenterhöhung anfordern.


# 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)

Wenn Sie stattdessen einen CPU-Cluster erstellen möchten, geben Sie eine andere VM-Größe für den Parameter „vm_size“ an, z. B. STANDARD_D2_V2.

Weitere Informationen zu Computezielen finden Sie im Artikel Was ist ein Computeziel?.

Definieren der Umgebung

Um die Azure Machine Learning-Umgebung zu definieren, die die Abhängigkeiten Ihres Trainingsskripts kapselt, können Sie entweder eine benutzerdefinierte Umgebung definieren oder eine von Azure Machine Learning kuratierte Umgebung verwenden.

Verwenden einer zusammengestellten Umgebung

Optional stellt Azure Machine Learning vordefinierte, kuratierte Umgebungen bereit, falls Sie keine eigene Umgebung definieren möchten. Es gibt mehrere kuratierte CPU- und GPU-Umgebungen für PyTorch, die verschiedenen Versionen von PyTorch entsprechen.

Wenn Sie eine zusammengestellte Umgebung verwenden möchten, können Sie stattdessen den folgenden Befehl ausführen:

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

Um die Pakete anzuzeigen, die in der zusammengestellten Umgebung enthalten sind, können Sie die Conda-Abhängigkeiten auf den Datenträger schreiben:

pytorch_env.save_to_directory(path=curated_env_name)

Stellen Sie sicher, dass die zusammengestellte Umgebung alle Abhängigkeiten enthält, die von Ihrem Trainingsskript benötigt werden. Wenn dies nicht der Fall ist, müssen Sie die Umgebung so ändern, dass die fehlenden Abhängigkeiten eingeschlossen werden. Wenn die Umgebung geändert wird, müssen Sie ihr einen neuen Namen geben, da das Präfix „AzureML“ für zusammengestellte Umgebungen reserviert ist. Wenn Sie die YAML-Datei für Conda-Abhängigkeiten geändert haben, können Sie daraus eine neue Umgebung mit einem neuen Namen erstellen. Beispiel:

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

Wenn Sie das Objekt der zusammengestellten Umgebung stattdessen direkt geändert haben, können Sie diese Umgebung mit einem neuen Namen klonen:

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

Erstellen einer benutzerdefinierten Umgebung

Sie können auch eine eigene Azure Machine Learning-Umgebung erstellen, die die Abhängigkeiten Ihres Trainingsskripts kapselt.

Definieren Sie zunächst Ihre Conda-Abhängigkeiten in einer YAML-Datei. In diesem Beispiel trägt die Datei den Namen 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

Erstellen Sie anhand dieser Conda-Umgebungsspezifikation eine Azure Machine Learning-Umgebung. Die Umgebung wird zur Laufzeit in einen Docker-Container gepackt.

Wenn kein Basisimage angegeben wird, verwendet Azure Machine Learning standardmäßig das CPU-Image azureml.core.environment.DEFAULT_CPU_IMAGE als Basisimage. Da das Training in diesem Beispiel auf einem GPU-Cluster ausgeführt wird, müssen Sie ein GPU-Basisimage mit den erforderlichen GPU-Treibern und -Abhängigkeiten angeben. Azure Machine Learning verwaltet eine Reihe von Basisimages, die in Microsoft Container Registry (MCR) veröffentlicht werden, und die Sie verwenden können. Weitere Informationen finden Sie unter AzureML-Container: GitHub-Repository.

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'

Tipp

Optional können Sie einfach alle ihre Abhängigkeiten direkt in einem benutzerdefinierten Docker-Image oder in einer Dockerfile-Datei erfassen und Ihre Umgebung daraus erstellen. Weitere Informationen finden Sie unter Trainieren mit einem benutzerdefinierten Image.

Weitere Informationen zum Erstellen und Verwenden von Umgebungen finden Sie unter Erstellen und Verwenden von Softwareumgebungen in Azure Machine Learning.

Konfigurieren und Übermitteln Ihrer Trainingsausführung

Erstellen eines ScriptRunConfig-Elements

Erstellen Sie ein ScriptRunConfig- Objekt, um die Konfigurationsdetails Ihres Trainingsauftrags anzugeben, einschließlich Ihres Trainingsskripts, der zu verwendenden Umgebung und des Computeziels für die Ausführung. Alle Argumente des Trainingsskripts werden über die Befehlszeile übergeben, wenn sie im arguments Parameter angegeben sind. Mit dem folgenden Code wird ein PyTorch-Auftrag mit einem Knoten konfiguriert.

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)

Warnung

Zum Ausführen von Trainingsskripts wird von Azure Machine Learning das gesamte Quellverzeichnis kopiert. Sind vertrauliche Daten vorhanden, die nicht hochgeladen werden sollen, verwenden Sie die IGNORE-Datei, oder platzieren Sie sie nicht im Quellverzeichnis. Greifen Sie stattdessen über ein Azure Machine Learning-Dataset auf Ihre Daten zu.

Weitere Informationen zum Konfigurieren von Aufträgen mit ScriptRunConfig finden Sie unter Konfigurieren und Übermitteln von Trainingsausführungen.

Warnung

Wenn Sie zuvor den PyTorch-Schätzer zum Konfigurieren Ihrer PyTorch-Trainingsaufträge verwendet haben, beachten Sie, dass der Schätzer mit der Veröffentlichung von Release 1.19.0 des SDK als veraltet eingestuft wurde. Beim Azure Machine Learning SDK >= 1.15.0 ist ScriptRunConfig die empfohlene Vorgehensweise zum Konfigurieren von Trainingsaufträgen, einschließlich derjenigen, die Deep Learning-Frameworks verwenden. Allgemeine Fragen zur Migration finden Sie im Leitfaden zur Migration vom Schätzer zu ScriptRunConfig.

Übermitteln Ihrer Ausführung

Das Run-Objekt bildet die Schnittstelle zum Ausführungsverlauf, während der Auftrag ausgeführt wird und nachdem er abgeschlossen wurde.

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

Was passiert während der Ausführung

Die Ausführung durchläuft die folgenden Phasen:

  • Vorbereitung: Ein Docker-Image wird entsprechend der definierten Umgebung erstellt. Das Image wird in die Containerregistrierung des Arbeitsbereichs hochgeladen und für spätere Ausführungen zwischengespeichert. Darüber hinaus werden Protokolle in den Ausführungsverlauf gestreamt, mit deren Hilfe der Status überwacht werden kann. Wenn stattdessen eine zusammengestellte Umgebung angegeben wird, wird das zwischengespeicherte Image verwendet, das diese zusammengestellte Umgebung unterstützt.

  • Skalierung: Der Cluster versucht ein Hochskalieren, wenn der Batch KI-Cluster mehr Knoten zur Ausführung benötigt, als derzeit verfügbar sind.

  • Wird ausgeführt: Alle Skripts im Skriptordner werden auf das Computeziel hochgeladen, Datenspeicher werden bereitgestellt oder kopiert, und script wird ausgeführt. Ausgaben aus „stdout“ und dem Ordner ./logs werden in den Ausführungsverlauf gestreamt und können zur Überwachung der Ausführung verwendet werden.

  • Nachbearbeitung: Der Ordner ./outputs der Ausführung wird in den Ausführungsverlauf kopiert.

Registrieren oder Herunterladen eines Modells

Sobald Sie das Modell trainiert haben, können Sie es in Ihrem Arbeitsbereich registrieren. Die Modellregistrierung bietet die Möglichkeit, Ihre Modelle in Ihrem Arbeitsbereich zu speichern und zu versionieren, um die Modellverwaltung und -bereitstellung zu vereinfachen.

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

Tipp

Die Schrittanleitung zur Bereitstellung enthält einen Abschnitt zur Registrierung von Modellen, aber Sie können direkt zu Erstellen eines Computeziels für die Bereitstellung springen, da Sie bereits über ein registriertes Modell verfügen.

Mit dem Run-Objekt können Sie auch eine lokale Kopie des Modells herunterladen. Im Trainingsskript pytorch_train.py wird das Modell durch ein Speicherobjekt von PyTorch persistent in einem lokalen Ordner (lokal für das Computeziel) gespeichert. Sie können das Run-Objekt verwenden, um eine Kopie herunterzuladen.

# 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'), 

Verteiltes Training

Azure Machine Learning unterstützt auch verteilte PyTorch-Aufträge auf mehreren Knoten, sodass Sie Ihre Trainingworkloads skalieren können. Sie können ganz einfach verteilte PyTorch-Aufträge ausführen. Azure Machine Learning verwaltet die Orchestrierung für Sie.

Azure Machine Learning unterstützt die Ausführung verteilter PyTorch-Aufträge sowohl mit Horovod als auch mit dem integrierten DistributedDataParallel-Modul von PyTorch.

Weitere Informationen zum verteilten Training finden Sie im Leitfaden für das verteilte GPU-Training.

Exportieren nach ONNX

Um Rückschlüsse mit der ONNX-Runtime zu optimieren, konvertieren Sie Ihr trainiertes PyTorch-Modell in dass ONNX-Format. Rückschlüsse oder Modellbewertungen stellen die Phase dar, in der das bereitgestellte Modell für die Vorhersage verwendet wird (meist für Produktionsdaten). Ein Beispiel finden Sie im Tutorial: Exportieren eines Modells aus PyTorch nach ONNX.

Nächste Schritte

In diesem Artikel haben Sie ein neuronales Deep Learning-Netz mithilfe von PyTorch in Azure Machine Learning trainiert und registriert. Um zu erfahren, wie Sie ein Modell bereitstellen, fahren Sie mit unserem Artikel zur Modellbereitstellung fort.