Trenowanie modeli PyTorch na dużą skalę przy użyciu zestawu Azure Machine Learning SDK (wersja 1)
DOTYCZY: Zestaw SDK języka Python w wersji 1
Z tego artykułu dowiesz się, jak uruchamiać skrypty szkoleniowe PyTorch w skali przedsiębiorstwa przy użyciu usługi Azure Machine Learning.
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 uczenia głębokiego PyTorch od podstaw, czy wprowadzasz istniejący model do chmury, możesz użyć usługi Azure Machine Learning do skalowania zadań trenowania typu open source przy użyciu elastycznych zasobów obliczeniowych w chmurze. Za pomocą usługi Azure Machine Learning można tworzyć, wdrażać, wersję i monitorować modele klasy produkcyjnej.
Wymagania wstępne
Uruchom ten kod w jednym z następujących środowisk:
Wystąpienie obliczeniowe usługi Azure Machine Learning — brak pobierania ani instalacji
- Ukończ przewodnik Szybki start: rozpocznij pracę z usługą Azure Machine Learning, 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
- Zainstaluj zestaw AZURE Machine Learning SDK (>= 1.15.0).
- Utwórz plik konfiguracji obszaru roboczego.
- Pobieranie przykładowych plików skryptów
pytorch_train.py
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 Learning 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.json
w 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.py
szkoleniowego . 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 Learning.
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 usługi Azure Machine Learning z obsługą procesora GPU.
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 Learning, które hermetyzuje zależności skryptu szkoleniowego, możesz zdefiniować środowisko niestandardowe lub użyć środowiska wyselekcjonowanego usługi Azure Machine Learning.
Korzystanie ze środowiska wyselekcjonowanych
Usługa Azure Machine Learning 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 Learning, 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 Learning 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 Learning 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 Learning 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 Learning.
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 Learning 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 Learning.
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 Learning SDK >= 1.15.0 narzędzie ScriptRunConfig jest zalecanym sposobem konfigurowania zadań szkoleniowych, w tym tych 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.py
trenowania 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 Learning obsługuje również zadania PyTorch rozproszone w wielu węzłach, dzięki czemu można skalować obciążenia szkoleniowe. Możesz łatwo uruchamiać rozproszone zadania PyTorch, a usługa Azure Machine Learning będzie zarządzać aranżacją.
Usługa Azure Machine Learning 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 Learning. Aby dowiedzieć się, jak wdrożyć model, przejdź do naszego artykułu dotyczącego wdrażania modelu.