# BFL (fp8r / nvfp4)

[Black Forest Labs](https://huggingface.co/black-forest-labs) menyediakan varian terkuantisasi dari [Flux3](../api/pipelines/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](https://github.com/NVIDIA/Model-Optimizer). 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](/docs/diffusers/main/id/api/quantization#diffusers.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](https://huggingface.co/black-forest-labs/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](../api/pipelines/flux3#single-file-loading)).

```python
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](https://huggingface.co/black-forest-labs/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.

