
ML v Pythone 7 – Využitie grafickej karty NVIDIA na výpočtovo náročné úlohy
V predchádzajúcej časti sme ukázali vytvorenie animovaných grafov a export od videosúborov. V tejto časti predstavíme platformu CUDA (Compute Unified Device Architecture) ktorá využíva výkon grafických kariet NVIDIA na výpočtovo náročné úlohy. Vo videu je ukázaná inštalácia CUDA Toolkitu, a následne na príklade násobenia veľkých matíc funkciou z knižnice Torch je porovnaná rýchlosť výpočtu pomocou CPU a GPU
CUDA (Compute Unified Device Architecture) je softvérová platforma, ktorá využíva výkon grafických kariet NVIDIA na náročné úlohy, napríklad na úlohy strojového učenia, čo je náš prípad, ale aj na rendrovanie videa, ťažbu kryptomien a podobne. Výhody tejto platformy na lokálnom počítači samozrejme môžu využívať len tí, čo v PC, alebo notebooku majú grafickú kartu NVIDIA.
Všetky matematické a logické výpočty pre strojové učenie samozrejme zvládne aj procesor. Ten je navrhnutý tak, aby vykonával potrebné operácie čo najrýchlejšie a je viacjadrový, aby čo najlepšie zvládal multitasking, čiže podporu viacerých úloh a aplikácií súčasne. Paralelné spracovanie úloh je však limitované počtom jadier. Napríklad procesor Intel Core i7 12 tej generácie v mojom PC má „len“ 12 jadier, z toho 8 je výkonných a štyri optimalizované na čo najnižšiu spotrebu sú určené na rutinné úlohy. Takže čo sa týka paralelného spracovania, súčasne môžu bežať procesy len na 12-tich jadrách. Naproti tomu grafická karta NVIDIA GeForce RTX 4060, mimochodom najlacnejšia z novej produktovej rodiny RTX 4000 má 3072 CUDA jadier Grafická karta má tiež k dispozícii 8 GB rýchlej pamäti RAM. Najvyšší model RTX 4090 má takýchto CUDA jadier až 16384. Takže aj v prípade relatívne lacnej grafickej karty RTX 4060 za 300 € k procesoru je počet jadier 3072 verzus 12, čiže 256 x viac. Na tejto karte môžeme teoreticky spustiť 3072 procesov súčasne. Na RTX 4090 až 16 384 procesov. Teoreticky v tomto prípade znamená, že softvérová nadstavba musí riešiť manažment prideľovania úloh, riadenie procesov a podobne
Postup inštalácie platformy Anaconda je vo videu
Nutnou podmienkou využitia CUDA je grafická karta NVIDIA, ktorá túto technológiu podporuje. Zistíte to z technických parametroch, alebo jednoducho tak, že v prostredí konzolovej aplikácie Anaconda PowerShell Prompt zadáte príkaz. Konzola zobrazí typ karty, resp. viacerých kariet vrátene identifikátora UUID- V našom prípade:
nvidia-smi --list-gpus
Konzola zobrazí typ karty, resp. viacerých kariet vrátene identifikátora UUID- V našom prípade:
GPU 0: NVIDIA GeForce RTX 4060 (UUID: GPU-ed374ae5-3dcb-d3c3-14c4-0869d08a4627)
Zo stránky https://developer.nvidia.com/cuda-zone odporúčam nainštalovať CUDA toolkit. V načich príkladoch budeme pracovať v prostredí Jupyter Notebook, ktorý je súčasťou balíka Anaconda.
Je niekoľko spôsobov, ako nainštalovať CUDA do tohoto prostredia, vrátane knižnice PyTorch, ktorá obsahuje podporu pre výpočty prostredníctvom GPU. PyTorch je framework pre strojové založený na knižnici Torch. Využíva sa napríklad pre rozpoznávanie obrazu, či spracovanie prirodzeného jazyka, ...
Popíšeme postup v konzolovej aplikácii Anaconda PowerShell Prompt. Všimnite si, že promt obsahuje v popise (base), čiže základné pracovné prostredie (enviroment). V našom prípade konkrétne
(base) PS C:\Users\llack>
Niektoré knižnice sa do base prostredia nainštalovať nedajú. Preto vytvoríme nové pracovné prostredie. V našom prípade sme ho nazvali ll_ML. V bázovom prostredí máme verziu Pythonu 3.11.3 (verziu Pythonu zistíte príkazom python -V). Do nového prostredia nainštalujeme vyššiu verziu 3.9. Príkaz na vytvorenie nového prostredia:
conda create -n ll_ML python=3.9
Prostredie je následne potrebné aktivovať príkazom:
conda activate ll_ML
V novovytvorenom pracovnom prostredí môžete nainštalovať CUDA Toolkit príkazom:
conda install -c anaconda cudatoolkit
nainštalujete najnovšiu verziu, v našom prípade NVIDIA CUDA 12.2. Knižnica PyTorch však s touto verziou nemusí korektne pracovať, takže potrebujete staršiu, PyTorchom podporovanú verziu. Odporúčaná stabilná verzia PyTorch 2.0.1 potrebuje CUDA 11.8 a Preview verzia potrebuje CUDA 12.1- PyTorch aj s integrovanou podporou CUDA nainštalujete príkazom, ktorý vám sformuluje formulár na stránke https://pytorch.org/ V našom prípade:
conda install pytorch torchvision torchaudio pytorch-cuda=11.8 -c pytorch -c nvidia
Do nového pracovného prostredia je potrebné nainštalovať aj Jupyter Notebook, v ktorom budeme pracovať
conda install jupyter
Jupyter notebook spustíme príkazom
jupyter notebook
Jednoduchým kódom sa Verziu CUDA zistíte v konzolovej aplikácii príkazom nvcc –version. V Pythone v prostredí Jupyter Notebook príkazom z knižnice Torch
V programe využívajúcom CUDA je žiadúce sa presvedčiť, či je CUDA k dispozícii, napríklad pomocou príkazu torch.cuda.is_available() presvedčíme, že podpora pre CUDA je skutočne inštalovaná. Ak nie, napríklad z dôvodu nekompatibilnej grafickej karty, knižnica Torch bude na výpočtu používať procesor.
Aby sme sa presvedčili, o tom koľkokrát sú výpočty pomocou grafickej karty s podporou CUDA rýchlejšie, než keď ich realizuje procesor, ukážeme to na nejakej výpočtovo náročnej operácii na násobení matíc. Každý prvok (po riadkoch) prvej matice sa násobí každým prvkom (po stĺpcoch) druhej matice. Postup dokumentuje obrázok z Wikipédie
Najskôr na ilustráciu jednoduchý príklad s malou maticou povedzme 5 x 5, ktorú naplníme náhodnými číslami.
A teraz nasleduje finále, čiže porovnanie rýchlosti. Najskôr matice vynásobíme pomocou CPU a následne pomocou grafickej karty. Rozmer matíc sme definovali tak, aby bol násobkom 32, prečo vysvetlíme v niektorom z pokračovaní. V našom prípade sme vzhľadom k výkonu hardvéru, na ktorom to budeme spúšťať, konkrétne CPU Intel i7 12700 a GPU NVIDIA GeForce RTX 4060 zvolili rozmer matíc 16 384.
V druhej časti príkladu – násobení matíc pomocou GPU si treba uvedomiť, že všetko okrem výpočtu, čiže aj výpisy má na starosti procesor. Preto je potrebné zabezpečiť aby procesor počkal kým sa do pamäti grafickej karty načítajú údaje a potom znovu treba počkať, kým GPU matice vynásobí a až potom vypísať výsledky. Zabezpečíme to príkazom torch.cuda.synchronize(), ktorý zastaví vykonávanie programu pomocou CPU až kým GPU nevykoná určené úlohy.
V našom prípade
Paralelné spracovanie programu pomocou CPU a GPU má svoje špecifiká. Zistíte to, keď blok kódu pre násobenie matíc pomocou GPU spustíte ešte raz. Druhý krát to grafická karta zvládne oveľa rýchlejšie
Prvýkrát ešte na pozadí môžu prebiehať ďalšie procesy. Do úvahy teda berieme čas 10,5 pre výpočet pomocou CPU a 0,95 s pre výpočet pomocou GPU. GPU, v našom prípade NVIDIA RTX 4060 zvládla násobenie veľkých 11 x rýchlejšie. Pripomíname, že sa jedná o najnižší model produktovej rodiny RTX 4000. U iných typov úloh môže byť rozdiel medzi CPU a GPU ešte podstatne výraznejší Čím úloha zložitejšia, tým lepší výkon GPU dosiahneme.
Rekapitulácia doterajších dielov
Strojové učenie v Pythone 1 – prostredie Google Colab
Strojové učenie v Pythone 2 – knižnica Pandas na prácu s údajmi
ML v Pythone 3 – export a import údajov vo formáte CSV a Excel
Strojové učenie v Pythone 4 – práca s údajmi