PyTorch – wolna i otwarta biblioteka programistyczna oraz zestaw narzędzi do uczenia maszynowego, w szczególności uczenia głębokiego. Łączy obliczenia na tensorach z automatycznym wyznaczaniem pochodnych, umożliwiając konstruowanie, uczenie i wykonywanie sieci neuronowych. Obsługuje obliczenia na procesorach centralnych oraz procesorach graficznych i innych akceleratorach sprzętowych.

Podstawowy interfejs biblioteki jest przeznaczony dla języka Python; dostępny jest również interfejs C++. PyTorch wykorzystuje imperatywny model programowania, w którym przebieg obliczeń opisuje się za pomocą zwykłych instrukcji programu. Rozwiązanie to pozwala łączyć definiowanie modeli z narzędziami do diagnozowania błędów i pozostałymi bibliotekami środowiska PythonaAdam Paszke, Sam Gross, Francisco Massa i inni, PyTorch: An Imperative Style, High-Performance Deep Learning Library, „Advances in Neural Information Processing Systems”, t. 32, 2019..

Projekt powstał przy udziale zespołu Facebook AI Research, należącego do przedsiębiorstwa Facebook, późniejszej Meta. W 2022 roku objęto go strukturą organizacyjną PyTorch Foundation, działającej w ramach Linux Foundation.

Historia

Prace nad PyTorch rozpoczęto w 2016 roku z udziałem programistów związanych ze społecznością biblioteki Torch, w tym pracowników Facebooka oraz innych przedsiębiorstw i instytucji. Publiczne udostępnienie nastąpiło w styczniu 2017 roku. Datę 19 stycznia potwierdza opublikowane rok później podsumowanie, w którym twórcy wskazali ten dzień jako pierwszą rocznicę publicznego wydania biblioteki.

W pierwszym roku rozwoju wokół projektu powstały biblioteki dziedzinowe i implementacje metod opisanych w publikacjach naukowych. Obejmowały one między innymi przetwarzanie obrazów, przetwarzanie języka naturalnego oraz programowanie probabilistyczne.

15 marca 2023 roku wydano PyTorch 2.0. Jedną z głównych zmian było wprowadzenie interfejsu torch.compile, udostępniającego mechanizmy kompilacji i optymalizacji obliczeń przy zachowaniu dotychczasowego sposobu definiowania modeli.

Architektura i zasada działania

Tensory

Podstawową strukturą danych jest torch.Tensor, reprezentujący wartości skalarne oraz tablice jedno- i wielowymiarowe. Tensory służą do przechowywania danych wejściowych, wyników obliczeń i parametrów modeli. Ich właściwości określają między innymi rozmiary poszczególnych osi, typ danych oraz urządzenie, w którego pamięci znajdują się dane.

Biblioteka udostępnia operacje arytmetyczne, mnożenie macierzy, zmianę kształtu tablic i inne procedury algebry liniowej. Zapewnia także współpracę z NumPy; w odpowiednich warunkach tablica NumPy i tensor przechowywany w pamięci procesora centralnego mogą współdzielić ten sam obszar pamięci.

Różniczkowanie automatyczne

Mechanizm torch.autograd wyznacza gradienty obliczeń złożonych z obsługiwanych operacji. W trybie różniczkowania odwrotnego rejestruje zależności między operacjami, a następnie przechodzi przez utworzony graf w kierunku przeciwnym do przebiegu obliczeń. Pochodne poszczególnych operacji są składane zgodnie z regułą łańcuchową.

W standardowym trybie wykonania, określanym jako eager execution, graf różniczkowania jest odtwarzany podczas kolejnych przebiegów programu. Dzięki temu instrukcje warunkowe i pętle Pythona mogą zmieniać strukturę wykonywanych obliczeń zależnie od danych.

Interfejs C++

Biblioteka ATen stanowi podstawę operacji tensorowych. Interfejs C++ uzupełnia ją o różniczkowanie automatyczne, moduły sieci neuronowych, algorytmy optymalizacji i obsługę danych. PyTorch umożliwia również tworzenie własnych operacji w C++ i z wykorzystaniem CUDA, a następnie udostępnianie ich programom napisanym w Pythonie.

Budowa i uczenie modeli

Modele sieci neuronowych definiuje się zazwyczaj za pomocą klas dziedziczących po torch.nn.Module. Moduł może zawierać warstwy i parametry modelu, natomiast metoda forward określa przebieg obliczeń. Podczas uczenia funkcja straty służy do oceny wyniku, mechanizm różniczkowania wyznacza gradienty, a algorytm optymalizacji aktualizuje parametry.

+ Wybrane składniki PyTorch Składnik Zastosowanie torch Tensory i podstawowe operacje numeryczne. torch.autograd Automatyczne wyznaczanie pochodnych. torch.nn Moduły i warstwy sieci neuronowych oraz funkcje straty. torch.optim Algorytmy aktualizacji parametrów modelu. torch.utils.data.Dataset Interfejs udostępniający przykłady ze zbioru danych. torch.utils.data.DataLoader Odczyt danych, grupowanie przykładów i obsługa ich dostarczania do modelu.

Kompilacja i optymalizacja

Interfejs torch.compile umożliwia przekazanie obliczeń modelu do mechanizmów optymalizacji i generowania kodu. W architekturze przedstawionej wraz z PyTorch 2.0 TorchDynamo wyodrębnia grafy obliczeń z programu Pythona, AOTAutograd przygotowuje obliczenia różniczkowania do kompilacji, a TorchInductor generuje kod dla wybranego środowiska wykonawczego. Kompilacja jest funkcją opcjonalną; uzyskiwane przyspieszenie zależy od modelu i sprzętu.

Obliczenia rozproszone

PyTorch udostępnia mechanizmy uczenia rozproszonego. W rozwiązaniu DistributedDataParallel poszczególne procesy wykorzystują lokalne kopie modelu. Gradienty są agregowane za pomocą operacji komunikacji zbiorowej, co pozwala aktualizować parametry poszczególnych kopii w sposób zgodny.

Przesyłanie gradientów może częściowo nakładać się w czasie na pozostałe obliczenia przebiegu wstecznego. Wydajność tej metody zależy między innymi od struktury modelu, ilości przesyłanych danych i możliwości komunikacyjnych infrastruktury.

Biblioteki powiązane i zastosowania

TorchVision udostępnia zbiory danych, architektury modeli, wytrenowane wagi i przekształcenia wykorzystywane w analizie obrazów. Obsługiwane zadania obejmują między innymi klasyfikację obrazów, wykrywanie obiektów i segmentację.

Przykładem projektu wykorzystującego PyTorch do programowania probabilistycznego jest Pyro, opracowane w Uber AI Labs, jednostce badawczej przedsiębiorstwa Uber. Pyro łączy opis modeli probabilistycznych z obliczeniami tensorowymi i automatycznym różniczkowaniem zapewnianymi przez PyTorch.

Obsługiwane środowiska i odtwarzalność

PyTorch jest dostępny dla systemów Linux, macOS i Windows. Zakres obsługi akceleratorów zależy od systemu operacyjnego, wersji biblioteki oraz konfiguracji sprzętu i oprogramowania.

Dokumentacja projektu wskazuje, że pełna zgodność wyników numerycznych między wersjami biblioteki i platformami sprzętowymi nie jest gwarantowana. Ustalenie stanów początkowych generatorów liczb pseudolosowych oraz wybór algorytmów deterministycznych ograniczają zmienność w określonym środowisku, lecz mogą zwiększać koszt obliczeń. Identyczna inicjalizacja generatora nie zapewnia sama w sobie jednakowych wyników na CPU i GPU.

Zarządzanie projektem i licencja

12 września 2022 roku ogłoszono utworzenie PyTorch Foundation w ramach Linux Foundation. Do jej członków założycieli należały AMD, Amazon Web Services, Google Cloud, Meta, Microsoft Azure i NVIDIA. Fundacja zapewnia projektowi wsparcie organizacyjne i strukturę współpracy między uczestniczącymi podmiotami. Zgodnie z ogłoszonym modelem zarządzania decyzje techniczne pozostają w gestii opiekunów poszczególnych części projektu.

Kod źródłowy jest publikowany w serwisie GitHub na trzyklauzulowej licencji BSD, dopuszczającej użytkowanie, modyfikowanie i rozpowszechnianie oprogramowania na określonych w niej warunkach.

Zobacz też TensorFlow NumPy Uczenie maszynowe Uczenie głębokie

Przypisy

Bibliografia Nikhil Ketkar, Introduction to PyTorch, w: Deep Learning with Python, Apress, 2017, s. 195–208, .

Linki zewnętrzne Oficjalna strona projektu Dokumentacja PyTorch Repozytorium kodu źródłowego

Kategoria:Biblioteki Pythona Kategoria:Uczenie maszynowe Kategoria:Wolne oprogramowanie