Buckets:

mishig's picture
|
download
raw
11.1 kB

시작하기

Quantization은 원래 데이터의 정밀도를 유지하면서 더 적은 비트로 데이터를 표현하는 데 초점을 맞춥니다. 이는 일반적으로 동일한 정보를 더 적은 비트로 표현하기 위해 데이터 유형을 변환하는 것을 의미합니다. 예를 들어, 모델 가중치가 32비트 부동소수점으로 저장되어 있고 이를 16비트 부동소수점으로 양자화하면 모델 크기가 절반으로 줄어 저장하기가 쉬워지고 메모리 사용량이 감소합니다. 더 낮은 정밀도는 더 적은 비트로 계산을 수행하는 데 시간이 덜 걸리기 때문에 추론 속도도 향상시킬 수 있습니다.

Diffusers는 Flux와 같은 대규모 diffusion 모델을 보다 쉽게 사용할 수 있도록 여러 quantization backends를 지원합니다. 이 가이드에서는 사전 학습된 체크포인트나 비양자화 체크포인트에서 파이프라인을 초기화하는 동안 PipelineQuantizationConfig 클래스를 사용하여 파이프라인을 양자화하는 방법을 보여줍니다.

Pipeline-level 양자화

양자화 설정에 적용할 커스터마이징 수준에 따라 PipelineQuantizationConfig를 사용하는 방법은 두 가지가 있습니다.

  • 기본 사용 사례의 경우 quant_backend, quant_kwargs, components_to_quantize 인수를 정의합니다
  • 세밀한 양자화 제어를 위해 개별 모델 구성 요소에 대한 양자화 구성을 제공하는 quant_mapping을 정의합니다

기본 양자화

다음 매개변수로 PipelineQuantizationConfig를 초기화합니다.

  • quant_backend는 사용할 양자화 백엔드를 지정합니다. 현재 지원되는 백엔드에는 bitsandbytes_4bit, bitsandbytes_8bit, gguf, quanto, torchao가 있습니다.
  • quant_kwargs는 사용할 양자화 인수를 지정합니다.

이 quant_kwargs 인수는 백엔드마다 다릅니다. 각 백엔드의 인수를 보려면 Quantization API 문서를 참조하세요.

  • components_to_quantize는 파이프라인의 어떤 구성 요소를 양자화할지 지정합니다. 일반적으로 Transformer와 같이 계산 집약적인 구성 요소를 양자화해야 합니다. FluxPipeline처럼 텍스트 인코더가 여러 개 있는 파이프라인의 경우, 텍스트 인코더도 양자화 대상으로 고려할 수 있습니다. 아래 예시는 FluxPipeline에서 T5 텍스트 인코더만 양자화하고 CLIP 모델은 그대로 유지합니다.

    components_to_quantize는 여러 모델을 위한 목록 또는 단일 모델을 위한 문자열을 받아들입니다.

아래 예제는 BitsAndBytesConfig에서 load_in_4bit, bnb_4bit_quant_type, bnb_4bit_compute_dtype 인수를 사용하여 bitsandbytes 백엔드를 로드합니다.

import torch
from diffusers import DiffusionPipeline
from diffusers.quantizers import PipelineQuantizationConfig

pipeline_quant_config = PipelineQuantizationConfig(
    quant_backend="bitsandbytes_4bit",
    quant_kwargs={"load_in_4bit": True, "bnb_4bit_quant_type": "nf4", "bnb_4bit_compute_dtype": torch.bfloat16},
    components_to_quantize=["transformer", "text_encoder_2"],
)

pipeline_quant_config를 from_pretrained()에 전달하여 파이프라인을 양자화합니다.

pipe = DiffusionPipeline.from_pretrained(
    "black-forest-labs/FLUX.1-dev",
    quantization_config=pipeline_quant_config,
    dtype=torch.bfloat16,
).to("cuda")  # or "mps", "xpu", "cpu"

image = pipe("photo of a cute dog").images[0]

고급 양자화

quant_mapping 인수는 파이프라인의 각 개별 구성 요소를 양자화하는 방법에 대해 더 많은 옵션을 제공합니다. 예를 들어, 서로 다른 양자화 백엔드를 결합하는 것 등이 있습니다.

PipelineQuantizationConfig을 초기화하고 quant_mapping을 전달합니다. quant_mapping을 사용하면 transformer, text encoder와 같은 파이프라인의 각 구성 요소에 대한 양자화 옵션을 지정할 수 있습니다.

아래 예시에서는 transformer와 text encoder에 각각 두 가지 양자화 백엔드인 QuantoConfig와 transformers.BitsAndBytesConfig를 사용합니다.

import torch
from diffusers import DiffusionPipeline
from diffusers import BitsAndBytesConfig as DiffusersBitsAndBytesConfig
from diffusers.quantizers.quantization_config import QuantoConfig
from diffusers.quantizers import PipelineQuantizationConfig
from transformers import BitsAndBytesConfig as TransformersBitsAndBytesConfig

pipeline_quant_config = PipelineQuantizationConfig(
    quant_mapping={
        "transformer": QuantoConfig(weights_dtype="int8"),
        "text_encoder_2": TransformersBitsAndBytesConfig(
            load_in_4bit=True, compute_dtype=torch.bfloat16
        ),
    }
)

Transformers에는 별도의 bitsandbytes 백엔드가 있습니다. Transformers에서 가져온 구성 요소의 경우 transformers.BitsAndBytesConfig를 가져와서 사용해야 합니다. 예를 들어, FluxPipeline의 text_encoder_2는 Transformers의 T5EncoderModel이므로 diffusers.BitsAndBytesConfig 대신 transformers.BitsAndBytesConfig를 사용해야 합니다.

이러한 개별 import를 관리하지 않거나 각 pipeline 구성 요소의 출처가 불분명한 경우, 위의 기본 양자화 방법을 사용하세요.

import torch
from diffusers import DiffusionPipeline
from diffusers import BitsAndBytesConfig as DiffusersBitsAndBytesConfig
from diffusers.quantizers import PipelineQuantizationConfig
from transformers import BitsAndBytesConfig as TransformersBitsAndBytesConfig

pipeline_quant_config = PipelineQuantizationConfig(
    quant_mapping={
        "transformer": DiffusersBitsAndBytesConfig(load_in_4bit=True, bnb_4bit_compute_dtype=torch.bfloat16),
        "text_encoder_2": TransformersBitsAndBytesConfig(
            load_in_4bit=True, compute_dtype=torch.bfloat16
        ),
    }
)

pipeline_quant_config를 from_pretrained()에 전달하여 파이프라인을 양자화합니다.

pipe = DiffusionPipeline.from_pretrained(
    "black-forest-labs/FLUX.1-dev",
    quantization_config=pipeline_quant_config,
    dtype=torch.bfloat16,
).to("cuda")  # or "mps", "xpu", "cpu"

image = pipe("photo of a cute dog").images[0]

사전 양자화 체크포인트 로드

일부 양자화 백엔드는 이미 양자화되어 Hub에 업로드된 체크포인트를 로드하는 것을 지원합니다. 이 경우 양자화 구성은 모델의 config.json에 저장되며 자동으로 읽힙니다. 따라서 PipelineQuantizationConfig를 생성하거나 quantization_config 인수를 전달할 필요가 없습니다.

import torch
from diffusers import DiffusionPipeline

pipe = DiffusionPipeline.from_pretrained(
    "rootonchair/ERNIE-Image-Turbo-nunchaku-lite-nvfp4",
    dtype=torch.bfloat16,
).to("cuda")  # or "mps", "xpu", "cpu"

다음 백엔드들은 사전 양자화 체크포인트를 기본적으로 로드할 수 있습니다.

| 백엔드 | The input is a single word "Notes".

참고 | |---|---| | bitsandbytes | Config는 config.json에 저장되며, 추가 인자가 필요하지 않습니다. 온플라이 양자화 및 사전 양자화된 체크포인트 로딩을 모두 지원합니다. | | torchao | 위와 동일합니다. | | GGUF | Model 클래스와 함께 from_single_file를 사용합니다. pipeline 수준의 로딩은 지원되지 않습니다. | | BFL | Black Forest Labs의 fp8r 및 nvfp4 단일 파일 체크포인트를 from_single_file로 로드합니다. 파이프라인 수준의 로딩은 지원되지 않습니다. | | AutoRound | 로드만 지원됩니다. 먼저 AutoRound CLI 또는 Python API를 사용하여 양자화하세요. | | Nunchaku Lite | Config는 config.json에 저장되며 kernels 패키지가 필요합니다. 로딩만 지원됩니다. | | ModelOpt | 모델만 로드하는 것이 지원됩니다. | | SDNQ | sdnq 패키지가 필요합니다. 실시간 양자화 및 사전 양자화 모델 로딩을 모두 지원합니다. |

리소스

양자화에 대해 자세히 알아보려면 아래 리소스를 확인하세요.

Xet Storage Details

Size:
11.1 kB
·
Xet hash:
15e537a6d469d66f59239b1d2f9c7f52fd59c99ba95eeafee2b46448c9f35e40

Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.