# 여섯 중 네 개

[Four Over Six](https://github.com/mit-han-lab/fouroversix)은 NVIDIA Blackwell GPU에서 NVFP4 형식을 사용하여 빠르고 정확한 FP4 양자화를 수행하기 위한 라이브러리입니다. 우리의 방법은 각 블록의 최대치에 가까운 값에 대한 양자화 오류를 줄이기 위해 NVFP4 블록을 4 또는 6으로 적응적으로 스케일링하며, 이는 [프리프린트](https://arxiv.org/abs/2512.02010)에 설명되어 있습니다.

![Four Over Six visual explanation](https://github.com/mit-han-lab/fouroversix/raw/main/assets/four-over-six.png)

Four Over Six 구현은 NVIDIA Blackwell GPU에서 가장 효율적으로 실행됩니다. 그러나 이전 하드웨어 또는 CPU에서도 코드 변경 없이 실행할 수 있으며, 이러한 경우 프레임워크가 FP32 행렬 곱셈을 사용하여 시뮬레이션을 수행하는 구현으로 자동으로 폴백됩니다.

4/6로 모델을 NVFP4로 양자화하려면, 다음과 같이 모델을 로드할 수 있습니다:

```python
from transformers import AutoModelForCausalLM, FourOverSixConfig

model = AutoModelForCausalLM.from_pretrained(
    "Qwen/Qwen3-8B",
    device_map="auto",
    quantization_config=FourOverSixConfig(),
)
```

NVFP4 양자화 과정에서 일반적으로 사용되는 다양한 양자화 옵션을 지원합니다. 여기에는 [사전 인쇄본](https://arxiv.org/abs/2512.02010)에 설명된 무작위 하다마드 변환, 2D 블록 스케일링, 전치 입력, 확률적 반올림 등이 포함됩니다. 이러한 옵션은 위에서 전달한 `FourOverSixConfig`에서 적절한 옵션을 설정하여 사용할 수 있습니다. 아래에 표시된 바와 같이, `module_config_overrides`를 설정하여 개별 레이어에 사용자 정의 양자화 옵션을 지정하거나, `modules_to_not_convert`를 설정하여 양자화에서 제외할 수 있습니다.

## 학습

양자화된 선형 레이어에는 backward pass 구현이 포함되어 있어, 소수의 수정만으로도 많은 모델을 추가로 학습할 수 있습니다. `keep_master_weights`를 `True`로 설정하고, 필요에 따라 양자화에서 레이어를 제외하세요(네트워크의 마지막 몇 개 레이어를 높은 정밀도로 유지하는 것이 종종 중요합니다):

```python
from transformers import AutoModelForCausalLM, FourOverSixConfig

model = AutoModelForCausalLM.from_pretrained(
    "Qwen/Qwen3-8B",
    device_map="auto",
    quantization_config=FourOverSixConfig(
        keep_master_weights=True,
        modules_to_not_convert=[
            "lm_head",
            "model.layers.34.self_attn.q_proj",
            "model.layers.34.self_attn.k_proj",
            "model.layers.34.self_attn.v_proj",
            # Add more layers here, e.g. self_attn.o_proj, MLP layers
        ],
    ),
)
```

