Python에서 FLUX.1-dev GGUF Q8 실행

GGUF 양자화로 FLUX.1-dev 가속화

Page content

FLUX.1-dev 은 텍스트에서 이미지를 생성하는 강력한 모델로, 놀라운 결과를 제공하지만 24GB 이상의 메모리 요구 사항으로 인해 많은 시스템에서 실행하기 어렵습니다. GGUF quantization of FLUX.1-dev 은 메모리 사용량을 약 50% 줄이며 우수한 이미지 품질을 유지하는 해결책을 제공합니다.

example output Q8 quantized FLUX.1-dev - asic 이 이미지는 GGUF 형식으로 Q8 양자화된 FLUX.1-dev 모델을 사용하여 생성되었으며, 메모리 사용량이 줄어든 상태에서도 품질이 유지됨을 보여줍니다.

GGUF 양자화란 무엇인가요?

GGUF(GPT-Generated Unified Format)는 언어 모델을 위해 처음 개발된 양자화 형식이지만, FLUX와 같은 확산 모델에도 지원됩니다. 양자화는 가중치를 8비트, 6비트, 또는 4비트와 같은 더 낮은 정밀도 형식으로 저장함으로써 모델 크기를 줄입니다. 이는 전체 16비트 또는 32비트 정밀도 대신 사용됩니다.

FLUX.1-dev의 경우, 모델의 가장 큰 부분인 트랜스포머 구성 요소를 양자화할 수 있으며, Q8_0 양자화를 사용하면 메모리 사용량이 약 24GB에서 12GB로 줄어들고, 더 강력한 양자화 수준을 사용하면 더 낮은 수준으로 줄어들 수 있습니다.

GGUF 양자화의 이점

GGUF 양자화된 FLUX 모델을 사용하는 주요 이점은 다음과 같습니다:

  • 메모리 사용량 감소: VRAM 요구 사항을 절반으로 줄여, 더 많은 하드웨어에서 FLUX.1-dev를 사용할 수 있습니다.
  • 품질 유지: Q8_0 양자화는 거의 눈에 띄지 않는 차이를 보이며 이미지 품질을 유지합니다.
  • 빠른 로딩: 파일 크기가 작아지므로 양자화된 모델이 더 빠르게 로드됩니다.
  • 전력 소비 감소: 메모리 사용량이 줄어들면 추론 중 전력 소비도 줄어듭니다.

우리의 테스트에서 양자화된 모델은 전체 모델에 비해 약 12-15GB의 VRAM을 사용하지만, 생성 시간은 유사합니다.

설치 및 설정

GGUF 양자화된 FLUX.1-dev를 사용하려면 표준 diffusers 의존성 외에도 gguf 패키지가 필요합니다. 이미 FLUX for text-to-image generation을 사용하고 있다면 기본 설정에 익숙할 것입니다.

uv as your Python package manager를 사용 중이라면 다음 명령어로 필요한 패키지를 설치할 수 있습니다:

uv pip install -U diffusers torch transformers gguf

또는 표준 pip를 사용하여 설치할 수 있습니다:

pip install -U diffusers torch transformers gguf

구현

GGUF 양자화된 모델을 사용할 때의 주요 차이점은 FluxTransformer2DModel.from_single_file()을 사용하여 트랜스포머를 별도로 로드하고 GGUFQuantizationConfig를 전달하는 것입니다. 이후 파이프라인에 전달합니다. Python 구문에 대한 빠른 참조가 필요하다면 Python Cheatsheet를 확인하세요. 다음은 완전한 작동 예시입니다:

import os
import torch
from diffusers import FluxPipeline, FluxTransformer2DModel, GGUFQuantizationConfig

# 경로
gguf_model_path = "/path/to/flux1-dev-Q8_0.gguf"
base_model_path = "/path/to/FLUX.1-dev-config"  # 구성 파일만

# GGUF 양자화된 트랜스포머 로드
print(f"Loading GGUF quantized transformer from: {gguf_model_path}")
transformer = FluxTransformer2DModel.from_single_file(
    gguf_model_path,
    quantization_config=GGUFQuantizationConfig(compute_dtype=torch.bfloat16),
    config=base_model_path,
    subfolder="transformer",
    torch_dtype=torch.bfloat16,
)

# 양자화된 트랜스포머와 파이프라인 생성
print(f"Creating pipeline with base model: {base_model_path}")
pipe = FluxPipeline.from_pretrained(
    base_model_path,
    transformer=transformer,
    torch_dtype=torch.bfloat16,
)

# CPU 오프로딩 활성화 (GGUF 사용 시 필수)
pipe.enable_model_cpu_offload()
# 참고: enable_sequential_cpu_offload()는 GGUF와 호환되지 않습니다.

# 이미지 생성
prompt = "A futuristic cityscape at sunset with neon lights"
image = pipe(
    prompt,
    height=496,
    width=680,
    guidance_scale=3.5,
    num_inference_steps=60,
    max_sequence_length=512,
    generator=torch.Generator("cpu").manual_seed(42)
).images[0]

image.save("output.jpg")

중요한 고려 사항

모델 구성 파일

GGUF 양자화를 사용할 때 원래 FLUX.1-dev 모델의 구성 파일이 여전히 필요합니다. 이는 다음과 같습니다:

  • model_index.json - 파이프라인 구조
  • 구성 파일 (트랜스포머, text_encoder, text_encoder_2, vae, scheduler)
  • 토크나이저 파일
  • 텍스트 인코더 및 VAE 가중치 (이들은 양자화되지 않음)

트랜스포머 가중치는 GGUF 파일에서 가져오지만, 다른 구성 요소는 원래 모델 파일이 필요합니다.

CPU 오프로딩 호환성

중요: enable_sequential_cpu_offload()는 GGUF 양자화된 모델과 호환되지 않으며 KeyError: None 오류를 발생시킵니다. 저는 양자화된 트랜스포머를 사용할 때 enable_model_cpu_offload()만 사용하고 있습니다.

양자화 수준

FLUX.1-dev에 사용 가능한 양자화 수준은 다음과 같습니다:

  • Q8_0: 최고 품질, 약 14-15GB 메모리 (추천)
  • Q6_K: 좋은 균형, 약 12GB 메모리
  • Q4_K: 최대 압축, 약 8GB 메모리 (품질에 악영향을 줄 것으로 추정)

대부분의 사용 사례에서 Q8_0은 메모리 절약과 이미지 품질 사이에서 최적의 균형을 제공합니다.

성능 비교

동일한 프롬프트와 설정으로 테스트한 결과는 다음과 같습니다:

모델 VRAM 사용량 생성 시간 품질
전체 FLUX.1-dev 24GB 큰 GPU가 없음 우수 (추정)
전체 FLUX.1-dev ~3GB (sequential_cpu_offload() 사용) ~329s 우수
GGUF Q8_0 ~14-15GB ~98s !!! 우수
GGUF Q6_K ~10-12GB ~116s 매우 좋음

양자화된 모델은 이제 더 적은 CPU 오프로딩이 필요하기 때문에, 메모리 사용량이 크게 줄어들면서 생성 속도가 3배 이상 빨라져, 제한된 VRAM을 가진 시스템에서도 실용적으로 사용할 수 있습니다.

다음 프롬프트로 두 모델 모두 테스트했습니다:

A futuristic close-up of a transformer inference ASIC chip with intricate circuitry, glowing blue light emitting from dense matrix multiply units and low-precision ALUs, surrounded by on-chip SRAM buffers and quantization pipelines, rendered in hyper-detailed photorealistic style with a cold, clinical lighting scheme.

FLUX.1-dev Q8의 샘플 출력은 이 게시물의 표지 이미지입니다 - 위에 보입니다.

비양자화된 FLUX.1-dev의 샘플 출력은 다음과 같습니다:

example image produced by non-quantized FLUX.1-dev - asic

품질 차이를 거의 보지 못했습니다.

결론

GGUF 양자화는 모델이 알려진 고품질 이미지 생성을 유지하면서도 더 넓은 범위의 하드웨어에 FLUX.1-dev를 사용할 수 있도록 합니다. 메모리 요구 사항을 약 50% 줄임으로써, 고성능 텍스트에서 이미지 생성을 더 저렴한 하드웨어에서도 실행할 수 있습니다.

diffusers 라이브러리와 함께 구현은 표준 FLUX 파이프라인 설정에 대한 약간의 변경만 필요합니다. 대부분의 사용자에게 Q8_0 양자화는 메모리 효율성과 이미지 품질 사이에서 최적의 균형을 제공합니다.

FLUX.1-Kontext-dev for image augmentation을 사용 중이라면, 미래에는 유사한 양자화 기술이 제공될 수 있습니다.

관련 기사

참고문헌