Connect with us

Konfigurasjon av trenings-, finjustering og inferens av LLM med NVIDIA-GPU og CUDA

AI-verktøy 101

Konfigurasjon av trenings-, finjustering og inferens av LLM med NVIDIA-GPU og CUDA

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

Feltet kunstig intelligens (AI) har vært vitne til bemerkelsesverdige fremgang i de siste årene, og i hjertet av det ligger den kraftfulle kombinasjonen av grafikkprosessorer (GPU) og parallell databehandlingplattform.

Modeller som GPT, BERT, og mer nylig Llama, Mistral er i stand til å forstå og generere menneske-lignende tekst med utenforliggende flyt og sammenheng. Men å trene disse modellene krever enorme mengder data og beregningsressurser, noe som gjør GPU og CUDA til uunnværlige verktøy i dette foretaket.

Denne omfattende guiden vil føre deg gjennom prosessen med å konfigurere en NVIDIA-GPU på Ubuntu, med dekning av installasjon av essensielle programvarekomponenter som NVIDIA-driver, CUDA Toolkit, cuDNN, PyTorch og mer.

Oppsvinget av CUDA-akselererte AI-rammeverk

GPU-akselerert dyp læring har blitt drivende av utviklingen av populære AI-rammeverk som utnytter CUDA for effektiv beregning. Rammeverk som TensorFlow, PyTorch, og MXNet har innebygget støtte for CUDA, som muliggjør sømløs integrering av GPU-akselerasjon i dyp læring-pipelines.

Ifølge NVIDIA Data Center Deep Learning Product Performance Study, kan CUDA-akselererte dyp læring-modeller oppnå opptil 100 ganger raskere ytelse sammenlignet med CPU-baserte implementeringer.

NVIDIA’s Multi-Instance GPU (MIG)-teknologi, introdusert med Ampere-arkitekturen, tillater en enkelt GPU å deles inn i flere sikre instanser, hver med sine egne dedikerte ressurser. Denne funksjonen muliggjør effektiv deling av GPU-ressurser blant flere brukere eller arbeidsbyrder, maksimerer utnyttelse og reduserer samlede kostnader.

Akselerering av LLM-inferens med NVIDIA TensorRT

Mens GPU har vært instrumentale i trening av LLM, er effektiv inferens like viktig for å distribuere disse modellene i produksjonsmiljøer. NVIDIA TensorRT, en høy-ytelses dyp læring-inferens-optimizer og kjøretid, spiller en vital rolle i akselerering av LLM-inferens på CUDA-aktiverede GPU.

Ifølge NVIDIA’s benchmark, kan TensorRT gi opptil 8 ganger raskere inferens-ytelse og 5 ganger lavere samlet eierkostnad sammenlignet med CPU-basert inferens for store språkmodeller som GPT-3.

NVIDIA’s forpliktelse til åpne kilde-initiativer har vært en drivende kraft bak den omfattende aksepten av CUDA i AI-forskningsmiljøet. Prosjekter som cuDNN, cuBLAS, og NCCL er tilgjengelige som åpne kildebiblioteker, som muliggjør at forskere og utviklere kan utnytte det fulle potensialet av CUDA for sine dyp læring-modeller.

Installasjon

Når det gjelder AI-utvikling, kan det å bruke de nyeste drivere og bibliotekene ikke alltid være det beste valget. For eksempel, mens den nyeste NVIDIA-drivere (545.xx) støtter CUDA 12.3, kan PyTorch og andre biblioteker ikke ennå støtte denne versjonen. Derfor vil vi bruke driver-versjon 535.146.02 med CUDA 12.2 for å sikre kompatibilitet.

Installasjonsprosedyre

1. Installer NVIDIA-driver

Først, identifiser din GPU-modell. For denne guiden, bruker vi NVIDIA-GPU. Besøk NVIDIA Driver Download-side, velg den riktige drivere for din GPU, og noter driver-versjonen.

Sjekk for forhåndsbygde GPU-pakker på Ubuntu, kjør:


sudo ubuntu-drivers list --gpgpu

Start om datamaskinen og verifiser installasjonen:


nvidia-smi

2. Installer CUDA Toolkit

CUDA Toolkit gir utviklingsmiljøet for å lage høy-ytelses GPU-akselererte applikasjoner.

For en ikke-LLM/dyp læring-oppsättning, kan du bruke:


sudo apt install nvidia-cuda-toolkit

Men for å sikre kompatibilitet med BitsAndBytes, vil vi følge disse trinnene:

[code language="BASH"]

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

Verifiser installasjonen:


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

Sett miljøvariabler:


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. Installer cuDNN

Last ned cuDNN-pakken fra NVIDIA Developer-nettsiden. Installer den med:


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

Følg instruksjonene for å legge til nøkleringen:


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

Installer cuDNN-bibliotekene:


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

4. Konfigurer Python-virtuelt miljø

Ubuntu 22.04 kommer med Python 3.10. Installer venv:


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

Opprett og aktiver det virtuelle miljøet:


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

5. Installer BitsAndBytes fra kilde

Naviger til BitsAndBytes-katalogen og bygg fra kilde:


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. Installer PyTorch

Installer PyTorch med følgende kommando:


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

7. Installer Hugging Face og Transformers

Installer transformers og accelerate-bibliotekene:


pip install transformers
pip install accelerate

Kraften av parallell prosessering

I kjernen er GPU-er høytt parallell prosessorer designet for å håndtere tusenvis av samtidige tråder effektivt. Denne arkitekturen gjør dem godt egnet for de beregningsintensive oppgavene involvert i trening av dyp læring-modeller, inkludert LLM.

CUDA-plattformen, utviklet av NVIDIA, gir et programvare-miljø som tillater utviklere å utnytte det fulle potensialet av disse GPU-ene, muliggjører skriving av kode som kan utnytte parallell prosessering-kapasiteten til maskinvaren.
Akselerering av LLM-trening med GPU og CUDA.

Trening av store språkmodeller er en beregningskrevende oppgave som krever prosessering av enorme mengder tekstdata og utføring av tallrike matriser-operasjoner. GPU-er, med sine tusenvis av kerner og høy minnehastighet, er ideelt egnet for disse oppgavene. Ved å utnytte CUDA, kan utviklere optimere sin kode for å utnytte parallell prosessering-kapasiteten til GPU-ene, noe som betyr at tiden som kreves for å trene LLM-er kan reduseres betydelig.

For eksempel, var treningen av GPT-3, en av de største språkmodellene til dato, mulig gjennom bruk av tusenvis av NVIDIA-GPU-er som kjører CUDA-optimert kode. Dette tillot modellen å bli trenet på en utenforliggende mengde data, noe som ledet til dens imponerende ytelse i naturlige språk-oppgaver.


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

# Last inn forhånds-trent GPT-2-modell og tokenizer
model = GPT2LMHeadModel.from_pretrained('gpt2')
tokenizer = GPT2Tokenizer.from_pretrained('gpt2')

# Flytt modell til GPU hvis tilgjengelig
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model = model.to(device)

# Definer treningdata og hyperparametere
train_data = [...] # Din treningdata
batch_size = 32
num_epochs = 10
learning_rate = 5e-5

# Definer tap-funksjon og optimizer
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=learning_rate)

# Trening-løkke
for epoch in range(num_epochs):
for i in range(0, len(train_data), batch_size):
# Forbered inndata og mål-sekvenser
inputs, targets = train_data[i:i+batch_size]
inputs = tokenizer(inputs, return_tensors="pt", padding=True)
inputs = inputs.to(device)
targets = targets.to(device)

# Fremover-passering
outputs = model(**inputs, labels=targets)
loss = outputs.loss

# Bakover-passering og optimisering
optimizer.zero_grad()
loss.backward()
optimizer.step()

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

I dette eksempelet demonstrerer vi trening av en GPT-2-språkmodell med PyTorch og CUDA-aktiverede GPU-er. Modellen lastes inn på GPU-en (hvis tilgjengelig), og trening-løkken utnytter parallellheten til GPU-ene for å utføre effektive fremover- og bakover-passeringer, akselererende treningen.

CUDA-akselererte biblioteker for dyp læring

I tillegg til CUDA-plattformen selv, har NVIDIA og åpne kilde-samfunnet utviklet en rekke CUDA-akselererte biblioteker som muliggjør effektiv implementering av dyp læring-modeller, inkludert LLM. Disse bibliotekene gir optimerte implementeringer av vanlige operasjoner, som matrisemultiplikasjon, konvolusjon og aktiveringsfunksjoner, og tillater utviklere å fokusere på modell-arkitekturen og trening-prosessen i stedet for lav-nivå-optimisering.

Et slikt bibliotek er cuDNN (CUDA Deep Neural Network-bibliotek), som gir høytt justerte implementeringer av standard-rutiner brukt i dyp neural nettverk. Ved å utnytte cuDNN, kan utviklere akselerere trening og inferens av sine modeller betydelig, og oppnå ytelsesforbedringer på opptil flere størrelsesordener sammenlignet med CPU-baserte implementeringer.


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

I dette kode-eksempelet definerer vi en residual-blokk for et konvolusjons-neural nettverk (CNN) med PyTorch. Autocast-kontekst-håndtereren fra PyTorch’s Automatic Mixed Precision (AMP) brukes til å aktivere blandet-presisjon-trening, som kan gi betydelige ytelsesforbedringer på CUDA-aktiverede GPU-er samtidig som høy nøyaktighet opprettholdes. F.relu-funksjonen er optimert av cuDNN, som sikrer effektiv utføring på GPU-er.

Multi-GPU og distribuert trening for skalerbarhet

Ettersom LLM-er og dyp læring-modeller fortsetter å vokse i størrelse og kompleksitet, øker også de beregningsmessige kravene for å trene disse modellene. For å møte denne utfordringen, har forskere og utviklere vendt seg til multi-GPU og distribuert treningsteknikker, som tillater dem å utnytte den kombinerte prosesseringskraften til flere GPU-er over flere maskiner.

CUDA og tilhørende biblioteker, som NCCL (NVIDIA Collective Communications Library), gir effektive kommunikasjonsprimitiver som muliggjør sømløs dataoverføring og synkronisering over flere GPU-er, og muliggjør distribuert trening i en tidligere uoppnåelig skala.

import torch.distributed as dist

from torch.nn.parallel import DistributedDataParallel as DDP

# Initialiser distribuert trening
dist.init_process_group(backend='nccl', init_method='...')
local_rank = dist.get_rank()
torch.cuda.set_device(local_rank)

# Opprett modell og flytt til GPU
model = MyModel().cuda()

# Pakk modell med DDP
model = DDP(model, device_ids=[local_rank])

# Trening-løkke (distribuert)
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()

I dette eksempelet demonstrerer vi distribuert trening med PyTorch’s DistributedDataParallel (DDP)-modul. Modellen pakkes inn i DDP, som automatisk håndterer data-parallellitet, gradient-synkronisering og kommunikasjon over flere GPU-er med NCCL. Denne tilnærmingen muliggjør effektiv skalering av trening-prosessen over flere maskiner, og tillater forskere og utviklere å trene større og mer komplekse modeller på en rimelig tid.

Distribusjon av dyp læring-modeller med CUDA

Mens GPU-er og CUDA hovedsakelig har blitt brukt til trening av dyp læring-modeller, er de også avgjørende for effektiv distribusjon og inferens. Ettersom dyp læring-modeller blir mer komplekse og ressurskrevende, er GPU-akselerasjon essensiell for å oppnå sanntids-ytelse i produksjonsmiljøer.

NVIDIA’s TensorRT er en høy-ytelses dyp læring-inferens-optimizer og kjøretid som gir lav-forsinkelse og høy-gjennomstrømming på CUDA-aktiverede GPU-er. TensorRT kan optimere og akselerere modeller trenet i rammeverk som TensorFlow, PyTorch og MXNet, og muliggjør effektiv distribusjon på ulike plattformer, fra innebygde systemer til datasentre.


import tensorrt as trt

# Last inn forhånds-trent modell
model = load_model(...)

# Opprett TensorRT-motor
logger = trt.Logger(trt.Logger.INFO)
builder = trt.Builder(logger)
network = builder.create_network()
parser = trt.OnnxParser(network, logger)

# Pars og optimér modell
success = parser.parse_from_file(model_path)
engine = builder.build_cuda_engine(network)

# Kjør inferens på GPU
context = engine.create_execution_context()
inputs, outputs, bindings, stream = allocate_buffers(engine)

# Sett inndata og kjør inferens
set_input_data(inputs, input_data)
context.execute_async_v2(bindings=bindings, stream_handle=stream.ptr)

# Behandle utdata
# ...

I dette eksempelet demonstrerer vi bruk av TensorRT for å distribuere en forhånds-trent dyp læring-modell på en CUDA-aktiveret GPU. Modellen pars og optimeres av TensorRT, som genererer en høytt optimert inferens-motor tilpasset for den spesifikke modellen og maskinvaren. Denne motoren kan deretter brukes til å utføre effektiv inferens på GPU-en, og utnytte CUDA for akselerert beregning.

Konklusjon

Kombinasjonen av GPU-er og CUDA har vært avgjørende i å drive fremgangen i store språkmodeller, datavisning, talegjenkjenning og andre områder av dyp læring. Ved å utnytte parallell prosessering-kapasiteten til GPU-er og de optimerte bibliotekene som følger med CUDA, kan forskere og utviklere trene og distribuere stadig mer komplekse modeller med høy effektivitet.

Ettersom AI-feltet fortsetter å utvikle seg, vil betydningen av GPU-er og CUDA bare øke. Med enda kraftigere maskinvare og programvare-optimiseringer, kan vi forvente å se ytterligere gjennombrudd i utvikling og distribusjon av AI-systemer, og presse grensene for hva som er mulig.

Jeg har brukt de siste fem årene til å dykke ned i den fasiniserende verden av Machine Learning og Deep Learning. Min lidenskap og ekspertise har ført meg til å bidra til over 50 forskjellige prosjekter innen programvareutvikling, med særlig fokus på AI/ML. Min pågående nysgjerrighet har også trukket meg mot Natural Language Processing, et felt jeg er ivrig etter å utforske videre.