• <xmp id="om0om">
  • <table id="om0om"><noscript id="om0om"></noscript></table>
  • 3 月 19 日下午 2 點,鎖定 NVIDIA AI 網絡中文專場。立即注冊觀看
    生成式人工智能/大語言模型

    NVIDIA TensorRT 通過 8 位預訓練量化將 Stable Diffusion 的速度提升近 2 倍

    在生成式 AI 的動態領域,擴散模型脫穎而出,成為使用文本提示生成高質量圖像的功能強大的架構 .Stable Diffusion 等模型徹底改變了創意應用。

    但是,由于需要執行迭代降噪步驟,擴散模型的推理過程非常計算密集。這對致力于實現最佳端到端推理速度的公司和開發者帶來了嚴峻挑戰。

    首先,NVIDIA TensorRT 9.2.0 引入了一款出色的量化工具包,支持FP8 或 INT8 預訓練量化 (PTQ),顯著提升了在 NVIDIA 硬件上部署擴散模型的速度,同時保持圖像質量。TensorRT 的 8 位量化功能已成為眾多生成式 AI 公司的首選解決方案,特別是對于領先的創意視頻編輯應用程序提供商。

    在本文中,我們討論了 TensorRT 與 Stable Diffusion XL 的性能。我們介紹了支持 TensorRT 成為低延遲 Stable Diffusion 推理首選的技術差異。最后,我們展示了如何使用 TensorRT 通過幾行代碼加速模型。

    基準測試

    NVIDIA TensorRT INT8 和 FP8 量化方法適用于擴散模型,在 NVIDIA RTX 6000 Ada GPU 上的速度比原生 PyTorch 快 1.72 倍和 1.95 倍torch.compile在 FP16 中運行 .FP8 的額外加速主要歸因于多頭注意力 (MHA) 層的量化。使用 TensorRT 8 位量化,您可以增強生成式 AI 應用程序的響應速度并降低推理成本。

    TensorRT INT8 and FP8 achieves 1.72x and 1.95x speedup compared to PyTorch’s torch.compile FP16.
    圖 1.TensorRT INT8 和 FP8 推理加速基準測試

    配置:Stable Diffusion XL 1.0 基礎模型;圖像分辨率=1024×1024;批量大小=1;Euler 調度程序適用于 50 個步驟; NVIDIA RTX 6000 Ada GPU.TensorRT INT8 量化現已推出,預計很快推出 FP8.基準測試可能會在發布時發生變化。

    除了加快推理速度外,TensorRT 8 位量化還擅長保留圖像質量。通過專有量化技術,它可以生成與原始 FP16 圖像非常相似的圖像。我們將在本文中后續部分介紹這些技術。

    Output images to demonstrate that TensorRT INT8 and FP8 can preserve the image quality compared with the original FP16.
    圖 2.與原始 FP16 相比,TensorRT INT8 和 FP8 可保留圖像質量

    TensorRT 解決方案:克服推理速度挑戰

    雖然 PTQ 被認為是降低內存占用和加快 AI 任務推理速度的首選壓縮方法,但它在擴散模型上不起作用。擴散模型具有獨特的多時間步驟降噪過程,并且在每個時間步驟的噪聲估計網絡的輸出分布可能會發生顯著變化。這使得直觀的 PTQ 校正方法無法使用。

    在現有的技術中,SmoothQuant 是一種流行的 PTQ 方法,它為 LLM 實現了 8 位權重和 8 位激活(W8A8)量化。它的主要創新之處在于通過將量化挑戰從激活轉移到權重,并通過數學等效變換來解決激活異常問題。

    盡管它很有效,但用戶經常遇到在 SmoothQuant 中手動定義參數的困難。實踐研究還發現,SmoothQuant 很難適應各種圖像特征,從而限制了其在真實場景中的靈活性和性能。此外,其他現有的擴散模型量化技術僅適用于單個擴散模型的一個版本,而用戶正在尋找一種通用方法,以加快各種模型版本的速度。

    為了應對這些挑戰, NVIDIA TensorRT 開發了一個精細的細粒度調整管線,以便為 SmoothQuant 確定每個模型層的最佳參數設置。您可以根據特定的特征圖塊開發自己的調整管線。此功能使 TensorRT 量化能夠實現比現有方法更出色的圖像質量,從而保留原始圖像的豐富細節。

    激活分布可能會在不同時間步長之間發生顯著變化,而圖像的形狀和整體風格主要在降噪過程的初始階段決定。因此,使用傳統的最大校正會在初始步驟中產生大量量化錯誤。參見 Q-Diffusion 白皮書了解更多詳情。

    Box plot of flattened tensor magnitudes with the high and low noise ranges marked off.
    圖 3.高噪聲和低噪聲范圍的激活分布s

    相反,我們選擇性地使用選定步長范圍中的最小量化擴展因子,因為我們發現激活值中的異常點對最終圖像質量的影響并不大。這種定制方法我們稱之為百分位數量重點關注步驟范圍的重要百分比。它使 TensorRT 能夠生成幾乎與原始 FP16 精度相同的圖像。

    Four output images (dog, man with red dragon, toy cannon, and woman with goggles) compare FP16 with INT8 with NVIDIA TensorRT Percentile Quant and INT8 with original SmoothQuant.
    圖 4.與 FP16 基準相比, NVIDIA TensorRT Percentile Quant 可生成接近相同的圖像

    使用 TensorRT 8 位量化來加速擴散模型

    這個 /NVIDIA/TensorRT?GitHub repo 現在托管一個端到端、SDXL、8 位推理管道,提供一個現成的解決方案,在 NVIDIA GPU 上實現優化的推理速度。

    運行一個命令,使用 Percentile Quant 生成圖像,并使用 demoDiffusion 測量延遲。在本節中,我們使用 INT8 作為示例,但 FP8 的工作流程大致相同。

    python demo_txt2img_xl.py "enchanted winter forest with soft diffuse light on a snow-filled day" --version xl-1.0 --onnx-dir onnx-sdxl --engine-dir engine-sdxl --int8 --quantization-level 3

    以下是此命令的主要步驟概述:

    • 校正
    • 導出 ONNX
    • 構建 TensorRT 引擎

    校正

    校正是量化過程中計算目標精度范圍的步驟。目前,TensorRT 中的量化功能包含 nvidia-ammo,這是 TensorRT 8 位量化示例中包含的依賴項。

    # Load the SDXL-1.0 base model from HuggingFace
    import torch
    from diffusers import DiffusionPipeline
    base = DiffusionPipeline.from_pretrained(
        "stabilityai/stable-diffusion-xl-base-1.0",
        torch_dtype=torch.float16,
        variant="fp16",
        use_safetensors=True
    )
    base.to("cuda")
     
    # Load calibration prompts:
    from utils import load_calib_prompts
    cali_prompts = load_calib_prompts(batch_size=2,prompts="./calib_prompts.txt")
     
    # Create the int8 quantization recipe
    from utils import get_percentilequant_config
    quant_config = get_percentilequant_config(base.unet, quant_level=3.0, percentile=1.0, alpha=0.8)
     
    # Apply the quantization recipe and run calibration 
    import ammo.torch.quantization as atq
    quantized_model = atq.quantize(base.unet, quant_config, forward_loop)
     
    # Save the quantized model
    import ammo.torch.opt as ato
    ato.save(quantized_model, 'base.unet.int8.pt')

    導出 ONNX

    獲取量化模型檢查點后,您可以導出 ONNX 模型。

    # Prepare the onnx export 
    from utils import filter_func, quantize_lvl
    base.unet = ato.restore(base.unet, 'base.unet.int8.pt')
    quantize_lvl(base.unet, quant_level=3.0)
    atq.disable_quantizer(base.unet, filter_func) # `filter_func` is used to exclude layers you don't quantize
      
    # Export the ONNX model
    from onnx_utils import ammo_export_sd
    base.unet.to(torch.float32).to("cpu")
    ammo_export_sd(base, 'onnx_dir', 'stabilityai/stable-diffusion-xl-base-1.0')

    構建 TensorRT 引擎

    利用 INT8 UNet ONNX 模型,您可以 創建 TensorRT 引擎

    trtexec --onnx=./onnx_dir/unet.onnx --shapes=sample:2x4x128x128,timestep:1,encoder_hidden_states:2x77x2048,text_embeds:2x1280,time_ids:2x6 --fp16 --int8 --builderOptimizationLevel=4 --saveEngine=unetxl.trt.plan

    總結

    在生成式 AI 時代,擁有優先考慮易用性的推理解決方案至關重要。借助 NVIDIA TensorRT,您可以通過其專有的 8 位量化技術實現高達 2 倍的推理速度提升,同時確保圖像質量不受影響,從而提供出色的用戶體驗。

    TensorRT 致力于平衡速度和質量,凸顯其在加速 AI 應用方面的領先地位,讓您輕松提供尖端解決方案。

    注冊參加 關于量化的 GTC 會議,以了解更多關于優化生成式 AI 模型推理速度和模型壓縮的信息。如果您正在使用基于 LLM 的應用程序,我們鼓勵您探索 如何利用 TensorRT-LLM 及其先進的量化技術加速推理過程

    有關更多信息,請參閱以下資源:

    ?

    +5

    標簽

    人人超碰97caoporen国产