Quantization details
- Scheme — W4A16 — INT4 asymmetric weights, group size 32 (BF16 scale + INT4 zero-point), BF16 activations, stored as compressed-tensors
pack-quantized.
- Kept in BF16 — vision tower, audio tower, vision/audio projections, token embeddings (tied with lm_head), the per-layer embedding table (
embed_tokens_per_layer), and all norms. These stay unquantized to preserve quality — about 64% of all parameters in this build.
- Tokenizer /
chat_template / processor_config / generation_config are byte-identical to the original, including Google's July-2026 corrected chat_template. config.json is the original plus a quantization_config block.
Quantization method — PTQ (AWQ / RTN) vs QAT
This model is a post-training quantization (PTQ): the released BF16 weights are quantized after training, with no retraining. How close each build stays to BF16 is reported in the measured sections where available.
- RTN (round-to-nearest) — weights are simply rounded to the quantization grid with per-group scales; no calibration data. Fastest, but outliers aren't compensated, so 4-bit fidelity is the lowest. Not used on purpose for any build published here; the first upload of this repo was effectively RTN by accident (see the revision note above).
- AWQ (activation-aware weight quantization) — a small calibration set finds the weight channels that multiply the largest activations; those salient channels are protected by per-channel scaling (the scale is folded into adjacent layers, e.g. LayerNorm → q/k/v) before rounding. Still PTQ (no gradient, seconds–minutes), and far better than RTN at 4-bit.
- QAT (quantization-aware training) — the model is fine-tuned with quantization simulated in the forward pass, so the weights adapt to quantization error via gradient descent. Best low-bit fidelity, but needs the full training stack, data and GPU hours. Google ships separate Gemma QAT checkpoints; this repo is not one of them.
Rough low-bit fidelity: QAT ≥ AWQ > RTN. Cost: QAT ≫ AWQ > RTN.
This build: AWQ — a calibration-based PTQ (128-sample calibration, no gradient).
Evaluation (measured)
Fidelity to the BF16 original on an internal mixed English/Korean set (100 prompts: the BF16 original's greedy answers, scored under each build with the same prompts and scoring code). This build was measured on the rebuilt files with vLLM 0.32 on 2026-11-01; the BF16 reference column was measured on 2026-10-12.
Table with columns: Metric, This model, BF16 original| Metric | This model | BF16 original |
|---|
| Perplexity (lower = closer) | 1.3327 | 1.1833 (+12.6%) |
| Top-1 next-token agreement | 89.8% | 99.0% |
These measure fidelity to the base model, not absolute task scores.
Benchmarks (measured)
Every column was measured with the same harness and settings — lm-evaluation-harness on vLLM, greedy, few-shot completion (no chat template). Percentages are recovery vs. the BF16 original.
Table with columns: Benchmark, BF16 (original), FP8-dynamic, AWQ-8bit, NVFP4A16, NVFP4, AWQ-4bit (this repo)| Benchmark | BF16 (original) | FP8-dynamic | AWQ-8bit | NVFP4A16 | NVFP4 | AWQ-4bit (this repo) |
|---|
| MMLU (5-shot) | 55.97 | 55.49 (99.1%) | 56.25 (100.5%) | 53.40 (95.4%) | 50.06 (89.4%) | 54.57 (97.5%) |
| GSM8K (5-shot, strict) | 51.63 | 48.82 (94.6%) | 53.98 (104.6%) | 48.52 (94.0%) | 38.13 (73.9%) | 40.03 (77.5%) |
| ARC-Challenge (0-shot) | 49.57 | 48.04 (96.9%) | 49.23 (99.3%) | 48.63 (98.1%) | 45.48 (91.7%) | 44.80 (90.4%) |
| Winogrande (5-shot) | 62.59 | 60.77 (97.1%) | 62.51 (99.9%) | 61.25 (97.9%) | 58.88 (94.1%) | 60.54 (96.7%) |
| KMMLU (5-shot, direct) | 40.72 | 40.70 (100.0%) | 40.69 (99.9%) | 39.51 (97.0%) | 37.95 (93.2%) | 39.45 (96.9%) |
| HAE-RAE (0-shot) | 62.14 | 62.05 (99.9%) | 62.24 (100.1%) | 59.67 (96.0%) | 57.01 (91.7%) | 60.59 (97.5%) |
| Average | 53.77 | 52.65 (97.9%) | 54.15 (100.7%) | 51.83 (96.4%) | 47.92 (89.1%) | 50.00 (93.0%) |
⚠️ Note: average recovery is 93.0% — noticeable degradation at this precision; prefer an 8-bit build if quality matters most.
Requirements
Table | |
|---|
| Runtime | vLLM — the architecture is in vLLM ≥ 0.19.0; tested here with vLLM 0.32.0. |
| vLLM install | vLLM 0.32 itself needs Python 3.11–3.14, torch 2.13 (CUDA 13.0 build, so an NVIDIA driver with CUDA 13 support), transformers ≥5.16.1,<5.20 and compressed-tensors 0.17.0 (both pinned by vLLM; 0.17.0 reads this checkpoint, which was saved with 0.19.0 — do not upgrade it separately). |
| GPU | NVIDIA Turing (sm75) or newer — weight-only INT, no special tensor cores needed. V100 (sm70) is not supported. (Kernel choice per GPU from vLLM 0.32's selection code; only B200 was run here.) |
| Memory | Weights: 7.6 GB. Add KV cache (grows with context length × concurrent requests) and a few GB for activations / CUDA graphs; use --tensor-parallel-size N when the weights do not fit one GPU. |
| Transformers (without vLLM) | transformers>=5.5.2 (5.5.0/5.5.1 cannot run the KV-shared layers). |
| trust_remote_code | not needed |
Usage (vLLM)
vllm serve axteam/gemma-4-E2B-it-AWQ-4bit
from vllm import LLM, SamplingParams llm = LLM(model="axteam/gemma-4-E2B-it-AWQ-4bit")params = SamplingParams(temperature=1.0, top_p=0.95, top_k=64, max_tokens=1024)out = llm.chat( [{"role": "user", "content": "Write a short joke about saving RAM."}], params,)print(out[0].outputs[0].text)
Recommended sampling (per Google): temperature=1.0, top_p=0.95, top_k=64.
Thinking mode: add the <|think|> token at the start of the system prompt to enable step-by-step reasoning.
Reducing KV-cache memory (optional, serve-time)
The KV cache is unquantized (BF16) here — the standard for quantized checkpoints
(RedHatAI, NVIDIA, etc. ship the same way). KV-cache precision is a runtime choice,
independent of the weight quantization above. For long context or large batches you can
roughly halve KV-cache memory with FP8:
vllm serve axteam/gemma-4-E2B-it-AWQ-4bit --kv-cache-dtype fp8
--kv-cache-dtype accepts auto (default, BF16), fp8 / fp8_e4m3, fp8_e5m2.
For a GGUF build the llama.cpp equivalent is --cache-type-k q8_0 --cache-type-v q8_0.
License
This is a quantized derivative of Google's Gemma 4. Use is governed by the
Gemma 4 license. All original
weights, tokenizer, and chat template belong to Google DeepMind.
한국어 요약
google/gemma-4-E2B-it의 AWQ INT4 (W4A16) 양자화 빌드 · 제작 axteam
개요
Table with columns: 항목, 내용| 항목 | 내용 |
|---|
| 원본 모델 | google/gemma-4-E2B-it |
| 양자화 방식 | AWQ INT4 (W4A16) |
| 저장 형식 | compressed-tensors pack-quantized |
| 모델 구조 | Gemma 4 · Dense |
| 용량 | 약 7.6 GB |
| 보정 데이터 | 샘플 128개 (한국어 위주, thinking 모드 답변 없음) |
양자화 상세
- 가중치: INT4 비대칭, 그룹 크기 32 (BF16 스케일 + INT4 영점)
- 활성화: BF16 (양자화하지 않음)
- 양자화 절차: PTQ(학습 후 양자화, 재학습 없음), AWQ 방식 — 보정 데이터로 활성화가 큰 가중치 채널을 찾아 채널별 스케일로 보호한 뒤 INT4로 반올림
- BF16 유지: 비전 타워, 오디오 타워, 비전·오디오 투영층, 토큰 임베딩(LM 헤드와 공유), 층별 임베딩 표(
embed_tokens_per_layer), 모든 정규화층 — 전체 파라미터의 약 64%
- 원본 파일: 토크나이저·chat template(Google의 2026년 7월 수정본)·processor·generation config를 바이트 단위로 그대로 사용,
config.json은 원본에 quantization_config 블록만 추가
품질 (실측)
- 원본 대비 충실도: PPL 1.3327 (원본 1.1833, +12.6%, 낮을수록 원본에 가까움), 다음 토큰 top-1 일치율 89.8% (원본 자체 기준값 99.0%) — 내부 영어·한국어 혼합 프롬프트 100개, 원본(BF16)의 greedy 답변을 기준 텍스트로 측정
- 벤치마크 평균: 50.00 (원본 53.77, 93.0%) — MMLU·GSM8K·ARC-Challenge·Winogrande·KMMLU·HAE-RAE 6종 평균, lm-evaluation-harness + vLLM, chat template 없는 few-shot·greedy, 모든 빌드를 같은 설정으로 측정
- 한국어 벤치마크: KMMLU 39.45 (원본 40.72, 96.9%) · HAE-RAE 60.59 (원본 62.14, 97.5%)
- 과제별 편차: GSM8K 40.03 (원본 51.63, 77.5%) — 평균에 가려지는 차이, 과제별 값은 위 영어 본문 Benchmarks 표
- 주의: ⚠️ 이 정밀도에서 품질 저하가 뚜렷함 (PPL +12.6%, 벤치마크 평균 원본 대비 93.0%) — 품질이 중요하면 8비트(FP8·AWQ-8bit) 빌드 권장
요구사항
- 실행 엔진: vLLM 0.19.0 이상(이 구조를 지원하는 첫 버전), 이 빌드는 vLLM 0.32.0에서 실행 확인
- vLLM 0.32 설치 조건: Python 3.11~3.14, torch 2.13(CUDA 13.0 빌드, CUDA 13 지원 드라이버 필요), transformers 5.16.1 이상 5.20 미만, compressed-tensors 0.17.0 — transformers·compressed-tensors는 vLLM이 버전을 고정하므로 compressed-tensors를 따로 업그레이드하지 말 것 (이 체크포인트는 0.19.0으로 저장됐지만 0.17.0에서도 로드됨)
- GPU: NVIDIA Turing(sm75) 이상, V100(sm70) 미지원 — 가중치 전용 정수 형식이라 FP8·FP4 전용 텐서코어 불필요 (GPU별 지원 여부는 vLLM 0.32 커널 선택 코드 기준, 실제 실행은 B200에서만 확인)
- 메모리: 가중치 7.6 GB + KV 캐시(컨텍스트 길이 × 동시 요청 수에 비례) + 활성화·CUDA graph용 수 GB — GPU 한 장에 다 들어가지 않으면
--tensor-parallel-size N으로 분산
- Transformers로 직접 사용: transformers 5.5.2 이상 (5.5.0·5.5.1은 KV 공유 층 실행 불가)
- trust_remote_code: 불필요
사용법
- 서버 실행:
vllm serve axteam/gemma-4-E2B-it-AWQ-4bit
- Python:
LLM(model="axteam/gemma-4-E2B-it-AWQ-4bit").chat(...) — 전체 예시는 위 영어 본문 'Usage (vLLM)' 절 참고
- 권장 샘플링:
temperature=1.0, top_p=0.95, top_k=64 (Google 권장값)
- thinking 모드: 기본 꺼짐 — 켜려면 시스템 프롬프트 맨 앞에
<|think|> 토큰 추가
- KV 캐시 절감(선택):
vllm serve에 --kv-cache-dtype fp8 추가 — 기본 BF16인 KV 캐시를 FP8로 저장해 KV 캐시 메모리를 약 절반으로 줄임 (긴 컨텍스트·동시 요청이 많을 때 유리, 가중치 양자화와 별개인 실행 옵션)
참고
- 수정 이력 (2026-11-01, 재양자화): 어텐션 입력(q/k/v, KV 공유 층은 q만)·MLP 입력(gate/up)·down 투영 입력에 AWQ 스무딩을 실제로 적용, 보정 샘플 128개 (스무딩된 norm이 원본과 달라졌고 모든 스무딩 짝을 0이 아닌 보정 오차로 탐색했음을 확인) — 이전 업로드의 결함: 첫 번째 업로드는 AWQ 스무딩이 실제로 적용되지 않아 사실상 단순 반올림(RTN) — 2026-11-01 09:57:52 UTC(리비전
a412d9b) 이전에 받았다면 다시 받을 것, 품질 항목의 벤치마크·충실도는 재양자화 빌드로 잰 값
라이선스
- 라이선스: Apache-2.0 (Gemma 4 라이선스 안내) — 원본 모델의 라이선스를 그대로 따름
- 권리: 원본 가중치·토크나이저·chat template은 Google DeepMind 소유, 이 리포는 양자화 파생물