NVIDIA GPU’larının sürekli artan işlem gücü, görüntü AI iş yüklerini optimize etmek için yeni fırsatlar sunuyor: donanımı veri ile beslemek. GPU performansı yükseldikçe, depolama alanından veri girişi, cihaz-dışına veri transferleri (PCIe) ve CPU tarafından yapılan işleme gibi geleneksel veri boru hattı aşamaları genellikle bu hızlanmaya ayak uyduramıyor. Bu farklılık, hızlandırıcıyı veri beklemeye bırakan bir darboğaza yol açabiliyor; bu duruma sıkça GPU kıtlığı deniyor. Kompresyonun bitlerinden model için hazır tensörlere daha verimli bir yol oluşturmak, modern yüksek performanslı donanımlarla uyumlu bir veri boru hattı tasarlamayı gerektiriyor.
Bu yazıda, SMPTE VC-6 (ST 2117-1) standardının NVIDIA CUDA hızlandırmalı uygulamasını tanıtıyoruz. Bu codec, kütlesel paralel hesaplama için geliştirilmiş bir yapı. VC-6’nın yerleşik özellikleri, hiyerarşik, çok çözünürlüklü ve seçici kodlama gibi, GPU’ların paralel mimarisi ile doğal bir uyum sağlıyor. Codec’in içsel paralelliğini doğrudan GPU mimarisine eşleştirerek, sıkıştırılmış bitlerden model için hazır tensörlere daha verimli bir geçiş oluşturabiliriz. Performans kazançlarını, CPU ve OpenCL’den CUDA uygulamasına geçişte yaşanan gelişmeleri ele alacağız; bu yaklaşım, talepkar AI uygulamaları için kolayca tüketilebilen hızlandırılmış bir çözüm sunmaktadır.
VC-6 Nedir?
SMPTE VC-6, modern hesaplama mimarileri ile, özellikle GPU’larla, doğrudan ve verimli etkileşim için baştan aşağıya tasarlanmış uluslararası bir görüntü ve video kodlama standardıdır. Normalde, bir resmi tek bir düz blok piksel olarak kodlamak yerine, VC-6 verimli bir çok çözünürlük hiyerarşisi üretir. Şekil 1‘de, farklı çözünürlükleri (8K, 4K, Full HD) gösteren bir örnek verilmiştir.

Kodlama süreci şu şekilde işler:
- Kaynak görüntü, her biri farklı kalite seviyelerini temsil eden çoklu katmanlar (eşalonlar) oluşturmak için tekrar tekrar alt örneklenir.
- En küçük eşalon; düşük çözünürlükte (root LoQ) kodlanır.
- Kodlayıcı, sonraki her seviyeye geçerken alt çözünürlük sürümünü yeniden örnekler ve bunu orijinal görüntüden çıkararak kalıntıları (residuals) yakalar.
- Son bit akışı, root LoQ’u ve ardından bu ardışık kalıntı katmanlarını içerir.

VC-6 kodlayıcısı, her LoQ üzerinden başarılı bir şekilde süreci tersine çevirir. Bu, root LoQ ile başlayarak, bir üst LoQ’ya yeniden örnekleme yaparak ve karşılık gelen kalıntıları ekleyerek hedef çözünürlüğe ulaşıncaya kadar devam eder. Her bileşen, ister bir renk düzlemi, ister bir eşalon, ister spesifik bir görüntü tile’ı olsun, bağımsız ve paralel bir şekilde erişilebilir ve kodlanabilir. Bu yapı, geliştiricilere aşağıdaki avantajları sunar:
- Önemli olan byte’ları yalnızca aktarın: Bu sayede, I/O, bant genişliği, bellek kullanımı ve bellek erişimlerini azaltırken, verimliliği artırabilirsiniz.
- Gerekli olanı yalnızca kodlayın: Herhangi bir LoQ’de, tam kodlama ve yeniden boyutlandırma olmadan, modele gereken giriş boyutuna daha yakın tensörler üretebilirsiniz.
- Hedef bölgeleri (RoI) yalnızca erişin: Her LoQ içinde tüm çerçeveyi işlemek yerine, yalnızca gerekli olan alanları işlemek, hesaplamayı, önemli bir şekilde azaltır.
Aşağıdaki tablo, VC-6’nın mimari avantajlarını özetlemektedir:
Özellik | SMPTE VC-6 (ST 2117) |
Temel mimari | Hiyerarşik, S-Ağaç Tahmini, Paralel. |
Seçici veri hatırlama | Yerel destek. Bit akış yapısı, kısmi istek için yalnızca gereken byte’ları çekmeye olanak tanır. |
Seçici çözünürlük (LoQ) kodlama | Yerel destek. Hiyerarşik LoQ yapısı, tam kodlama + yeniden boyutlandırma olmadan hedef boyuta yakın yüzeyler üretir. |
RoI kodlama | Yerel destek. Gezilebilir S-ağaç yapısı sayesinde yalnızca model aşaması için önem taşıyan kutucukları çekin. |
Paralel kodlama yeteneği | Yüksek derecede paralel. Düzlem/LoQ/karşılıklı kalıntılar bağımsızlığı, ince düzeyde GPU paralelliğini etkinleştirir. |
Maks. bit derinliği | Her bileşen için 31 bit‘ye kadar. |
Çok düzlem desteği | Yerli, 255 düzleme kadar destek (örn. RGB, alfa, derinlik). |
Tabloda belirtildiği gibi, VC-6’nın yerel destekleri, seçici çözünürlük, RoI kodlama, ve özellikle seçici veri hatırlama özellikleri, verimlilik ve hedefe yönelik veri erişiminin önemli olduğu AI boru hatları için uygundur.
Kısmi Veri Hatırlama ile Giriş/Çıkış (I/O) Azaltma
Kodlama hızının ötesinde, VC-6’nın verileri seçici olarak hatırlama yeteneği, I/O’yu önemli ölçüde azaltır. Geleneksel codec’ler genellikle daha düşük çözünürlük çıktıları için bile tüm dosyanın okunmasını gerektirir. VC-6 ile yalnızca hedef LoQ, RoI veya düzlem (örn. renk alanı) için gereken byte’ları çekersiniz. CPU kodlamasında, bu fayda daha az byte’ın ağdan veya depolamadan RAM’e transfer edilmesiyle sağlanır. GPU kodlamasında, bu aynı zamanda PCIe bellek bant genişliğini ve VRAM kullanımını da azaltır.
Şekil 3‘te, DIV2K veri setinin ilk 100 görüntüsünde (bir boyutu 2,040 piksel olan ve diğeri değişken olan) gözlemlenenler şöyledir:
- LoQ1 (orta çözünürlük, 1,020 piksel) transfer eder: ~%63 toplam dosya byte’ı.
- LoQ2 (düşük çözünürlük, 510 piksel) transfer eder: ~%27.

Bu, tam çözünürlükte yaklaşık %37 ve %72 I/O tasarrufuna, proporsyonel olarak ağ, depolama, PCIe ve bellek trafiğini azaltarak ulaşmaktadır. Kalan katmanları veya yalnızca küçük bir RoI için gerekli olan kutucukları, tüm dosyayı yeniden işlemeye gerek olmadan alabilirsiniz. Veri yükleyicileri için bu, model kodunu değiştirmeden verimliliği arttıracak ya da yükseltilmiş grup boyutları sağlar.
GPU’ya VC-6 Uygulaması: Paralellik için Doğal Bir Uyum
VC-6’nın mimarisi, GPU’nun tek komut, çoklu iş parçacığı (SIMT) yürütme modeline çok iyi uyum sağlar. Tasarımı, büyük paralelliği desteklemek için inter-bağımlılıkları minimize edecek şekilde geliştirilmiştir.
- Bileşen bağımsızlığı: Görüntü verisi, bağımsız olarak işlenebilen tile’lar, düzlemler ve eşalonlara ayrılmıştır. VC-6, bağımsız tile kodlama için gereken bilgileri, sıkıştırma verimliliğine minimal etkiyle, yüz binlerce tile’ın paralel işlenmesine imkan tanıyacak şekilde kodlar.
- Basit, yerel işlemler: Block tabanlı DCT veya dalgacık kullanan codec’lerin aksine, VC-6’nın temel piksel dönüşümleri, küçük, bağımsız 2×2 piksel komşuluklar üzerinde çalışır. Bu durum, GPU çekirdek tasarımını basitleştirir.
- Bellek verimliliği: Entropi kodlama, doğası gereği oldukça paraleldir ve tabloların bellek ayak izi çok düşüktür. Bu tablolardaki veriler, paylaşımlı belleğe veya hatta registrerlara sığacak kadar küçüktür, bu da SIMT yürütmesi için süreci oldukça uygun hale getirir.
Hiyerarşi terimi, seri işlemeyi ima edebilirken, VC-6, iki hiyerarşi ile inter-bağımlılığı minimize ederek, eş zamanlı işlemler için benzersiz bir yapı sunar.
Bu mimari paralellik, başlangıçta CPU ve OpenCL versiyonlarındaki düşük gecikmeli, rastgele erişimli video düzenleme iş akışları için kullanılmıştır; ancak AI için yüksek throughput taleplerine de mükemmel bir yanıt vermektedir.
AI eğitim boru hatları, verimliliği maksimize etmek için tasarlanmıştır. PyTorch DataLoader gibi bir çerçeve, gecikmeyi gizlemek için paralel süreçler başlatır. İleri düzey düzenleme sistemlerinde olduğu gibi, bu AI iş akışları, görüntünün farklı çözünürlüklerine ve bölgelerine hızlı, talebe dayalı erişim gerektirir. VC-6’nın bu özelliklerini, AI iş yüklerini hızlandırmak için uygulamak, özel bir CUDA uygulaması oluşturma konusunda temel bir etkendir. Yerlisi CUDA olan bir kütüphane, AI ekosisteminin mevcut güçleriyle VC-6’nın mimari güçlerini en üst düzeye çıkaran belirli optimizasyonları mümkün kılmaktadır.
CUDA Hızlandırmalı VC-6 Python Kütüphanesi
V-Nova ve NVIDIA, CUDA platformu için VC-6’ı optimize etmek üzere iş birliği yaptı. Bu, AI ekosisteminde de facto standart olarak biliniyor. VC-6’nın OpenCL’den CUDA’ya taşınması, PyTorch ve daha geniş AI boru hattı ile sorunsuz entegrasyon sağlar; ek CPU kopyaları veya senkronizasyon noktalarına ihtiyaç olmaz.
VC-6’nın CUDA’ya taşınması birkaç temel avantaj sağlar:
- Aşırı yükü minimize eder: AI yükleri ile OpenCL uygulaması arasında pahalı bağlam geçişi yükünü ortadan kaldırır.
- Karşılıklı çalışabilirliği artırır: CUDA tensor ekosistemi ile doğrudan entegrasyon sağlar. CUDA akışı, CPU senkronizasyonu olmadan bellek değişimini mümkün kılar.
- Gelişmiş profilleme olanakları sunar: NVIDIA Nsight Systems ve NVIDIA Nsight Compute gibi güçlü araçları kullanma imkanı sunarak performans darboğazlarını belirleme ve ele alma imkanı sağlar.
- GPU donanım içgörüleri: CUDA ile mevcut tüm donanım içgörülerinden faydalanabilmeyi mümkün kılar.
Mevcut VC-6 CUDA yolu alpha aşamasında olup, yerel toplama ve daha fazla optimizasyon yol haritasında bulunmaktadır; bu optimizasyonlar, CUDA sayesinde mümkün olmuştur ve yeni AI gereksinimleri ile motive edilmiştir. Bu aşamada bile, OpenCL ve CPU uygulaması üzerinde önemli performans kazançları mevcut olduğu görülmekte; bu durum, geliştirmenin ve iyileştirmelerin devam edeceği sağlam bir temel oluşturmaktadır.
Kurulum ve Kullanım
VC-6 Python paketi, pip aracılığıyla basit bir kurulum imkanı sağlayan önceden derlenmiş bir Python tekerleği olarak dağıtılmaktadır. Bunun ardından, VC-6 codec nesneleri oluşturabilir ve kodlama, kod çözücü ve yeniden kodlama işlemlerine başlayabilirsiniz. Aşağıda, VC-6 bit akışını nasıl kodlayıp çözeceğinize dair bir örnek sunulmaktadır (daha kapsamlı örnekler için GitHub repo’sine göz atabilirsiniz):
from vnova.vc6_cuda12 import codec as vc6codec # yalnızca CUDA için
# from vnova.vc6_opencl import codec as vc6codec # OpenCL için
# from vnova.vc6_metal import codec as vc6codec # Metal için
# kodlayıcı ve çözücü nesnelerini ayarlayın
encoder = vc6codec.EncoderSync(1920, 1080, vc6codec.CodecBackendType.CPU, vc6codec.PictureFormat.RGB_8, vc6codec.ImageMemoryType.CPU)
encoder.set_generic_preset(vc6codec.EncoderGenericPreset.LOSSLESS)
decoder = vc6codec.DecoderSync(1920, 1080, vc6codec.CodecBackendType.CPU, vc6codec.PictureFormat.RGB_8, vc6codec.ImageMemoryType.CPU)
encoded_image = encoder.read("example_1920x1080_rgb8.rgb")
decoder.write(encoded_image.memoryview, "recon_example_1920x1080_rgb8.rgb")
GPU Bellek Çıkışı
CUDA paketinde (vc6_cuda12) kod çözücü çıkışı bir CUDA dizi arayüzü sağlayabilir. Bu özelliği etkinleştirmek için, kod çözücüyü GPU_DEVICE
olarak bellek türünü belirterek oluşturmanız gerekir. Böylece, çıktı görüntüleri __cuda_array_interface__
bulundurarak; CuPy, PyTorch ve nvImageCodec gibi diğer kütüphanelerle kullanılabilir hale gelir.
from vnova.vc6_cuda12 import codec as vc6codec # yalnızca CUDA için
import cupy # CUDA cihaz çıkışıyla GPU'da kod çözücü nesnelerini ayarlayın
decoder = vc6codec.DecoderSync(1920, 1080, vc6codec.CodecBackendType.CPU, vc6codec.PictureFormat.RGB_8, vc6codec.ImageMemoryType.CUDA_DEVICE)
# dosyadan kod çözme
decoded_image = decoder.read("example_1920x1080_rgb8.vc6")
# kodlanmış görüntüden bir cupy dizisi oluşturun, cpu'ya indirip dosyaya yazın
cuarray = cupy.asarray(decoded_image)
with open("reconstruction_example_1920x1080_rgb8.rgb") as
decoded_file.write(cuarray.get(),
"reconstruction_example_1920x1080_rgb8.rgb")
Senkranizasyon ve asenkron çözücüler için __cuda_array_interface__
erişimi engelleyici olup, görüntüdeki sonuçların hazırlanmasını bekleyecektir.
Kısmi kod çözme ve I/O işlemleri
Kısmi bir kod çözme gerçekleştirmek için, kod çözücü işlevleri, hedef bölgeyi tanımlayan isteğe bağlı bir parametre alır. Aşağıdaki örnekte, kod çözücü yalnızca çeyrek çözünürlükteki görüntü için gereken verileri okuyup işler:
# Çeyrek çözünürlük (eşalon 1) görüntüsünü okuyup kod çözme, FrameRegion de hedef dikdörtgeni tanımlamak için kullanılabilir
decoded_image = decoder.read("example_1920x1080_rgb8.vc6", vc6codec.FrameRegion(echelon=1))
Kısmi veri hatırlama, dosya yolları yerine bellekte işleyecek diğer kod çözme işlevlerinde de mümkündür. Bu amaçla, hedef LoQ için gereken boyutu ayrıştırıp bildirecek VC6 kütüphanesinde ayrı bir işlev mevcuttur. Tam kullanım örneği için lütfen GitHub örneklerine göz atın.
CPU, OpenCL ve CUDA ile Performans Karşılaştırmaları
VC-6’yı, DIV2K veri setindeki (800 görüntü) her görüntü için kod çözme süresini ölçerek, NVIDIA RTX PRO 6000 Blackwell Sunucu Sürümünde değerlendirdik. Toplu testler için, yerel toplama simülasyonu yaparak, birden fazla eş zamanlı tek görüntü kod çözücüsünü çalıştırarak verimliliği maksimize ettik. Sonuçların görsellerine Şekil 4‘te ulaşabilirsiniz.

CUDA’ya geçiş, belirgin bir performans artışı sunuyor.
- Tek görüntü kod çözmede, CUDA, CPU’ya göre 13 kat daha hızlıdır (1.24 ms vs. 15.95 ms).
- Mevcut GPU uygulaması ile karşılaştırıldığında, CUDA sürümü, OpenCL ile 1.2x ile 1.6x daha hızlıdır. Gelecekte, CUDA, özel donanım içgörülerine daha fazla erişim imkanı sağlayacaktır.
- Grup işlemede verimlilik artar ve tüm platformlarda iyi sonuç almayı bekliyoruz; aynı zamanda yerel bir toplu kod çözücü bekliyoruz.
Profiling ile Nsight ve Gelecek Hedefler
Nsight Sistemleri, kod çözme işlerinin CPU (bit akışı ayrıştırması, kök düğümler) ile GPU (tile kalıntı kod çözümü, yeniden yapılandırma) arasındaki dağılımını gösteriyor. Gecikme optimizasyonlu tek görüntü yolu, GPU’yu tam kapasite kullanmıyor; verimlilik modu ise CUDA’nın güçlü yönlerinin altını çiziyor. Üç ana sıcak nokta, planımızı yönlendirdi:
- Kernal çalıştırma aşırı yükü: Düşük LoQ’larda, küçük çekirdekler başlatma aşırı yükü ile iç içe geçiyor. CUDA Grafikleri prototipleri, çekirdekler arası boşlukları önemli ölçüde azaltır. Ayrıca, aracı tüketilmeyen aralardaki erken LoQ’larda çekirdek birleştirmeyi de araştırıyoruz.
- Çekirdek verimliliği: Nsight Compute, bazı aşamalarda dalga sapması, kayıt taşmaları ve koalesans olmayan I/O yakaladı. Bu sorunları temizlemek, doluluğu ve verimliliği artıracaktır.
- Çekirdek düzeyinde paralellik: Şu anda, her çözüm kendi çekirdek zincirini başlatıyor; bu, GPU üzerinde uygun bir ölçeklendirme sağlamıyor. Her görüntü için bir dizi çekirdek başlatılıyor; bu, GPU üzerindeki eş zamanlı çekirdek sayısıyla sınırlıdır.
Yeniden Örnekleme Zincirleri

Bir yeniden örnekleme çekirdek zinciri (Şekil 5), görüntüyü her LoQ’da yeniden yapılandırıyor. Düşük LoQ’larda, faydalı hesaplamanın (mavi) ve aşırı yükün (beyaz) oranı oldukça yüksektir. CUDA grafikleri gibi teknikler veya çekirdek birleştirme, her bir çekirdek arasındaki aşırı yükü azaltarak hesaplamayı hızlandırabilir.
Nsight izleme, düşük GPU kullanımını da göstermekte; bu, küçük ızgara boyutlarına bağlı. Özellikle ilk yeniden örnekleme çekirdeği sadece tek bir blok başlatıyor, bu ise yalnızca bir akış çoklayıcı (SM) üzerinden gücün kullanılmasına yol açıyor. RTX PRO 6000 üzerindeki 188 SM ile, tek bir görüntünün kod çözülmesi esasen GPU’nun yalnızca 1/188’ini kullanıyor.
Teorik olarak, bu, GPU’nun geri kalan 187/188’ini aynı anda başka görüntüleri kodlamak için kullanmamızı olanak tanıtır. Pratikte bu duruma çekirdek düzeyinde paralellik denir ve bu, NVIDIA GPU’larını en iyi şekilde kullanmak için en etkili yöntem değildir.
Çekirdek Düzeyinde Paralellik

Şekil 6’daki Nsight Sistemleri izleme kaydı, CPU üzerinde üç eş zamanlı kod çözücü başlatıldığını ve bunların karşılık gelen GPU aktivitesini göstermektedir. Her kod çözücü (mavi), kendi akışında çalışmaktadır. Bu durum, GPU zamanlayıcısının bu çekirdekleri aynı anda çalıştırmasına olanak tanırken; daha verimli olan, GPU üzerinde tek bir daha büyük ızgarayı başlatmaktır. Çekirdek düzeyindeki paralellik, zamanlama çatışmalarına, kaynak rekabetine yol açabilir ve GPU’nun işleme yeteneğine bağlı olarak, eş zamanlı çalışabilecek çekirdek sayısında katı bir sınır vardır.
Sonuçlar
AI boru hatlarının sadece daha hızlı modellere ihtiyacı yok; aynı zamanda AI’nin işlem hızına uygun veri de gereklidir. VC-6’nın hiyerarşik ve seçici mimarisini, CUDA’nın güçlü paralelliği ile birleştirerek, depolama alanından tensöre geçiş sürecini önemli ölçüde hızlandırabiliriz. Bu yaklaşım, belirli LoQ/RoI kodlama ve GPU’da yer alan verilerin sağladığı acil avantajları ön plana çıkararak, mevcut kütüphaneleri tamamlar.
CUDA uygulaması, veri boru hatlarınızı daha hızlı ve daha verimli hale getirmek için kullanabileceğiniz pratik bir yapıtaşıdır. Şu anki alpha versiyonu zaten avantajlar sunuyor; NVIDIA mühendisleri ile devam eden iş birliği, yerel toplama ve çekirdek optimizasyonları ile büyük bir verimlilik açılımı sağlayacaktır. Bu ilk CUDA uygulaması, popüler AI SDK’ları ve veri yükleme boru hatları ile daha sağlam bir entegrasyon sağlayacaktır. Yüksek throughput’lu, çok modal AI sistemleri oluşturuyorsanız, şimdi VC-6’nın CUDA ile iş akışlarınızı nasıl hızlandırabileceğini keşfetme zamanı!
Başlayın
CUDA (alpha), OpenCL ve CPU için VC-6 SDK’ları, C++ ve Python API’leri ile sağlayan mevcuttur.
- SDK ve belgeler: V-Nova aracılığıyla SDK Portalına ve belgelere erişin.
- Deneme erişimi: CUDA alpha tekerleği ve karşılaştırma scriptleri için V-Nova ile ai@v-nova.com adresinden iletişime geçin.
- Örnekler:GitHub üzerinden erişebilirsiniz.