파인그레인드 FP8

파인그레인드 FP8 (Fine-grained FP8)

Fine-grained FP8 양자화는 가중치와 활성화를 FP8로 양자화합니다. 이 방식은 DeepSeek-V3와 DeepSeek-R1 같은 대형 모델을 지원하는 데 쓰입니다.

출처: 문서

본문

가중치는 2D 블록(weight_block_size=(128, 128))마다 8비트로 양자화되고, 활성화는 토큰별 그룹마다 8비트로 양자화됩니다. 그룹 값은 입력 채널의 가중치와 일치합니다(기본 128).

[!TIP] Compute Capability>=9 (H100) 이상의 GPU를 사용해야 하며, GPU의 CUDA 버전과 호환되는 PyTorch 버전을 설치해야 합니다.

Accelerate를 설치하고 PyTorch를 최신 버전으로 업그레이드하세요.

pip install --upgrade accelerate torch

FineGrainedFP8Config 클래스를 만들고 from_pretrained()에 전달하면 모델을 양자화할 수 있습니다. 가중치는 실제 저장된 데이터 타입과 무관하게 기본적으로 전체 정밀도(torch.float32)로 로드됩니다. dtype="auto"를 설정하면 모델의 config.json 파일에 정의된 데이터 타입으로 가중치를 로드하므로 메모리에 가장 효율적인 데이터 타입을 자동으로 사용할 수 있습니다.

from transformers import FineGrainedFP8Config, AutoModelForCausalLM, AutoTokenizer

model_name = "meta-llama/Meta-Llama-3-8B"
quantization_config = FineGrainedFP8Config()
quantized_model = AutoModelForCausalLM.from_pretrained(model_name, dtype="auto", device_map="auto", quantization_config=quantization_config)

tokenizer = AutoTokenizer.from_pretrained(model_name)
input_text = "What are we having for dinner?"
input_ids = tokenizer(input_text, return_tensors="pt").to(quantized_model.device.type)

output = quantized_model.generate(**input_ids, max_new_tokens=10)
print(tokenizer.decode(output[0], skip_special_tokens=True))

save_pretrained()를 사용해 양자화된 모델을 저장하고 from_pretrained()로 다시 로드할 수 있습니다.

quant_path = "/path/to/save/quantized/model"
quantized_model.save_pretrained(quant_path)
model = AutoModelForCausalLM.from_pretrained(quant_path, device_map="auto")

DeepGEMM fast path

Hopper(SM90+)와 Blackwell(SM100+) GPU에서 weight_block_size=(128, 128)이고 activation_scheme="dynamic"일 때 모든 FP8 linear는 자동으로 kernels-community/deep-gemm에서 제공하는 DeepGEMM 커널로 디스패치됩니다. DeepGEMM은 Triton 폴백보다 3~6배 빠릅니다. 이를 활성화하려면 kernels 패키지를 설치하거나 업그레이드하세요.

pip install -U kernels

DeepGEMM은 시스템 nvcc로 커널을 JIT 컴파일하므로 전체 CUDA 툴킷이 설치되어 있어야 합니다. 런타임만 설치한 경우(CUDA 라이브러리만 있고 nvcc가 없는 경우)에는 동작하지 않습니다. 최소 툴킷 버전은 하드웨어에 따라 다릅니다. Hopper(SM90)에서는 12.3 이상, Blackwell(SM100)에서는 12.9 이상입니다.

Transformers는 CUDA_HOME, CUDA_PATH, PATH에 있는 nvcc, /usr/local/cuda 순서로 툴킷을 찾습니다. nvcc가 발견되지 않으면 CUDA_HOME을 툴킷 루트로 설정하세요.

커널을 로드할 수 없으면(누락된 kernels, 지원되지 않는 GPU, CUDA 툴킷 없음, 또는 필수 버전보다 오래된 nvcc) Transformers는 경고를 한 번 로그로 남기고 Triton finegrained-fp8 커널로 폴백합니다. 정적 활성화 양자화는 항상 Triton 경로를 사용합니다.

DeepGEMM을 사용할 수 있어도 Triton 폴백을 강제하려면 TRANSFORMERS_DISABLE_DEEPGEMM_LINEAR=1을 설정하세요. 이는 FP8 linear 디스패치에만 영향을 주며 set_experts_implementation()으로 전환하는 "deepgemm" experts 백엔드에는 영향을 주지 않습니다.

MoE experts의 경우 DeepGEMM 경로는 옵트인(opt-in)입니다. 로드 시 experts_implementation="deepgemm"(Blackwell에서는 "deepgemm_megamoe")을 전달하면 expert matmul을 DeepGEMM으로 라우팅할 수 있습니다. 전체 옵션 목록은 Experts backends 가이드를 참고하세요.

UE8M0 scale format

DeepSeek V4 스타일 체크포인트는 FP8 가중치 스케일을 float32 대신 패킹된 float8_e8m0fnu 포맷으로 저장합니다. 이러한 체크포인트는 사전 양자화되어 있으며 양자화 설정에 scale_fmt="ue8m0"을 설정합니다. DeepGEMM과 Triton 커널 모두 UE8M0 스케일을 읽으므로 이 체크포인트는 어느 경로에서든 실행됩니다.

Blackwell(SM100+)에서 DeepGEMM experts 커널은 UE8M0 스케일만 지원합니다. 일반 float32 스케일(scale_fmt="float")의 체크포인트는 ValueError를 발생시킵니다. scale_fmt="ue8m0" 체크포인트를 사용하거나, float32 스케일을 직접 지원하는 grouped_mm 또는 batched_mm로 experts를 실행하세요. Hopper(SM90+)는 변환 없이 DeepGEMM 경로에서 float32 스케일을 지원합니다. experts 백엔드 옵션은 Experts backends 가이드를 참고하세요.

더 알아보기 (Learn more)