NUMA zamka s 8 GPU-a: CPU-GPU afinitet i multi-node inferencija
Kada radite s više GPU-ova, posebno u sustavima s 8 ili više kartica, često se suočavate s neočekivanim usporavanjima. Problem često nije u samim GPU-ovima, već u načinu na koji su povezani s CPU-om i memorijom. Riječ je o NUMA (Non-Uniform Memory Access) zamci: ako CPU i GPU nisu pravilno usklađeni, latencija raste, a propusnost pada, čak i ako su hardverske komponente vrhunske.
Što je NUMA i zašto je važna?
NUMA je arhitektura u kojoj svaki CPU socket ima vlastitu memoriju, a pristup tuđoj memoriji je sporiji. U sustavima s više procesora i GPU-ova, svaki GPU je fizički povezan na određeni CPU socket preko PCIe kontrolera. Ako proces na CPU-u šalje podatke GPU-u koji nije na istom socketu, podaci moraju putovati kroz QPI/UPI vezu, što dodaje latenciju. U višečvornim sustavima (multi-node), problem se dodatno pogoršava jer komunikacija ide kroz mrežu.
Simptomi NUMA neusklađenosti
- Visoka latencija u inferenciji, čak i pri malim batch veličinama.
- Niska iskorištenost GPU-a (GPU utilization) dok CPU čeka na memoriju.
- Neujednačene performanse između različitih GPU-ova u istom sustavu.
- Povećano vrijeme odziva kada se koristi više GPU-ova paralelno.
Kako dijagnosticirati problem?
Prvi korak je provjeriti topologiju PCIe veza. Alati poput nvidia-smi topo -m prikazuju matricu povezanosti između GPU-ova i CPU-a. Obratite pažnju na oznake kao što su NVLink, PIX (CPU-GPU veza) i PHB (PCIe host bridge). Ako GPU nije izravno povezan s CPU-om na kojem se izvodi proces, to je jasan znak NUMA neusklađenosti.
Drugi korak je analiza rasporeda memorije. Koristite numactl --hardware da vidite koje su memorijske zone dostupne na kojim socketima. Zatim provjerite gdje se nalazi memorija koju koristi vaš proces (npr. pomoću /proc/pid/numa_maps). Ako je memorija na udaljenom socketu, latencija će biti veća.
Rješenja i najbolje prakse
- Postavite CPU-GPU afinitet: Koristite numactl --cpunodebind da vežete proces na CPU socket koji je izravno povezan s GPU-om. Na primjer, ako koristite GPU 0 koji je na socketu 0, pokrenite:
numactl --cpunodebind=0 --membind=0 python infer.py. - Koristite CUDA_VISIBLE_DEVICES: Ograničite vidljive GPU-ove na one koji su na istom NUMA čvoru kao i proces.
- Optimizirajte raspored podataka: Prenesite podatke u memoriju blizu GPU-a prije početka inferencije. Koristite cudaHostAlloc s cudaHostAllocMapped za mapped memory, ili cudaMemAdvise za preporuke o migraciji stranica.
- Razmotrite NVLink: Ako vaš sustav podržava NVLink, koristite ga za među-GPU komunikaciju jer je brži od PCIe i smanjuje ovisnost o CPU-u.
Napredne tehnike za multi-node sustave
U multi-node okruženjima, gdje imate više računala povezanih mrežom, NUMA problem postaje još izraženiji. Preporučuje se korištenje GPUDirect RDMA za izravan prijenos podataka između GPU-ova na različitim čvorovima, bez posredovanja CPU-a. Također, razmislite o korištenju CUDA Graphs za smanjenje overheada pri pokretanju kernel-a, što može ublažiti utjecaj latencije.
Dijagnostika NUMA problema nije jednokratna aktivnost. Redovito pratite performanse i koristite alate poput NVIDIA Nsight Systems za profiliranje. Uz pravilno postavljen afinitet i raspored memorije, možete postići značajno poboljšanje—često i do 30% nižu latenciju u multi-GPU inferenciji.
Ne dopustite da vas NUMA zamka uspori—preuzmite kontrolu nad afinitetom i memorijom već danas.
Zanima vas ovakva AI tehnologija?
RiNET gradi sovereign AI rjesenja za javni sektor i poduzeca - od civic intelligence do automatizacije nabave.
Kontaktirajte nas →
Komentari