AI-työkalut 101

NVIDIA-grafiikkakorttien ja CUDA:n avulla tapahtuva LLM-koulutus, hienosäätö ja inference

mm
Lisää Unite.AI suosikkilähteisiisi Google-palvelussa
Nvidia GPU in Ubuntu Basics of GPU Parallel Computing GPU Based LLM Training Machine

Tekoälyalan (AI) on kokenut merkittäviä edistysaskeleita viime vuosina, ja sen ytimessä on voimakas yhdistelmä grafiikkakortteja (GPU) ja rinnakkaislaskentapohjaa.

Mallit, kuten GPT, BERT ja viimeaikaiset Llama, Mistral, pystyvät ymmärtämään ja tuottamaan ihmismäistä tekstiä ennennäkemättömällä sulavuudella ja yhtenäisyydellä. Kuitenkin näiden mallien koulutus vaatii valtavat määrät dataa ja laskentaresursseja, mikä tekee GPU:ista ja CUDA:sta välttämättömiä työkaluja tässä pyrkimyksessä.

Tämä kattava opas opastaa sinua NVIDIA (NVDA ) -grafiikkakortin asettamisessa Ubuntu-koneeseen, kattaa olennaisen ohjelmisto-osien, kuten NVIDIA-ajurin, CUDA-työkalupakin, cuDNN:n, PyTorchin ja muiden, asentamisen.

CUDA-kiihdytettyjen AI-kehysten nousu

GPU-kiihdytetty syväoppiminen on saanut vauhtia suosittujen AI-kehysten kehityksestä, jotka hyödyntävät CUDA:a tehokkaalle laskennalle. Kehykset, kuten TensorFlow, PyTorch ja MXNet, sisältävät valmiin CUDA-tuen, mahdollistaen helpon integraation GPU-kiihdytystä syväoppimisputkiin.

NVIDIA:n Multi-Instance GPU (MIG) -tekniikka, joka esiteltiin Ampere-arkkitehtuurissa, sallii yhden GPU:n jakamisen useaan turvalliseen instanssiin, joilla on omat omistetut resurssit. Tämä ominaisuus mahdollistaa tehokkaan jakamisen GPU-resursseja useiden käyttäjien tai työkuormien kesken, maksimoimalla hyödyntämisen ja vähentämällä kustannuksia.

LLM-inferenssin kiihdyttäminen NVIDIA TensorRT:llä

Vaikka GPU:t ovat olleet tärkeitä LLM-mallien koulutuksessa, tehokas inferenssi on yhtä tärkeää mallien käyttöönotossa tuotantoympäristöissä. NVIDIA TensorRT, korkean suorituskyvyn syväoppimisen inferenssoptimoija ja ajonaikainen, on tärkeässä roolissa LLM-inferenssin kiihdyttämisessä CUDA-kiihdytettyjen GPU:iden avulla.

NVIDIA:n sitoutuminen avoimien lähteiden aloitteisiin on ollut voimakas voima CUDA:n laajan hyväksymisen takana AI-tutkimusyhteisössä. Projektit, kuten cuDNN, cuBLAS ja NCCL, ovat saatavilla avoimina kirjastoina, mahdollistaen tutkijoille ja kehittäjille hyödyntää CUDA:n täydellistä potentiaalia syväoppimissovelluksissaan.

Asennus

Kun asennetaan AI-kehystöä, viimeisimmät ajurit ja kirjastot eivät aina ole paras valinta. Esimerkiksi, vaikka viimeisin NVIDIA-ajuri (545.xx) tukee CUDA 12.3:aa, PyTorch ja muut kirjastot eivät välttämättä tue tätä versiota vielä. Siksi käytämme ajuria 535.146.02 ja CUDA 12.2:aa, jotta varmistamme yhteensopivuuden.

Asennusohjeet

1. Asenna NVIDIA-ajuri

Tunnista ensin GPU-mallisi. Tässä opasessa käytämme NVIDIA GPU:ta. Mene NVIDIA-ajurin lataussivulle, valitse sopiva ajuri GPU:lle ja muista ajurin versio.

Tarkista ennalta koostetut GPU-paketit Ubuntu:ssa, suorita:

[koodi kieli=”BASH”]

sudo ubuntu-drivers list –gpgpu

[/koodi]

Käynnistä tietokoneesi uudelleen ja vahvista asennus:

[koodi kieli=”BASH”]

nvidia-smi

[/koodi]

2. Asenna CUDA-työkalupaketti

CUDA-työkalupaketti tarjoaa kehitysympäristön luomiseen GPU-kiihdytettyjä sovelluksia varten.

Jos et käytä LLM:ää tai syväoppimista, voit asentaa:

[koodi kieli=”BASH”]

sudo apt install nvidia-cuda-toolkit

Kuitenkin, varmistamaan yhteensopivuuden BitsAndBytesin kanssa, seuraamme näitä vaiheita:

[koodi kieli=”BASH”]

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

[/koodi]

Vahvista asennus:

[koodi kieli=”BASH”]

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

[/koodi]

Aseta ympäristömuuttujat:

[koodi kieli=”BASH”]

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

[/koodi]

3. Asenna cuDNN

Lataa cuDNN-paketti NVIDIA-kehittäjien sivustolta. Asenna se seuraavasti:

[koodi kieli=”BASH”]

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

[/koodi]

Seuraa ohjeita avaimen lisäämiseksi:

[koodi kieli=”BASH”]

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

[/koodi]

Asenna cuDNN-kirjastot:

[koodi kieli=”BASH”]

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

[/koodi]

4. Määritä Python-virtuaaliympäristö

Ubuntu 22.04 sisältää Pythonin version 3.10. Asenna venv:

[koodi kieli=”BASH”]

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

[/koodi]

Luo ja aktivoi virtuaaliympäristö:

[koodi kieli=”BASH”]

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

[/koodi]

5. Asenna BitsAndBytes lähteestä

Siirry BitsAndBytes-kansioon ja rakenna lähde:

[koodi kieli=”BASH”]

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

[/koodi]

6. Asenna PyTorch

Asenna PyTorch seuraavalla komennolla:

[koodi kieli=”BASH”]

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

[/koodi]

7. Asenna Hugging ja Transformers

Asenna transformers- ja accelerate-kirjastot:

[koodi kieli=”BASH”]

pip install transformers
pip install accelerate

[/koodi]

Rinnakkaisen laskennan voima

GPU:t ovat ytimeltään erittäin rinnakkaisia prosessoreita, jotka on suunniteltu käsittelemään tuhansia rinnakkaisia säikeitä tehokkaasti. Tämä arkkitehtuuri tekee niistä hyvin soveltuvia laskennan vaativiin tehtäviin, mukaan lukien syväoppimisen mallien koulutus, kuten LLM:t.

CUDA-alusta, jonka NVIDIA on kehittänyt, tarjoaa ohjelmistoympäristön, joka mahdollistaa kehittäjien hyödyntämisen näiden GPU:iden täydellistä potentiaalia, mahdollistaen heidän kirjoittaa koodia, joka voi hyödyntää laitteiston rinnakkaislaskennan ominaisuuksia.

Kiihdyttäminen LLM-koulutusta GPU:illa ja CUDA:lla.

Suurten kielimallien koulutus on laskennan vaativa tehtävä, joka vaatii valtavat määrät tekstidataa ja useita matriisilaskentoja. GPU:t, joilla on tuhannet ytimet ja korkea muistikaista, ovat ihanteellisia näille tehtäville. Hyödyntämällä CUDA:a, kehittäjät voivat optimoida koodinsa hyödyntämään GPU:iden rinnakkaislaskennan ominaisuuksia, merkittävästi vähentäen LLM-mallien koulutusaikaa.

Esimerkiksi GPT-3-mallin koulutus, yksi suurimmista kieli-malleista tähän mennessä, tehtiin mahdolliseksi käyttämällä tuhansia NVIDIA GPU:ita, jotka suorittivat CUDA-optimoitua koodia. Tämä mahdollisti mallin koulutuksen ennennäkemättömällä määrällä dataa, johtuen sen vaikuttavasta suorituskyvystä luonnollisen kielen tehtävissä.

[koodi kieli=”PYTHON”]

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

# Lataa esikoulutettu GPT-2-malli ja tokenizer
model = GPT2LMHeadModel.from_pretrained(‘gpt2’)
tokenizer = GPT2Tokenizer.from_pretrained(‘gpt2′)

# Siirrä malli GPU:lle, jos mahdollista
laite = torch.device(“cuda” if torch.cuda.is_available() else “cpu”)
model = model.to(laite)

# Määritä koulutusdata ja hyperparametrit
koulutus_data = […] # Koulutusdata
batch_koko = 32
epochit = 10
oppiaines = 5e-5

# Määritä menetetty funktio ja optimoija
kriteeri = nn.CrossEntropyLoss()
optimoija = optim.Adam(model.parameters(), lr=oppiaines)

# Koulutussilmukka
for epoch in range(epochit):
for i in range(0, len(koulutus_data), batch_koko):
# Valmistele syöte- ja kohdemuuttujat
syote, kohde = koulutus_data[i:i+batch_koko]
syote = tokenizer(syote, return_tensors=”pt”, padding=True)
syote = syote.to(laite)
kohde = kohde.to(laite)

# Eteenpäin suoritus
tulokset = model(**syote, labels=kohde)
menetys = tulokset.loss

# Taaksepäin suoritus ja optimointi
optimoija.zero_grad()
menetys.backward()
optimoija.step()

print(f’Epoch {epoch+1}/{epochit}, Menetys: {menetys.item()}’)

[/koodi]

Tässä koodiesimerkissä esitetään GPT-2-kielimallin koulutus PyTorchilla ja CUDA-kiihdytettyjen GPU:iden avulla. Malli ladataan GPU:lle (jos mahdollista), ja koulutussilmukka hyödyntää GPU:iden rinnakkaista laskentaa tehokkaan eteenpäin- ja taaksepäinsuorituksen suorittamiseen, kiihdyttäen koulutusprosessia.

CUDA-kiihdytettyjä kirjastoja syväoppimiseen

Lisäksi CUDA-alustan itsensä, NVIDIA ja avoimen lähdekoodin yhteisö ovat kehittäneet useita CUDA-kiihdytettyjä kirjastoja, jotka mahdollistavat tehokkaan toteutuksen syväoppimismalleja, mukaan lukien LLM:t. Nämä kirjastot tarjoavat optimoidut toteutukset yleisistä operaatioista, kuten matriisien kertolaskuista, konvoluutioista ja aktivaatiofunktioista, mahdollistaen kehittäjien keskittymisen mallin arkkitehtuuriin ja koulutusprosessiin ilman alhaisen tason optimoinnin vaivaa.

Yksi tällainen kirjasto on cuDNN (CUDA Deep Neural Network library), joka tarjoaa erittäin optimoidut toteutukset standardirutiineista, joita käytetään syvissä neuroverkoissa. Hyödyntämällä cuDNN:ää, kehittäjät voivat kiihdyttää merkittävästi mallien koulutusta ja inferenssiä, saavuttaen suorituskyvyn parannuksia useita kertaa suurempia kuin CPU-pohjaisiin toteutuksiin verrattuna.

[koodi kieli=”PYTHON”]

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

luokka ResidualBlock(nn.Module):
def __init__(self, sisääntulokanavat, ulostulokanavat, askel=1):
super().__init__()
self.conv1 = nn.Conv2d(sisääntulokanavat, ulostulokanavat, kernel_size=3, askel=askel, padding=1, bias=False)
self.bn1 = nn.BatchNorm2d(ulostulokanavat)
self.conv2 = nn.Conv2d(ulostulokanavat, ulostulokanavat, kernel_size=3, askel=1, padding=1, bias=False)
self.bn2 = nn.BatchNorm2d(ulostulokanavat)
self.shortcut = nn.Sequential()
if askel != 1 or sisääntulokanavat != ulostulokanavat:
self.shortcut = nn.Sequential(
nn.Conv2d(sisääntulokanavat, ulostulokanavat, kernel_size=1, askel=askel, bias=False),
nn.BatchNorm2d(ulostulokanavat))

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

[/koodi]

Tässä koodiesimerkissä määritellään residual-lohko konvoluutioneuroverkkoon PyTorchilla. Autocast-kontekstinhallinta PyTorchin Automatic Mixed Precision (AMP) -ominaisuudesta käytetään mixed-precision-koulutuksen mahdollistamiseen CUDA-kiihdytettyjen GPU:iden avulla, säilyttäen korkean tarkkuuden. F.relu-funktio on optimoitu cuDNN:llä, varmistaen tehokkaan suorituksen GPU:illa.

Moni-GPU- ja jakautunut koulutus skaalautuvuuden vuoksi

Kun LLM:t ja syväoppimismallit jatkavat kasvamistaan ja monimutkaisuuttaan, myös niiden koulutusvaatimukset kasvavat. Tähän haasteeseen ovat tutkijat ja kehittäjät vastanneet moni-GPU- ja jakautuneen koulutuksen tekniikoilla, jotka mahdollistavat useiden GPU:iden yhdistetyn laskentatehon hyödyntämisen useiden koneiden yli.

CUDA ja liittyvät kirjastot, kuten NCCL (NVIDIA Collective Communications Library), tarjoavat tehokkaat viestintäprimitiivit, jotka mahdollistavat tietojen ja synkronoinnin siirtämisen useiden GPU:iden välillä, mahdollistaen jakautuneen koulutuksen ennennäkemättömällä skaalalla.

[koodi kieli=”PYTHON”]

import torch.distributed as dist
from torch.nn.parallel import DistributedDataParallel as DDP

# Käynnistä jakautunut koulutus
dist.init_process_group(backend=’nccl’, init_method=’…’)
lokaalinen_sijoitus = dist.get_rank()
torch.cuda.set_device(lokaalinen_sijoitus)

# Luo malli ja siirrä se GPU:lle
malli = MyModel().cuda()

# Kääri malli DDP:llä
malli = DDP(malli, device_ids=[lokaalinen_sijoitus])

# Koulutussilmukka (jakautunut)
for epoch in range(epochit):
for data in koulutus_lataaja:
syote, kohde = data
syote = syote.cuda(non_blocking=True)
kohde = kohde.cuda(non_blocking=True)

tulokset = malli(syote)
menetys = kriteeri(tulokset, kohde)

optimoija.zero_grad()
menetys.backward()
optimoija.step()

[/koodi]

Tässä esimerkissä esitetään jakautunut koulutus PyTorchin DistributedDataParallel (DDP) -moduulilla. Malli kääritään DDP:llä, joka käsittelee automaattisesti data-jakautumisen, gradienttien synkronoinnin ja viestinnän useiden GPU:iden välillä NCCL:n avulla. Tämä lähestymistapa mahdollistaa koulutusprosessin tehokkaan skaalautumisen useiden koneiden yli, sallien tutkijoille ja kehittäjille kouluttaa suurempia ja monimutkaisempia malleja kohtuullisessa ajassa.

Syväoppimismallien käyttöönotto CUDA:lla

Vaikka GPU:t ja CUDA ovat pääasiassa käytetty koulutukseen, ne ovat myös tärkeitä syväoppimismallien käyttöönotossa ja inferenssissä. Kun syväoppimismallit tulevat yhä monimutkaisemmiksi ja resursseja vaativammiksi, GPU-kiihdytys on välttämätöntä saavuttaaksesi reaaliaikaisen suorituskyvyn tuotantoympäristöissä.

NVIDIA:n TensorRT on korkean suorituskyvyn syväoppimisen inferenssoptimoija ja ajonaikainen, joka tarjoaa matalan viiveen ja korkean läpäisyn CUDA-kiihdytettyjen GPU:iden avulla. TensorRT voi optimoida ja kiihdyttää malleja, jotka on koulutettu kehyksissä kuten TensorFlow, PyTorch ja MXNet, mahdollistaen tehokkaan käyttöönoton eri alustoilla, embedded-järjestelmistä datakeskuksiin.

[koodi kieli=”PYTHON”]

import tensorrt as trt

# Lataa esikoulutettu malli
malli = lataa_malli(…)

# Luo TensorRT-moottori
loki = trt.Logger(trt.Logger.INFO)
rakentaja = trt.Builder(loki)
verkko = rakentaja.create_network()
parseri = trt.OnnxParser(verkko, loki)

# Parsaa ja optimoi malli
onnistui = parseri.parse_from_file(malli_polku)
moottori = rakentaja.build_cuda_engine(verkko)

# Suorita inferenssi GPU:lla
konteksti = moottori.create_execution_context()
syote, tulokset, sidokset, virta = varaa_puskurit(moottori)

# Aseta syötedata ja suorita inferenssi
aseta_syotedata(syote, syotedata)
konteksti.execute_async_v2(sidokset=sidokset, virtaprosessori=virta.ptr)

# Prosessoi tulokset
# …

[/koodi]

Tässä esimerkissä esitetään esikoulutetun syväoppimismallin käyttöönotto CUDA-kiihdytettyjen GPU:iden avulla TensorRT:llä. Malli parsitaan ja optimoidaan TensorRT:llä, joka luo erittäin optimoidun inferenssimoottorin, joka on suunniteltu mallille ja laitteistolle. Tätä moottoria voidaan sitten käyttää tehokkaaseen inferenssiin GPU:illa, hyödyntäen CUDA:a kiihdytettyyn laskentaan.

Johtopäätös

GPU:iden ja CUDA:n yhdistelmä on ollut ratkaiseva tekijä suurten kieli-mallien, tietokoneavusteisen näön, puheentunnistuksen ja muiden syväoppimisen sovellusten kehityksessä. Käyttämällä GPU:iden rinnakkaislaskentakykyä ja CUDA:n optimoituja kirjastoja, tutkijat ja kehittäjät voivat kouluttaa ja käyttöönottaa yhä monimutkaisempia malleja tehokkaasti.

Kun tekoälyalan jatkaa kehittymistä, GPU:iden ja CUDA:n merkitys kasvaa entisestään. Uusilla, tehokkaammilla laitteilla ja ohjelmistoparannuksilla odotetaan edelleen merkittäviä läpimurtoja tekoälyjärjestelmien kehityksessä ja käyttöönotossa, laajentaen mahdollisuuksien rajoja.

Olen viettänyt viimeiset viisi vuotta uppoutumalla kiinnostavaan koneoppimisen ja syvän oppimisen maailmaan. Minun intohimoni ja asiantuntemukseni ovat johtaneet minun osallistumiseen yli 50:een monipuoliseen ohjelmistosuunnitteluhankkeeseen, joissa on erityisesti painottunut AI/ML. Minun jatkuva uteliaisuuteni on myös ohjannut minun luontaisen kielen prosessoinnin pariin, jota haluan tutkia tarkemmin.