Connect with us

Konfigurowanie szkolenia, dostrajania i inferencji LLM z NVIDIA GPU i CUDA

Narzędzia AI 101

Konfigurowanie szkolenia, dostrajania i inferencji LLM z NVIDIA GPU i CUDA

mm
Nvidia GPU in Ubuntu Basics of GPU Parallel Computing GPU Based LLM Training Machine

Dziedzina sztucznej inteligencji (AI) doświadczyła znaczących postępów w ostatnich latach, a w jej centrum leży potężne połączenie jednostek przetwarzania grafiki (GPU) i platformy obliczeń równoległych.

Modele takie jak GPT, BERT, a ostatnio Llama, Mistral są w stanie zrozumieć i generować teksty podobne do ludzkich z niezwykłą płynnością i spójnością. Jednak szkolenie tych modeli wymaga ogromnych ilości danych i zasobów obliczeniowych, co sprawia, że GPU i CUDA są niezastąpionymi narzędziami w tym przedsięwzięciu.

Ten kompleksowy przewodnik przeprowadzi Cię przez proces konfigurowania NVIDIA GPU na Ubuntu, obejmujący instalację niezbędnych składników oprogramowania, takich jak sterownik NVIDIA, CUDA Toolkit, cuDNN, PyTorch i wiele innych.

Wzrost frameworków AI z przyspieszeniem CUDA

Przyspieszone głębokie uczenie się zostało napędzane przez rozwój popularnych frameworków AI, które wykorzystują CUDA do wydajnych obliczeń. Frameworki takie jak TensorFlow, PyTorch i MXNet mają wbudowane wsparcie dla CUDA, umożliwiając bezproblemową integrację przyspieszenia GPU z potokami głębokiego uczenia się.

Według NVIDIA Data Center Deep Learning Product Performance Study, modele głębokiego uczenia się z przyspieszeniem CUDA mogą osiągać nawet 100-krotnie szybszą wydajność w porównaniu z implementacjami opartymi na CPU.

Technologia Multi-Instance GPU (MIG) firmy NVIDIA, wprowadzona z architekturą Ampere, pozwala na podział jednej karty graficznej na wiele bezpiecznych instancji, z których każda ma własne dedykowane zasoby. Ta funkcja umożliwia wydajne udostępnianie zasobów GPU między wieloma użytkownikami lub obciążeniami, maksymalizując wykorzystanie i redukując ogólne koszty.

Przyspieszanie inferencji LLM z NVIDIA TensorRT

Podczas gdy karty graficzne były instrumentalne w szkoleniu LLM, wydajna inferencja jest równie istotna dla wdrożenia tych modeli w środowiskach produkcyjnych. NVIDIA TensorRT, optymalizator i środowisko uruchomieniowe dla głębokiego uczenia się, odgrywa istotną rolę w przyspieszaniu inferencji LLM na kartach graficznych z obsługą CUDA.

Według benchmarków NVIDIA, TensorRT może zapewnić nawet 8-krotnie szybszą wydajność inferencji i 5-krotnie niższy całkowity koszt posiadania w porównaniu z inferencją opartą na CPU dla dużych modeli językowych, takich jak GPT-3.

Zobowiązanie NVIDIA do inicjatyw open-source było siłą napędową powszechnego przyjęcia CUDA w społeczności badawczej AI. Projekty takie jak cuDNN, cuBLAS i NCCL są dostępne jako biblioteki open-source, umożliwiając badaczom i deweloperom wykorzystanie pełnego potencjału CUDA dla ich głębokiego uczenia się.

Instalacja

Podczas konfigurowania środowiska AI, używanie najnowszych sterowników i bibliotek nie zawsze jest najlepszym wyborem. Na przykład, podczas gdy najnowszy sterownik NVIDIA (545.xx) obsługuje CUDA 12.3, PyTorch i inne biblioteki mogą jeszcze nie obsługiwać tej wersji. Dlatego użyjemy sterownika w wersji 535.146.02 z CUDA 12.2, aby zapewnić zgodność.

Kroki instalacji

1. Zainstaluj sterownik NVIDIA

Najpierw zidentyfikuj swój model karty graficznej. W tym przewodniku użyjemy karty graficznej NVIDIA. Odwiedź stronę pobierania sterownika NVIDIA, wybierz odpowiedni sterownik dla Twojej karty graficznej i zanotuj wersję sterownika.

Aby sprawdzić prekompilowane pakiety GPU na Ubuntu, uruchom:


sudo ubuntu-drivers list --gpgpu

Uruchom ponownie komputer i zweryfikuj instalację:


nvidia-smi

2. Zainstaluj CUDA Toolkit

CUDA Toolkit zapewnia środowisko deweloperskie do tworzenia aplikacji z przyspieszeniem GPU o wysokiej wydajności.

Dla nie-LLM / głębokiego uczenia się, możesz użyć:


sudo apt install nvidia-cuda-toolkit

Jednak aby zapewnić zgodność z BitsAndBytes, wykonamy następujące kroki:

[code language="BASH"]

git clone https://github.com/TimDettmers/bitsandbytes.git
cd bitsandbytes/
bash install_cuda.sh 122 ~/local 1

Zweryfikuj instalację:


~/local/cuda-12.2/bin/nvcc --version

Ustaw zmienne środowiskowe:


export CUDA_HOME=/home/roguser/local/cuda-12.2/
export LD_LIBRARY_PATH=/home/roguser/local/cuda-12.2/lib64
export BNB_CUDA_VERSION=122
export CUDA_VERSION=122

3. Zainstaluj cuDNN

Pobierz pakiet cuDNN ze strony internetowej NVIDIA Developer. Zainstaluj go za pomocą:


sudo apt install ./cudnn-local-repo-ubuntu2204-8.9.7.29_1.0-1_amd64.deb

Postępuj zgodnie z instrukcjami, aby dodać klucz:


sudo cp /var/cudnn-local-repo-ubuntu2204-8.9.7.29/cudnn-local-08A7D361-keyring.gpg /usr/share/keyrings/

Zainstaluj biblioteki cuDNN:


sudo apt update
sudo apt install libcudnn8 libcudnn8-dev libcudnn8-samples

4. Skonfiguruj środowisko wirtualne Python

Ubuntu 22.04 jest wyposażony w Python 3.10. Zainstaluj venv:


sudo apt-get install python3-pip
sudo apt install python3.10-venv

Utwórz i aktywuj środowisko wirtualne:


cd
mkdir test-gpu
cd test-gpu
python3 -m venv venv
source venv/bin/activate

5. Zainstaluj BitsAndBytes z kodu źródłowego

Przejdź do katalogu BitsAndBytes i zbuduj z kodu źródłowego:


cd ~/bitsandbytes
CUDA_HOME=/home/roguser/local/cuda-12.2/ \
LD_LIBRARY_PATH=/home/roguser/local/cuda-12.2/lib64 \
BNB_CUDA_VERSION=122 \
CUDA_VERSION=122 \
make cuda12x

CUDA_HOME=/home/roguser/local/cuda-12.2/ \
LD_LIBRARY_PATH=/home/roguser/local/cuda-12.2/lib64 \
BNB_CUDA_VERSION=122 \
CUDA_VERSION=122 \
python setup.py install

6. Zainstaluj PyTorch

Zainstaluj PyTorch za pomocą następującej komendy:


pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121

7. Zainstaluj Hugging Face i Transformers

Zainstaluj biblioteki transformers i accelerate:


pip install transformers
pip install accelerate

Moc przetwarzania równoległego

W swojej istocie karty graficzne są wysoko wydajnymi procesorami równoległymi, zaprojektowanymi do obsługi tysięcy współbieżnych wątków w sposób wydajny. Ta architektura sprawia, że są one idealnie dopasowane do zadania obliczeniowo intensywnych zadań związanych z szkoleniem modeli głębokiego uczenia się, w tym LLM. Platforma CUDA, opracowana przez NVIDIA, zapewnia środowisko programistyczne, które pozwala deweloperom wykorzystać pełny potencjał tych kart graficznych, umożliwiając im pisanie kodu, który może wykorzystywać możliwości przetwarzania równoległego sprzętu.
Przyspieszanie szkolenia LLM z kartami graficznymi i CUDA.

Szkolenie dużych modeli językowych jest zadaniem wymagającym obliczeniowo, które wymaga przetworzenia ogromnych ilości danych tekstowych i wykonania licznych operacji macierzowych. Karty graficzne, z ich tysiącami rdzeni i wysoką przepustowością pamięci, są idealnie dopasowane do tych zadań. Wykorzystując CUDA, deweloperzy mogą zoptymalizować swój kod, aby wykorzystać możliwości przetwarzania równoległego kart graficznych, znacznie redukując czas wymagany do szkolenia LLM.

Na przykład szkolenie GPT-3, jednego z największych modeli językowych do tej pory, było możliwe dzięki użyciu tysięcy kart graficznych NVIDIA z optymalizowanym kodem CUDA. To pozwoliło na szkolenie modelu na niezwykle dużej ilości danych, prowadząc do jego imponującej wydajności w zadaniach językowych.


import torch
import torch.nn as nn
import torch.optim as optim
from transformers import GPT2LMHeadModel, GPT2Tokenizer

# Załaduj pre-trenowany model GPT-2 i tokenizator
model = GPT2LMHeadModel.from_pretrained('gpt2')
tokenizer = GPT2Tokenizer.from_pretrained('gpt2')

# Przenieś model na kartę graficzną, jeśli jest dostępna
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model = model.to(device)

# Zdefiniuj dane szkoleniowe i hiperparametry
train_data = [...] # Twoje dane szkoleniowe
batch_size = 32
num_epochs = 10
learning_rate = 5e-5

# Zdefiniuj funkcję straty i optymalizator
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=learning_rate)

# Pętla szkoleniowa
for epoch in range(num_epochs):
for i in range(0, len(train_data), batch_size):
# Przygotuj dane wejściowe i wyjściowe
inputs, targets = train_data[i:i+batch_size]
inputs = tokenizer(inputs, return_tensors="pt", padding=True)
inputs = inputs.to(device)
targets = targets.to(device)

# Przód
outputs = model(**inputs, labels=targets)
loss = outputs.loss

# Backward i optymalizacja
optimizer.zero_grad()
loss.backward()
optimizer.step()

print(f'Epoch {epoch+1}/{num_epochs}, Loss: {loss.item()}')

W tym przykładzie kodu demonstrujemy szkolenie modelu GPT-2 z wykorzystaniem PyTorch i kart graficznych z obsługą CUDA. Model jest ładowany na kartę graficzną (jeśli jest dostępna), a pętla szkoleniowa wykorzystuje równoległość kart graficznych do wykonywania wydajnych kroków do przodu i do tyłu, przyspieszając proces szkolenia.

Biblioteki CUDA dla głębokiego uczenia się

Oprócz samej platformy CUDA, NVIDIA i społeczność open-source opracowali szereg bibliotek z przyspieszeniem CUDA, które umożliwiają wydajną implementację modeli głębokiego uczenia się, w tym LLM. Te biblioteki zapewniają zoptymalizowane implementacje typowych operacji, takich jak mnożenia macierzy, splotów i funkcji aktywacyjnych, pozwalając deweloperom skoncentrować się na architekturze modelu i procesie szkolenia, a nie na optymalizacji niskopoziomowej.

Jedną z takich bibliotek jest cuDNN (CUDA Deep Neural Network library), która zapewnia wysoko zoptymalizowane implementacje standardowych rutyn używanych w sieciach neuronowych. Wykorzystując cuDNN, deweloperzy mogą znacznie przyspieszyć szkolenie i inferencję swoich modeli, osiągając zyski wydajności sięgające nawet kilku rzędów wielkości w porównaniu z implementacjami opartymi na CPU.


import torch
import torch.nn as nn
import torch.nn.functional as F
from torch.cuda.amp import autocast

class ResidualBlock(nn.Module):
def __init__(self, in_channels, out_channels, stride=1):
super().__init__()
self.conv1 = nn.Conv2d(in_channels, out_channels, kernel_size=3, stride=stride, padding=1, bias=False)
self.bn1 = nn.BatchNorm2d(out_channels)
self.conv2 = nn.Conv2d(out_channels, out_channels, kernel_size=3, stride=1, padding=1, bias=False)
self.bn2 = nn.BatchNorm2d(out_channels)
self.shortcut = nn.Sequential()
if stride != 1 or in_channels != out_channels:
self.shortcut = nn.Sequential(
nn.Conv2d(in_channels, out_channels, kernel_size=1, stride=stride, bias=False),
nn.BatchNorm2d(out_channels))

def forward(self, x):
with autocast():
out = F.relu(self.bn1(self.conv1(x)))
out = self.bn2(self.conv2(out))
out += self.shortcut(x)
out = F.relu(out)
return out

W tym fragmencie kodu definiujemy blok resztowy dla sieci neuronowej wykorzystującej PyTorch. Menedżer kontekstu autocast z PyTorch’s Automatic Mixed Precision (AMP) jest używany do włączenia szkolenia z mieszaną precyzją, co może zapewnić znaczne zyski wydajności na kartach graficznych z obsługą CUDA, przy zachowaniu wysokiej dokładności. Funkcja F.relu jest zoptymalizowana przez cuDNN, zapewniając wydajną wykonywalność na kartach graficznych.

Wielokrotna karta graficzna i rozproszone szkolenie dla skalowalności

Podczas gdy LLM i modele głębokiego uczenia się nadal rosną w rozmiarze i złożoności, wymagania obliczeniowe dla szkolenia tych modeli również rosną. Aby rozwiązać ten problem, badacze i deweloperzy zwrócili się ku technikom szkolenia wielokartowego i rozproszonego, które pozwalają im wykorzystać łączną moc obliczeniową wielu kart graficznych na wielu maszynach.

CUDA i powiązane biblioteki, takie jak NCCL (NVIDIA Collective Communications Library), zapewniają wydajne prymitywy komunikacyjne, które umożliwiają bezproblemową transmisję danych i synchronizację między wieloma kartami graficznymi, umożliwiając rozproszone szkolenie w niezwykłej skali.

import torch.distributed as dist

from torch.nn.parallel import DistributedDataParallel as DDP

# Zainicjuj rozproszone szkolenie
dist.init_process_group(backend='nccl', init_method='...')
local_rank = dist.get_rank()
torch.cuda.set_device(local_rank)

# Utwórz model i przenieś go na kartę graficzną
model = MyModel().cuda()

# Zawij model w DDP
model = DDP(model, device_ids=[local_rank])

# Pętla szkoleniowa (rozproszona)
for epoch in range(num_epochs):
for data in train_loader:
inputs, targets = data
inputs = inputs.cuda(non_blocking=True)
targets = targets.cuda(non_blocking=True)

outputs = model(inputs)
loss = criterion(outputs, targets)

optimizer.zero_grad()
loss.backward()
optimizer.step()

W tym przykładzie demonstrujemy rozproszone szkolenie z wykorzystaniem PyTorch’s DistributedDataParallel (DDP) modułu. Model jest zawijany w DDP, który automatycznie obsługuje równoległość danych, synchronizację gradientów i komunikację między wieloma kartami graficznymi z wykorzystaniem NCCL. Ten podejście umożliwia wydajne skalowanie procesu szkolenia na wiele maszyn, pozwalając badaczom i deweloperom szkolić większe i bardziej złożone modele w rozsądnym czasie.

Wdrożenie modeli głębokiego uczenia się z CUDA

Podczas gdy karty graficzne i CUDA były głównie używane do szkolenia modeli głębokiego uczenia się, są one również niezastąpione dla wydajnej inferencji. Podczas gdy modele głębokiego uczenia się stają się coraz bardziej złożone i wymagające zasobów, przyspieszenie GPU jest niezbędne do osiągnięcia wydajności w czasie rzeczywistym w środowiskach produkcyjnych.

NVIDIA’s TensorRT jest wysoko wydajnym optymalizatorem i środowiskiem uruchomieniowym dla inferencji głębokiego uczenia się, który zapewnia niską latencję i wysoką przepustowość inferencji na kartach graficznych z obsługą CUDA. TensorRT może optymalizować i przyspieszać modele szkolone w frameworkach takich jak TensorFlow, PyTorch i MXNet, umożliwiając wydajne wdrożenie na różnych platformach, od systemów wbudowanych do centrów danych.


import tensorrt as trt

# Załaduj pre-trenowany model
model = load_model(...)

# Utwórz silnik TensorRT
logger = trt.Logger(trt.Logger.INFO)
builder = trt.Builder(logger)
network = builder.create_network()
parser = trt.OnnxParser(network, logger)

# Przeanalizuj i zoptymalizuj model
success = parser.parse_from_file(model_path)
engine = builder.build_cuda_engine(network)

# Uruchom inferencję na karcie graficznej
context = engine.create_execution_context()
inputs, outputs, bindings, stream = allocate_buffers(engine)

# Ustaw dane wejściowe i uruchom inferencję
set_input_data(inputs, input_data)
context.execute_async_v2(bindings=bindings, stream_handle=stream.ptr)

# Przetwórz dane wyjściowe
# ...

W tym przykładzie demonstrujemy użycie TensorRT do wdrożenia pre-trenowanego modelu głębokiego uczenia się na karcie graficznej z obsługą CUDA. Model jest najpierw przeanalizowany i zoptymalizowany przez TensorRT, który generuje wysoko zoptymalizowany silnik inferencji dostosowany do konkretnego modelu i sprzętu. Ten silnik może być następnie użyty do wykonywania wydajnej inferencji na karcie graficznej, wykorzystując CUDA do przyspieszonego obliczeń.

Podsumowanie

Połączenie kart graficznych i CUDA było instrumentalne w napędzaniu postępów w dużych modelach językowych, rozpoznawaniu obrazów, rozpoznawaniu mowy i innych dziedzinach głębokiego uczenia się. Wykorzystując możliwości przetwarzania równoległego kart graficznych i zoptymalizowanych bibliotek dostarczonych przez CUDA, badacze i deweloperzy mogą szkolić i wdrażać coraz bardziej złożone modele z wysoką wydajnością.

Podczas gdy dziedzina AI nadal ewoluuje, znaczenie kart graficznych i CUDA będzie tylko rosło. Z jeszcze bardziej potężnym sprzętem i optymalizacjami oprogramowania, możemy oczekiwać dalszych przełomów w rozwoju i wdrożeniu systemów AI, przesuwając granice tego, co jest możliwe.

Spędziłem ostatnie pięć lat, zanurzając się w fascynującym świecie Machine Learning i Deep Learning. Moja pasja i ekspertyza doprowadziły mnie do udziału w ponad 50 różnych projektach inżynierii oprogramowania, ze szczególnym uwzględnieniem AI/ML. Moja nieustanna ciekawość również skierowała mnie w stronę Natural Language Processing, dziedziny, którą chcę bardziej zbadać.