14 maja 2020 nastąpił historyczny moment w świecie przetwarzania danych, NVIDIA zaprezentowała najnowszą architekturę nowych akceleratorów GPU. Nowy model NVIDIA A100 Tensor Core GPU bazuje na najnowszej architekturze Ampere wykonanej w litografii 7nm. A100 jest wysoko skalowalnym rozwiązaniem do obliczeń wykonywanych w stacjach roboczych, serwerach, klastrach i centrach danych. Nowa architektura wprowadza również trzecią generację Tensor Core, która zwiększa przepływowość obliczeniową. Przykładowo obliczenia FP32 na A100 są 10x szybsze w stosunku do poprzedniej generacji V100, a w przypadku użycia macierzy rzadkich obliczenia są wykonywane nawet do 20x szybciej.

Multi-instance GPU (MIG)
Nowa karta wprowadza szereg rozwiązań wpływających na wydajność obliczeń. Jednym z ciekawszych rozwiązań, wcześniej niedostępnych, jest MIG ( multi-instance GPU). MIG pozwala na podzielenie obliczeń wykonywanych na GPU nawet na 7 oddzielnych niezależnych instancji. Obliczenia na tych instancjach są wykonywane jednocześnie, posiadają własną część pamięci, cache oraz jednostek SM. Nowa funkcjonalność jest genialnym rozwiązaniem, którego brakowało od lat w dziedzinie przetwarzania danych AI.

Oprócz podziału na 7 niezależnych instancji możliwa jest również granulacja na mniejszą liczbę instancji, w zależności od wymaganej mocy obliczeniowej lub dostępnej pamięci.

Korzystanie z potencjału MIG nie będzie wymagało zmian w kodzie co jest świetną informacją! MIG na starcie będzie w pełni wspierać systemy z rodziny Linux, Kubernetes i kontenery. MIG w połączeniu z NVIDIA vComputeServer zapewni wsparcie dla systemów wirtualizacji tj. VMware vSphere, Red Hat Virtualization.
40GB HBM2 i 40MB Cache L2
Aby wykorzystać potencjał płynący z nowej architektury, NVIDIA zadbała o odpowiednią ilość pamięci na karcie. Na pokładzie znalazło się 40GB pamięci wykonanej w technologii HBM2 z przepustowością 1555GB/s, jest to wzrost o 73% w stosunku do Tesli V100. Dodatkowo zwiększona została ilość pamięci podręcznej L2 do 40MB, czyli prawie 7x więcej niż w V100.
Nowa generacja NVLink
Trzecia generacja NVLink, która jest zaimplementowana w architekturze Ampere zwiększa dotychczasową wydajność, skalowalność i niezawodność. Zwiększona ilość ścieżek dla każdego GPU i Switcha daje nam pomiędzy dwiema kartami podwójną prędkość w stosunku do V100 ( 50Gbit/s); maksymalna przepustowość wynosi aktualnie do 600Gbit/s.
Bliższe spojrzenie na nową architekturę
Chipset karty graficznej A100 jest zbudowany z wielu klastrów procesujących (GPCs), klastrów procesujących teksturowanie (TPCs), bloków SM (SM - Streaming Multiprocessors) oraz kontrolerów HBM2.
Pełna implementacja chipsetu GA100 jest złożona z:
- 8 GPCs, 8 TPCs/GPC, 2 SMs/TPC, 16 SMs/GPC, 128 SMs na cały układ GPU
- 64 FP32 CUDA Cores/SM, 8192 FP32 CUDA Cores na cały układ GPU
- 4 Tensor Cores/SM, 512 Tensor Cores na cały układ GPU
- 6 modułów HBM2, 12 kontrolerów pamięci o szynie 512-bit
- 7 GPCs, 7 lub 8 TPCs/GPC, 2 SMs/TPC, do 16 SMs/GPC, 108 SMs na cały układ GPU
- 64 FP32 CUDA Cores/SM, 6912 FP32 CUDA Cores na cały układ GPU
- 4 Tensor Cores/SM, 432 Tensor Cores na cały układ GPU
- 5 modułów HBM2, 10 kontrolerów pamięci o szynie 512-bit

Architektura bloków SM w A100
Nowa konstrukcja bloków SM diametralnie zwiększa wydajność, wzbogaca możliwości zaprezentowane w poprzednich generacjach oraz dodaje nowe funkcjonalności i usprawnienia. Poniższy diagram ukazuje konstrukcję bloku SM. Karty w architekturze Volta i Turing mają po 8 Tensor Core dla bloku SM, które wykonują 64 operacji FP16/FP32 dla każdego cyklu GPU. Konstrukcja bloku SM w Ampere pozwala na 256 operacji FP16/FP32 dla każdego cyklu GPU. A100 posiada 4 Tensor Core dla bloku SM co daje nam podwójną wydajność w porównaniu do Volta i Turing.

Dodatkowo architektura bloków SM przeszła szereg zmian opisanych poniżej:
- Tensor Core trzeciej generacji:
- Akceleracja obliczeń dla każdego typu danych m.in. FP16, BF16, TF32, FP64, INT8, INT4, oraz liczb binarnych.
- Nowa funkcjonalność pozwalająca na korzystanie z macierzy rzadkości przyspiesza uczenie głębokie zwiększając wydajność dwukrotnie w stosunku do operacji na akceleratorach poprzedniej generacji.
- Obliczenia na FP32 są 10x szybsze niż na V100, a przy użyciu macierzy rzadkości nawet do 20x.
- Obliczenia mieszane FP16/FP32 są 2,5x szybsze w porównaniu do V100, a przy użyciu macierzy rzadkości nawet 5x.
- Tak samo szybkie jak powyżej są obliczenia BF16/FP32.
- Obliczenia FP64 są do 2,5x szybsze w porównaniu do V100.
- Obliczenia INT8 z użyciem macierzy rzadkości są do 20x szybsze niżeli na V100.
- 192 KB łącznej dzielonej pamięci i pamięci podręcznej L1. Do 1,5x więcej niż na bloku SM w V100.
- Nowa funkcjonalność instrukcji kopiowania asynchronicznego z pamięci globalnej do współdzielonej, opcjonalnie możliwe pominięcie L1 oraz wyeliminowanie potrzeby rejestracji pośredniej (RF).
- Nowe jednostki dla pamięci współdzielonej (asynchronous barriers) do użycia z nowym zestawem instrukcji kopiowania asynchronicznego.
- Nowe instrukcje do zarządzania pamięcią podręczną L2.
- Nowe instrukcje redukcji na poziomie warp wspierane przez CUDA.
- Wiele nowych usprawnień programistycznych w celu zredukowania poziomu skomplikowania oprogramowania.

Wzrost wydajności nowej architektury A100 względem poprzedniej generacji V100 ukazano poniżej:

Macierze rzadkości w A100
Wraz z nową architekturą wdrożona została nowa funkcjonalność szczegółowej strukturalnej rzadkości. Jest to nowy sposób obliczeń, który zwiększa dwukrotnie wydajność obliczeniową dla głęboki sieci neuronowych.
Korzystanie z macierzy rzadkości jest możliwe w głębokim uczeniu dzięki zmianom indywidualnych wag podczas ewoluowania w procesie uczenia. Pod koniec uczenia tylko część wag przybiera na znaczeniu w celu znalezienia końcowego wyniku. Pozostałe wagi nie są dłużej potrzebne.
Definicja macierzy rzadkości
Struktura jest wymuszona przez nową definicję macierzy rzadkości w formacie 2:4, pozwala na dwie wartości zerowe w wektorze czteroliczbowym. A100 wspiera strukturę macierzy rzadkości 2:4 w wierszach co jest ukazane na obrazie poniżej.
Dzięki dobrze zdefiniowanej strukturze macierzy może być ona skompresowana nawet do 2x w celu zredukowania zajmowanej pamięci i wykorzystania przepustowości.

Architektura MIG
W związku z tym, że nie wszystkie obliczenia na serwerach wymagają maksymalnej wydajności obliczeniowej, została wprowadzona możliwość dzielenia instancji GPU. Dotychczasowo nie istniała taka możliwość przy korzystaniu z akceleratorów graficznych poprzednich generacji. Dzięki nowej architekturze można teraz wykonywać obliczenia na wirtualnych instancjach GPU tak jakby były one fizycznymi kartami. Użytkownicy mogą teraz uruchamiać kontenery oparte na Dockerze z użyciem MIG.


NVIDIA Merlin
Wraz z zapowiedzią nowej generacji kart NVIDIA zaprezentowała nowy Framework dla systemów decyzyjnych z wykorzystaniem głębokiego uczenia. Systemy tego typu odgrywają bardzo dużą rolę w utrzymywaniu wysokiego zaangażowania klienta podczas korzystania z platformy online.

NVIDIA Merlin jest frameworkiem aplikacyjnym oraz całym ekosystemem stworzonym do wdrażania tego typu rozwiązań. Składa się on z podstawowych elementów:
- Merlin ETL: zestaw narzędzi dla szybkiego systemu rekomendacyjnego; NVTabular, który jest jego elementem, oferuje bardzo szybkie przetwarzanie danych i ich transformacje na poziomie GPU, gdzie jest możliwe korzystanie z datasetów o rozmiarach wielu terabajtów. W celu wyelminowania słabych przepustowości dane wyjściowe z NVTabular mogą być dalej przekazane - za pomocą wbudowanych data loaderów - do sieci frameworków uczących, tj. HugeCTR, PyTorch albo TensorFlow.
- Merlin Training: kolekcja systemów głębokiego uczenia i narzędzi uczących.
- HugeCTR to wysoko wydajny system rekomendacyjny oparty na C++, dedykowany framework trenujący. Zawiera on możliwość uczenia za pomocą wielu GPU i wielu węzłów. HugeCTR korzysta z typowych modeli uczenia tj. Wide&Deep (W&D), Deep Cross Network, DeepFM i niedługo Deep Learning Recommender Model (DLRM).
- DLRM, W&D, Neaural Collaborative Filtering i Variational AutoEncoder tworzą zestaw narzędzi portfolio NVIDIA DL. Zestaw, pokrywa zakres architektury sieci i aplikacji w wielu domenach wykraczających poza systemy rekomendacyjne m.in. analizę obrazu, tekstu oraz mowy. Modele te są zaprojektowane i zoptymalizowane pod uczenie z wykorzystaniem TensorFlow i PyTorch.
- Merlin Interface: NVIDIA TensorRT i NVIDIA Triton Interface Server.
- NVIDIA TensorRT jest to SDK wykorzystywanym do szybkiego przetwarzania DL. Zawiera w sobie optymalizator wnioskowania DL i silnik uruchomieniowy, który zapewnia niską latencję oraz wysoki przepływ danych dla aplikacji DL.
- Triton Server zapewnia rozwiązania zoptymalizowane pod kątem GPU dla wnioskowania DL, które umożliwia podłączenie wielu backendów tj. PyTorch, TensorFlow, TensorFlowRT oraz Open Neural Network Exchange. Triton Server automatycznie zarządza i wykorzystuje całe dostępne zasoby GPU i pozwala na korzystanie z wielu wersji modeli, aby później raportować ich wyniki i metryki. Pozwala to na dokładne analizowanie wydajności modeli, jak i ich dokładne porównanie.

Bardzo ciekawym elementem zestawu Merlin jest NVTabular, który jest biblioteką do przetwarzania wstępnego, zdolną do szybkiej i łatwej manipulacji nad datasetami o rozmiarach terabajtów. Dzięki 10-20 liniom kodu napisanych pod wysoko poziomowe API możemy zyskać nawet 10x zysk wydajności w porównaniu z przetwarzaniem za pomocą CPU. NVTabular wspiera akcelerację za pomocą cuDF, ApacheSpark 3.0 i Dask-cuDF.

Poniżej zamieszczamy kod zaprezentowany przez NVIDIA, który posłużył do przetwarzania wstępnego datasetu 1TB firmy Criteo. Na początku definiujemy kolumny numeryczne i kategoryzujące. Następnie definiujemy przepływ pracy NVTabular i załączamy zestaw danych do uczenia i walidacji.
import nvtabular as nvt
import glob
cont_names = ["I"+str(x) for x in range(1, 14)] # specify continuous feature names
cat_names = ["C"+str(x) for x in range(1, 27)] # specify categorical feature names
label_names = ["label"] # specify target feature
columns = label_names + cat_names + cont_names # all feature names
# initialize Workflow
proc = nvt.Worfklow(cat_names=cat_names, cont_names=cont_names, label_name=label_names)
# create datsets from input files
train_files = glob.glob("./dataset/train/*.parquet")
valid_files = glob.glob("./dataset/valid/*.parquet")
train_dataset = nvt.dataset(train_files, gpu_memory_frac=0.1)
valid_dataset = nvt.dataset(valid_files, gpu_memory_frac=0.1)
# add feature engineering and preprocessing ops to Workflow<
/span>
proc.add_cont_feature([nvt.ops.ZeroFill(), nvt.ops.LogOp()])
proc.add_cont_preprocess(nvt.ops.Normalize())
proc.add_cat_preprocess(nvt.ops.Categorify(use_frequency=True, freq_threshold=15))
# compute statistics, transform data, export to disk
proc.apply(train_dataset, shuffle=True, output_path="./processed_data/train", num_out_files=len(train_files))
proc.apply(valid_dataset, shuffle=False, output_path="./processed_data/valid", num_out_files=len(valid_files))
Czas przetwarzania datasetu Criteo w porównaniu z innymi technologiami jest zaprezentowany poniżej.

W tym wpisie zawarte zostały opisy części nowych technologii, w przyszłych tygodniach pojawią się kolejne.