Hugging Face Diffusers 양자화 백엔드

Hugging Face Diffusers는 FLUX.1-dev와 같은 대형 디퓨전 모델을 메모리와 연산 요구량을 줄여 보다 쉽게 사용할 수 있도록 여러 양자화 백엔드를 통합했습니다. 이러한 백엔드를 사용하면 모델을 크게 축소하면서도 이미지 품질을 크게 손상시키지 않을 수 있으며, 8비트 양자화는 고정밀 BF16 모델과 거의 구분되지 않을 정도의 결과를 자주 제공합니다.

FLUX.1-dev 모델 아키텍처 및 메모리 기준선

양자화의 영향을 이해하려면 BF16 정밀도에서 FLUX.1-dev 모델의 메모리 기준선을 설정해야 하며, 이는 약 31.447 GB의 메모리를 필요로 합니다. 모델은 네 가지 주요 구성 요소로 이루어져 있습니다:

  • Transformer (MMDiT): 핵심 생성 멀티모달 디퓨전 트랜스포머이며, 23.8 GB가 필요합니다.
  • Text Encoder 2 (T5): 미묘한 이해와 텍스트 렌더링에 사용되며, 9.52 GB가 필요합니다.
  • Text Encoder 1 (CLIP): 초기 텍스트 이해에 사용되며, 246 MB가 필요합니다.
  • VAE: 픽셀과 잠재 공간 사이의 이미지 변환을 담당하며, 168 MB가 필요합니다.

양자화 작업은 주로 트랜스포머와 T5 텍스트 인코더를 대상으로 하여 가장 큰 메모리 절감을 목표로 합니다.

지원되는 양자화 백엔드

bitsandbytes (BnB)

bitsandbytes는 8비트와 4비트 양자화를 제공합니다. FLUX.1-dev에 대해 4비트 양자화(NF4 사용)는 로드 후 메모리를 12.584 GB, 피크 메모리를 17.281 GB로 줄이며, NVIDIA H100 80GB GPU에서 추론 시간은 12초를 유지합니다. 8비트 양자화는 메모리 사용량이 증가(로드 시 19.273 GB / 피크 24.432 GB)하고 추론 시간이 27초로 느려집니다.

torchao

torchao는 아키텍처 최적화를 위한 PyTorch 네이티브 라이브러리이며, 여러 가중치 전용 포맷을 지원합니다:

  • int4_weight_only: 가장 낮은 메모리 사용량(로드 시 10.635 GB / 피크 14.654 GB)이지만 가장 느린 추론(109초).
  • int8_weight_only: 중간 정도 메모리(로드 시 17.020 GB / 피크 21.482 GB)와 빠른 추론(15초).
  • float8_weight_only: int8과 유사한 메모리와 속도(로드 시 17.016 GB / 피크 21.488 GB; 15초).

Quanto

optimum 라이브러리를 통해 통합된 Quanto는 다양한 정밀도를 지원합니다:

  • INT4: 로드 시 12.254 GB / 피크 메모리 16.139 GB; 추론 109초.
  • INT8: 로드 시 17.330 GB / 피크 메모리 21.814 GB; 추론 15초.
  • FP8: 로드 시 16.395 GB / 피크 메모리 20.898 GB; 추론 16초.

GGUF

Diffusers는 GGUF 파일 포맷을 지원하여 from_single_file을 통해 llama.cpp 커뮤니티의 사전 양자화 모델을 사용할 수 있습니다. FLUX.1-dev에 대한 벤치마크는 다음과 같습니다:

  • Q2_k: 로드 시 13.264 GB / 피크 메모리 17.752 GB; 추론 26초.
  • Q4_1: 로드 시 16.838 GB / 피크 메모리 21.326 GB; 추론 23초.
  • Q8_0: 로드 시 21.502 GB / 피크 메모리 25.973 GB; 추론 15초.

FP8 Layerwise Casting

enable_layerwise_casting은 가중치를 FP8(e4m3)으로 저장하고 계산 중에 동적으로 더 높은 연산 정밀도(예: BF16)로 캐스팅하는 메모리 최적화 기법입니다. 이를 통해 로드 후 메모리를 23.682 GB, 피크 메모리를 28.451 GB로 줄이며, 추론 시간은 13초가 됩니다.

양자화와 메모리 최적화 결합

양자화 백엔드는 다른 Diffusers 최적화 기법과 결합하여 VRAM 사용량을 더욱 줄일 수 있습니다:

  • Model CPU Offloading (enable_model_cpu_offload): 전체 구성 요소를 CPU와 GPU 사이에 이동합니다. BnB 4비트와 이 방법을 결합하면 피크 메모리를 12.383 GB로 감소시킵니다.
  • Group Offloading (enable_group_offload): 내부 레이어 그룹을 CPU로 이동합니다. FP8 레이어별 캐스팅과 그룹 오프로드를 결합하면 로드 후 메모리를 9.264 GB, 피크 메모리를 14.232 GB로 줄입니다.
  • torch.compile: PyTorch 2.x를 통해 실행을 가속합니다. 메모리를 낮추지는 않지만 추론 속도를 크게 향상시킵니다. 예를 들어 torchao int4_weight_only의 추론 시간이 컴파일 후 109초에서 6초로 감소하지만, 컴파일 자체에 약 285초가 소요됩니다.

백엔드 선택 가이드

하드웨어와 성능 목표에 따라 다음과 같은 백엔드를 권장합니다:

  • NVIDIA 사용자 (가장 쉬움): bitsandbytes 4/8-bit 사용.
  • 추론 속도: torchao, GGUF 또는 bitsandbytestorch.compile() 결합 사용.
  • 하드웨어 유연성(CPU/MPS) 또는 FP8: Quanto 사용.
  • Hopper/Ada 아키텍처: FP8 Layerwise Casting 사용.
  • 기존 GGUF 모델: from_single_file을 통한 GGUF 로드 사용.

SUMMARY: Hugging Face Diffusers는 bitsandbytes, torchao, Quanto, GGUF, 그리고 FP8 레이어별 캐스팅을 포함한 여러 양자화 백엔드를 통합하여 FLUX.1-dev와 같은 대형 디퓨전 모델의 메모리 사용량을 줄입니다.

TITLE: Hugging Face Diffusers 양자화 백엔드

Sources