Trenowanie modeli PyTorch na dużą skalę przy użyciu zestawu AZURE Machine Edukacja SDK (wersja 1)

DOTYCZY: Zestaw SDK języka Python azureml w wersji 1

W tym artykule dowiesz się, jak uruchamiać skrypty szkoleniowe PyTorch w skali przedsiębiorstwa przy użyciu usługi Azure Machine Edukacja.

Przykładowe skrypty w tym artykule służą do klasyfikowania obrazów kurczaka i indyka w celu utworzenia sieci neuronowej uczenia głębokiego (DNN) na podstawie samouczka uczenia transferowego PyTorch. Uczenie transferowe to technika, która stosuje wiedzę uzyskaną od rozwiązania jednego problemu do innego, ale powiązanego problemu. Uczenie transferowe skraca proces trenowania, wymagając mniej danych, czasu i zasobów obliczeniowych niż trenowanie od podstaw. Aby dowiedzieć się więcej na temat uczenia transferowego, zobacz artykuł Uczenie głębokie a uczenie maszynowe.

Niezależnie od tego, czy trenujesz model PyTorch uczenia głębokiego od podstaw, czy wprowadzasz istniejący model do chmury, możesz użyć usługi Azure Machine Edukacja do skalowania zadań szkoleniowych typu open source przy użyciu elastycznych zasobów obliczeniowych w chmurze. Modele klasy produkcyjnej można tworzyć, wdrażać, wersje i monitorować za pomocą usługi Azure Machine Edukacja.

Wymagania wstępne

Uruchom ten kod w jednym z następujących środowisk:

  • Wystąpienie obliczeniowe usługi Azure Machine Edukacja — brak pobierania ani instalacji

    • Ukończ przewodnik Szybki start: wprowadzenie do usługi Azure Machine Edukacja, aby utworzyć dedykowany serwer notesów wstępnie załadowany przy użyciu zestawu SDK i przykładowego repozytorium.
    • W folderze przykładów uczenia głębokiego na serwerze notesu znajdź ukończony i rozszerzony notes, przechodząc do tego katalogu: how-to-use-azureml > ml-frameworks > pytorch > train-hyperparameter-tune-deploy-with-pytorch folder.
  • Własny serwer jupyter Notebook

    Możesz również znaleźć ukończoną wersję notesu Jupyter Notebook na stronie przykładów usługi GitHub. Notes zawiera rozwinięte sekcje obejmujące inteligentne dostrajanie hiperparametrów, wdrażanie modelu i widżety notesu.

Przed uruchomieniem kodu w tym artykule w celu utworzenia klastra procesora GPU należy zażądać zwiększenia limitu przydziału dla obszaru roboczego.

Konfigurowanie eksperymentu

Ta sekcja konfiguruje eksperyment szkoleniowy, ładując wymagane pakiety języka Python, inicjując obszar roboczy, tworząc docelowy obiekt obliczeniowy i definiując środowisko szkoleniowe.

Importowanie pakietów

Najpierw zaimportuj niezbędne biblioteki języka 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

Inicjowanie obszaru roboczego

Obszar roboczy usługi Azure Machine Edukacja to zasób najwyższego poziomu dla usługi. Zapewnia scentralizowane miejsce do pracy ze wszystkimi tworzonymi artefaktami. W zestawie SDK języka Python możesz uzyskać dostęp do artefaktów obszaru roboczego, tworząc workspace obiekt.

Utwórz obiekt obszaru roboczego na podstawie pliku utworzonego config.jsonw sekcji wymagań wstępnych.

ws = Workspace.from_config()

Pobieranie danych

Zestaw danych składa się z około 120 obrazów treningowych dla indyków i kurczaków, z 100 obrazami weryfikacji dla każdej klasy. Pobierzemy i wyodrębnimy zestaw danych w ramach naszego skryptu pytorch_train.pyszkoleniowego . Obrazy są podzbiorem zestawu danych Open Images w wersji 5. Aby uzyskać więcej instrukcji dotyczących tworzenia kodu JSONL do trenowania przy użyciu własnych danych, zobacz ten notes Jupyter.

Przygotowywanie skryptu szkoleniowego

W tym samouczku został już udostępniony skrypt szkoleniowy . pytorch_train.py W praktyce możesz podjąć dowolny niestandardowy skrypt trenowania, tak jak to jest, i uruchomić go za pomocą usługi Azure Machine Edukacja.

Utwórz folder dla skryptów szkoleniowych.

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

Tworzenie docelowego obiektu obliczeniowego

Utwórz docelowy obiekt obliczeniowy dla zadania PyTorch do uruchomienia. W tym przykładzie utwórz klaster obliczeniowy platformy Azure z obsługą procesora GPU Edukacja.

Ważne

Przed utworzeniem klastra procesora GPU należy zażądać zwiększenia limitu przydziału dla obszaru roboczego.


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

Jeśli zamiast tego chcesz utworzyć klaster procesora CPU, podaj inny rozmiar maszyny wirtualnej do parametru vm_size, takiego jak STANDARD_D2_V2.

Aby uzyskać więcej informacji na temat docelowych obiektów obliczeniowych, zobacz artykuł co to jest docelowy obiekt obliczeniowy.

Definiowanie środowiska

Aby zdefiniować środowisko usługi Azure Machine Edukacja Environment, które hermetyzuje zależności skryptu szkoleniowego, możesz zdefiniować środowisko niestandardowe lub użyć środowiska usługi Azure Machine Edukacja wyselekcjonowanego środowiska.

Korzystanie ze środowiska wyselekcjonowanych

Usługa Azure Machine Edukacja udostępnia wstępnie utworzone, wyselekcjonowane środowiska, jeśli nie chcesz definiować własnego środowiska. Istnieje kilka środowisk nadzorowanych procesora CPU i procesora GPU dla platformy PyTorch odpowiadających różnym wersjom rozwiązania PyTorch.

Jeśli chcesz użyć wyselekcjonowanych środowisk, możesz zamiast tego uruchomić następujące polecenie:

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

Aby wyświetlić pakiety zawarte w wyselekcjonowanych środowiskach, można zapisać zależności conda na dysku:

pytorch_env.save_to_directory(path=curated_env_name)

Upewnij się, że środowisko wyselekcjonowane zawiera wszystkie zależności wymagane przez skrypt trenowania. Jeśli nie, musisz zmodyfikować środowisko, aby uwzględnić brakujące zależności. Jeśli środowisko zostanie zmodyfikowane, musisz nadać mu nową nazwę, ponieważ prefiks "AzureML" jest zarezerwowany dla wyselekcjonowanych środowisk. Jeśli zmodyfikowano plik YAML zależności conda, możesz utworzyć nowe środowisko pod nową nazwą, na przykład:

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

Jeśli zamiast tego zmodyfikowano bezpośrednio obiekt środowiska wyselekcjonowanego, możesz sklonować to środowisko o nowej nazwie:

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

Tworzenie środowiska niestandardowego

Możesz również utworzyć własne środowisko usługi Azure Machine Edukacja, które hermetyzuje zależności skryptu szkoleniowego.

Najpierw zdefiniuj zależności conda w pliku YAML; w tym przykładzie plik ma nazwę 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

Utwórz środowisko usługi Azure Machine Edukacja na podstawie tej specyfikacji środowiska conda. Środowisko zostanie spakowane w kontenerze platformy Docker w czasie wykonywania.

Domyślnie, jeśli nie określono obrazu podstawowego, usługa Azure Machine Edukacja będzie używać obrazu procesora CPU jako obrazu azureml.core.environment.DEFAULT_CPU_IMAGE podstawowego. Ponieważ ten przykład uruchamia szkolenie w klastrze gpu, należy określić podstawowy obraz procesora GPU, który ma niezbędne sterowniki i zależności procesora GPU. Usługa Azure Machine Edukacja obsługuje zestaw obrazów podstawowych publikowanych w usłudze Microsoft Container Registry (MCR), których można użyć. Aby uzyskać więcej informacji, zobacz repozytorium GitHub AzureML-Containers.

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'

Napiwek

Opcjonalnie możesz po prostu przechwycić wszystkie zależności bezpośrednio w niestandardowym obrazie platformy Docker lub pliku Dockerfile i utworzyć środowisko na podstawie tego. Aby uzyskać więcej informacji, zobacz Trenowanie za pomocą obrazu niestandardowego.

Aby uzyskać więcej informacji na temat tworzenia i używania środowisk, zobacz Tworzenie i używanie środowisk oprogramowania w usłudze Azure Machine Edukacja.

Konfigurowanie i przesyłanie przebiegu trenowania

Tworzenie polecenia ScriptRunConfig

Utwórz obiekt ScriptRunConfig, aby określić szczegóły konfiguracji zadania trenowania, w tym skrypt trenowania, środowisko do użycia i docelowy obiekt obliczeniowy do uruchomienia. Wszystkie argumenty skryptu trenowania zostaną przekazane za pośrednictwem wiersza polecenia, jeśli określono go w parametrze arguments . Poniższy kod skonfiguruje zadanie PyTorch z jednym węzłem.

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)

Ostrzeżenie

Usługa Azure Machine Edukacja uruchamia skrypty szkoleniowe, kopiując cały katalog źródłowy. Jeśli masz poufne dane, które nie chcesz przekazywać, użyj pliku .ignore lub nie dołącz go do katalogu źródłowego . Zamiast tego uzyskaj dostęp do danych przy użyciu zestawu danych usługi Azure Machine Edukacja.

Aby uzyskać więcej informacji na temat konfigurowania zadań za pomocą polecenia ScriptRunConfig, zobacz Konfigurowanie i przesyłanie przebiegów trenowania.

Ostrzeżenie

Jeśli wcześniej używano narzędzia do szacowania PyTorch do konfigurowania zadań szkoleniowych usługi PyTorch, pamiętaj, że narzędzia do szacowania zostały przestarzałe od wersji zestawu SDK 1.19.0. W przypadku zestawu AZURE Machine Edukacja SDK >= 1.15.0 zalecana jest metoda ScriptRunConfig do konfigurowania zadań szkoleniowych, w tym zadań korzystających z platform uczenia głębokiego. Aby uzyskać odpowiedzi na typowe pytania dotyczące migracji, zobacz Przewodnik migracji narzędzia do szacowania do skryptuRunConfig.

Przesyłanie przebiegu

Obiekt Run udostępnia interfejs historii uruchamiania, gdy zadanie jest uruchomione i po jego zakończeniu.

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

Co się dzieje podczas wykonywania przebiegu

Po wykonaniu przebiegu przechodzi on przez następujące etapy:

  • Przygotowywanie: obraz platformy Docker jest tworzony zgodnie ze zdefiniowanym środowiskiem. Obraz jest przekazywany do rejestru kontenerów obszaru roboczego i buforowany w celu późniejszego uruchomienia. Dzienniki są również przesyłane strumieniowo do historii uruchamiania i można je wyświetlić w celu monitorowania postępu. Jeśli zamiast tego określono wyselekcjonowane środowisko, zostanie użyty buforowany obraz obsługujący środowisko wyselekcjonowane.

  • Skalowanie: klaster próbuje skalować w górę, jeśli klaster usługi Batch AI wymaga więcej węzłów do wykonania przebiegu niż jest obecnie dostępne.

  • Uruchomione: wszystkie skrypty w folderze script są przekazywane do docelowego obiektu obliczeniowego, magazyny danych są instalowane lub kopiowane i script wykonywane. Dane wyjściowe ze strumienia stdout i folderu ./logs są przesyłane strumieniowo do historii uruchamiania i mogą służyć do monitorowania przebiegu.

  • Przetwarzanie końcowe: folder ./outputs przebiegu jest kopiowany do historii uruchamiania.

Rejestrowanie lub pobieranie modelu

Po wytrenowanym modelu możesz zarejestrować go w obszarze roboczym. Rejestracja modelu umożliwia przechowywanie i przechowywanie wersji modeli w obszarze roboczym w celu uproszczenia zarządzania modelami i wdrażania.

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

Napiwek

Instrukcje dotyczące wdrażania zawierają sekcję dotyczącą rejestrowania modeli, ale możesz przejść bezpośrednio do utworzenia docelowego obiektu obliczeniowego na potrzeby wdrożenia, ponieważ masz już zarejestrowany model.

Możesz również pobrać lokalną kopię modelu przy użyciu obiektu Run. W skrypcie pytorch_train.pytrenowania obiekt zapisywania PyTorch utrwala model w folderze lokalnym (lokalnie dla docelowego obiektu obliczeniowego). Aby pobrać kopię, możesz użyć obiektu Uruchom.

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

Szkolenie rozproszone

Usługa Azure Machine Edukacja obsługuje również zadania PyTorch rozproszone z wieloma węzłami, dzięki czemu można skalować obciążenia szkoleniowe. Rozproszone zadania PyTorch można łatwo uruchamiać, a usługa Azure Machine Edukacja będzie zarządzać aranżacją.

Usługa Azure Machine Edukacja obsługuje uruchamianie rozproszonych zadań PyTorch z wbudowanym modułem DistributedDataParallel platformy Horovod i PyTorch.

Aby uzyskać więcej informacji na temat trenowania rozproszonego, zobacz Przewodnik trenowania rozproszonego procesora GPU.

Eksportowanie do ONNX

Aby zoptymalizować wnioskowanie przy użyciu środowiska uruchomieniowego ONNX, przekonwertuj wytrenowany model PyTorch na format ONNX. Wnioskowanie lub ocenianie modelu to faza, w której wdrożony model jest używany do przewidywania, najczęściej na danych produkcyjnych. Aby zapoznać się z przykładem, zobacz samouczek Eksportowanie modelu z PyTorch do ONNX.

Następne kroki

W tym artykule wytrenujesz i zarejestrowano uczenie głębokie, sieć neuronową przy użyciu rozwiązania PyTorch w usłudze Azure Machine Edukacja. Aby dowiedzieć się, jak wdrożyć model, przejdź do naszego artykułu dotyczącego wdrażania modelu.