Diffusers documentation

BFL (fp8r / nvfp4)

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v0.42.1).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

BFL (fp8r / nvfp4)

Black Forest Labs menyediakan varian terkuantisasi dari Flux3 transformers-nya dalam dua skema, disimpan sebagai checkpoint file tunggal di samping bobot bf16 aslinya:

  • fp8r: FP8 rowwise. Setiap linear terkuantisasi menyimpan weight E4M3 dan weight_scale fp32 per baris. Aktivasi dkuantisasi ke E4M3 per baris saat runtime.
  • nvfp4: NVFP4 dalam tata letak ModelOpt. Setiap linear terkuantisasi menyimpan weight E2M1 yang dikemas (dua nilai per byte), skala blok E4M3 sebesar 16 (weight_scale), weight_scale_2 global fp32, dan skala aktivasi fp32 yang dikalibrasi input_scale.

Diffusers memuat keduanya melalui ~FromSingleFileMixin.from_single_file dengan BFLQuantizationConfig. Skema dibaca dari checkpoint, sehingga config yang sama berfungsi untuk kedua file. Hanya pemuatan checkpoint prequantized yang didukung; pemuatan tingkat pipeline tidak didukung.

Contoh di bawah ini memuat checkpoint fp8r dari FLUX 3 Image Klein Base, yang berada di variants/fp8r/model.safetensors dalam repositori model. Sampaikan config agar konfigurasi model dibaca dari folder Diffusers di repositori tersebut, lalu muat komponen lainnya berdasarkan nama (lihat Pemuatan file tunggal).

import torch

from diffusers import BFLQuantizationConfig, Flux3Transformer2DModel, ModularPipeline

ckpt_path = "https://huggingface.co/black-forest-labs/flux-3-image-klein-base/blob/main/variants/fp8r/model.safetensors"
transformer = Flux3Transformer2DModel.from_single_file(
    ckpt_path,
    config="black-forest-labs/flux-3-image-klein-base",
    subfolder="transformer",
    quantization_config=BFLQuantizationConfig(compute_dtype=torch.bfloat16),
    dtype=torch.bfloat16,
)
pipe = ModularPipeline.from_pretrained("black-forest-labs/flux-3-image-klein-base")
pipe.load_components(dtype=torch.bfloat16)
pipe.update_components(transformer=transformer)
pipe.to("cuda")

prompt = "A wide-angle wildlife photograph of a red fox standing alert in a snow-covered forest clearing at golden hour."
image = pipe(prompt=prompt, generator=torch.Generator().manual_seed(0), output="images")[0]
image.save("flux3-klein-base-fp8r.png")

Ganti variants/fp8r dengan variants/nvfp4 untuk memuat varian nvfp4. FLUX 3 Image Klein yang telah di-distilasi langkahnya menyertakan dua varian yang sama; muat keduanya dengan id repositorinya sebagai config dan pipeline.

Kernels

Bobot terkuantisasi tetap berada dalam dtype penyimpanan presisi rendah. GEMM mana yang dijalankan bergantung pada perangkat:

SkemaKernel terpaduPersyaratan
fp8rtorch._scaled_mm dengan skala barisGPU CUDA dengan kemampuan komputasi 8.9 atau lebih tinggi
nvfp4flashinfer.mm_fp4 (CUTLASS) dengan flashinfer.nvfp4_quantize untuk aktivasiGPU Blackwell (kemampuan komputasi 10.0 atau lebih tinggi), toolkit CUDA dengan nvcc, dan flashinfer-python dengan flashinfer-cubin pada versi yang sama

Install kedua paket FlashInfer pada versi yang sama, misalnya pip install flashinfer-python==0.6.13 flashinfer-cubin==0.6.13. Rilis flashinfer-cubin bisa tertinggal di belakang flashinfer-python, dan FlashInfer akan menolak diimpor jika versinya berbeda.

FlashInfer mengompilasi kernel NVFP4-nya pada penggunaan pertama dengan toolkit CUDA dari lingkungan dan memilih arsitektur target dari GPU yang terlihat (atau dari FLASHINFER_CUDA_ARCH_LIST jika disetel). GPU Blackwell untuk konsumen dan workstation (compute capability 12.0) memerlukan toolkit CUDA versi 12.9 atau lebih baru. Dengan toolkit yang lebih lama, FlashInfer tidak menemukan arsitektur yang memenuhi syarat dan panggilan NVFP4 pertama akan gagal dengan FlashInfer requires GPUs with sm75 or higher.

Pada perangkat lain, bobot didekuantisasi ke compute_dtype pada setiap forward pass dan layer berjalan sebagai linear reguler. Dalam kasus tersebut, aktivasi tidak dikuantisasi, sehingga output sedikit berbeda dari kernel yang difusi.

Update on GitHub