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, Flux3 dönüştürücülerinin kuantize edilmiş varyantlarını iki şema ile sunar; bunlar, orijinal bf16 ağırlıklarının yanında tek dosyalık kontrol noktaları olarak saklanır:

  • fp8r: satır bazlı FP8. Her kuantize doğrusal, bir E4M3 weight ve satır başına bir fp32 weight_scale saklar. Aktivasyonlar çalışma zamanında satır bazında E4M3'e kuantize edilir.
  • nvfp4: ModelOpt yerleşimindeki NVFP4. Her kuantize doğrusal, paketlenmiş E2M1 weight (bayt başına iki değer), 16'lı E4M3 blok ölçekleri (weight_scale), küresel fp32 weight_scale_2 ve kalibre edilmiş fp32 aktivasyon ölçeği input_scale saklar.

Diffusers, her ikisini de BFLQuantizationConfig ile ~FromSingleFileMixin.from_single_file üzerinden yükler. Şema, checkpoint'ten okunduğu için aynı yapılandırma her iki dosya için de geçerlidir. Yalnızca önceden kuantize edilmiş checkpoint'lerin yüklenmesi desteklenir; pipeline düzeyinde yükleme desteklenmez.

Aşağıdaki örnek, model deposundaki variants/fp8r/model.safetensors konumunda bulunan FLUX 3 Image Klein Base'in fp8r kontrol noktasını yükler. Model yapılandırmasının o depodaki Diffusers klasöründen okunması için config parametresini iletin, ardından diğer bileşenleri adlarıyla yükleyin (bkz. Single-file loading).

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")

variants/fp8r yerine variants/nvfp4 yazarak nvfp4 varyantını yükleyin. Adım-distilled FLUX 3 Image Klein aynı iki varyantı içerir; bunları config ve pipeline olarak deposunun kimliğiyle yükleyin.

Çekirdekler

Kantize ağırlıklar, düşük hassasiyetli depolama veri türlerinde kalır. Hangi GEMM'in çalışacağı cihaza bağlıdır:

ŞemaFused çekirdekGereksinimler
fp8rSatır bazlı ölçeklerle torch._scaled_mmHesaplama yeteneği 8.9 veya daha yüksek olan CUDA GPU
nvfp4flashinfer.mm_fp4 (CUTLASS) ve aktivasyonlar için flashinfer.nvfp4_quantizeBlackwell GPU (hesaplama yeteneği 10.0 veya daha yüksek), nvcc içeren bir CUDA araç seti ve aynı sürümde flashinfer-python ile flashinfer-cubin

İki FlashInfer paketini aynı sürümde yükleyin, örneğin pip install flashinfer-python==0.6.13 flashinfer-cubin==0.6.13. flashinfer-cubin sürümü flashinfer-python sürümünün gerisinde kalabilir ve sürümler farklı olduğunda FlashInfer içe aktarmayı reddeder.

FlashInfer, NVFP4 çekirdeklerini ilk kullanımda ortamın CUDA araç setiyle derler ve hedef mimariyi görünür GPU'dan (veya ayarlanmışsa FLASHINFER_CUDA_ARCH_LIST değişkeninden) seçer. Tüketici ve iş istasyonu Blackwell GPU'ları (hesaplama yeteneği 12.0) için 12.9 veya daha yeni bir CUDA araç seti gereklidir. Daha eski bir araç seti kullanıldığında FlashInfer uygun bir mimari bulamaz ve ilk NVFP4 çağrısı FlashInfer requires GPUs with sm75 or higher hatasıyla başarısız olur.

Diğer herhangi bir cihazda, ağırlıklar her ileri geçişte compute_dtype tipine dekuantize edilir ve katman normal bir doğrusal katman olarak çalışır. Bu durumda aktivasyonlar kuantize edilmediğinden, çıktılar füzyonlu çekirdeklerden hafifçe farklılık gösterir.

Update on GitHub