02. Technologie
Technologie programistyczne¶
Pamięć współdzielona¶
OpenMP¶
powszechnie używany standard do zrównoleglania obliczeń w architekturze pamięci współdzielonej, tj. w obrębie jednego komputera i pojedynczego procesu. Oparty o wiele wątków z dostępem do tej samej pamięci. Przewidziany głównie do wykorzystania możliwości wielordzeniowych procesorów, obecnie umożliwia również offloading na akcelerator (tj. delegowanie obliczeń do wykonania np. na układzie GPU).
Obliczenia rozproszone¶
MPI¶
powszechnie używany standard do zrównoleglania obliczeń w architekturze rozproszonej, tj. między wieloma komputerami połączonymi w sieć. Oparty o procesy z oddzielną pamięcią, może zostać wykorzystany również w obrębie jednego komputera. Bardzo często jest łączony z innymi technologiami odpowiedzialnymi za dalsze zrównoleglenie obliczeń na wiele wątków lub akceleratory (np. OpenMP, CUDA lub HIP).
Implementacje: MPICH • Open MPI • MVAPICH
MPI-IO¶
część standardu MPI definiująca API do równoległej pracy z plikami umieszczonymi we współdzielonym, sieciowym systemie plików przez wiele rozproszonych procesów. Przewidziany szczególnie do wydajnej pracy z równoległymi systemami plików, takimi jak Lustre czy GPFS.
Akceleratory¶
OpenACC¶
podobny do OpenMP, standard do zrównoleglania obliczeń na platformach akcelerowanych. Został zaprojektowany do ułatwienia prowadzenia obliczeń przede wszystkim na GPU. Może wspierać również inne typy akceleratorów. Wprowadził koncepcję delegowania obliczeń (tzw. offloading), która później została zaadaptowana przez standard OpenMP. Niektóre kompilatory umożliwiają wykonanie zrównoleglonego kodu zarówno na GPU jak i na wielordzeniowym CPU.
CUDA¶
rozwijany przez firmę NVIDIA model programowania dla platform akcelerowanych z układami GPU NVIDIA, przewidziany wyłącznie dla kart tego producenta. Standardowo umożliwia zlecanie obliczeń i komunikację pomiędzy procesorem a kartami GPU, oraz bezpośredni dostęp do pamięci pomiędzy wieloma kartami w obrębie jednego komputera. Posiada dodatkowe rozwiązania wspierające efektywną pracę z wieloma GPU, również w architekturze rozproszonej.
HIP¶
rozwijany przez firmę AMD model programowania dla platform akcelerowanych będący odpowiednikiem NVIDIA CUDA. Umożliwia tworzenie oprogramowania dla układów GPU AMD, ale jednocześnie gwarantuje przenośność kodu, tj. pozwala na uruchomienie tego samego kodu również na GPU NVIDIA. Wchodzi w skład szerszego zestawu narzędzi programistycznych oraz bibliotek AMD ROCm.
SYCL¶
wysokopoziomowy model programowania dla platform akcelerowanych, traktujący wielordzeniowe procesory również jako akceleratory. Oparty o C++, oferuje zunifikowany interfejs do programowania różnych urządzeń dostępnych w obrębie jednego komputera (tzw. strategia XPU). Dzięki temu umożliwia kompilację oraz uruchamianie tego samego kodu źródłowego na akceleratorach różnych typów (CPU, GPU, FPGA i inne) od różnych producentów.
Implementacje: Intel oneAPI DPC++ • AdaptiveCpp • Codeplay ComputeCpp
OpenCL¶
otwarty standard określający model programowania dla platform akcelerowanych, który powstał jako alternatywa dla CUDA. Jest rozwiązaniem nieograniczającym się tylko do kart GPU, tylko jednego producenta. Udostępnia jednolity interfejs pozwalający programować różne typy akceleratorów, zaliczając do tego grona również wielordzeniowe CPU.
Biblioteki obliczeniowe¶
Podstawy korzystania z bibliotek¶
Biblioteki programistyczne dostarczają gotowe funkcje i typy danych, które mogą zostać użyte przez programistę we własnym kodzie źródłowym. Biblioteki mogą znacznie przyspieszyć i ułatwić tworzenie aplikacji. Omawiamy różne aspekty i pojęcia związane z korzystaniem z bibliotek, m.in.:
- czym jest API
- sposoby instalacji i rodzaje bibliotek
- kompilacja programów korzystających z bibliotek
- przydatne zmienne środowiskowe
Podstawowe biblioteki¶
BLAS/LAPACK¶
powszechnie uznane biblioteki matematyczne służące do wykonywania typowych operacji algebry liniowej na wektorach i macierzach liczb rzeczywistych lub zespolonych. Ich interfejs stał się swego rodzaju standardem, który obecnie posiada wiele implementacji. Są przeznaczone do obliczeń na CPU w modelu pamięci współdzielonej. Dostawcy GPU oferują biblioteki o tym samym lub zbliżonym interfejsie, które potrafią wykonać część obliczeń na akceleratorze (np. NVBLAS, cuBLAS, rocBLAS).
Implementacje: Netlib • OpenBLAS • ATLAS • MKL • BLIS/libFLAME • AOCL • FlexiBLAS (wrapper)
ScaLAPACK¶
skalowalna wersja biblioteki LAPACK, umożliwiająca wykonywanie typowych operacji algebry liniowej w środowisku rozproszonym. Udostępnia podzbiór funkcji LAPACK o interfejsie zmodyfikowanym pod kątem rozpraszania obliczeń. Podobnie jak BLAS i LAPACK posiada kilka implementacji. Jest przeznaczona do obliczeń na CPU. Porównywalne rozwiązania dla GPU oferuje firma NVIDIA w formie bibliotek cuSOLVER (moduł cuSolverMG) oraz cuSOLVERMp.
Moduły: BLACS • PBLAS
FFTW¶
zoptymalizowana biblioteka pozwalającą na wykonywanie operacji z dziedziny FFT czyli szybkiej transformacji Fouriera (Fast Fourier Transform). Jest to wydajna implementacja umożliwiająca obliczenia zrównoleglone – zarówno wielowątkowe jak i rozproszone. Przewidziana do obliczeń na CPU.
Zestawy bibliotek¶
Intel MKL¶
złożona biblioteka firmy Intel, zawierająca wydajne funkcje obliczeniowe z wielu dziedzin. Implementuje interfejsy dobrze znanych bibliotek (BLAS/LAPACK/ScaLAPACK, FFTW), dostarcza również funkcje do generowania liczb losowych (RNG), statystyki, interpolacji (data fitting) i wiele innych. Przewidziana do obliczeń głównie na CPU, zoptymalizowana pod architekturę Intel. Posiada pewne wsparcie dla Intel GPU. Oprócz standardowego interfejsu, dostępna również dla SYCL.
AMD AOCL¶
przygotowany przez firmę AMD zestaw popularnych bibliotek obliczeniowych z różnych dziedzin. W jego skład wchodzą implementacje dobrze znanych bibliotek dot. algebry liniowej i FFT (BLAS/LAPACK/ScaLAPACK, FFTW), jak i biblioteki przeznaczone do kompresji, szyfrowania danych czy generowania liczb pseudolosowych (RNG). Biblioteki są zoptymalizowane pod kątem procesorów AMD (z rodziny Zen).
Python¶
NumPy¶
bardzo wydajna biblioteka obliczeniowa dla języka Python, przewidziana do obliczeń wykonywanych na CPU. Umożliwia tworzenie obiektów reprezentujących wielowymiarowe tablice oraz dostarcza funkcje do szybkich operacji na tablicach wielowymiarowych. Zakres wspieranych funkcji jest bardzo szeroki i obejmuje m.in. podstawowe operacje algebry liniowej na wektorach i macierzach.
SciPy¶
zawiera wiele naukowych i numerycznych algorytmów i funkcji, które rozszerzają NumPy. Podczas gdy NumPy koncentruje się na wydajnych operacjach tablicowych, SciPy udostępnia zbiór modułów dla różnych dziedzin naukowych.
CuPy¶
biblioteka stanowiąca rozszerzenie popularnej biblioteki NumPy o możliwość łatwego wykonywania obliczeń na GPU. API zostało zaprojektowane tak, aby zapewnić kompatybilność z bibliotekami NumPy i SciPy, umożliwiając tym samym bezpośrednie i szybkie wykorzystanie ich w istniejącym już kodzie. Dużą zaletą jest też niezależność od stosowanych urządzeń – CuPy nie jest ograniczona pod względem danego typu GPU czy CPU. Wspiera platformę NVIDIA CUDA, a od pewnego czasu (wersji 9.0) także AMD HIP/ROCm (wsparcie eksperymentalne).
Sztuczna inteligencja (AI)¶
Poradnik AI/ML¶
Krótki poradnik zawierający podstawowe informacje, które warto znać, wchodząc w dziedzinę uczenia maszynowego (machine learning), a szczególnie w jej poddziedzinę jaką jest uczenie głębokie (deep learning). Materiał autorstwa dr. hab. inż. Macieja Wielgosza z AGH.
Książka "Dive into Deep Learning"¶
Interaktywna książka, w przystępny sposób wprowadzająca w świat uczenia głębokiego. Łaczy teorię z praktyką - omawiane koncepcje są zobrazowane kodem źródłowym dla PyTorch, TensorFlow, JAX, co pozwala szybko zacząć samodzielnie eksperymentować. Dostępne są równiez notatniki Jupyter.
Książka zawiera suplement tłumaczący podstawy matematyczne, które mają zastosowanie nie tylko dla uczenia głębokiego ale również dla klasycznego uczenia maszynowego (m.in. podstawy algebry liniowej, zmienne losowe, rozkłady prawdopodobieństwa, naiwny klasyfikator bayesowski, statystyka).
Klasyczne uczenie maszynowe¶
scikit-learn¶
biblioteka oferująca klasyczne narzędzia uczenia maszynowego (machine learning). Napisana w Pythonie, stworzona z myślą o wspólnym korzystaniu z bibliotekami NumPy i SciPy. Dostarcza szereg funkcjonalności służących do obróbki i wizualizacji danych.
Tworzenie sieci neuronowych¶
PyTorch¶
rozbudowana biblioteka do rozwiązań uczenia głębokiego (deep learning), stworzona oryginalnie przez Meta, a obecnie stanowiąca część Linux Foundation. Powstała na bazie biblioteki Torch, która już nie jest rozwijana. Z założenia, Pytorch jest nastawiony na modułowość i programowanie obiektowe. Udostępnia również rozwiązania niskopoziomowe do pracy z sieciami neuronowymi.
Lightning¶
biblioteka, która została stworzona jako wysokopoziomowy interfejs do biblioteki Pytorch. Głównymi celami twórcy frameworku, Williama Falcona, było zminimalizowanie czasu poświęconego na rozwiązywanie problemów inżynieryjnych podczas tworzenia kodu do eksperymentów naukowych. Umożliwia efektywne strukturyzowanie i upraszczanie kodu stworzonego w bibliotece Pytorch.
TensorFlow¶
rozbudowana biblioteka do rozwiązań uczenia głębokiego (deep learning), stworzona przez Google. Podobnie jak Pytorch, pozwala zarówno na wysokopoziomowe, modułowe tworzenie sieci, jak i na niskopoziomowe konfigurowanie sieci krok po kroku. W porównaniu do Pytorcha, niskopoziomowa praca w Tensorflow może być mniej przystępna dla początkującego użytkownika.
Keras¶
biblioteka działająca obecnie jako wysokopoziomowe API dla Tensorflow. Głównym założeniem twórców Keras było dostarczenie narzędzia do prostej implementacji sieci neuronowych, związanych z nią funkcji pomocniczych i szybkiego eksperymentowania.
JAX¶
stworzona przez firmę Google biblioteka do akceleracji obliczeń numerycznych i tworzenia sieci neuronowych dla języka Python. JAX nadaje się jako osobny framework do tworzenia nowych, autorskich rozwiązań z wykorzystaniem uczenia głębokiego (deep learning), głównie w celach badawczych przez zaawansowanych użytkowników. Może być także wykorzystany jako element wspomagający pracę innych frameworków jak Tensorflow i Pytorch. Dodatkowo, stanowi wartościową bibliotekę do wykonywania innych obliczeń naukowych, niekoniecznie związanych z sieciami neuronowymi.
Rozwiązania pomocnicze¶
HuggingFace¶
platforma społecznościowa/hub AI mająca na celu demokratyzację i rozwój społeczności skoncentrowanej wokół AI. Oprócz samgo aspektu społecznościowego, na ekosystem HuggingFace składa się wiele bibliotek umożliwiających stosowanie udostępnianych zasobów. Platforma HuggingFace udostępnia obszerne zbiory modeli oraz zestawy danych treningowych.
DeepSpeed¶
stworzona przez Microsoft biblioteka do efektywnego trenowania modeli oraz inferencji. Jako trzon wykorzystuje bibliotekę Pytorch. Niektóre elementy, jak na przykład strategie treningu rozproszonego, są zintegrowane z innymi technologiami takimi jak Lightning czy HuggingFace Transformers.
Horovod¶
stworzony przez Uber, a obecnie utrzymywany przez Linux Foundation, framework do treningu rozproszonego. Głównym celem projektu jest przyspieszenie procesu treningu modeli oraz zmniejszenie zużycia pamięci akceleratorów.
ONNX¶
projekt mający na celu unifikację standardów obecnych w dziedzinie AI. Jego głównym założeniem jest ułatwienie transferu modeli gotowych do inferencji pomiędzy różnymi językami programowania, systemami operacyjnymi i architekturami sprzętowymi.
Netron¶
aplikacja do graficznej wizualizacji modeli uczenia głębokiego. Ułatawia analizę architektury oraz funkcjonalności modeli.
Zagadnienia¶
LLM¶
rodzaj modeli językowych opartych o sieć neuronową. “Large” odnosi się do ogromnej ilości parametrów zawartych w takiej sieci, która z reguły wynosi od 1 miliarda do ponad 1 biliona parametrów. Modele te znalazły szerokie zastosowanie w przetwarzaniu języka naturalnego (NLP, natural language processing). Leżą u podstaw aplikacji konwersacyjnych (popularne chatboty), generujących i uzupełniających tekst, tłumaczących, klasyfikujących treści oraz wielu innych.