AI-verktøy 101

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

mm
Legg til Unite.AI blant dine foretrukne kilder på Google
Nvidia GPU in Ubuntu Basics of GPU Parallel Computing GPU Based LLM Training Machine

Feltet kunstig intelligens (AI) har sett bemerkelsesverdige fremgang i de senere årene, og i hjertet av det ligger den kraftfulle kombinasjonen av grafikkprosessorer (GPUs) og parallellprosesseringsplattform.

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

Denne omfattende guiden vil føre deg gjennom prosessen med å sette opp en NVIDIA (NVDA ) -GPU på Ubuntu, og dekker installasjonen av essensielle programvarekomponenter som NVIDIA-drivere, 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 innebygd støtte for CUDA, og muliggjør enkel integrasjon 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, og maksimerer utnyttelsen og reduserer de totale kostnadene.

Akselerering av LLM-inferens med NVIDIA TensorRT

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

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

NVIDIA’s forpliktelse til åpen 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 åpen kilde-biblioteker, og muliggjør at forskere og utviklere kan utnytte fullt potensialet av CUDA for sine dyp læring-modeller.

Installasjon

Når du setter opp 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.

Installasjonssteg

1. Installer NVIDIA-drivere

Først, identifiser din GPU-modell. For denne guiden, vil vi bruke 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

<p>Men for å sikre kompatibilitet med BitsAndBytes, vil vi følge disse stegene:</p>

[code language=&amp;quot;BASH&amp;quot;]

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

Verifiser installasjonen:


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

Sett miljøvariabler:


<p>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</p>

3. Installer cuDNN

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


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

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


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

Installer cuDNN-bibliotekene:


<p>sudo apt update
sudo apt install libcudnn8 libcudnn8-dev libcudnn8-samples</p>

4. Sett opp Python-virtuelt miljø

Ubuntu 22.04 kommer med Python 3.10. Installer venv:


<p>sudo apt-get install python3-pip
sudo apt install python3.10-venv</p>

Opprett og aktiver virtuelt miljø:


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

5. Installer BitsAndBytes fra kilde

Naviger til BitsAndBytes-katalogen og bygg fra kilde:


<p>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</p>

<p>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</p>

6. Installer PyTorch

Installer PyTorch med følgende kommando:


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

7. Installer Hugging og Transformers

Installer transformers- og accelerate-bibliotekene:


<p>pip install transformers
pip install accelerate</p>

Kraften av parallellprosesserings

I kjernen er GPU-er høytt parallellprosessorer 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.
Akselerering av LLM-trening med GPU-er og CUDA.

Trening av store språkmodeller er en beregningskrevende oppgave som krever prosessering av enorme mengder tekstdata og utføring av tallrike matriseregnskaper. 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 parallellprosesseringskapasiteten til GPU-er, og redusere tiden det tar å trene LLM-er betydelig.

For eksempel, treningen av GPT-3, en av de største språkmodellene til dags dato, ble mulig gjennom bruk av tusenvis av NVIDIA-GPU-er som kjørte CUDA-optimert kode. Dette tillot modellen å bli trent på en utenforliggende mengde data, og ledet til dens imponerende ytelse i naturlige språkoppdrag.


<p>import torch
import torch.nn as nn
import torch.optim as optim
from transformers import GPT2LMHeadModel, GPT2Tokenizer</p>

<p># Last inn forhånds-trent GPT-2-modell og tokenizer
model = GPT2LMHeadModel.from_pretrained(&amp;#039;gpt2&amp;#039;)
tokenizer = GPT2Tokenizer.from_pretrained(&amp;#039;gpt2&amp;#039;)</p>

<p># Flytt modell til GPU hvis tilgjengelig
device = torch.device(&amp;quot;cuda&amp;quot; if torch.cuda.is_available() else &amp;quot;cpu&amp;quot;)
model = model.to(device)</p>

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

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

<p># Treningssyklus
for epoch in range(num_epochs):
for i in range(0, len(train_data), batch_size):
# Preparér inndata og målsekvenser
inputs, targets = train_data[i:i+batch_size]
inputs = tokenizer(inputs, return_tensors=&amp;quot;pt&amp;quot;, padding=True)
inputs = inputs.to(device)
targets = targets.to(device)</p>

<p># Fremover-pass
outputs = model(**inputs, labels=targets)
loss = outputs.loss</p>

<p># Bakover-pass og optimalisering
optimizer.zero_grad()
loss.backward()
optimizer.step()</p>

<p>print(f&amp;#039;Epoch {epoch+1}/{num_epochs}, Loss: {loss.item()}&amp;#039;)</p>

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 treningssyklusen utnytter parallellheten til GPU-er for å utføre effektive fremover- og bakover-passer, og akselerer treningprosessen.

CUDA-akselererte biblioteker for dyp læring

I tillegg til CUDA-plattformen selv, har NVIDIA og åpen 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å modellarkitektur og treningprosess i stedet for lav-nivå-optimering.

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 modellene sine, og oppnå ytelsesforbedringer på opptil flere størrelsesordener sammenlignet med CPU-baserte implementeringer.


<p>import torch
import torch.nn as nn
import torch.nn.functional as F
from torch.cuda.amp import autocast</p>

<p>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))</p>

<p>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</p>

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

Flere-GPU-er 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 flere-GPU-er 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 enkel dataoverføring og synkronisering over flere GPU-er, og muliggjør distribuert trening i en utenforliggende skala.

&amp;lt;/pre&amp;gt;
import torch.distributed as dist

<p>from torch.nn.parallel import DistributedDataParallel as DDP</p>

<p># Initialiser distribuert trening
dist.init_process_group(backend=&amp;#039;nccl&amp;#039;, init_method=&amp;#039;...&amp;#039;)
local_rank = dist.get_rank()
torch.cuda.set_device(local_rank)</p>

<p># Opprett modell og flytt til GPU
model = MyModel().cuda()</p>

<p># Omgi modell med DDP
model = DDP(model, device_ids=[local_rank])</p>

<p># Treningssyklus (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)</p>

<p>outputs = model(inputs)
loss = criterion(outputs, targets)</p>

<p>optimizer.zero_grad()
loss.backward()
optimizer.step()</p>

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

Deployering 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 deployering og inferens. Ettersom dyp læring-modeller blir stadig 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 runtime som gir lav-forsinkelse og høy-gjennomstrømming inferens på CUDA-aktiverede GPU-er. TensorRT kan optimere og akselerere modeller trent i rammeverk som TensorFlow, PyTorch og MXNet, og muliggjør effektiv deployering på ulike plattformer, fra innbygde systemer til data-sentere.


import tensorrt as trt

<p># Last inn forhånds-trent modell
model = load_model(...)</p>

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

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

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

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

# Behandle utdata
# ...

I dette eksempelet demonstrerer vi bruk av TensorRT for å deployere en forhånds-trent dyp læring-modell på en CUDA-aktiveret GPU. Modellen lastes inn og optimiseres av TensorRT, som genererer en høytt optimert inferens-motor tilpasset den spesifikke modellen og hårdwaren. 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 instrumentell i å drive fremgangen i store språkmodeller, datamaskin-syn, tale-gjenkjenning og andre områder av dyp læring. Ved å utnytte parallellprosesseringskapasiteten til GPU-er og de optimerte bibliotekene som følger med CUDA, kan forskere og utviklere trene og deployere stadig mer komplekse modeller med høy effektivitet.

Som feltet AI fortsetter å utvikle seg, vil betydningen av GPU-er og CUDA bare øke. Med enda mer kraftfulle hårdware og programvare-optimaliseringer, kan vi forvente å se ytterligere gjennombrudd i utviklingen og deployeringen av AI-systemer, og å pusha grensene for hva som er mulig.

Jeg har brukt de siste fem årene på å dykke ned i den fasiniserende verden av Maskinlæring og Dypt Læring. Min lidenskap og ekspertise har ledet meg til å bidra til over 50 ulike programvareprosjekter, med særlig fokus på AI/ML. Min pågående nysgjørhet har også trukket meg mot Naturlig Språkbehandling, et felt jeg er ivrig etter å utforske videre.