PyTorch-modellen op schaal trainen met Azure Machine Learning SDK (v1)

VAN TOEPASSING OP: Python SDK azureml v1

In dit artikel leert u hoe u uw PyTorch-trainingsscripts op ondernemingsniveau uitvoert met behulp van Azure Machine Learning.

De voorbeeldscripts in dit artikel worden gebruikt om kippen- en kalkoenafbeeldingen te classificeren om een DNN (Deep Learning Neural Network) te bouwen op basis van de zelfstudie over transfer learning van PyTorch. Leren overdragen is een techniek die kennis toepast die is opgedaan bij het oplossen van één probleem op een ander, maar gerelateerd probleem. Leerproces overdragen verkort het trainingsproces door minder gegevens, tijd en rekenresources te vereisen dan de training helemaal zelf. Zie het artikel over deep learning versus machine learning voor meer informatie over overdrachtsleer .

Of u nu een Deep Learning PyTorch-model traint vanaf de basis of als u een bestaand model in de cloud brengt, kunt u Azure Machine Learning gebruiken om opensource-trainingstaken uit te schalen met behulp van elastische cloud-rekenresources. U kunt modellen op productieniveau bouwen, implementeren, versien en bewaken met Azure Machine Learning.

Vereisten

Voer deze code uit op een van deze omgevingen:

  • Azure Machine Learning-rekenproces: er zijn geen downloads of installatie nodig

    • Voltooi de quickstart: Aan de slag met Azure Machine Learning om een toegewezen notebookserver te maken die vooraf is geladen met de SDK en de voorbeeldopslagplaats.
    • Zoek in de map Deep Learning-voorbeelden op de notebookserver een voltooid en uitgebreid notebook door naar deze map te navigeren: how-to-use-azureml > ml-frameworks > pytorch > train-hyperparameter-tune-deploy-with-pytorch folder.
  • Uw eigen Jupyter Notebook-server

    U kunt ook een voltooide Jupyter Notebook-versie van deze handleiding vinden op de pagina met GitHub-voorbeelden. Het notebook bevat uitgebreide secties met intelligente afstemming van hyperparameters, modelimplementatie en notebookwidgets.

Voordat u de code in dit artikel kunt uitvoeren om een GPU-cluster te maken, moet u een quotumverhoging aanvragen voor uw werkruimte.

Het experiment instellen

In deze sectie wordt het trainingsexperiment ingesteld door de vereiste Python-pakketten te laden, een werkruimte te initialiseren, het rekendoel te maken en de trainingsomgeving te definiëren.

Pakketten importeren

Importeer eerst de benodigde 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

Een werkruimte initialiseren

De Azure Machine Learning-werkruimte is de resource op het hoogste niveau voor de service. Het biedt u een centrale plek om te werken met alle artefacten die u maakt. In de Python SDK hebt u toegang tot de werkruimteartefacten door een workspace object te maken.

Maak een werkruimteobject op basis van het config.json bestand dat is gemaakt in de sectie Vereisten.

ws = Workspace.from_config()

De gegevens ophalen

De gegevensset bestaat uit ongeveer 120 trainingsafbeeldingen voor kalkoenen en kippen, met 100 validatieafbeeldingen voor elke klasse. We downloaden en extraheren de gegevensset als onderdeel van ons trainingsscript pytorch_train.py. De installatiekopieën zijn een subset van de Open Images v5-gegevensset. Zie dit Jupyter-notebook voor meer stappen voor het maken van een JSONL om met uw eigen gegevens te trainen.

Trainingsscript voorbereiden

In deze zelfstudie wordt het trainingsscript, pytorch_train.pyal opgegeven. In de praktijk kunt u elk aangepast trainingsscript gebruiken en uitvoeren met Azure Machine Learning.

Maak een map voor uw trainingsscript(s).

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

Een rekendoel maken

Maak een rekendoel waarop uw PyTorch-taak kan worden uitgevoerd. In dit voorbeeld maakt u een Azure Machine Learning-rekencluster met GPU.

Belangrijk

Voordat u een GPU-cluster kunt maken, moet u een quotumverhoging aanvragen voor uw werkruimte.


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

Als u in plaats daarvan een CPU-cluster wilt maken, geeft u een andere VM-grootte op voor de parameter vm_size, zoals STANDARD_D2_V2.

Zie het artikel over een rekendoel voor meer informatie over rekendoelen.

Uw omgeving definiëren

Als u de Azure Machine Learning-omgeving wilt definiëren waarmee de afhankelijkheden van uw trainingsscript worden ingekapseld, kunt u een aangepaste omgeving definiëren of een gecureerde Azure Machine Learning-omgeving gebruiken.

Een gecureerde omgeving gebruiken

Azure Machine Learning biedt vooraf samengestelde, gecureerde omgevingen als u uw eigen omgeving niet wilt definiëren. Er zijn verschillende gecureerde CPU- en GPU-omgevingen voor PyTorch die overeenkomen met verschillende versies van PyTorch.

Als u een gecureerde omgeving wilt gebruiken, kunt u in plaats daarvan de volgende opdracht uitvoeren:

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

Als u de pakketten wilt zien die zijn opgenomen in de gecureerde omgeving, kunt u de conda-afhankelijkheden naar schijf schrijven:

pytorch_env.save_to_directory(path=curated_env_name)

Zorg ervoor dat de gecureerde omgeving alle afhankelijkheden bevat die vereist zijn voor uw trainingsscript. Zo niet, dan moet u de omgeving wijzigen om de ontbrekende afhankelijkheden op te nemen. Als de omgeving wordt gewijzigd, moet u deze een nieuwe naam geven, omdat het voorvoegsel 'AzureML' is gereserveerd voor gecureerde omgevingen. Als u het YAML-bestand met conda-afhankelijkheden hebt gewijzigd, kunt u er een nieuwe omgeving van maken met een nieuwe naam, bijvoorbeeld:

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

Als u in plaats daarvan het gecureerde omgevingsobject rechtstreeks hebt gewijzigd, kunt u die omgeving klonen met een nieuwe naam:

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

Een aangepaste omgeving maken

U kunt ook uw eigen Azure Machine Learning-omgeving maken waarmee de afhankelijkheden van uw trainingsscript worden ingekapseld.

Definieer eerst uw conda-afhankelijkheden in een YAML-bestand; in dit voorbeeld heeft het bestand de naam 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

Maak een Azure Machine Learning-omgeving op basis van deze conda-omgevingsspecificatie. De omgeving wordt tijdens runtime verpakt in een Docker-container.

Als er geen basisinstallatiekopieën zijn opgegeven, gebruikt Azure Machine Learning standaard een CPU-installatiekopieën azureml.core.environment.DEFAULT_CPU_IMAGE als basisinstallatiekopieën. Omdat in dit voorbeeld training wordt uitgevoerd op een GPU-cluster, moet u een GPU-basisinstallatiekopieën opgeven met de benodigde GPU-stuurprogramma's en afhankelijkheden. Azure Machine Learning onderhoudt een set basisinstallatiekopieën die zijn gepubliceerd op Microsoft Container Registry (MCR) die u kunt gebruiken. Zie De GitHub-opslagplaats AzureML-Containers voor meer informatie.

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'

Tip

U kunt eventueel al uw afhankelijkheden rechtstreeks in een aangepaste Docker-installatiekopieën of Dockerfile vastleggen en daar uw omgeving van maken. Zie Trainen met aangepaste installatiekopieën voor meer informatie.

Zie Software-omgevingen maken en gebruiken in Azure Machine Learning voor meer informatie over het maken en gebruiken van omgevingen.

Uw trainingsuitvoering configureren en verzenden

Een ScriptRunConfig maken

Maak een ScriptRunConfig-object om de configuratiegegevens van uw trainingstaak op te geven, inclusief het trainingsscript, de omgeving die u wilt gebruiken en het rekendoel om uit te voeren. Argumenten voor uw trainingsscript worden doorgegeven via de opdrachtregel, indien opgegeven in de arguments parameter. Met de volgende code wordt een PyTorch-taak met één knooppunt geconfigureerd.

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)

Waarschuwing

Azure Machine Learning voert trainingsscripts uit door de volledige bronmap te kopiëren. Als u gevoelige gegevens hebt die u niet wilt uploaden, gebruikt u een .ignore-bestand of neemt u het niet op in de bronmap. Open in plaats daarvan uw gegevens met behulp van een Azure Machine Learning-gegevensset.

Zie Trainingsuitvoeringen configureren en verzenden voor meer informatie over het configureren van taken met ScriptRunConfig.

Waarschuwing

Als u eerder de PyTorch-estimator gebruikt om uw PyTorch-trainingstaken te configureren, moet u er rekening mee houden dat Estimators vanaf de 1.19.0 SDK-release zijn afgeschaft. Met Azure Machine Learning SDK >= 1.15.0 is ScriptRunConfig de aanbevolen manier om trainingstaken te configureren, inclusief die met behulp van deep learning-frameworks. Zie de migratiehandleiding voor Estimator naar ScriptRunConfig voor algemene migratievragen.

Uw uitvoering verzenden

Het run-object biedt de interface voor de uitvoeringsgeschiedenis terwijl de taak wordt uitgevoerd en nadat deze is voltooid.

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

Wat gebeurt er tijdens de uitvoering van de uitvoering

Terwijl de uitvoering wordt uitgevoerd, worden de volgende fasen doorlopen:

  • Voorbereiden: Er wordt een Docker-installatiekopieën gemaakt op basis van de gedefinieerde omgeving. De installatiekopieën worden geüpload naar het containerregister van de werkruimte en in de cache opgeslagen voor latere uitvoeringen. Logboeken worden ook gestreamd naar de uitvoeringsgeschiedenis en kunnen worden bekeken om de voortgang te controleren. Als in plaats daarvan een gecureerde omgeving is opgegeven, wordt de back-up van de gecureerde omgeving in de cache gebruikt.

  • Schalen: Het cluster probeert omhoog te schalen als voor het Batch AI-cluster meer knooppunten nodig zijn om de uitvoering uit te voeren dan momenteel beschikbaar is.

  • Wordt uitgevoerd: Alle scripts in de scriptmap worden geüpload naar het rekendoel, gegevensarchieven worden gekoppeld of gekopieerd en de script scripts worden uitgevoerd. Uitvoer van stdout en de map ./logs worden gestreamd naar de uitvoeringsgeschiedenis en kunnen worden gebruikt om de uitvoering te bewaken.

  • Naverwerking: de map ./outputs van de uitvoering wordt gekopieerd naar de uitvoeringsgeschiedenis.

Een model registreren of downloaden

Nadat u het model hebt getraind, kunt u het registreren bij uw werkruimte. Met modelregistratie kunt u uw modellen opslaan en versien in uw werkruimte om modelbeheer en implementatie te vereenvoudigen.

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

Tip

De instructies voor de implementatie bevatten een sectie over het registreren van modellen, maar u kunt direct doorgaan met het maken van een rekendoel voor implementatie, omdat u al een geregistreerd model hebt.

U kunt ook een lokale kopie van het model downloaden met behulp van het run-object. In het trainingsscript pytorch_train.pyblijft een PyTorch-opslagobject het model behouden in een lokale map (lokaal voor het rekendoel). U kunt het run-object gebruiken om een kopie te downloaden.

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

Gedistribueerde training

Azure Machine Learning ondersteunt ook gedistribueerde PyTorch-taken met meerdere knooppunten, zodat u uw trainingsworkloads kunt schalen. U kunt eenvoudig gedistribueerde PyTorch-taken uitvoeren en Azure Machine Learning beheert de indeling voor u.

Azure Machine Learning biedt ondersteuning voor het uitvoeren van gedistribueerde PyTorch-taken met zowel de ingebouwde DistributedDataParallel-module van Horovod als PyTorch.

Zie de handleiding voor gedistribueerde GPU-training voor meer informatie over gedistribueerde training.

Exporteren naar ONNX

Als u deductie wilt optimaliseren met de ONNX Runtime, converteert u het getrainde PyTorch-model naar de ONNX-indeling. Deductie, of modelscore, is de fase waarin het geïmplementeerde model wordt gebruikt voor voorspelling, meestal voor productiegegevens. Zie het exporteren van het model van PyTorch naar ONNX voor een voorbeeld.

Volgende stappen

In dit artikel hebt u een deep learning-neuraal netwerk getraind en geregistreerd met behulp van PyTorch in Azure Machine Learning. Als u wilt weten hoe u een model implementeert, gaat u verder met het artikel over modelimplementatie.