Eszközök

Mesterséges intelligenciával generált szöveg

cuDLA Python-kötésekkel DLA-inferencia futtatása NVIDIA Jetson AGX Orinon

A cikk főszereplője az NVIDIA cuDLA Python-kötése (cuda.bindings.cudla) és a Jetson AGX Orin platform, bemutatva, hogyan lehet natív DLA-inferenciát futtatni Pythonból.

cuDLA Python-kötésekkel DLA-inferencia futtatása NVIDIA Jetson AGX Orinon

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):

  1. 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.
  2. 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.
  3. 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.
  4. GPU memóriakihelyezés

    • runtime.cudaMalloc a descriptor.size_ alapján; minden tensorhoz egy GPU buffer-t foglalunk.
  5. 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.
  6. 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.
  7. 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.
  8. 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ó.
  9. 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.