Rozproszone dostrajanie dużego modelu BERT do zadania polegającego na odpowiadaniu na pytania za pomocą Hugging Face Transformers w Amazon SageMaker

Węzeł źródłowy: 1885069

Od szkolenia nowych modeli do wdrażania ich w produkcji, Amazon Sage Maker oferuje najbardziej kompletny zestaw narzędzi dla startupów i przedsiębiorstw do wykorzystania mocy uczenia maszynowego (ML) i głębokiego uczenia się.

Dzięki bibliotece typu open source Transformers i platformie ML, Hugging Face sprawia, że ​​nauka transferu i najnowsze modele ML są dostępne dla globalnej społeczności AI, skracając czas potrzebny naukowcom danych i inżynierom ML w firmach na całym świecie na wykorzystanie każdej nowej wiedzy naukowej postęp.

Zastosowanie Transformers do nowych zadań lub domen NLP wymaga dopracowania dużych modeli językowych, techniki wykorzystującej zgromadzoną wiedzę z wcześniej wytrenowanych modeli w celu dostosowania ich do nowego zadania lub określonego typu dokumentów w dodatkowym, wydajnym procesie szkoleniowym.

Precyzyjne dostrojenie modelu w celu uzyskania dokładnych prognoz dotyczących danego problemu biznesowego wymaga przeszkolenia dużych modeli Transformers, na przykład BERT, BART, RoBERTa, T5, których wykonanie w skalowalny sposób może być trudne.

Hugging Face ściśle współpracuje z SageMaker gotowe do użycia kontenery Deep Learning (DLC), które sprawiają, że szkolenie i wdrażanie najnowszych modeli Transformers jest łatwiejsze i szybsze niż kiedykolwiek. Ponieważ funkcje takie jak SageMaker Data Parallel (SMDP), SageMaker Model Parallel (SMMP), tryb potokowy S3 są zintegrowane z kontenerem, korzystanie z nich drastycznie skraca czas potrzebny firmom na tworzenie rozwiązań ML opartych na Transformers, takich jak odpowiadanie na pytania, generowanie tekst i obrazy, optymalizując wyniki wyszukiwania oraz usprawniając automatyzację obsługi klienta, interfejsy konwersacyjne, wyszukiwanie semantyczne, analizy dokumentów i wiele innych aplikacji.

W tym poście skupimy się na głębokiej integracji rozproszonych bibliotek SageMaker z Hugging Face, która umożliwia analitykom danych przyspieszenie szkolenia i dostrajania modeli Transformers z dni do godzin, a wszystko to w SageMaker.

Przegląd szkoleń rozproszonych

Praktycy ML i analitycy danych napotykają dwa wyzwania związane ze skalowaniem podczas szkolenia modeli: skalowanie rozmiaru modelu (liczba parametrów i warstw) oraz skalowanie danych szkoleniowych. Skalowanie rozmiaru modelu lub danych treningowych może skutkować lepszą dokładnością, ale w uczeniu głębokim mogą wystąpić przypadki, w których ilość pamięci w akceleratorze (CPU lub GPU) ogranicza kombinację rozmiaru danych treningowych i rozmiaru Model. Na przykład podczas uczenia dużego modelu językowego wielkość partii jest często ograniczona do niewielkiej liczby próbek, co może skutkować mniej dokładnym modelem.

Rozproszone szkolenie może podzielić obciążenie, aby wyszkolić model między wieloma procesorami, tzw pracowników. Pracownicy ci działają równolegle, aby przyspieszyć szkolenie modeli.

W zależności od tego, co chcemy skalować (model lub dane), istnieją dwa podejścia do szkolenia rozproszonego: równoległość danych i równoległość modelu.

Dane równoległe to najpowszechniejsze podejście do szkolenia rozproszonego. Równoległość danych polega na stworzeniu kopii architektury modelu i obciążeniu na różnych akceleratorach. Wtedy, zamiast przekazywać cały zestaw treningowy do jednego akceleratora, możemy podzielić zestaw treningowy na różne akceleratory i szybciej przejść przez zestaw treningowy. Chociaż dodaje to etap, w którym akceleratory muszą przekazać informacje o gradiencie z powrotem do serwera parametrów, ten czas jest więcej niż zrównoważony przez zwiększenie prędkości iteracji na ułamku całego zestawu danych na akcelerator. Z tego powodu równoległość danych może znacznie skrócić czas szkolenia. Na przykład uczenie pojedynczego modelu bez równoległości zajmuje 4 godziny. Korzystanie ze szkolenia rozproszonego może skrócić ten czas do 24 minut. Rozproszone szkolenia SageMaker wdrażają również najnowocześniejsze techniki aktualizacji gradientów.

Podejście równoległe do modeli jest stosowane w przypadku dużych modeli, które są zbyt duże, aby zmieściły się na jednym akceleratorze (GPU). To podejście implementuje strategię równoległości, w której architektura modelu jest dzielona na fragmenty i umieszczana na różnych akceleratorach. Konfiguracja każdego z tych odłamków zależy od architektury sieci neuronowej i zwykle obejmuje kilka warstw. Komunikacja między akceleratorami odbywa się za każdym razem, gdy dane szkoleniowe przechodzą z jednego fragmentu do drugiego.

Podsumowując, należy używać równoległości rozproszonych danych szkoleniowych w przypadku zadań czasochłonnych ze względu na duże zestawy danych lub gdy chcesz przyspieszyć eksperymenty szkoleniowe. Powinieneś użyć równoległości modelu, gdy twój model nie pasuje do jednego akceleratora.

Wymagania wstępne

Aby przeprowadzić rozproszone szkolenie modeli Hugging Face Transformers w SageMaker, musisz spełnić następujące wymagania wstępne:

Wdrażaj szkolenia rozproszone

Biblioteka Hugging Face Transformers zapewnia interfejs API trenera, który jest zoptymalizowany do trenowania lub dostrajania modeli udostępnianych przez bibliotekę. Możesz także użyć go na swoich własnych modelach, jeśli działają one tak samo jak modele Transformers; Widzieć Trener po więcej szczegółów. Ten interfejs API jest używany w naszym przykładowe skrypty, które pokazują, jak wstępnie przetwarzać dane dla różnych zadań NLP, które można wykorzystać jako modele do napisania skryptu rozwiązującego własny, niestandardowy problem. Obietnica interfejsu API trenera polega na tym, że ten skrypt działa od razu po wyjęciu z pudełka w dowolnej konfiguracji rozproszonej, w tym w SageMaker.

Trainer API bierze wszystko, co jest potrzebne do szkolenia. Obejmuje to twoje zbiory danych, twój model (lub funkcję, która zwraca twój model), a compute_metrics funkcja, która zwraca metryki, które chcesz śledzić, z tablic przewidywań i etykiet, Twojego optymalizatora i harmonogramu szybkości uczenia się (zapewnione są dobre ustawienia domyślne), a także wszystkie hiperparametry, które możesz dostroić do treningu, zgrupowane w klasie danych o nazwie TrainingArguments. Dzięki temu udostępnia trzy metody — uczenie, ocenianie i przewidywanie — umożliwiające trenowanie modelu, uzyskiwanie wyników metryk na dowolnym zbiorze danych lub uzyskiwanie prognoz na dowolnym zbiorze danych. Aby dowiedzieć się więcej o obiekcie Trainer, zobacz Dostrajanie modelu za pomocą Trainer API i wideo Interfejs API trenera, który przeprowadzi Cię przez prosty przykład.

Za kulisami Trainer API zaczyna się od analizy środowiska, w którym uruchamiasz swój skrypt podczas tworzenia TrainingArguments. Na przykład, jeśli rozpocząłeś szkolenie z SageMaker, patrzy na SM_FRAMEWORK_PARAMS zmiennej w środowisku, aby wykryć, czy włączono równoległość danych SageMaker lub równoległość modelu. Następnie pobiera odpowiednie zmienne (takie jak ranga procesu lub rozmiar świata) ze środowiska przed wykonaniem niezbędnych kroków inicjalizacji (takich jak smdistributed.dataparallel.torch.distributed.init_process_group()).

Trainer zawiera całą pętlę treningową, dzięki czemu może dostosować niezbędne kroki, aby upewnić się, że smdistributed.dataparallel backend jest używany w razie potrzeby bez konieczności zmiany linii kodu w skrypcie. Nadal może działać (choć znacznie wolniej) na komputerze lokalnym w celu debugowania. Obsługuje podział zestawu danych na fragmenty, tak że każdy proces automatycznie widzi różne próbki, z przetasowaniem w każdej epoce, synchronizacją gradientów przed krokiem optymalizacji, mieszanym treningiem precyzji, jeśli go aktywowałeś, akumulacją gradientu, jeśli nie możesz zmieścić dużego rozmiaru partii na GPU i wiele innych optymalizacji.

Jeśli aktywowałeś równoległość modelu, upewnia się, że procesy, które muszą widzieć te same dane (jeśli ich dp_rank jest taki sam) otrzymują te same partie, a procesy są różne dp_rank nie widzę tych samych próbek, ponownie z przetasowaniem w każdej epoce. Zapewnia prawidłową synchronizację słowników stanu modelu lub optymalizatorów podczas wyznaczania punktów kontrolnych i ponownie obsługuje wszystkie optymalizacje, takie jak mieszana precyzja i akumulacja gradientu.

Podczas korzystania z metod oceny i przewidywania Trainer przeprowadza rozproszoną ocenę, aby wykorzystać wszystkie procesory graficzne. Prawidłowo obsługuje dzielenie danych dla każdego procesu (proces tego samego dp_rank jeśli aktywna jest równoległość modelu) i upewnia się, że predykcje są prawidłowo gromadzone w tej samej kolejności, co zestaw danych, którego używasz, zanim zostaną wysłane do compute_metrics funkcja lub właśnie wróciła. Korzystanie z Trainer API nie jest obowiązkowe. Użytkownicy nadal mogą używać Keras lub PyTorch w Hugging Face. Interfejs API trenera może jednak zapewnić pomocną warstwę abstrakcji.

Wytrenuj model za pomocą estymatorów przytulania twarzy SageMaker

Estimator to interfejs wysokiego poziomu do szkolenia SageMaker i obsługuje kompleksowe zadania szkoleniowe i wdrożeniowe SageMaker. Szkolenie twojego skryptu jest wywoływane, gdy dzwonisz fit na HuggingFace Taksator. W estymatorze określasz, który skrypt dostrajający ma być używany jako entry_point, który instance_type do użycia i które hiperparametry są przekazywane. Aby uzyskać więcej informacji na temat HuggingFace parametry, patrz Przytulanie estymatora twarzy.

Szkolenie rozproszone: dane równoległe

W tym przykładzie używamy nowych DLC Hugging Face i SageMaker SDK do trenowania rozproszonego modelu Seq2Seq-transformer w zadaniu pytań i odpowiedzi przy użyciu Transformers i bibliotek zestawów danych. The bert-large-uncased-całe-słowo-maskowanie model jest dostrojony na oddział zestaw danych.

Poniższe przykłady kodu przedstawiają kroki tworzenia pliku HuggingFace estymator do uczenia rozproszonego z równoległością danych.

  1. Wybierz scenariusz Hugging Face Transformers:
    # git configuration to download our fine-tuning script
    git_config = {'repo': 'https://github.com/huggingface/transformers.git','branch': 'v4.6.1'}

Kiedy tworzysz plik HuggingFace Estimator, możesz określić skrypt szkoleniowy, który jest przechowywany w repozytorium GitHub jako punkt wejścia dla Estimatora, więc nie musisz pobierać skryptów lokalnie. Możesz użyć git_config aby uruchomić przykładowe skrypty Hugging Face Transformers i prawą „gałąź”, jeśli twoja transformers_version wymaga skonfigurowania. Na przykład, jeśli używasz transformers_version 4.6.1, musisz użyć „branch':'v4.6.1".

  1. Skonfiguruj hiperparametry szkoleniowe, które są przekazywane do zadania szkoleniowego:
    # hyperparameters, which are passed into the training job
    hyperparameters={ 'model_name_or_path': 'bert-large-uncased-whole-word-masking', 'dataset_name':'squad', 'do_train': True, 'do_eval': True, 'fp16': True, 'per_device_train_batch_size': 4, 'per_device_eval_batch_size': 4, 'num_train_epochs': 2, 'max_seq_length': 384, 'max_steps': 100, 'pad_to_max_length': True, 'doc_stride': 128, 'output_dir': '/opt/ml/model'
    }

Jako hiperparametr możemy zdefiniować dowolny Argumenty Seq2SeqTraining oraz zdefiniowane w skrypcie szkoleniowym.

  1. Zdefiniuj parametry rozkładu w pliku HuggingFace Taksator:
    # configuration for running training on smdistributed Data Parallel
    distribution = {'smdistributed':{'dataparallel':{ 'enabled': True }}}

Możesz użyć Biblioteka równoległości danych SageMaker od razu po wyjęciu z pudełka do szkoleń rozproszonych. Dodaliśmy funkcjonalność równoległości danych bezpośrednio do Trainera. Aby włączyć równoległość danych, możesz po prostu dodać pojedynczy parametr do pliku HuggingFace Estimator, aby Twój kod oparty na Trainer używał go automatycznie.

  1. Stwórz HuggingFace Estymator zawierający parametry zdefiniowane w poprzednich krokach i rozpocznij trening:
from sagemaker.huggingface import HuggingFace
# estimator
huggingface_estimator = HuggingFace(entry_point='run_qa.py', source_dir='./examples/pytorch/question-answering', git_config=git_config, instance_type= 'ml.p3.16xlarge', instance_count= 2, volume_size= 200, role= <SageMaker Role>, # IAM role, transformers_version='4.6', pytorch_version='1.7', py_version='py36', distribution= distribution, hyperparameters = hyperparameters) # starting the train job huggingface_estimator.fit()

Połączenia Repozytorium Hugging Face Transformers zawiera kilka przykładów i skryptów do precyzyjnego dostrajania modeli w zadaniach, od modelowania języka po klasyfikację tokenów. W naszym przypadku używamy run_qa.py z examples/pytorch/question-answering przykłady.

smdistributed.dataparallel obsługuje szkolenie modeli w SageMaker z tylko następujące typy instancji. Aby uzyskać najlepszą wydajność, zalecamy użycie obsługiwanego typu instancji Elastyczny adapter do tkaniny (NNKT):

  • ml.p3.16xduże
  • ml.p3dn.24xlarge (zalecane)
  • ml.p4d.24xlarge (zalecane)

Aby uzyskać najlepszą wydajność i jak najwięcej SMDataParallel, powinieneś użyć co najmniej dwóch instancji, ale możesz też użyć jednej do przetestowania tego przykładu.

Poniższy przykładowy notatnik zawiera bardziej szczegółowe wskazówki krok po kroku.

Szkolenie rozproszone: model równoległy

Do rozproszonego szkolenia z równoległością modeli używamy biblioteki Hugging Face Transformers i zestawów danych wraz z SageMaker SDK do klasyfikacji sekwencji na Ogólna ocena rozumienia języka (GLUE) test porównawczy w wielowęzłowym klastrze z wieloma procesorami graficznymi przy użyciu Biblioteka równoległości modeli SageMaker.

Podobnie jak w przypadku równoległości danych, najpierw ustawiamy konfigurację git, hiperparametry szkoleniowe i parametry dystrybucji w pliku HuggingFace Taksator:

# git configuration to download our fine-tuning script
git_config = {'repo': 'https://github.com/huggingface/transformers.git','branch': 'v4.6.1'} # hyperparameters, which are passed into the training job
hyperparameters={ 'model_name_or_path':'roberta-large', 'task_name': 'mnli', 'per_device_train_batch_size': 16, 'per_device_eval_batch_size': 16, 'do_train': True, 'do_eval': True, 'do_predict': True, 'num_train_epochs': 2, 'output_dir':'/opt/ml/model', 'max_steps': 500,
} # configuration for running training on smdistributed Model Parallel
mpi_options = { "enabled" : True, "processes_per_host" : 8,
}
smp_options = { "enabled":True, "parameters": { "microbatches": 4, "placement_strategy": "spread", "pipeline": "interleaved", "optimize": "speed", "partitions": 4, "ddp": True, }
} distribution={ "smdistributed": {"modelparallel": smp_options}, "mpi": mpi_options
}

Biblioteka równoległości modelu wewnętrznie używa MPI, więc aby użyć równoległości modelu, należy włączyć MPI za pomocą parametru dystrybucji. “processes_per_host” w powyższym kodzie określa liczbę procesów, które MPI powinien uruchomić na każdym hoście. Sugerujemy je do rozwoju i testowania. W czasie produkcji możesz skontaktować się z pomocą techniczną AWS, jeśli potrzebujesz dużej mocy GPU. Aby uzyskać więcej informacji, zobacz Uruchom równoległe zadanie szkoleniowe modelu rozproszonego SageMaker.

Poniższy przykładowy notatnik zawiera kompletne skrypty kodu.

Instancje Spot

Dzięki rozszerzeniu struktury Hugging Face dla SageMaker Python SDK możemy również w pełni zarządzać Elastyczna chmura obliczeniowa Amazon (Amazonka EC2) Instancje Spot i zaoszczędź do 90% kosztów szkolenia.

Jeśli zadanie szkoleniowe nie zakończy się szybko, zalecamy użycie punkty kontrolne z zarządzanym treningiem punktowym, dlatego musisz zdefiniować checkpoint_s3_uri.

Aby użyć Spot Instancji z HuggingFace Estymator, musimy ustawić use_spot_instances parametr na True i zdefiniuj swój max_wait i max_run czas. Aby uzyskać więcej informacji na temat cyklu życia szkolenia na miejscu zarządzanym, zobacz Zarządzane szkolenie punktowe w Amazon SageMaker.

Poniżej znajduje się fragment kodu służący do konfigurowania kalkulatora szkolenia punktowego:

from sagemaker.huggingface import HuggingFace # hyperparameters, which are passed into the training job
hyperparameters={'epochs': 1, 'train_batch_size': 32, 'model_name':'distilbert-base-uncased', 'output_dir':'/opt/ml/checkpoints' } # s3 uri where our checkpoints will be uploaded during training
job_name = "using-spot"
checkpoint_s3_uri = f's3://{sess.default_bucket()}/{job_name}/checkpoints' huggingface_estimator = HuggingFace(entry_point='train.py', source_dir='./scripts', instance_type='ml.p3.2xlarge', instance_count=1, base_job_name=job_name, checkpoint_s3_uri=checkpoint_s3_uri, use_spot_instances=True, max_wait=3600, # This should be equal to or greater than max_run in seconds' max_run=1000, # expected max run in seconds role=role, transformers_version='4.6', pytorch_version='1.7', py_version='py36', hyperparameters = hyperparameters)

Poniższy notatnik zawiera kompletne skrypty kodu.

Wnioski

W tym poście omówiliśmy rozproszone szkolenie Transformatorów Przytulania Twarzy przy użyciu SageMaker. Najpierw przejrzeliśmy przypadki użycia równoległości danych i równoległości modelu. Równoległość danych jest zwykle bardziej odpowiednia, ale niekoniecznie ograniczona do sytuacji, gdy szkolenie jest ograniczone przez obliczenia, podczas gdy równoległości modelu można użyć, gdy model nie mieści się w pamięci dostępnej na jednym akceleratorze. Następnie pokazaliśmy, jak trenować obiema metodami.

W omawianym przypadku użycia równoległości danych uczenie modelu na pojedynczej instancji p3.2xlarge (z jednym procesorem graficznym) zajmuje 4 godziny i kosztuje około 15 USD w chwili pisania tego tekstu. Dzięki równoległości danych możemy wytrenować ten sam model w 24 minuty za 28 USD. Chociaż koszt się podwoił, skróciło to czas szkolenia 10-krotnie. W sytuacji, w której trzeba trenować wiele modeli w krótkim czasie, równoległość danych może to umożliwić przy stosunkowo niskim wzroście kosztów. Jeśli chodzi o przypadek użycia równoległości modeli, dodaje on możliwość trenowania modeli, których wcześniej w ogóle nie można było trenować ze względu na ograniczenia sprzętowe. Obie funkcje umożliwiają praktykom ML nowe przepływy pracy i są łatwo dostępne za pośrednictwem HuggingFace Estimator jako część pakietu SageMaker Python SDK. Wdrażanie tych modeli w hostowanych punktach końcowych odbywa się zgodnie z tą samą procedurą, co w przypadku innych estymatorów.

Ta integracja umożliwia korzystanie z innych funkcji, które są częścią ekosystemu SageMaker. Na przykład możesz użyć Instancji Spot, dodając prostą flagę do Estimatora w celu dodatkowej optymalizacji kosztów. W następnym kroku możesz znaleźć i uruchomić plik demonstracja treningu i przykładowy notatnik.


O autorach

Archisa Joglekara jest architektem AI/ML Partner Solutions w zespole Emerging Technologies. Interesuje się wydajnym, skalowalnym głębokim uczeniem i obliczeniami naukowymi z wykorzystaniem bloków konstrukcyjnych AWS. Jego wcześniejsze doświadczenia sięgają od badań fizyki obliczeniowej po rozwój platformy uczenia maszynowego w środowisku akademickim, laboratoriach krajowych i start-upach. Czas wolny od komputera spędza grając w piłkę nożną oraz spotykając się z przyjaciółmi i rodziną.

Jamesa Yi jest starszym architektem rozwiązań partnerskich AI/ML w zespole nowych technologii w Amazon Web Services. Pasjonuje go praca z klientami korporacyjnymi i partnerami przy projektowaniu, wdrażaniu i skalowaniu aplikacji AI/ML w celu uzyskania ich wartości biznesowych. Poza pracą lubi grać w piłkę nożną, podróżować i spędzać czas z rodziną.

Filip Schmid jest inżynierem uczenia maszynowego i liderem technicznym w Hugging Face, gdzie kieruje współpracą z zespołem Amazon SageMaker. Pasjonuje się demokratyzacją, optymalizacją i produkcją najnowocześniejszych modeli NLP oraz poprawianiem łatwości użytkowania w Deep Learning.

Sylvaina Guggera jest inżynierem ds. badań w Hugging Face i jednym z głównych opiekunów biblioteki Transformers. Uwielbia oprogramowanie open source i pomaga społeczności z niego korzystać.

Jeffa Boudiera buduje produkty w Hugging Face, twórcy Transformers, wiodącej biblioteki ML typu open source. Wcześniej Jeff był współzałożycielem firmy Stupeflix, przejętej przez GoPro, gdzie pełnił funkcję dyrektora ds. zarządzania produktami, marketingu produktów, rozwoju biznesu i rozwoju korporacyjnego.

Źródło: https://aws.amazon.com/blogs/machine-learning/distributed-fine-tuning-of-a-bert-large-model-for-a-question-answering-task-using-hugging-face- transformers-on-amazon-sagemaker/

Znak czasu:

Więcej z Blog dotyczący uczenia maszynowego AWS