NVIDIA TensorRT, NVIDIA GPU’larda makine öğrenimi modellerinin dağıtımını optimize etmek üzere geliştirilmiş bir AI çıkarım kütüphanesidir. TensorRT, modern mimarilerde yer alan özel donanımları hedef alarak, gelişmiş makine öğrenimi modellerinde sıkça kullanılan işlemleri hızlandırmak için NVIDIA Blackwell Tensor Core’ları kullanır. Ayrıca, katman birleştirme ve otomatik çekirdek taktik seçimi gibi optimizasyon teknikleri ile AI modellerinin belirli donanımlarda daha verimli çalışmasını sağlamak için AI modellerini değiştirme yeteneğine sahiptir.
Popüler PyTorch gibi frameworkler, AI modelleri üzerinde çalışmak için sezgisel ve tutarlı bir arayüz sunar; ancak her zaman en yüksek performansa ulaşamazlar. Torch-TensorRT, bu açığı kapatmaktadır. PyTorch modelleri için güçlü bir derleyici olan Torch-TensorRT, NVIDIA GPU’larda TensorRT seviyesinde performans sunarken, PyTorch sınıf kullanılabilirliğini de korur. PyTorch API’lerinde değişiklik yapmadan, performansı iki katına çıkarma imkanı sunar.
Bu blog yazısında, Torch-TensorRT’nin optimizasyonunu son derece kolaylaştırdığını, minimal kod değişiklikleriyle önemli hızlanmalar sağladığını göstereceğiz. Tek bir kod satırı kullanarak, FLUX.1-dev modelindeki 12 milyar parametreli düzeltilmiş akış dönüştürücüsü, yerel PyTorch FP16’ya kıyasla %50 performans artırmaktadır. Ayrıca, üzerine basit bir FP8 kantizasyon işlemi uygulandığında, performans %240 artarak 2.4 katı hızlanma sağlar.
Ayrıca, Torch-TensorRT kullanarak gelişmiş diffusers iş akışlarını desteklemeyi de göstereceğiz, örneğin, dinamik model yeniden uyarlama olan LoRA işlemleri için.
Model Hızlandırma
HuggingFace Diffusers, geliştiricilerin çok çeşitli gelişmiş modellere kolay erişim sağlamasına olanak tanıyan bir SDK’dır. Bu aynı zamanda, rafine etme ve LoRA gibi, önceden hazırlanmış modelleri özelleştirme gibi birçok gelişmiş kullanım senaryosunu da destekler.
Genellikle, model optimizasyonu kullanım kolaylığı ile performans arasında bir denge gerektirir. Birçok optimizasyon iş akışı, modelleri PyTorch’tan üçüncü taraf bir formata çıkarmayı zorunlu kılar. Bu iş yoğunluğu, AI modelleri etrafında karmaşık iş akışları oluşturmayı zorlaştırır. Örneğin, birden fazla GPU modeli destekleme veya LoRA kullanırken ağırlıkları çalışma zamanında değiştirerek değiştirme gibi.
Torch-TensorRT, diffusers boru hattının kritik bileşenlerini çok az kod ile optimize eder ve ara adımlar gerektirmez. Eğer boru hattında bir değişiklik yaparsanız, yeni bir kontrol ağı ekler veya bir LoRA yüklerken, ek bir çalışma gerekmez. Yeni ağırlıklar gerçek zamanlı olarak yeniden uyarlanırken, mevcut iş akışları genellikle modelinizi dışarıda elle yeniden çıkarmanızı ve yeniden optimize etmenizi gerektirir.
Örneğin, FLUX.1-dev kullanarak Torch-TensorRT hızlandırmasının etkinliğini ve kolay erişilebilir entegrasyon iş akışını göstereceğiz. FLUX.1-dev, HuggingFace’den çekilebilir ve şu şekilde çalıştırılabilir:
Kod: Hugging Face yükleme boru hattı
import torch
import torch_tensorrt
from diffusers import FLUXPipeline
DEVICE = "cuda:0"
pipe = FLUXPipeline.from_pretrained(
"black-forest-labs/FLUX.1-dev",
torch_dtype=torch.float16,
)
pipe.to(DEVICE).to(torch.float16)
NVIDIA HGX B200 GPU’lar, birçok düşük gecikmeli uygulama için yeterli performansı sağlarken modelleri kutudan çıkararak çalıştırabilir. Ancak basit bir ek adım ile gecikme süresi önemli ölçüde azaltılabilir ve kullanıcı deneyimi daha da iyileştirilebilir.
Bir Satırlık Optimizasyon ile Değişken Torch-TensorRT Modülü
Torch-TensorRT, standart PyTorch’un üzerine optimizasyon yaparak uygulamanın dağıtılacağı GPU için belirli bir TensorRT motoru üretir. TensorRT, katman birleştirme ve çekirdek otomatik ayarlama gibi tekniklerle verimliliği artırır ve gecikmeyi en aza indirir.
Statik hesaplama grafiklerinde, TensorRT güçlü hızlandırma sağlar ve çeşitli dağıtım senaryolarını destekler. Ancak, dinamik ağırlıklar, grafikler veya diffusers gibi üçüncü taraf API’lerle etkileşim içeren uygulamalarla entegre etmek, ek geliştirme çalışmaları gerektirebilir. Torch-TensorRT bu dinamik kullanımlar için Değişken Torch-TensorRT Modülü (MTTM) ile süreci basit hale getirir.
MTTM, PyTorch modülleri için şeffaf bir sarıcı olarak tasarlanmış ve TensorRT kullanarak forward
fonksiyonunu anlık olarak optimize eden bir modüldür. Bu, Torch-TensorRT hızlandırmasını Hugging Face gibi karmaşık sistemlere sorunsuz bir şekilde entegre eder. Bu sayede, çalışma zamanında boru hattı değiştiren iş akışları, örneğin bir LoRA adaptörünü eklemek, ek kod değişiklikleri olmadan çalışır.
Ayrıca, grafik veya ağırlık değişiklikleri tespit edildikçe, modül kendiliğinden değişikliklere uyum sağlamak için yeniden uyarlama veya yeniden derleme işlemlerini gerçekleştirir. Mevcut JIT iş akışlarının aksine, MTTM seri hale getirilebilir ve JIT ile AOT arasında bir hibrit yaklaşım için kullanılabilir. Geliştiriciler, önceden derlenmiş bir MTTM gönderebilir ve çalışma zamanı koşulları değiştiğinde, yeniden uyarlama veya yeniden derleme işlemleri anlık olarak gerçekleştirilebilir.
pipe.transformer = torch_tensorrt.MutableTorchTensorRTModule(
pipe.transformer,
strict=False,
allow_complex_guards_as_runtime_asserts=True,
enabled_precisions={torch.float16},
truncate_double=True,
immutable_weights=False,
offload_module_to_cpu=True,
)
images = pipe(
prompt,
output_type="pil",
num_inference_steps=20,
num_images_per_prompt=batch_size,
).images # Derleme, modül ilk kez çalıştırıldığında başlar
İlk yürütmede, MTTM, girdilerin kalıplarını otomatik olarak yakalar ve orijinal modülün tüm davranışlarını çoğaltır. Kullanıcıların sahte girdi sağlamaları veya PyTorch ve TensorRT modülleri arasında gerekli diğer nitelikleri (cihaz veya yapılandırmalar gibi) yönetmeleri gerekmez. Derlemeden sonra, optimize edilmiş modül hızlı bir şekilde disk üzerine kaydedilebilir:
torch_trt.MutableTorchTensorRTModule.save(trt_gm, "mutable_module.pt2") # Modülü diske kaydet
LoRA’ları Şeffaf Bir Şekilde Destekleme
Görsel üretim uygulamaları için en popüler iş akışlarından biri, FLUX gibi modellerin çıktısını özelleştirmek için LoRA kullanmaktır. Kullanıcılar, FLUX.1-dev model ağırlıklarını belirli bir sanatsal tarzda resimler üretmek için hedefli düzenlemeler yapmak istediklerinde, genellikle farklı LoRA modüllerini yüklerler. Ancak, LoRA geçişleri model optimizasyoncuları için zorluklar yaratabilir, çünkü ağırlık güncellemeleri genellikle yeniden derleme gerektirir ve bu zaman alıcı bir süreçtir.
Torch-TensorRT, yeniden ağırlık uyarlama ile bu sınırlamayı aşar ve LoRA geçişlerini aynı çalışma zamanı içerisinde, yeniden derleme gerektirmeden gerçekleştirir. Ağırlık değiştiğinde uyarlama süresi önemli ölçüde kısalarak, GenAI uygulamalarının yaşam döngüsünü iyileştirir.
MTTM kullanarak, uyarlama süreci sorunsuz bir şekilde arka planda gerçekleştirilir. Kullanıcılar, Hugging Face’in load_lora_weights API’sini kullanarak istediği LoRA’yı boru hattına yükleyebilir ve MTTM ağırlık değişikliklerini otomatik olarak tespit eder. Sonraki yürütmelerde, MTTM gerekli uyarlamaları içsel olarak gerçekleştirir ve ek bir kullanıcı eylemi gerektirmez.
# Standard HuggingFace LoRA Yükleme Prosedürü
pipe.load_lora_weights(path, adapter_name="lora1")
pipe.set_adapters(["lora1"], adapter_weights=[1])
pipe.fuse_lora()
pipe.unload_lora_weights()
images = pipe(
prompt,
output_type="pil",
num_inference_steps=20,
num_images_per_prompt=batch_size,
).images # Yeniden uyarlama bu noktada gerçekleşir
Kantizasyon
FLUX.1-dev modelini daha küçük GPU’larda çalışabilmesi için daha da optimize etmek amacıyla, ağırlıkların ve aktivasyonların standart 16-bit kayan nokta temsillerindeki kantizasyon tekniklerini kullanarak hem çıkarım performansını artırıyoruz, hem de model boyutunu ve GPU bellek tüketimini azaltıyoruz.
Model kantizasyonu, NVIDIA TensorRT Model Optimizer ( nvidia-modelopt ) ile gerçekleştirilir; bu kapsamlı kütüphane, kalibrasyon, kantizasyon, budama, damıtma ve spekülatif kodlama gibi gelişmiş model optimizasyon teknikleri sunar. Bu tool, derin öğrenme modellerini etkili bir şekilde sıkıştırarak TensorRT-LLM veya TensorRT gibi çerçevelerde aşağıya doğru dağıtım yapabilmek için maksimum çıkarım hızını maksimize eder.
Model hedef doğrulukta kantize edildikten sonra, aynı Torch-TensorRT derleme prosedürünü kullanarak hedef kantizasyon hassasiyetine sahip olacak şekilde ayarlamalar yapılır:
quantized_transformer = mtq.diffusers.quantize_diffusers_module(pipe, "transformer", mtq.FP8_DEFAULT_CONFIG),
pipe.transformer = torch_tensorrt.MutableTorchTensorRTModule(
quantized_transformer,
strict=False,
allow_complex_guards_as_runtime_asserts=True,
enabled_precisions={torch.float16},
truncate_double=True,
immutable_weights=False,
offload_module_to_cpu=True,
)
images = pipe(
prompt,
output_type="pil",
num_inference_steps=20,
num_images_per_prompt=batch_size,
).images
FLUX Performans Ölçümü
FLUX.1-dev, bir B200 GPU ile 20 gürültü azaltma aşaması ve iki görüntüden oluşan bir grup ile çalıştırıldığında, ortalama yaklaşık 6.56 saniye sürerken, her aşama için gecikme 164 ms’dir.
MTTM, hızlandırma sağlar ve sadece bir satır kod ile iki görüntüden oluşan bir grup oluşturma süresi 4.28 saniyeye düşerken, her aşama gecikmesi 107 ms’ye inmiştir. Bu da, FLUX.1-dev’in FP16 altında PyTorch ile çalıştırılmasına kıyasla 1.5 kat bir hızlanma sağlamaktadır.
FP8’e kadar bir kantizasyon ile optimize edilmiş TensorRT motoru, orijinal Hugging Face uygulamasına kıyasla %240 hızlanma sağlar. Özellikle, ortalama iki görüntüden oluşan bir grup üretme süresi daha da düşerek 2.72 saniyeye, her aşama gecikmesi 68 ms’ye inmiştir, bu da %240 hızlanmayı temsil etmektedir.

Üstelik, FP8, FLUX.1-dev’in tüketici düzeyindeGeForce RTX 5090 gibi 32 GB belleğe sahip donanımlarda çalıştırılmasını mümkün kılmaktadır. Tek bir grup için, RTX 5090 ortalama 260 ms gecikme ile başarıyla derlenebilmekte ve çalıştırılabilmektedir.
Sonuç
Torch-TensorRT API’leri, özellikle MutableTorchTensorRT modülü kullanarak, geliştiricilerin yüksek debili, düşük gecikmeli performansla generatif AI uygulamaları oluşturmalarını sağlamaktadır. JIT ve AOT derlemenin bir kombinasyonunu ve basit kantizasyon tekniklerini kullanarak, kullanıcılar çıkış süresini ve GPU bellek ayak izini önemli ölçüde düşürürken, LoRA desteği gibi dinamik iş akışlarını mevcut PyTorch kodlarında minimal değişiklikle destekleyebilmektedir.
Gelecekte, FP4 hassasiyeti de desteklenen hassasiyet listesine eklenecek ve modelin bellek ayak izini ve çıkarım hızını daha da optimize edecektir. Bu blog yazısında FLUX konu edilmiştir; ancak bu iş akışı, Stable Diffusion ve Kandinsky gibi HuggingFace Diffusers tarafından desteklenen birçok yayılma modeline genelleştirilebilir. Daha fazla bilgi edinmek ve FLUX.1-dev demosunu GitHub üzerinde görüntülemek için inceleyebilirsiniz.