NVIDIA cuDLA-hoz készült Python-kötések (cuda.bindings.cudla) lehetővé teszik, hogy DLA-hardveren fusson a tanult hálózatok inferenciája Jetson AGX Orin eszközön anélkül, hogy a futtató környezet kezeléséhez C++-t kellene írni. A megközelítés javíthatja az energiahatékonyságot és felszabadíthat GPU kapacitást más feladatok számára, mivel a DLA fix-funkciós gyorsítóként végzi a támogatott rétegeket (konvolúciók, pooling stb.).
Mi az új és miért fontos
A cuda.bindings.cudla modul a CUDA Python projekt részeként a cuda-bindings 13.3.0 kiadásban jelent meg. Ez egy vékony, Cython-alapú Python réteg a cuDLA C++ API fölött, amely hibrid üzemmódú (CUDA+DLA) munkafolyamatokat támogat: a CUDA streamekkel összehangolva lehet a GPU és a DLA munkáit egymás után futtatni ugyanazon a streamen. A JetPack telepítése tartalmazza az eszközhöz szükséges libcudla.so futtatókörnyezetet, így az eszközön futtatáshoz nincs szükség külön cuDLA SDK telepítésére.
Előkészületek és telepítés
-
Telepítendő Python-kötés: pip install "cuda-bindings>=13.3.0".
-
A JetPack alapértelmezett Pythonja előfordulhat, hogy régebbi a szükséges minimum, amely Python 3.10; a cikkben javasolt példa Python 3.12 telepítése a deadsnakes PPA-val:
sudo apt update && sudo apt install -y software-properties-common sudo add-apt-repository -y ppa:deadsnakes/ppa sudo apt update && sudo apt install -y python3.12 python3.12-venv python3.12-dev python3.12 -m venv ~/dla-env ~/dla-env/bin/pip install "cuda-bindings>=13.3.0"
-
Fontos: a DLA loadable (a futtatható bináris) előállításához TensorRT szükséges, de a futtatáshoz a JetPack által biztosított libcudla.so elegendő.
DLA loadable készítése (példa)
A DLA loadable a TensorRT trtexec eszközzel előállítható. A bemutatott példa TensorRT 11.4.1 és CUDA 13.4 Update 1 célzásával készült, Jetson AGX Orin rendszeren JetPack 7.2.2 vagy újabb verzióhoz. FP16 CHW16 loadable előállításához (ha a modell FP16 típusú és fix bemeneti méretekkel rendelkezik):
trtexec
--onnx=your_model_fp16.onnx
--useDLACore=0
--inputIOFormats=chw16
--outputIOFormats=chw16
--memPoolSize=dlaSRAM:1
--saveEngine=model.bin
--buildDLAStandalone
Kulcsfontosságú kapcsolók:
- --useDLACore=0: az Orin első DLA magját célozza.
- --buildDLAStandalone: olyan nyers DLA loadable-t hoz létre, ami nem igényel TensorRT-t futtatási időben.
Megjegyzés: a TensorRT 11 a precizitást a modell tensor típusából származtatja (--fp16 és --int8 opciók eltűntek), és sok hálózatnál szükséges lehet az ONNX graf előfeldolgozása, hogy az inkompatibilis rétegeket (head/tail) a DLA általi futtatás előtt eltávolítsuk vagy áthelyezzük.
Python futtatási munkafolyamat (összefoglaló)
A szükséges importok:
import numpy as np from cuda.bindings import cudla from cuda.bindings import driver, runtime
A driver és runtime a meglévő cuda-python kötéseket használja a stream-, memória- és adatmozgatási műveletekhez. A cudla modul pedig közvetlenül kiteszi a cuDLA runtime API-t Pythonból.
A példa lépései (röviden):
-
Inicializálás és DLA eszköz létrehozása
- driver.cuInit(0) és runtime.cudaSetDevice(0)
- cudla.create_device(0, int(cudla.Mode.CUDA_DLA)) létrehozza a hibrid (CUDA+DLA) eszközt. A jelenlegi kiadás nem támogatja a standalone módot ezen keresztül.
-
A loadable betöltése memóriából
- A .bin fájlt beolvassuk bytes-ként és cudla.module_load_from_memory segítségével töltjük be: nincs szükség fájlrendszer handle-re futtatási időben.
-
A modul attribútumainak lekérdezése
- cudla.module_get_attributes segítségével lekérdezzük az input/output tensorok számát és leírását (cudla.ModuleTensorDescriptor). Ezek a leírók adják meg a pontos bájtméretet (size_), dimenziókat (n,c,h,w), stride-ot, név- és formátum-információkat.
-
GPU memóriakihelyezés
- runtime.cudaMalloc a descriptor.size_ alapján; minden tensorhoz egy GPU buffer-t foglalunk.
-
GPU pufferek regisztrálása cuDLA-val
- cudla.mem_register visszaad egy DLA-oldali fogantyút, amit a taskokban használunk. A regisztráció kötelező lépés a DLA számára.
-
Bemeneti adatok előkészítése és átmásolása a GPU-ra
- Normalizálás és a descriptor által megadott layout szerint elkészített numpy tömb másolása async módon (cudaMemcpyAsync) a GPU pufferre. A streamen belül a kimeneti puffer memset-elése is megtörténik.
-
Task felépítése és beadása
- cudla.Task példány létrehozása, module_handle, input_tensor és output_tensor mezők feltöltése (a regisztrált fogantyúk int() konverzióját használva). cudla.submit_task hozza sorba a DLA munkát a megadott CUDA streamen.
-
Szinkronizálás és kimenet visszamásolása
- runtime.cudaStreamSynchronize(stream) vár a DLA feladat befejezésére, majd a kimeneti GPU puffer DeviceToHost másolása és ismételt stream szinkronizáció.
-
Takarítás
- mem_unregister, module_unload, destroy_device, cudaFree és cuStreamDestroy meghívása a létrehozott erőforrásokra.
Hibakezelés Pythonban
A cuDLA hívások hibák esetén cudla.CudlaError kivételt dobnak, amely tartalmazza a numerikus státuszt és annak emberi olvasható nevét. A szokásos try/finally mintát javasolt használni a tisztításra, és szükség szerint branchelni e.status ellen a cudla.Status enum értékei alapján.
Kimenet és utófeldolgozás
A cudaStreamSynchronize után a visszamásolt numpy tömb (output_cpu) egy nyers bájtfolyam, amelyet a kimenet descriptor mezői (data_type, data_format, stride, shape) alapján kell értelmezni és átalakítani (reshape, dtype konverzió stb.). A példa szerint egy ResNet-50 alapú loadable esetén a program kiírja a létrehozott eszköz- és modulfogantyúkat, a be- és kimeneti tensorok méretét és neveit, majd a DLA kimenetet a hostra írja.
Platformkiterjesztés
Bár a bemutató Jetson Orin-re fókuszál, az NVIDIA RTX Spark Windows laptopokon is támogatja a DLA inferenciát, és a cuda.bindings.cudla API ugyanaz mindkét platformon. Így a leírt cuDLA felület és munkafolyamat RTX Spark esetén is alkalmazható.
Összegzés
Telepítse a cuda-bindings>=13.3.0 csomagot, fordítsa le a DLA loadable-t a TensorRT trtexec eszközével (például TensorRT 11.4.1 és CUDA 13.4 Update 1 beállításokkal), majd a bemutatott lépések szerint futtathatja az inferenciát közvetlenül Pythonból Jetson AGX Orinon. A cuDLA kötés lehetővé teszi a DLA és GPU munkák szekvenciális, stream-alapú összehangolását anélkül, hogy C++-ban kellene runtime-ot írni.
További források
- Telepített modul: cuda-bindings 13.3.0 (cuda.bindings.cudla)
- Példa unit tesztek a NVIDIA/cuda-python GitHub repóban: cuda_bindings/tests/cudla/ (ezek a tesztek DLA hardver nélkül is futtathatók).
- A Deep Learning Accelerator samples tartalmaz végponttól végpontig példákat és modellelőkészítő script-eket.
A leírt munkafolyamat modell-agnosztikus: a modul introspekciója helyezi a kódot abba a helyzetbe, hogy bármilyen .bin vagy .nvdla loadable-t kezeljen ugyanazon a futtatási útvonalon.



