Diffusers documentation
BFL (fp8r / nvfp4)
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 menyimpanweightE4M3 danweight_scalefp32 per baris. Aktivasi dkuantisasi ke E4M3 per baris saat runtime.nvfp4: NVFP4 dalam tata letak ModelOpt. Setiap linear terkuantisasi menyimpanweightE2M1 yang dikemas (dua nilai per byte), skala blok E4M3 sebesar 16 (weight_scale),weight_scale_2global fp32, dan skala aktivasi fp32 yang dikalibrasiinput_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:
| Skema | Kernel terpadu | Persyaratan |
|---|---|---|
fp8r | torch._scaled_mm dengan skala baris | GPU CUDA dengan kemampuan komputasi 8.9 atau lebih tinggi |
nvfp4 | flashinfer.mm_fp4 (CUTLASS) dengan flashinfer.nvfp4_quantize untuk aktivasi | GPU 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.