-
GPU-kiihdytetty koneoppiminen
GPU-kiihdytetty koneoppiminen
Tässä oppaassa selitetään GPU:iden käytön perusteet CSC:n supertietokoneissa. Se on osa koneoppimisopastamme.
Puhti, Mahti, Roihu vai LUMI?
Puhti, Mahti ja Roihu ovat CSC:n kansallisia supertietokoneita. Roihun on suunniteltu olevan käytettävissä toukokuussa 2026, kun taas Puhti ja Mahti ajetaan alas vuoden 2026 aikana. Tällä hetkellä käytettävissä olevista kahdesta järjestelmästä Puhdissa on enemmän GPU:ita (NVIDIA V100) ja laajin valikoima asennettuja ohjelmistoja, kun taas Mahdissa on pienempi määrä nopeampia uuden sukupolven NVIDIA A100 -GPU:ita. Roihussa tulee olemaan 528 GPU:ta (NVIDIA GH200), ja se tarjoaa Puhdin kaltaisen laajan ohjelmistopinon.
CSC:n isännöimä eurooppalainen supertietokone LUMI tarjoaa valtavan AMD-GPU:ihin perustuvan GPU-resurssin.
Keskeiset GPU:ihin liittyvät tilastot on koottu alla olevaan taulukkoon.
| GPU type | GPU memory | GPU nodes | GPUs/node | Total GPUs | Notes | |
|---|---|---|---|---|---|---|
| Puhti | NVIDIA Volta V100 | 32 GB | 80 | 4 | 320 | Suljetaan kesäkuussa |
| Mahti | NVIDIA Ampere A100 | 40 GB | 24 | 4 | 96 | Suljetaan elokuussa |
| Roihu | NVIDIA Hopper GH200 | 96 GB | 132 | 4 | 528 | Saatavilla toukokuussa |
| LUMI | AMD MI250x | 64 (128) GB | 2978 | 8 (4) | 23824 (11912) |
Huomio
Jokaisessa LUMI-solmussa on 4 MI250x-GPU:ta, mutta Slurmin kautta on käytettävissä 8 GPU:ta, koska MI250x-kortissa on 2 GPU-dietä (GCD). Yllä olevassa taulukossa on esitetty GPU-die-kohtaiset luvut, ja MI250x-korttikohtaiset luvut on merkitty sulkeisiin.
Lue myös GPU-solmujen käyttöehtomme. Huomioi lisäksi, että Slurmin jonotustilanne voi vaihdella eri supertietokoneiden välillä eri aikoina, joten kaikki vaihtoehdot kannattaa tarkistaa. Esimerkiksi LUMIssa on valtava määrä GPU:ita käytettävissä, ja jonotusajat ovat yleensä lyhyempiä kuin kansallisissa järjestelmissä.
Huomaa, että kaikissa supertietokoneissa on erilliset tiedostojärjestelmät, joten tiedostot täytyy kopioida käsin, jos haluat vaihtaa järjestelmää.
Saatavilla olevat koneoppimisohjelmistot
Tuemme CSC:n supertietokoneissa GPU-kiihdytettyyn koneoppimiseen useita sovelluksia, mukaan lukien TensorFlow ja PyTorch. Lue tarkemmat ohjeet juuri siitä sovelluksesta, josta olet kiinnostunut.
Sinun täytyy käyttää moduulijärjestelmää ladataksesi haluamasi sovelluksen, esimerkiksi:
Huomaa, että moduulimme sisältävät jo CUDA- ja cuDNN-kirjastot, joten cuda- ja cudnn-moduuleja ei tarvitse ladata erikseen!
LUMIssa suosittelemme käyttämään LUMI AI Factoryn tarjoamaa AI Software Environmentia.
Oman ohjelmiston asentaminen
Monissa tapauksissa olemassa olevat moduulimme tarjoavat tarvittavan ohjelmistokehyksen, mutta joitakin paketteja puuttuu. Tällöin voit usein ladata sopivan moduulin ja sitten asentaa lisäpaketteja omaan käyttöön pip-paketinhallinnalla.
Monimutkaisempia ohjelmistotarpeita varten suosittelemme käyttämään tykkyä tai luomaan oman Apptainer-säiliön.
GPU-töiden ajaminen
Jotta voit lähettää GPU-työn Slurm-työnhallintaan, sinun täytyy käyttää Puhdissa gpu-osiota tai Mahdissa gpusmall- tai gpumedium-osiota sekä määrittää tarvittavien GPU:iden tyyppi ja määrä --gres-valitsimella.
LUMIssa sinun täytyy käyttää jotakin GPU-osioista, kuten dev-g, small-g tai standard-g.
Alla on esimerkkieräajokomennostot yhden GPU:n ja sitä vastaavan osuuden yhden solmun CPU-ytimistä ja muistista varaamiseen:
Mahdin gpusmall-osio tukee vain töitä, joissa on 1–2 GPU:ta. Jos tarvitset enemmän GPU:ita, käytä gpumedium-jonoa. Voit lukea lisää monen GPU:n ja monen solmun töistä erillisestä oppaastamme.
Tarkempia tietoja eri osioista löydät sivuiltamme CSC:n supertietokoneiden käytettävissä olevista eräajo-osioista ja LUMIn Slurm-osioista.
GPU:n käyttöaste
GPU:t ovat CPU:ihin verrattuna erittäin kallis resurssi, joten GPU:iden käyttöasteen tulisi olla mahdollisimman korkea sen jälkeen, kun ne on varattu. Tarjoamme joitakin työkaluja GPU-töiden käyttöasteen seurantaan eri supertietokoneissa. GPU:n käyttöasteen tulisi ihannetapauksessa olla lähellä 100 %:a. Jos käyttöasteesi on jatkuvasti matala (esimerkiksi alle 50 %), siihen voi olla useita syitä:
-
Sinulla voi olla prosessoinnin pullonkaula. Esimerkiksi sinun kannattaa käyttää datan latauskehystä (ja varata sille riittävästi CPU-ytimiä), jotta GPU:lle voidaan syöttää dataa riittävän nopeasti. Katso dokumentaatiomme useiden CPU-ytimien käytöstä datan esikäsittelyyn.
-
Vaihtoehtoisesti voi yksinkertaisesti olla niin, että laskennallinen ongelma on GPU:lle "liian pieni", esimerkiksi jos neuroverkko on suhteellisen yksinkertainen. Tämä ei sinänsä ole ongelma, mutta jos käyttöasteesi on todella matala, kannattaa harkita, olisiko CPU:iden käyttö kustannustehokkaampaa.
Kuten aina, älä epäröi ottaa yhteyttä palvelutukeemme, jos sinulla on kysyttävää GPU:n käyttöasteesta.
Työkalut GPU:n käyttöasteen seurantaan
seff-komento valmiille työlle (Puhti ja Mahti)
Helpoin tapa tarkistaa valmiin työn GPU:n käyttöaste on käyttää seff-komentoa:
Tässä esimerkissä näemme, että suurin käyttöaste on 100 %, mutta keskiarvo on 92 % (tämä on hyvä taso):
GPU load
Hostname GPU Id Mean (%) stdDev (%) Max (%)
r01g07 0 92.18 19.48 100
------------------------------------------------------------------------
GPU memory
Hostname GPU Id Mean (GiB) stdDev (GiB) Max (GiB)
r01g07 0 16.72 1.74 16.91
nvidia-smi käynnissä olevalle työlle (Puhti ja Mahti)
Kun työ on käynnissä, voit suorittaa nvidia-smi-komennon ssh:n kautta sillä solmulla, jossa työ on käynnissä. Voit tarkistaa solmun konenimen komennolla squeue --me. Tuloste voi näyttää esimerkiksi tältä:
JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON)
17273947 gpu puhti-gp mvsjober R 0:07 1 r01g06
Näet solmun konenimen NODELIST-sarakkeesta, tässä tapauksessa se on r01g06. Voit nyt tarkistaa GPU:n käyttöasteen komennolla (korvaa <nodename> oman tapauksesi todellisella solmun konenimellä):
Tuloste näyttää suunnilleen tältä:
Wed Jun 14 09:53:11 2023
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 515.105.01 Driver Version: 515.105.01 CUDA Version: 11.7 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|===============================+======================+======================|
| 0 Tesla V100-SXM2... On | 00000000:89:00.0 Off | 0 |
| N/A 57C P0 232W / 300W | 5222MiB / 32768MiB | 100% Default |
| | | N/A |
+-------------------------------+----------------------+----------------------+
+-----------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=============================================================================|
| 0 N/A N/A 2312753 C /appl/soft/ai/bin/python3 5219MiB |
+-----------------------------------------------------------------------------+
Tästä näemme, että prosessimme käyttää noin 5 Gt (32 Gt:sta) GPU-muistia ja että tämänhetkinen GPU:n käyttöaste on 100 % (mikä on erittäin hyvä).
Jos haluat jatkuvasti päivittyvän näkymän:
Tämä päivittyy 2 sekunnin välein. Poistu painamalla Ctrl-C.
rocm-smi käynnissä olevalle työlle (LUMI)
LUMI-supertietokone käyttää AMD-GPU:ita, joten komento on hieman erilainen: rocm-smi. LUMIssa sinun täytyy käyttää srun-komentoa kirjautuaksesi solmuun, jossa sinulla on käynnissä oleva työ:
Korvaa <jobid> todellisella Slurm-työn tunnuksella. Voit myös käyttää komentoa watch rocm-smi saadaksesi jatkuvasti päivittyvän näkymän.
Useiden CPU-ytimien käyttö datan esikäsittelyyn
Yksi yleinen syy GPU:n matalaan käyttöasteeseen on se, että CPU ei pysty lataamaan ja esikäsittelemään dataa riittävän nopeasti, jolloin GPU joutuu odottamaan seuraavaa käsiteltävää erää. Tällöin on tavallista varata enemmän CPU:ita datan lataamiseen ja esikäsittelyyn useissa rinnakkaisissa säikeissä tai prosesseissa. Hyvä nyrkkisääntö Puhdissa on varata 10 CPU:ta per GPU (koska jokaisessa solmussa on 4 GPU:ta ja 40 CPU:ta). Mahdissa voit varata enintään 32 ydintä, koska se vastaa 1/4:ää solmusta. LUMIssa suosittelemme käyttämään 7 CPU-ydintä, koska siellä on 63 ydintä 8 GPU:lle. Muista, että CPU:t ovat paljon halvempi resurssi kuin GPU!
Olet ehkä huomannut, että olemme jo noudattaneet tätä ohjetta esimerkkityökomennostoissamme:
Koodisi täytyy myös tukea rinnakkaista esikäsittelyä. Useimmat korkean tason koneoppimiskehykset tukevat tätä kuitenkin valmiiksi. Esimerkiksi TensorFlow’ssa voit käyttää tf.data-rajapintaa ja asettaa num_parallel_calls-arvoksi varattujen CPU:iden määrän sekä käyttää prefetch-toimintoa:
PyTorchissa voit käyttää torch.utils.DataLoader-luokkaa, joka tukee datan lataamista useilla prosesseilla:
Jos käytät useita datalataajia mutta datan lataaminen on silti hidasta, voi myös olla, että käytät jaettua tiedostojärjestelmää tehottomasti. Yleinen virhe on lukea valtava määrä pieniä tiedostoja. Voit lukea lisää siitä, miten data kannattaa tallentaa ja ladata mahdollisimman tehokkaasti koneoppimista varten erillisestä oppaastamme.
Profilointityökalut
TensorFlow Profiler ja PyTorch Profiler ovat saatavilla TensorBoard-liitännäisinä. Profilointityökalut löytyvät TensorBoardin PROFILE- ja PYTORCH_PROFILER-välilehdiltä. Huomaa, että välilehdet eivät välttämättä näy oletuksena, vaan ne löytyvät käyttöliittymän oikeassa reunassa olevasta pudotusvalikosta. Profilointityökaluja voidaan käyttää resurssien kulutuksen tunnistamiseen ja suorituskyvyn pullonkaulojen ratkaisemiseen, erityisesti datan syöttöputkessa.
Katso myös:
GPU:n energiankulutus
Ekologisista ja taloudellisista syistä koneoppimistöiden energiankulutusta on usein tarpeen seurata. Yksittäisen työn koko energiankulutuksen mittaaminen, mukaan lukien CPU- ja GPU-prosessointi, verkkoliikenne ja jäähdytys, on yleisessä tapauksessa melko vaikeaa, koska nämä resurssit jakautuvat monien töiden kesken ja voivat riippua useista seurattavasta työstä riippumattomista tekijöistä. Onneksi pelkkien GPU:iden energiankulutuksen mittaaminen on helpompaa, koska niitä ei yleensä jaeta monien töiden kesken. Koska GPU on ylivoimaisesti suurin energian kuluttaja, se antaa hyvän arvion kokonaisenergiankulutuksesta.
Työkalut GPU:n energiankulutuksen seurantaan
seff-komento valmiille työlle (Puhti ja Mahti)
Puhdissa ja Mahdissa voit käyttää valmiille työlle seff-työkalua:
Huomaa, että GPU:n energiankulutus lasketaan vasta työn valmistuttua, joten työn aikana ei tulostu väliaikaista arvoa.
Esimerkkituloste tilanteessa, jossa on käytetty yhtä solmua ja 4 GPU
gpu-energy-työkalu (LUMI)
LUMIssa ei ole seff-komentoa, mutta käytettävissä on yksinkertainen työkalu, jolla voidaan lukea AMD-GPU-kortista löytyviä GPU:n energialaskureita. Työkalu ja sen dokumentaatio löytyvät täältä:
https://github.com/mvsjober/gpu-energy-amd.
Se on esiasennettu LUMIin polkuun /appl/local/csc/soft/ai/bin/gpu-energy.
Tyypillinen käyttö Slurm-komentosarjassa:
Esimerkkituloste:
GPU 0: 46.64 Wh, avg power: 377.81 W (444.43 s)
GPU 2: 46.47 Wh, avg power: 376.46 W (444.43 s)
GPU 4: 46.18 Wh, avg power: 374.04 W (444.43 s)
GPU 6: 46.62 Wh, avg power: 377.62 W (444.43 s)
TOTAL: 185.91 Wh
Huomaa, että työkalu tulostaa energian vain parillisille GCD-numeroille, koska AMD-GPU:n energialaskuri tuottaa vain yhden arvon koko MI250x-kortille.
Mittaa GPU:n käyttö LUMIssa aina koko solmulle!
GPU:n energian mittaus LUMIssa täytyy tehdä koko solmulla, jotta tulokset ovat tarkkoja. Syynä on se, että MI250x-GPU:ssa on 2 GPU-dietä (GCD), mutta energialaskuri antaa yhden luvun koko MI250x:lle. Jos varaat yhden GCD:n, toinen ajo saattaa käyttää toista GCD:tä. Vaikka varaisit 2 GCD:tä, ei ole mahdollista taata, että ne tulevat samalta kortilta.
Katso lisää käyttöesimerkkejä README.md-tiedostosta.