Buckets:

mishig's picture
|
download
raw
11.1 kB
# 시작하기
Quantization은 원래 데이터의 정밀도를 유지하면서 더 적은 비트로 데이터를 표현하는 데 초점을 맞춥니다. 이는 일반적으로 동일한 정보를 더 적은 비트로 표현하기 위해 데이터 유형을 변환하는 것을 의미합니다. 예를 들어, 모델 가중치가 32비트 부동소수점으로 저장되어 있고 이를 16비트 부동소수점으로 양자화하면 모델 크기가 절반으로 줄어 저장하기가 쉬워지고 메모리 사용량이 감소합니다. 더 낮은 정밀도는 더 적은 비트로 계산을 수행하는 데 시간이 덜 걸리기 때문에 추론 속도도 향상시킬 수 있습니다.
Diffusers는 [Flux](../api/pipelines/flux)와 같은 대규모 diffusion 모델을 보다 쉽게 사용할 수 있도록 여러 quantization backends를 지원합니다. 이 가이드에서는 사전 학습된 체크포인트나 비양자화 체크포인트에서 파이프라인을 초기화하는 동안 [PipelineQuantizationConfig](/docs/diffusers/main/ko/api/quantization#diffusers.PipelineQuantizationConfig) 클래스를 사용하여 파이프라인을 양자화하는 방법을 보여줍니다.
## Pipeline-level 양자화
양자화 설정에 적용할 커스터마이징 수준에 따라 [PipelineQuantizationConfig](/docs/diffusers/main/ko/api/quantization#diffusers.PipelineQuantizationConfig)를 사용하는 방법은 두 가지가 있습니다.
- 기본 사용 사례의 경우 `quant_backend`, `quant_kwargs`, `components_to_quantize` 인수를 정의합니다
- 세밀한 양자화 제어를 위해 개별 모델 구성 요소에 대한 양자화 구성을 제공하는 `quant_mapping`을 정의합니다
### 기본 양자화
다음 매개변수로 [PipelineQuantizationConfig](/docs/diffusers/main/ko/api/quantization#diffusers.PipelineQuantizationConfig)를 초기화합니다.
- `quant_backend`는 사용할 양자화 백엔드를 지정합니다. 현재 지원되는 백엔드에는 `bitsandbytes_4bit`, `bitsandbytes_8bit`, `gguf`, `quanto`, `torchao`가 있습니다.
- `quant_kwargs`는 사용할 양자화 인수를 지정합니다.
> [!TIP]
> 이 `quant_kwargs` 인수는 백엔드마다 다릅니다. 각 백엔드의 인수를 보려면 [Quantization API](../api/quantization) 문서를 참조하세요.
- `components_to_quantize`는 파이프라인의 어떤 구성 요소를 양자화할지 지정합니다. 일반적으로 Transformer와 같이 계산 집약적인 구성 요소를 양자화해야 합니다. [FluxPipeline](/docs/diffusers/main/ko/api/pipelines/flux#diffusers.FluxPipeline)처럼 텍스트 인코더가 여러 개 있는 파이프라인의 경우, 텍스트 인코더도 양자화 대상으로 고려할 수 있습니다. 아래 예시는 [FluxPipeline](/docs/diffusers/main/ko/api/pipelines/flux#diffusers.FluxPipeline)에서 T5 텍스트 인코더만 양자화하고 CLIP 모델은 그대로 유지합니다.
`components_to_quantize`는 여러 모델을 위한 목록 또는 단일 모델을 위한 문자열을 받아들입니다.
아래 예제는 [BitsAndBytesConfig](/docs/diffusers/main/ko/api/quantization#diffusers.BitsAndBytesConfig)에서 `load_in_4bit`, `bnb_4bit_quant_type`, `bnb_4bit_compute_dtype` 인수를 사용하여 bitsandbytes 백엔드를 로드합니다.
```py
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()](/docs/diffusers/main/ko/api/pipelines/overview#diffusers.DiffusionPipeline.from_pretrained)에 전달하여 파이프라인을 양자화합니다.
```py
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](/docs/diffusers/main/ko/api/quantization#diffusers.PipelineQuantizationConfig)을 초기화하고 `quant_mapping`을 전달합니다. `quant_mapping`을 사용하면 transformer, text encoder와 같은 파이프라인의 각 구성 요소에 대한 양자화 옵션을 지정할 수 있습니다.
아래 예시에서는 transformer와 text encoder에 각각 두 가지 양자화 백엔드인 [QuantoConfig](/docs/diffusers/main/ko/api/quantization#diffusers.QuantoConfig)와 [transformers.BitsAndBytesConfig](https://huggingface.co/docs/transformers/main/en/main_classes/quantization#transformers.BitsAndBytesConfig)를 사용합니다.
```py
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](https://huggingface.co/docs/transformers/main_classes/quantization#transformers.BitsAndBytesConfig)에는 별도의 bitsandbytes 백엔드가 있습니다. Transformers에서 가져온 구성 요소의 경우 [transformers.BitsAndBytesConfig](https://huggingface.co/docs/transformers/main/en/main_classes/quantization#transformers.BitsAndBytesConfig)를 가져와서 사용해야 합니다. 예를 들어, [FluxPipeline](/docs/diffusers/main/ko/api/pipelines/flux#diffusers.FluxPipeline)의 `text_encoder_2`는 Transformers의 [T5EncoderModel](https://huggingface.co/docs/transformers/main/en/model_doc/t5#transformers.T5EncoderModel)이므로 [diffusers.BitsAndBytesConfig](/docs/diffusers/main/ko/api/quantization#diffusers.BitsAndBytesConfig) 대신 [transformers.BitsAndBytesConfig](https://huggingface.co/docs/transformers/main/en/main_classes/quantization#transformers.BitsAndBytesConfig)를 사용해야 합니다.
> [!TIP]
> 이러한 개별 import를 관리하지 않거나 각 pipeline 구성 요소의 출처가 불분명한 경우, 위의 [기본 양자화](#basic-quantization) 방법을 사용하세요.
```py
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()](/docs/diffusers/main/ko/api/pipelines/overview#diffusers.DiffusionPipeline.from_pretrained)에 전달하여 파이프라인을 양자화합니다.
```py
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](/docs/diffusers/main/ko/api/quantization#diffusers.PipelineQuantizationConfig)를 생성하거나 `quantization_config` 인수를 전달할 필요가 없습니다.
```py
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](./bitsandbytes) | Config는 `config.json`에 저장되며, 추가 인자가 필요하지 않습니다. 온플라이 양자화 및 사전 양자화된 체크포인트 로딩을 모두 지원합니다. |
| [torchao](./torchao) | 위와 동일합니다. |
| [GGUF](./gguf) | Model 클래스와 함께 `from_single_file`를 사용합니다. pipeline 수준의 로딩은 지원되지 않습니다. |
| [BFL](./bfl) | Black Forest Labs의 `fp8r` 및 `nvfp4` 단일 파일 체크포인트를 `from_single_file`로 로드합니다. 파이프라인 수준의 로딩은 지원되지 않습니다. |
| [AutoRound](./autoround) | 로드만 지원됩니다. 먼저 AutoRound CLI 또는 Python API를 사용하여 양자화하세요. |
| [Nunchaku Lite](./nunchaku) | Config는 `config.json`에 저장되며 `kernels` 패키지가 필요합니다. 로딩만 지원됩니다. |
| [ModelOpt](./modelopt) | 모델만 로드하는 것이 지원됩니다. |
| [SDNQ](./sdnq) | `sdnq` 패키지가 필요합니다. 실시간 양자화 및 사전 양자화 모델 로딩을 모두 지원합니다. |
## 리소스
양자화에 대해 자세히 알아보려면 아래 리소스를 확인하세요.
- 양자화에 처음 접하시는 경우, DeepLearning.AI와 협력하여 만든 초보자 친화적인 다음 코스를 확인해 보시는 것을 권장합니다.
- [Hugging Face를 활용한 양자화 기초](https://www.deeplearning.ai/short-courses/quantization-fundamentals-with-hugging-face/)
- [양자화 심층 분석](https://www.deeplearning.ai/short-courses/quantization-in-depth/)
- 새로운 양자화 방법을 추가하는 데 관심이 있다면 [새로운 양자화 방법 기여 가이드](https://huggingface.co/docs/transformers/main/en/quantization/contribute)를 참조하세요.
- Transformers 양자화 [개요](https://huggingface.co/docs/transformers/quantization/overview#when-to-use-what)는 다양한 양자화 백엔드의 장단점을 요약합니다.
- 각 양자화 백엔드에 대한 간략한 소개, 백엔드 선택 방법, 그리고 양자화를 다른 메모리 최적화 기법과 결합하는 방법에 대해서는 [Exploring Quantization Backends in Diffusers](https://huggingface.co/blog/diffusers-quantization) 블로그 포스트를 참고하세요.

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.