SAMSUNG_022024A Advertisement SAMSUNG_022024A Advertisement SAMSUNG_022024A Advertisement

ML v Pythone 7 – Využitie grafickej karty NVIDIA na výpočtovo náročné úlohy

0

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

import torch
print(torch.version.cuda)

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.

import torch
if torch.cuda.is_available():
   device = torch.device("cuda")
else:
   device = torch.device("cpu")
print("Využívame", device)

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.

import torch
 
#násobenie matíc
rozmer = 5
matica_1 = torch.randn(rozmer, rozmer)
print(matica_1,"\n")
matica_2 = torch.randn(rozmer, rozmer)
print(matica_2,"\n")
vysledok = torch.matmul(matica_1, matica_2)
print(vysledok)

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.

import torch
import time
 
if torch.cuda.is_available():
   device = torch.device("cuda")
else:
   device = torch.device("cpu")
 
rozmer = 16384 #násobok 32
matica_1 = torch.randn(rozmer, rozmer)
matica_2 = torch.randn(rozmer, rozmer)
   
print("Násobenie matíc pomocou CPU Intel i7 12700")
start = time.time() #čas spustenia
vysledok = torch.matmul(matica_1, matica_2) #násobenie matíc
print(time.time() - start, " sekúnd") #doba trvania
print("Hardvér:", vysledok.device)
 
print("Násobenie matíc pomocou GPU NVIDIA GeForce RTX 4060")
mat1_cuda = matica_1.to(device)
mat2_cuda = matica_2.to(device)
torch.cuda.synchronize()
 
start = time.time() #čas spustenia
vysledok_cuda = torch.matmul(mat1_cuda, mat2_cuda)
torch.cuda.synchronize()
print(time.time() - start, " sekúnd")  #doba trvania
print("Hardvér:", vysledok_cuda.device)

V našom prípade

Násobenie matíc pomocou CPU Intel i7 12700
10.545350551605225  sekúnd
Hardvér: cpu
Násobenie matíc pomocou GPU NVIDIA GeForce RTX 4060
2.620710611343384  sekúnd
Hardvér: cuda:0

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

Násobenie matíc pomocou GPU NVIDIA GeForce RTX 4060
0.9486720561981201  sekúnd
Hardvér: cuda:0

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

ML v Pythone 5 – vizualizácia údajov pomocou grafov

ML v Pythone 6 – animované grafy a ich export ako video

Luboslav Lacko

Všetky autorove články
NVIDIA NVIDIA Cuda Python strojove ucenie PyTorch Torch

Pridať komentár

Mohlo by vás zaujímať

Mohlo by vás zaujímať