Przewodnik trenowania rozproszonego procesora GPU (zestaw SDK w wersji 1)
DOTYCZY:Zestaw SDK języka Python w wersji 1
Dowiedz się więcej o sposobie używania rozproszonego kodu trenowania procesora GPU w usłudze Azure Machine Learning (ML). W tym artykule nie nauczysz się trenowania rozproszonego. Pomoże ci to uruchomić istniejący rozproszony kod szkoleniowy w usłudze Azure Machine Learning. Oferuje porady i przykłady, które należy wykonać dla każdej platformy:
- Interfejs przekazywania komunikatów (MPI)
- Horovod
- DeepSpeed
- Zmienne środowiskowe z interfejsu OPEN MPI
- PyTorch
- Inicjowanie grupy procesów
- Opcje uruchamiania
- DistributedDataParallel (uruchamianie poszczególnych procesów)
- Korzystanie z
torch.distributed.launch
polecenia (uruchamianie według węzła) - Piorun PyTorch
- Przytulanie transformatorów twarzy
- TensorFlow
- Zmienne środowiskowe dla biblioteki TensorFlow (TF_CONFIG)
- Przyspieszanie trenowania procesora GPU za pomocą rozwiązania InfiniBand
Wymagania wstępne
Zapoznaj się z tymi podstawowymi pojęciami dotyczącymi trenowania rozproszonego procesora GPU , takich jak równoległość danych, równoległość rozproszonych danych i równoległość modelu.
Porada
Jeśli nie wiesz, jakiego typu równoległości używać, ponad 90% czasu należy użyć rozproszonego równoległości danych.
MPI
Usługa Azure Machine Learning oferuje zadanie MPI umożliwiające uruchomienie danej liczby procesów w każdym węźle. Tę metodę można zastosować do uruchamiania trenowania rozproszonego przy użyciu uruchamiania dla poszczególnych procesów lub uruchamiania na węzeł, w zależności od tego, czy process_count_per_node
ustawiono wartość 1 (wartość domyślną) dla uruchamiania węzła, czy też liczbę urządzeń/procesorów GPU dla uruchamiania poszczególnych procesów. Usługa Azure Machine Learning tworzy pełne polecenie uruchamiania MPI (mpirun
) w tle. Nie można podać własnych pełnych poleceń head-node-launcher, takich jak mpirun
lub DeepSpeed launcher
.
Porada
Podstawowy obraz platformy Docker używany przez zadanie MPI usługi Azure Machine Learning musi mieć zainstalowaną bibliotekę MPI. Otwarte interfejsy MPI są uwzględniane we wszystkich podstawowych obrazach procesora GPU usługi Azure Machine Learning. Podczas korzystania z niestandardowego obrazu platformy Docker odpowiadasz za upewnienie się, że obraz zawiera bibliotekę MPI. Zalecane jest otwieranie interfejsu MPI, ale można również użyć innej implementacji MPI, takiej jak Intel MPI. Usługa Azure Machine Learning udostępnia również wyselekcjonowane środowiska dla popularnych platform.
Aby uruchomić trenowanie rozproszone przy użyciu interfejsu MPI, wykonaj następujące kroki:
- Użyj środowiska usługi Azure Machine Learning z preferowaną strukturą uczenia głębokiego i interfejsem MPI. Usługa Azure Machine Learning udostępnia wyselekcjonowane środowisko dla popularnych platform.
- Zdefiniuj
MpiConfiguration
za pomocą poleceniaprocess_count_per_node
inode_count
.process_count_per_node
powinna być równa liczbie procesorów GPU na węzeł dla uruchamiania procesu lub ustawić wartość 1 (wartość domyślna) dla uruchamiania dla węzła, jeśli skrypt użytkownika będzie odpowiedzialny za uruchamianie procesów na węzeł. MpiConfiguration
Przekaż obiekt do parametrudistributed_job_config
.ScriptRunConfig
from azureml.core import Workspace, ScriptRunConfig, Environment, Experiment
from azureml.core.runconfig import MpiConfiguration
curated_env_name = 'AzureML-PyTorch-1.6-GPU'
pytorch_env = Environment.get(workspace=ws, name=curated_env_name)
distr_config = MpiConfiguration(process_count_per_node=4, node_count=2)
run_config = ScriptRunConfig(
source_directory= './src',
script='train.py',
compute_target=compute_target,
environment=pytorch_env,
distributed_job_config=distr_config,
)
# submit the run configuration to start the job
run = Experiment(ws, "experiment_name").submit(run_config)
Horovod
Konfiguracja zadania MPI jest używana podczas korzystania z platformy Horovod do trenowania rozproszonego za pomocą platformy uczenia głębokiego.
Upewnij się, że kod jest zgodny z następującymi wskazówkami:
- Kod trenowania jest poprawnie instrumentowany przy użyciu struktury Horovod przed dodaniem części usługi Azure Machine Learning
- Środowisko usługi Azure Machine Learning zawiera interfejsy Horovod i MPI. Środowiska PyTorch i TensorFlow wyselekcjonowane procesory GPU są wstępnie skonfigurowane przy użyciu platformy Horovod i jej zależności.
- Utwórz element
MpiConfiguration
z żądaną dystrybucją.
Przykład horovod
DeepSpeed
Nie używaj niestandardowego uruchamiania deepSpeed do uruchamiania trenowania rozproszonego za pomocą biblioteki DeepSpeed w usłudze Azure Machine Learning. Zamiast tego skonfiguruj zadanie MPI, aby uruchomić zadanie trenowania za pomocą interfejsu MPI.
Upewnij się, że kod jest zgodny z następującymi wskazówkami:
- Środowisko usługi Azure Machine Learning zawiera bibliotekę DeepSpeed i jej zależności, open MPI i mpi4py.
- Utwórz obiekt
MpiConfiguration
z dystrybucją.
Przykład DeepSpeed
Zmienne środowiskowe z interfejsu OPEN MPI
Podczas uruchamiania zadań MPI z obrazami Open MPI następujące zmienne środowiskowe dla każdego uruchomionego procesu:
OMPI_COMM_WORLD_RANK
- ranga procesuOMPI_COMM_WORLD_SIZE
- rozmiar świataAZ_BATCH_MASTER_NODE
- adres podstawowy z portem,MASTER_ADDR:MASTER_PORT
OMPI_COMM_WORLD_LOCAL_RANK
— lokalna ranga procesu w węźleOMPI_COMM_WORLD_LOCAL_SIZE
- liczba procesów w węźle
Porada
Pomimo nazwy zmienna środowiskowa OMPI_COMM_WORLD_NODE_RANK
nie odpowiada zmiennej NODE_RANK
. Aby użyć uruchamiania dla węzła, ustaw process_count_per_node=1
i użyj polecenia OMPI_COMM_WORLD_RANK
jako NODE_RANK
.
PyTorch
Usługa Azure Machine Learning obsługuje uruchamianie rozproszonych zadań przy użyciu natywnych funkcji trenowania rozproszonego PyTorch (torch.distributed
).
Porada
W przypadku równoległości danych oficjalna wskazówka PyTorch polega na korzystaniu z metody DistributedDataParallel (DDP) na potrzeby trenowania rozproszonego zarówno dla jednego węzła, jak i wielu węzłów. PyTorch zaleca również używanie funkcji DistributedDataParallel w pakiecie wieloprocesorowym. W związku z tym dokumentacja i przykłady usługi Azure Machine Learning koncentrują się na trenowaniu DistributedDataParallel.
Inicjowanie grupy procesów
Szkielet każdego trenowania rozproszonego opiera się na grupie procesów, które znają się nawzajem i mogą komunikować się ze sobą przy użyciu zaplecza. W przypadku PyTorch grupa procesów jest tworzona przez wywołanie torch.distributed.init_process_group we wszystkich procesach rozproszonych w celu utworzenia grupy procesów zbiorczo.
torch.distributed.init_process_group(backend='nccl', init_method='env://', ...)
Najczęściej używane zaplecza komunikacji to mpi
, nccl
i gloo
. W przypadku trenowania nccl
opartego na procesorze GPU zaleca się najlepszą wydajność i należy ich używać zawsze, gdy jest to możliwe.
init_method
informuje, jak każdy proces może odnaleźć się nawzajem, jak inicjuje i weryfikuje grupę procesów przy użyciu zaplecza komunikacji. Domyślnie, jeśli init_method
nie określono parametru PyTorch, użyje metody inicjowania zmiennej środowiskowej (env://
). init_method
to zalecana metoda inicjowania używana w kodzie trenowania do uruchamiania rozproszonego narzędzia PyTorch w usłudze Azure Machine Learning. PyTorch będzie szukać następujących zmiennych środowiskowych do inicjowania:
MASTER_ADDR
- Adres IP maszyny, która będzie hostować proces o klasyfikacji 0.MASTER_PORT
- Bezpłatny port na maszynie, który będzie hostować proces o klasyfikacji 0.WORLD_SIZE
- Całkowita liczba procesów. Powinna być równa łącznej liczbie urządzeń (GPU) używanych do trenowania rozproszonego.RANK
- (globalna) ranga bieżącego procesu. Możliwe wartości to od 0 do (rozmiar świata — 1).
Aby uzyskać więcej informacji na temat inicjowania grupy procesów, zobacz dokumentację PyTorch.
Poza tym wiele aplikacji będzie również potrzebować następujących zmiennych środowiskowych:
LOCAL_RANK
- Lokalna (względna) ranga procesu w węźle. Możliwe wartości to od 0 do (liczba procesów w węźle — 1). Te informacje są przydatne, ponieważ wiele operacji, takich jak przygotowywanie danych, powinno być wykonywanych tylko raz na węzeł, --- zwykle na local_rank = 0.NODE_RANK
- Ranga węzła na potrzeby trenowania z wieloma węzłami. Możliwe wartości to od 0 do (łączna liczba węzłów — 1).
Opcje uruchamiania PyTorch
Zadanie PyTorch usługi Azure Machine Learning obsługuje dwa typy opcji uruchamiania trenowania rozproszonego:
- Uruchamianie poszczególnych procesów: system uruchomi wszystkie procesy rozproszone wraz ze wszystkimi odpowiednimi informacjami (takimi jak zmienne środowiskowe) w celu skonfigurowania grupy procesów.
- Uruchamianie poszczególnych węzłów: udostępniasz usługę Azure Machine Learning za pomocą uruchamiania narzędzi, które będą uruchamiane w każdym węźle. Narzędzie uruchamiania będzie obsługiwać uruchamianie każdego z procesów w danym węźle. Lokalnie w każdym węźle
RANK
iLOCAL_RANK
są konfigurowane przez moduł uruchamiania. Narzędzie torch.distributed.launch i PyTorch Lightning należą do tej kategorii.
Nie ma podstawowych różnic między tymi opcjami uruchamiania. Wybór zależy w dużej mierze od preferencji lub konwencji struktur/bibliotek opartych na wanilii PyTorch (takich jak Lightning lub Hugging Face).
W poniższych sekcjach szczegółowo opisano sposób konfigurowania zadań usługi Azure Machine Learning PyTorch dla każdej z opcji uruchamiania.
DistributedDataParallel (uruchamianie poszczególnych procesów)
Nie musisz używać narzędzia uruchamiania, takiego jak torch.distributed.launch
. Aby uruchomić rozproszone zadanie PyTorch:
- Określanie skryptu trenowania i argumentów
- Utwórz element
PyTorchConfiguration
i określ elementyprocess_count
inode_count
. Wartośćprocess_count
odpowiada całkowitej liczbie procesów, które mają zostać uruchomione dla zadania.process_count
zazwyczaj powinna być równa# GPUs per node x # nodes
. Jeśliprocess_count
nie zostanie określony, usługa Azure Machine Learning domyślnie uruchomi jeden proces na węzeł.
Usługa Azure Machine Learning ustawi MASTER_ADDR
zmienne środowiskowe , MASTER_PORT
, WORLD_SIZE
i NODE_RANK
na każdym węźle oraz ustawi zmienne środowiskowe i LOCAL_RANK
na poziomie RANK
procesu.
Aby użyć tej opcji na potrzeby trenowania wielu procesów na węzeł, użyj zestawu SDK >= 1.22.0
języka Python usługi Azure Machine Learning. Process_count wprowadzono w wersji 1.22.0.
from azureml.core import ScriptRunConfig, Environment, Experiment
from azureml.core.runconfig import PyTorchConfiguration
curated_env_name = 'AzureML-PyTorch-1.6-GPU'
pytorch_env = Environment.get(workspace=ws, name=curated_env_name)
distr_config = PyTorchConfiguration(process_count=8, node_count=2)
run_config = ScriptRunConfig(
source_directory='./src',
script='train.py',
arguments=['--epochs', 50],
compute_target=compute_target,
environment=pytorch_env,
distributed_job_config=distr_config,
)
run = Experiment(ws, 'experiment_name').submit(run_config)
Porada
Jeśli skrypt trenowania przekazuje informacje, takie jak ranga lokalna lub ranga argumentów skryptu, można odwołać się do zmiennych środowiskowych w argumentach:
arguments=['--epochs', 50, '--local_rank', $LOCAL_RANK]
Przykład Pytorch per-process-launch
Korzystanie z narzędzia torch.distributed.launch (uruchamianie poszczególnych węzłów)
PyTorch udostępnia narzędzie uruchamiania w pliku torch.distributed.launch , którego można użyć do uruchamiania wielu procesów na węzeł. Moduł torch.distributed.launch
duplikuje wiele procesów trenowania na każdym z węzłów.
W poniższych krokach pokazano, jak skonfigurować zadanie PyTorch za pomocą modułu uruchamiania dla poszczególnych węzłów w usłudze Azure Machine Learning. Zadanie osiąga odpowiednik uruchomienia następującego polecenia:
python -m torch.distributed.launch --nproc_per_node <num processes per node> \
--nnodes <num nodes> --node_rank $NODE_RANK --master_addr $MASTER_ADDR \
--master_port $MASTER_PORT --use_env \
<your training script> <your script arguments>
torch.distributed.launch
Podaj poleceniecommand
dla parametru konstruktoraScriptRunConfig
. Usługa Azure Machine Learning uruchamia to polecenie w każdym węźle klastra szkoleniowego.--nproc_per_node
powinna być mniejsza lub równa liczbie procesorów GPU dostępnych w każdym węźle. MASTER_ADDR, MASTER_PORT i NODE_RANK są ustawiane przez usługę Azure Machine Learning, dzięki czemu można odwoływać się tylko do zmiennych środowiskowych w poleceniu . Usługa Azure Machine Learning ustawia MASTER_PORT na6105
, ale jeśli chcesz, możesz przekazać inną wartość do argumentu--master_port
polecenia torch.distributed.launch. (Narzędzie uruchamiania spowoduje zresetowanie zmiennych środowiskowych).- Utwórz element
PyTorchConfiguration
i określ elementnode_count
.
from azureml.core import ScriptRunConfig, Environment, Experiment
from azureml.core.runconfig import PyTorchConfiguration
curated_env_name = 'AzureML-PyTorch-1.6-GPU'
pytorch_env = Environment.get(workspace=ws, name=curated_env_name)
distr_config = PyTorchConfiguration(node_count=2)
launch_cmd = "python -m torch.distributed.launch --nproc_per_node 4 --nnodes 2 --node_rank $NODE_RANK --master_addr $MASTER_ADDR --master_port $MASTER_PORT --use_env train.py --epochs 50".split()
run_config = ScriptRunConfig(
source_directory='./src',
command=launch_cmd,
compute_target=compute_target,
environment=pytorch_env,
distributed_job_config=distr_config,
)
run = Experiment(ws, 'experiment_name').submit(run_config)
Porada
Trenowanie z wieloma procesorami GPU z jednym węzłem: Jeśli używasz narzędzia uruchamiania do uruchamiania trenowania z wieloma procesorami GPU PyTorch z jednym węzłem, nie musisz określać distributed_job_config
parametru ScriptRunConfig.
launch_cmd = "python -m torch.distributed.launch --nproc_per_node 4 --use_env train.py --epochs 50".split()
run_config = ScriptRunConfig(
source_directory='./src',
command=launch_cmd,
compute_target=compute_target,
environment=pytorch_env,
)
Przykład uruchamiania rozwiązania PyTorch dla węzła
Piorun PyTorch
PyTorch Lightning to uproszczona biblioteka typu open source, która zapewnia interfejs wysokiego poziomu dla biblioteki PyTorch. Błyskawica oddziela wiele konfiguracji trenowania rozproszonego niższego poziomu wymaganych dla vanilla PyTorch. Lightning umożliwia uruchamianie skryptów szkoleniowych w ustawieniach pojedynczego procesora GPU, wielowęźleowego procesora GPU i wielu węzłów z wieloma procesorami GPU. W tle uruchamia wiele procesów podobnych do torch.distributed.launch
.
W przypadku trenowania z jednym węzłem (w tym z wieloma procesorami GPU z jednym węzłem) można uruchomić kod w usłudze Azure Machine Learning bez konieczności określania elementu distributed_job_config
.
Aby uruchomić eksperyment przy użyciu wielu węzłów z wieloma procesorami GPU, dostępne są 2 opcje:
Przy użyciu konfiguracji PyTorch (zalecane): zdefiniuj
PyTorchConfiguration
i określcommunication_backend="Nccl"
wartości ,node_count
iprocess_count
(pamiętaj, że jest to łączna liczba procesów, tj.num_nodes * process_count_per_node
). W module Lightning Trainer określ zarówno element , jaknum_nodes
igpus
, aby był zgodny z elementemPyTorchConfiguration
. Na przykładnum_nodes = node_count
igpus = process_count_per_node
.Korzystanie z konfiguracji MPI:
Zdefiniuj
MpiConfiguration
i określ wartości inode_count
process_count_per_node
. W obszarze Lightning Trainer określ odpowiednio wartościnum_nodes
igpus
, aby były takie same jaknode_count
iprocess_count_per_node
zMpiConfiguration
.W przypadku trenowania z wieloma węzłami za pomocą interfejsu MPI błyskawica wymaga ustawienia następujących zmiennych środowiskowych w każdym węźle klastra szkoleniowego:
- MASTER_ADDR
- MASTER_PORT
- NODE_RANK
- LOCAL_RANK
Ręcznie ustaw te zmienne środowiskowe wymagane przez program Lightning w głównych skryptach szkoleniowych:
import os from argparse import ArgumentParser def set_environment_variables_for_mpi(num_nodes, gpus_per_node, master_port=54965): if num_nodes > 1: os.environ["MASTER_ADDR"], os.environ["MASTER_PORT"] = os.environ["AZ_BATCH_MASTER_NODE"].split(":") else: os.environ["MASTER_ADDR"] = os.environ["AZ_BATCHAI_MPI_MASTER_NODE"] os.environ["MASTER_PORT"] = str(master_port) try: os.environ["NODE_RANK"] = str(int(os.environ.get("OMPI_COMM_WORLD_RANK")) // gpus_per_node) # additional variables os.environ["MASTER_ADDRESS"] = os.environ["MASTER_ADDR"] os.environ["LOCAL_RANK"] = os.environ["OMPI_COMM_WORLD_LOCAL_RANK"] os.environ["WORLD_SIZE"] = os.environ["OMPI_COMM_WORLD_SIZE"] except: # fails when used with pytorch configuration instead of mpi pass if __name__ == "__main__": parser = ArgumentParser() parser.add_argument("--num_nodes", type=int, required=True) parser.add_argument("--gpus_per_node", type=int, required=True) args = parser.parse_args() set_environment_variables_for_mpi(args.num_nodes, args.gpus_per_node) trainer = Trainer( num_nodes=args.num_nodes, gpus=args.gpus_per_node )
Błyskawica obsługuje obliczenia rozmiaru świata z flag
--gpus
trenera i--num_nodes
.from azureml.core import ScriptRunConfig, Experiment from azureml.core.runconfig import MpiConfiguration nnodes = 2 gpus_per_node = 4 args = ['--max_epochs', 50, '--gpus_per_node', gpus_per_node, '--accelerator', 'ddp', '--num_nodes', nnodes] distr_config = MpiConfiguration(node_count=nnodes, process_count_per_node=gpus_per_node) run_config = ScriptRunConfig( source_directory='./src', script='train.py', arguments=args, compute_target=compute_target, environment=pytorch_env, distributed_job_config=distr_config, ) run = Experiment(ws, 'experiment_name').submit(run_config)
Przytulanie transformatorów twarzy
Przytulanie twarzy zawiera wiele przykładów użycia biblioteki Transformers do torch.distributed.launch
uruchamiania trenowania rozproszonego. Aby uruchomić te przykłady i własne niestandardowe skrypty szkoleniowe przy użyciu interfejsu API trenera przekształcania, postępuj zgodnie z sekcją Using (Używanie torch.distributed.launch
).
Przykładowy kod konfiguracji zadania w celu dostosowania dużego modelu BERT do zadania MNLI klasyfikacji tekstu przy użyciu skryptu run_glue.py
w jednym węźle z 8 procesorami GPU:
from azureml.core import ScriptRunConfig
from azureml.core.runconfig import PyTorchConfiguration
distr_config = PyTorchConfiguration() # node_count defaults to 1
launch_cmd = "python -m torch.distributed.launch --nproc_per_node 8 text-classification/run_glue.py --model_name_or_path bert-large-uncased-whole-word-masking --task_name mnli --do_train --do_eval --max_seq_length 128 --per_device_train_batch_size 8 --learning_rate 2e-5 --num_train_epochs 3.0 --output_dir /tmp/mnli_output".split()
run_config = ScriptRunConfig(
source_directory='./src',
command=launch_cmd,
compute_target=compute_target,
environment=pytorch_env,
distributed_job_config=distr_config,
)
Możesz również użyć opcji uruchamiania poszczególnych procesów , aby uruchomić trenowanie rozproszone bez użycia polecenia torch.distributed.launch
. Należy pamiętać, że użycie tej metody polega na tym, że przekształcanie TrainingArguments oczekuje, że ranga lokalna zostanie przekazana jako argument (--local_rank
). torch.distributed.launch
Zajmuje się tym w przypadku --use_env=False
, ale jeśli używasz uruchamiania poszczególnych procesów, musisz jawnie przekazać rangę lokalną jako argument do skryptu --local_rank=$LOCAL_RANK
trenowania, ponieważ usługa Azure Machine Learning ustawia LOCAL_RANK
tylko zmienną środowiskową.
TensorFlow
Jeśli używasz natywnego rozproszonego biblioteki TensorFlow w kodzie trenowania, takim jak interfejs API biblioteki tf.distribute.Strategy
TensorFlow 2.x, możesz uruchomić zadanie rozproszone za pośrednictwem usługi Azure Machine Learning przy użyciu polecenia TensorflowConfiguration
.
W tym celu określ TensorflowConfiguration
obiekt dla distributed_job_config
parametru konstruktora ScriptRunConfig
. Jeśli używasz polecenia tf.distribute.experimental.MultiWorkerMirroredStrategy
, określ element worker_count
w TensorflowConfiguration
odpowiadającym liczbie węzłów zadania szkoleniowego.
from azureml.core import ScriptRunConfig, Environment, Experiment
from azureml.core.runconfig import TensorflowConfiguration
curated_env_name = 'AzureML-TensorFlow-2.3-GPU'
tf_env = Environment.get(workspace=ws, name=curated_env_name)
distr_config = TensorflowConfiguration(worker_count=2, parameter_server_count=0)
run_config = ScriptRunConfig(
source_directory='./src',
script='train.py',
compute_target=compute_target,
environment=tf_env,
distributed_job_config=distr_config,
)
# submit the run configuration to start the job
run = Experiment(ws, "experiment_name").submit(run_config)
Jeśli skrypt trenowania używa strategii serwera parametrów do trenowania rozproszonego, takiego jak w przypadku starszej wersji biblioteki TensorFlow 1.x, należy również określić liczbę serwerów parametrów do użycia w zadaniu, na przykład tf_config = TensorflowConfiguration(worker_count=2, parameter_server_count=1)
.
TF_CONFIG
W systemie TensorFlow zmienna środowiskowa TF_CONFIG jest wymagana do trenowania na wielu maszynach. W przypadku zadań TensorFlow usługa Azure Machine Learning skonfiguruje i ustawi odpowiednio zmienną TF_CONFIG dla każdego procesu roboczego przed wykonaniem skryptu szkoleniowego.
Jeśli potrzebujesz: , możesz uzyskać dostęp do TF_CONFIG ze skryptu szkoleniowego: os.environ['TF_CONFIG']
.
Przykład TF_CONFIG ustawiony w węźle głównego procesu roboczego:
TF_CONFIG='{
"cluster": {
"worker": ["host0:2222", "host1:2222"]
},
"task": {"type": "worker", "index": 0},
"environment": "cloud"
}'
Przykład tensorFlow
Przyspieszanie trenowania rozproszonego procesora GPU za pomocą rozwiązania InfiniBand
Wraz ze wzrostem liczby maszyn wirtualnych do trenowania modelu czas wymagany do wytrenowania tego modelu powinien się zmniejszyć. W idealnym przypadku spadek czasu powinien być liniowo proporcjonalny do liczby trenowanych maszyn wirtualnych. Jeśli na przykład trenowanie modelu na jednej maszynie wirtualnej trwa 100 sekund, trenowanie tego samego modelu na dwóch maszynach wirtualnych powinno potrwać 50 sekund. Trenowanie modelu na czterech maszynach wirtualnych powinno potrwać 25 sekund itd.
InfiniBand może być ważnym czynnikiem w osiągnięciu tego skalowania liniowego. InfiniBand umożliwia komunikację między węzłami w klastrze o małych opóźnieniach i komunikacji między procesorami GPU. Rozwiązanie InfiniBand wymaga wyspecjalizowanego sprzętu do działania. Niektóre serie maszyn wirtualnych platformy Azure, w szczególności NC, ND i H, mają teraz maszyny wirtualne z obsługą funkcji RDMA z obsługą funkcji SR-IOV i InfiniBand. Te maszyny wirtualne komunikują się za pośrednictwem sieci InfiniBand o małych opóźnieniach i wysokiej przepustowości, co jest znacznie bardziej wydajne niż łączność oparta na sieci Ethernet. Sr-IOV dla InfiniBand umożliwia niemal bez systemu operacyjnego wydajność dowolnej biblioteki MPI (MPI jest używana przez wiele rozproszonych struktur szkoleniowych i narzędzi, w tym oprogramowania NCCL firmy NVIDIA). Te jednostki SKU są przeznaczone do spełnienia wymagań obciążeń uczenia maszynowego intensywnie korzystających z obliczeń. Aby uzyskać więcej informacji, zobacz Przyspieszanie trenowania rozproszonego w usłudze Azure Machine Learning przy użyciu funkcji SR-IOV.
Zwykle jednostki SKU maszyn wirtualnych o nazwie "r" zawierają wymagany sprzęt InfiniBand, a te bez "r" zwykle nie. ('r' jest odwołaniem do FUNKCJI RDMA, która oznacza "zdalny bezpośredni dostęp do pamięci"). Na przykład jednostka SKU Standard_NC24rs_v3
maszyny wirtualnej jest włączona w rozwiązaniu InfiniBand, ale jednostka SKU Standard_NC24s_v3
nie jest. Oprócz możliwości InfiniBand specyfikacje między tymi dwoma jednostkami SKU są w dużej mierze takie same — oba mają 24 rdzenie, 448 GB pamięci RAM, 4 procesory GPU tej samej jednostki SKU itp. Dowiedz się więcej o jednostkach SKU maszyn z obsługą funkcji RDMA i InfiniBand.
Ostrzeżenie
Jednostka SKU Standard_NC24r
maszyny starszej generacji jest włączona przez funkcję RDMA, ale nie zawiera sprzętu SR-IOV wymaganego dla rozwiązania InfiniBand.
Jeśli tworzysz AmlCompute
klaster z jedną z tych funkcji RDMA, rozmiary z włączoną funkcją InfiniBand, obraz systemu operacyjnego będzie wyposażony w sterownik Mellanox OFED wymagany do włączenia wstępnie zainstalowanej i wstępnie skonfigurowanej aplikacji InfiniBand.