Ubrzanje učitavanja podataka u GPU pomoću NVIDIA KvikIO i GPUDirect Storage

  • PublicPublic
  • 22 Oct, 2026
Ubrzanje učitavanja podataka u GPU pomoću NVIDIA KvikIO i GPUDirect Storage

NVIDIA Magnum IO GPUDirect Storage (GDS) rješava problem uske grla pri premještanju velikih skupova podataka s pohrane na akceleratora omogućivanjem izravnog puta za prijenos koji zaobilazi međuspremnik u memoriji CPU. Kako se modeli umjetne inteligencije i skupovi podataka za obuku eksponencijalno povećavaju, učinkovito premještanje podataka ključno je za održavanje opterećenja GPU. Iako je primarni sučelje GDS C API cuFile, Python ostaje dominantni jezik u modernom razvoju AI. NVIDIA KvikIO premošćuje taj jaz pružanjem visokorazinskih, idiomatskih sučelja za Python i C++ za visokoperformantni ulaz/izlaz datoteka. Radi iznad cuFile, nudeći dodatne kontrole nad načinom izvršavanja zahtjeva za ulaz/izlaz, što omogućuje razvojnicima upravljanje putem prijenosa podataka bez prelaska na niskorazinski C kod.

Slika 1. Uspješan tijek izvršavanja čitanja KvikIO
Slika 1. Uspješan tijek izvršavanja čitanja KvikIO

Arhitektura uključuje dvije odvojene točke odluke za odabir puta prijenosa podataka. Prvo, KvikIO određuje treba li uputiti zahtjev putem cuFile-a ili koristiti vlastiti put kompatibilnosti POSIX, koji koristi memoriju domaćina kao međukorak. Na taj izbor utječe postavka compat_mode, koja može imati vrijednosti AUTO, ON ili OFF. U načinu AUTO, KvikIO pokušava koristiti cuFile, ali se vraća na POSIX ako on nije dostupan. Drugo, kada cuFile primi zahtjev, on odlučuje koristiti li ubrzan put GDS ili vlastiti put kompatibilnosti s međuskladištem u CPU-u, ovisno o podršci sustava i konfiguraciji. Stoga, poziv na API cuFile-a potvrđuje samo odabir KvikIO-a, ali ne jamči da je korišten ubrzan put GDS. Razvojnicima je potrebno provjeriti konačni put kako bi osigurali optimalne performanse.

Za početak, postavite Python okruženje i instalirajte izdanje KvikIO za CUDA 13 pomoću naredbe pip install kvikio-cu13, koje uključuje CuPy kao ovisnost. Prije izvođenja operacija ulaza/izlaza, ispitajte aktivnu konfiguraciju pomoću API-ja zadanih vrijednosti KvikIO-a. Ključne postavke uključuju compat_mode, koji izvještava o aktivnom načinu, i gds_threshold, minimalnu veličinu zahtjeva koji se šalje u cuFile. Na testnom sustavu prag iznosi 16 KiB, što znači da se manja čitanja izravno izvršavaju putem POSIX puta KvikIO-a. Ove postavke mogu se kontrolirati pomoću varijabli okruženja, poput KVIKIO_COMPAT_MODE i KVIKIO_GDS_THRESHOLD. Osim toga, skripta gdscheck.py može se koristiti za provjeru instaliranih komponenti GDS, podržanih datotečnih sustava i aktivne konfiguracije cuFile-a na platformi.

Za čitanje podataka u memoriju GPU-a, dodijelite CuPy niz odgovarajuće veličine i koristite kontekstni menadžer kvikio.CuFile za izvođenje čitanja. Na primjer, čitanje datoteke veličine 1 GiB uključuje stvaranje CuPy međuspremnika veličine 1 GiB i njegovo proslijeđivanje metodi read. Da biste provjerili put prijenosa podataka, omogućite statistiku izvršavanja cuFile-a postavljanjem varijable okruženja CUFILE_STATS_LEVEL=3 i pokretanjem skripte u interaktivnom načinu. Zatim koristite gds_stats za ispitivanje brojača. U izlazu po GPU-u, brojač nvfs prati operacije koje koriste modul jezgre nvidia-fs (ubrzan put), dok posix prati operacije koje koriste put kompatibilnosti. S zadanim postavkama, čitanje od 1 GiB podijeljeno je na 256 operacija od po 4 MiB, sve prikazujući nvfs=256 i posix=0, što potvrđuje korištenje ubrzanog puta.

Dodatna kontrola moguća je neovisnim mijenjanjem postavki KvikIO-a i cuFile-a. Postavljanje KVIKIO_COMPAT_MODE=off prisiljava KvikIO da koristi cuFile, dok CUFILE_FORCE_COMPAT_MODE=true prisiljava cuFile da koristi svoj put kompatibilnosti, što rezultira pojavom brojača posix u statistici. Suprotno tome, KVIKIO_COMPAT_MODE=on potpuno zaobilazi cuFile, koristeći pozadinski sustav KvikIO-a s međuskladištem u CPU-u. Osim odabira puta, parametri izvršavanja u datoteci cufile.json upravljaju obradom zahtjeva. KvikIO dijeli velike operacije na zadatke na temelju KVIKIO_TASK_SIZE, koji se zatim šalju u cuFile. cuFile može dodatno podijeliti te zahtjeve na temelju svog unutarnjeg bazena nitki i min_io_threshold_size_kb. Na primjer, zahtjev od 1 GiB s veličinom zadatka od 4 MiB rezultira 256 zasebnih zahtjeva cuFile-a, od kojih se svaki obrađuje kao cjelina.

Ako KvikIO pošalje u cuFile jedan veliki zahtjev (npr. 1 GiB), cuFile može podijeliti taj zahtjev na manje dijelove radi paralelne obrade, što je ograničeno brojem radnih nitova i max_request_parallelism. U konfiguraciji s četiri radna nitova, zahtjev od 1 GiB podijeli se u četiri dijela od po 256 MiB. Budući da je ciljni međuspremnik registriran za DMA prijenos s pohrane, cuFile koristi registrirani GPU bounce buffer, kopirajući podatke u slojevima od najviše 16 MiB. Postavka min_io_threshold_size_kb utječe na raspoređivanje zahtjeva; na primjer, zahtjev od 16 MiB može se podijeliti u dva dijela od po 8 MiB kako bi se zadovoljio prag. KvikIO dio je CUDA-X biblioteka i korišten je u cuDF, cuCIM i cuPhoton za ubrzanje unosa podataka u formatima Parquet, ORC i znanstvenih slika. Razumijevanje tih slojeva omogućuje razvojnicima da prilagode performanse ulaza/izlaza za specifične radne opterećenja.