NVIDIA Holoscan geliştiricilere uçtan uca sensör işleme hattını oluşturmaları için temel sağlayan, NVIDIA etki alanından bağımsız, çok modlu, gerçek zamanlı yapay zeka sensör işleme platformudur. NVIDIA Holoscan SDK'nın özellikleri şunları içerir:
- Düşük gecikmeli sensör ve ağ bağlantısı için birleşik donanım sistemleri
- Veri işleme ve yapay zeka için optimize edilmiş kitaplıklar
- Esnek dağıtım: uç veya bulut
- Python ve C++ gibi çeşitli programlama dilleri
Holoscan SDK, tıbbi cihazlar, uçta yüksek performanslı bilgi işlem ve endüstriyel denetim dahil olmak üzere çeşitli endüstriler ve kullanım durumları için akışlı yapay zeka ardışık düzenleri oluşturmak için kullanılabilir. Daha fazla bilgi için bkz. NVIDIA Holoscan ile Üretime Hazır Yapay Zeka Sensör İşleme Uygulamaları Geliştirme.
Holoscan SDK, yazılım ve donanımdan yararlanarak yapay zeka uygulamalarının akışını hızlandırır. İle işbirliği yapabilir RDMA teknolojisi GPU hızlandırmayla uçtan uca işlem hattı performansını daha da geliştirmek. Uçtan uca sensör işleme hattı tipik olarak şunları içerir:
- Sensör veri girişi
- Hızlandırılmış bilgi işlem ve yapay zeka çıkarımı
- Gerçek zamanlı görselleştirme, çalıştırma ve veri akışı çıkışı
Bu işlem hattındaki tüm veriler GPU belleğinde depolanır ve ana cihazdan bellek aktarımı olmadan Holoscan yerel operatörleri tarafından doğrudan erişilebilir.
Bu gönderide, Holoscan SDK'yı ve açık kaynak kitaplığı OpenCV'yi entegre ederek ek bellek aktarımı olmadan uçtan uca GPU ile hızlandırılmış iş akışlarının nasıl elde edileceği açıklanmaktadır.
OpenCV nedir?
OpenCV (Açık Kaynak Bilgisayarlı Görme Kitaplığı), Görüntü ve Video İşleme, Nesne ve Yüz Algılama ve OpenCV Derin Öğrenme Modülü dahil olmak üzere 2.500'den fazla algoritma içeren kapsamlı bir açık kaynaklı bilgisayarlı görme kitaplığıdır.
OpenCV GPU hızlandırmayı desteklerCUDA hesaplama yeteneklerini kullanmak için bir dizi sınıf ve işlev sağlayan bir CUDA modülü içerir. NVIDIA CUDA Çalışma Zamanı API'si kullanılarak uygulanır ve yardımcı işlevler, düşük seviyeli görme temelleri ve yüksek seviyeli algoritmalar sağlar.
OpenCV'de sağlanan kapsamlı GPU hızlandırmalı algoritmalar ve operatörler sayesinde geliştiriciler, Holoscan SDK'yı temel alan daha karmaşık işlem hatlarını uygulayabilirler (Şekil 2).
OpenCV operatörlerini Holoscan SDK hattına entegre edin
OpenCV operatörlerini Holoscan SDK hattına entegre etmeye başlamak için aşağıdakilere ihtiyacınız vardır:
- OpenCV >= 4.8.0
- Holoscan SDK'sı >= v0.6
OpenCV'yi CUDA modülüyle kurmak için şu adreste bulunan kılavuzu izleyin: opencv/opencv_contrib. Holoscan SDK ve OpenCV CUDA ile bir görüntü oluşturmak için bkz. nvidia-holoscan/holohub Docker dosyası.
Holoscan SDK içerisinde veri türü olarak görev yapan Tensor, tek bir veri türünün çok boyutlu öğeleri dizisi olarak tanımlanır. Tensor sınıfı, etrafını saran bir sarmalayıcıdır. DLManagedTensorCtx DLManagedTensor nesnesini tutan yapı. Tensor sınıfı hem DLPack'i hem de NumPy dizi arayüzünü destekler (__array_interface__
Ve __cuda_array_interface__
) böylece diğer Python kütüphaneleriyle birlikte kullanılabilir.CuPy,PyTorch,JAX,TensorFlowVeNumba.
Ancak OpenCV'nin veri türü GPUMather ikisini de uygulamayan __cuda_array_interface__
ne de standart DLPack. Uçtan uca GPU ile hızlandırılmış işlem hattına veya uygulamaya ulaşmak, GpuMat'ı CuPy dizisine dönüştürmek için iki işlevin uygulanmasını gerektirir; buna doğrudan Holoscan Tensor ile erişilebilir veya tam tersi de mümkündür.
GpuMat'tan CuPy dizisine kusursuz sıfır kopyalama
OpenCV Python bağlamalarının GpuMat nesnesi şunları sağlar: cudaPtr
Bir GpuMat nesnesinin GPU bellek adresine erişmek için kullanılabilecek yöntem. Bu bellek işaretçisi, bir CuPy dizisini doğrudan başlatmak için kullanılabilir ve ana bilgisayar ile aygıt arasındaki gereksiz veri aktarımlarını önleyerek verimli veri işlemeyi mümkün kılar.
Aşağıdaki fonksiyon GpuMat'tan bir CuPy dizisi oluşturmak için kullanılır. Kaynak kodu şurada verilmiştir: HoloHub Endoskopi Derinlik Tahmini uygulaması.
import cv2
import cupy as cp
def gpumat_to_cupy(gpu_mat: cv2.cuda.GpuMat) -> cp.ndarray:
w, h = gpu_mat.size()
size_in_bytes = gpu_mat.step * w
shapes = (h, w, gpu_mat.channels())
assert gpu_mat.channels() <=3, "Unsupported GpuMat channels"
dtype = None
if gpu_mat.type() in [cv2.CV_8U,cv2.CV_8UC1,cv2.CV_8UC2,cv2.CV_8UC3]:
dtype = cp.uint8
elif gpu_mat.type() == cv2.CV_8S:
dtype = cp.int8
elif gpu_mat.type() == cv2.CV_16U:
dtype = cp.uint16
elif gpu_mat.type() == cv2.CV_16S:
dtype = cp.int16
elif gpu_mat.type() == cv2.CV_32S:
dtype = cp.int32
elif gpu_mat.type() == cv2.CV_32F:
dtype = cp.float32
elif gpu_mat.type() == cv2.CV_64F:
dtype = cp.float64
assert dtype is not None, "Unsupported GpuMat type"
mem = cp.cuda.UnownedMemory(gpu_mat.cudaPtr(), size_in_bytes, owner=gpu_mat)
memptr = cp.cuda.MemoryPointer(mem, offset=0)
cp_out = cp.ndarray(
shapes,
dtype=dtype,
memptr=memptr,
strides=(gpu_mat.step, gpu_mat.elemSize(), gpu_mat.elemSize1()),
)
return cp_out
kullandığımızı unutmayın. Sahipsiz Bellek Bu işlevde CuPy dizisini oluşturmak için API. Bazı durumlarda OpenCV operatörleri, CuPy tarafından işlenmesi gereken yeni bir cihaz belleği oluşturacaktır ve kullanım ömrü tek bir operatörle değil tüm işlem hattıyla sınırlı olacaktır. Bu durumda GpuMat'tan başlatılan CuPy dizisi sahibini tanır ve nesneye olan referansı saklar. Daha fazla ayrıntı için bkz. CuPy birlikte çalışabilirlik belgeleri.
Holoscan Tensor'dan GpuMat'a kusursuz sıfır kopyalama
OpenCV 4.8'in piyasaya sürülmesiyle birlikte OpenCV için Python bağlamaları artık GpuMat nesnelerinin doğrudan GPU bellek işaretçilerinden başlatılmasını destekliyor. Bu özellik, ana bilgisayar ile cihaz belleği arasındaki veri aktarımı ihtiyacını ortadan kaldırarak, GPU'da yerleşik verilerle doğrudan etkileşimi mümkün kılarak, daha verimli veri işleme ve işlemeyi kolaylaştırır.
Holoscan SDK'yı temel alan ardışık düzen uygulamalarında GPU bellek işaretçisi, __cuda_array_interface__
CuPy dizileri tarafından sağlanır. CuPy dizilerini kullanarak GpuMat nesneleri oluşturmak için aşağıda özetlenen işlevlere bakın. Ayrıntılı bir uygulama için, burada sağlanan kaynak koduna bakın. HoloHub Endoskopi Derinlik Tahmini uygulaması.
import cv2
import cupy as cp
def gpumat_from_cp_array(arr: cp.ndarray) -> cv2.cuda.GpuMat:
assert len(arr.shape) in (2, 3), "CuPy array must have 2 or 3 dimensions to be a valid GpuMat"
type_map = {
cp.dtype('uint8'): cv2.CV_8U,
cp.dtype('int8'): cv2.CV_8S,
cp.dtype('uint16'): cv2.CV_16U,
cp.dtype('int16'): cv2.CV_16S,
cp.dtype('int32'): cv2.CV_32S,
cp.dtype('float32'): cv2.CV_32F,
cp.dtype('float64'): cv2.CV_64F
}
depth = type_map.get(arr.dtype)
assert depth is not None, "Unsupported CuPy array dtype"
channels = 1 if len(arr.shape) == 2 else arr.shape[2]
mat_type = depth + ((channels - 1) << 3)
mat = cv2.cuda.createGpuMatFromCudaMemory(
arr.__cuda_array_interface__['shape'][1::-1],
mat_type,
arr.__cuda_array_interface__['data'][0]
)
return mat
OpenCV operatörlerini entegre edin
Önceki iki işlevle herhangi birini kullanabilirsiniz. OpenCV-CUDA işlemi Holoscan SDK tabanlı bir işlem hattında bellek aktarımı olmadan. Aşağıdaki adımları kullanın:
- OpenCV operatörünün çağrıldığı özelleştirilmiş bir operatör oluşturun. Ayrıntılar için bkz. Holoscan SDK örnek belgeleri.
- Operatördeki hesaplama işlevinde:
- Önceki operatörden mesajı alın ve Holoscan Tensöründen bir CuPy dizisi oluşturun.
- Arama
gpumat_from_cp_array
GpuMat'ı oluşturmak için. - Özel OpenCV operatörünüzle işlem yapın.
- Arama
gpumat_to_cupy
GpuMat'tan bir CuPy dizisi oluşturmak için.
Aşağıdaki gösteri koduna bakın. Kaynak kodunun tamamı için bkz. HoloHub Endoskopi Derinlik Tahmini uygulaması.
def compute(self, op_input, op_output, context):
stream = cv2.cuda_Stream()
message = op_input.receive("in")
cp_frame = cp.asarray(message.get("")) # CuPy array
cv_frame = gpumat_from_cp_array(cp_frame) # GPU OpenCV mat
## Call OpenCV Operator
cv_frame = cv2.cuda.XXX(hsv_merge, cv2.COLOR_HSV2RGB)
cp_frame = gpumat_to_cupy(cv_frame)
cp_frame = cp.ascontiguousarray(cp_frame)
out_message = Entity(context)
out_message.add(hs.as_tensor(cp_frame), "")
op_output.emit(out_message, "out")
Özet
OpenCV CUDA operatörlerini Holoscan SDK üzerine kurulu uygulamalara dahil etmek, OpenCV GpuMat ve CuPy dizileri arasındaki dönüşümü kolaylaştıran iki fonksiyonun uygulanmasını gerektirir. Bu işlevler, özelleştirilmiş operatörler dahilinde Holoscan Tensörlerine doğrudan erişim sağlar. Bu işlevleri çağırarak, gelişmiş performans için bellek aktarımı olmadan uçtan uca GPU ile hızlandırılmış uygulamaları sorunsuz bir şekilde oluşturabilirsiniz.
Başlamak,Holoscan SDK 2.0'ı indirinve kontrol edinsürüm notları. NVIDIA Geliştirici forumlarında sorular sorun ve bilgi paylaşın.
Yardımcı NVIDIA'da diğer harici kitaplıkların Holoscan SDK hattına nasıl entegre edileceği hakkında daha fazla bilgi edinin HoloHub öğreticisi. Ayrıca şu adresteki örnek kod ve uygulamalardan da başlayabilirsiniz: nvidia-holoscan/holohubNVIDIA Holoscan AI sensör işleme topluluğunun merkezi deposu.