--- quantized_by: ubergarm pipeline_tag: text-generation base_model: zai-org/GLM-5.1 base_model_relation: quantized license: mit tags: - imatrix - conversational - glm_moe_dsa - ik_llama.cpp language: - en - zh --- ## `ik_llama.cpp` imatrix Quantizations of zai-org/GLM-5.1 *NOTE* `ik_llama.cpp` can also run your existing GGUFs from bartowski, unsloth, mradermacher, etc if you want to try it out before downloading my quants. Some of ik's new quants are supported with [Nexesenex/croco.cpp](https://github.com/Nexesenex/croco.cpp) fork of KoboldCPP with Windows builds. Also check for [ik_llama.cpp windows builds by Thireus here.](https://github.com/Thireus/ik_llama.cpp/releases). These quants provide best in class perplexity for the given memory footprint. ## Big Thanks Shout out to Wendell and the **Level1Techs** crew, the community [Forums](https://forum.level1techs.com/t/deepseek-deep-dive-r1-at-home/225826), [YouTube Channel](https://www.youtube.com/@Level1Techs)! **BIG thanks** for providing **BIG hardware** expertise and access to run these experiments and make these great quants available to the community!!! Also thanks to all the folks in the quanting and inferencing community on [BeaverAI Club Discord](https://huggingface.co/BeaverAI) and on [r/LocalLLaMA](https://www.reddit.com/r/LocalLLaMA/) for tips and tricks helping each other run, test, and benchmark all the fun new models! Thanks to huggingface for hosting all these big quants! Finally, I *really* appreciate the support from [aifoundry.org](https://aifoundry.org) so check out their open source RISC-V based solutions! ## Quant Collection Perplexity computed against *wiki.test.raw*. (lower is "better") ![Perplexity Chart](images/perplexity.png "Chart showing Perplexity vs Model Size.") These two are just test quants for baseline perplexity comparison and not available for download here: * `BF16` 1404.406 GiB (16.003 BPW) - PPL over 565 chunks for n_ctx=512 = 2.7257 +/- 0.01497 * `Q8_0` 746.302 GiB (8.504 BPW) - PPL over 565 chunks for n_ctx=512 = 2.7257 +/- 0.01498 *NOTE*: The first split file is much smaller on purpose to only contain metadata, its fine! ## smol-IQ4_K 405.502 GiB (4.621 BPW) PPL over 565 chunks for n_ctx=512 = 2.7547 +/- 0.01516 NOTE: Actual used RAM/VRAM will be about ~397.8 GiB despite larger model size reported due to unused blk.78/indexer/nextn tensors.
👈 Secret Recipe ```bash #!/usr/bin/env bash custom=" # 79 Repeating Layers [0-78] ## Attention [0-78] blk\..*\.attn_k_b\.weight=q8_0 blk\..*\.attn_v_b\.weight=q8_0 blk\..*\.attn_kv_a_mqa\.weight=q8_0 blk\..*\.attn_q_a\.weight=q8_0 blk\..*\.attn_q_b\.weight=q8_0 blk\..*\.attn_output\.weight=q8_0 # First 3 Dense Layers [0-2] blk\..*\.ffn_down\.weight=iq6_k blk\..*\.ffn_(gate|up)\.weight=iq6_k # Shared Expert Layers [3-78] blk\..*\.ffn_down_shexp\.weight=iq6_k blk\..*\.ffn_(gate|up)_shexp\.weight=iq6_k # Routed Experts Layers [3-78] # NOTE: blk.78.* NOT implemented at time of quantizing so no imatrix data available blk\.(78)\.ffn_down_exps\.weight=iq6_k blk\.(78)\.ffn_(gate|up)_exps\.weight=iq6_k blk\..*\.ffn_down_exps\.weight=iq4_k blk\..*\.ffn_(gate|up)_exps\.weight=iq4_k # Lightning indexer tensors [0-78] # NOTE: indexer.* NOT implemented at time of quantizing so no imatrix data available blk\..*\.indexer\.proj\.weight=q8_0 blk\..*\.indexer\.attn_k\.weight=q8_0 blk\..*\.indexer\.attn_q_b\.weight=q8_0 # NextN MTP Layer [78] # NOTE: nextn.* NOT implemented at time of quantizing so no imatrix data available blk\..*\.nextn\.eh_proj\.weight=q8_0 # Non-Repeating Layers token_embd\.weight=iq6_k output\.weight=iq6_k " custom=$( echo "$custom" | grep -v '^#' | \ sed -Ez 's:\n+:,:g;s:,$::;s:^,::' ) numactl -N ${SOCKET} -m ${SOCKET} \ ./build/bin/llama-quantize \ --custom-q "$custom" \ --imatrix /mnt/data/models/ubergarm/GLM-5.1-GGUF/imatrix-GLM-5.1-BF16.dat \ /mnt/data/models/ubergarm/GLM-5.1-GGUF/GLM-256x22B-5.1-BF16-00001-of-00033.gguf \ /mnt/data/models/ubergarm/GLM-5.1-GGUF/GLM-5.1-smol-IQ4_K.gguf \ IQ4_K \ 128 ```
## IQ3_KS 320.216 GiB (3.649 BPW) PPL over 565 chunks for n_ctx=512 = 2.8780 +/- 0.01609 NOTE: Actual used RAM/VRAM will be about 314.07 GiB despite larger model size reported due to unused blk.78/indexer/nextn tensors.
👈 Secret Recipe ```bash #!/usr/bin/env bash custom=" # 79 Repeating Layers [0-78] ## Attention [0-78] blk\..*\.attn_k_b\.weight=q8_0 blk\..*\.attn_v_b\.weight=q8_0 blk\..*\.attn_kv_a_mqa\.weight=q8_0 blk\..*\.attn_q_a\.weight=iq6_k blk\..*\.attn_q_b\.weight=iq6_k blk\..*\.attn_output\.weight=iq6_k # First 3 Dense Layers [0-2] blk\..*\.ffn_down\.weight=iq5_ks blk\..*\.ffn_(gate|up)\.weight=iq5_ks # Shared Expert Layers [3-78] blk\..*\.ffn_down_shexp\.weight=iq5_ks blk\..*\.ffn_(gate|up)_shexp\.weight=iq5_ks # Routed Experts Layers [3-78] # NOTE: blk.78.* NOT implemented at time of quantizing so no imatrix data available blk\.(78)\.ffn_down_exps\.weight=iq5_ks blk\.(78)\.ffn_(gate|up)_exps\.weight=iq5_ks blk\..*\.ffn_down_exps\.weight=iq4_ks blk\..*\.ffn_(gate|up)_exps\.weight=iq3_ks # Lightning indexer tensors [0-78] # NOTE: indexer.* NOT implemented at time of quantizing so no imatrix data available blk\..*\.indexer\.proj\.weight=q8_0 blk\..*\.indexer\.attn_k\.weight=q8_0 blk\..*\.indexer\.attn_q_b\.weight=iq6_k # NextN MTP Layer [78] # NOTE: nextn.* NOT implemented at time of quantizing so no imatrix data available blk\..*\.nextn\.eh_proj\.weight=q8_0 # Non-Repeating Layers token_embd\.weight=iq4_k output\.weight=iq6_k " custom=$( echo "$custom" | grep -v '^#' | \ sed -Ez 's:\n+:,:g;s:,$::;s:^,::' ) numactl -N ${SOCKET} -m ${SOCKET} \ ./build/bin/llama-quantize \ --custom-q "$custom" \ --imatrix /mnt/data/models/ubergarm/GLM-5.1-GGUF/imatrix-GLM-5.1-BF16.dat \ /mnt/data/models/ubergarm/GLM-5.1-GGUF/GLM-256x22B-5.1-BF16-00001-of-00033.gguf \ /mnt/data/models/ubergarm/GLM-5.1-GGUF/GLM-5.1-IQ3_KS.gguf \ IQ3_KS \ 128 ```
## IQ2_KL 261.988 GiB (2.985 BPW) PPL over 565 chunks for n_ctx=512 = 3.1275 +/- 0.01759 NOTE: Actual used RAM/VRAM will be about 255.84 GiB despite larger model size reported due to unused blk.78/indexer/nextn tensors.
👈 Secret Recipe ```bash #!/usr/bin/env bash custom=" # 79 Repeating Layers [0-78] ## Attention [0-78] blk\..*\.attn_k_b\.weight=q8_0 blk\..*\.attn_v_b\.weight=q8_0 blk\..*\.attn_kv_a_mqa\.weight=q8_0 blk\..*\.attn_q_a\.weight=iq6_k blk\..*\.attn_q_b\.weight=iq6_k blk\..*\.attn_output\.weight=iq6_k # First 3 Dense Layers [0-2] blk\..*\.ffn_down\.weight=iq5_ks blk\..*\.ffn_(gate|up)\.weight=iq5_ks # Shared Expert Layers [3-78] blk\..*\.ffn_down_shexp\.weight=iq5_ks blk\..*\.ffn_(gate|up)_shexp\.weight=iq5_ks # Routed Experts Layers [3-78] # NOTE: blk.78.* NOT implemented at time of quantizing so no imatrix data available blk\.(78)\.ffn_down_exps\.weight=iq5_ks blk\.(78)\.ffn_(gate|up)_exps\.weight=iq5_ks blk\..*\.ffn_down_exps\.weight=iq3_ks blk\..*\.ffn_(gate|up)_exps\.weight=iq2_kl # Lightning indexer tensors [0-78] # NOTE: indexer.* NOT implemented at time of quantizing so no imatrix data available blk\..*\.indexer\.proj\.weight=q8_0 blk\..*\.indexer\.attn_k\.weight=q8_0 blk\..*\.indexer\.attn_q_b\.weight=iq6_k # NextN MTP Layer [78] # NOTE: nextn.* NOT implemented at time of quantizing so no imatrix data available blk\..*\.nextn\.eh_proj\.weight=q8_0 # Non-Repeating Layers token_embd\.weight=iq4_k output\.weight=iq6_k " custom=$( echo "$custom" | grep -v '^#' | \ sed -Ez 's:\n+:,:g;s:,$::;s:^,::' ) numactl -N ${SOCKET} -m ${SOCKET} \ ./build/bin/llama-quantize \ --custom-q "$custom" \ --imatrix /mnt/data/models/ubergarm/GLM-5.1-GGUF/imatrix-GLM-5.1-BF16.dat \ /mnt/data/models/ubergarm/GLM-5.1-GGUF/GLM-256x22B-5.1-BF16-00001-of-00033.gguf \ /mnt/data/models/ubergarm/GLM-5.1-GGUF/GLM-5.1-IQ2_KL.gguf \ IQ2_KL \ 128 ```
## smol-IQ2_KS 205.738 GiB (2.344 BPW) PPL over 565 chunks for n_ctx=512 = 3.8818 +/- 0.02300 NOTE: Actual used RAM/VRAM will be about 200 GiB despite larger model size reported due to unused blk.78/indexer/nextn tensors.
👈 Secret Recipe ```bash #!/usr/bin/env bash custom=" # 79 Repeating Layers [0-78] ## Attention [0-78] blk\..*\.attn_k_b\.weight=q8_0 blk\..*\.attn_v_b\.weight=q8_0 blk\..*\.attn_kv_a_mqa\.weight=q8_0 blk\..*\.attn_q_a\.weight=iq6_k blk\..*\.attn_q_b\.weight=iq6_k blk\..*\.attn_output\.weight=iq6_k # First 3 Dense Layers [0-2] blk\..*\.ffn_down\.weight=iq5_ks blk\..*\.ffn_(gate|up)\.weight=iq5_ks # Shared Expert Layers [3-78] blk\..*\.ffn_down_shexp\.weight=iq5_ks blk\..*\.ffn_(gate|up)_shexp\.weight=iq5_ks # Routed Experts Layers [3-78] # NOTE: blk.78.* NOT implemented at time of quantizing so no imatrix data available blk\.(78)\.ffn_down_exps\.weight=iq5_ks blk\.(78)\.ffn_(gate|up)_exps\.weight=iq5_ks blk\..*\.ffn_down_exps\.weight=iq2_ks blk\..*\.ffn_(gate|up)_exps\.weight=iq2_ks # Lightning indexer tensors [0-78] # NOTE: indexer.* NOT implemented at time of quantizing so no imatrix data available blk\..*\.indexer\.proj\.weight=q8_0 blk\..*\.indexer\.attn_k\.weight=q8_0 blk\..*\.indexer\.attn_q_b\.weight=iq6_k # NextN MTP Layer [78] # NOTE: nextn.* NOT implemented at time of quantizing so no imatrix data available blk\..*\.nextn\.eh_proj\.weight=q8_0 # Non-Repeating Layers token_embd\.weight=iq4_k output\.weight=iq6_k " custom=$( echo "$custom" | grep -v '^#' | \ sed -Ez 's:\n+:,:g;s:,$::;s:^,::' ) numactl -N ${SOCKET} -m ${SOCKET} \ ./build/bin/llama-quantize \ --custom-q "$custom" \ --imatrix /mnt/data/models/ubergarm/GLM-5.1-GGUF/imatrix-GLM-5.1-BF16.dat \ /mnt/data/models/ubergarm/GLM-5.1-GGUF/GLM-256x22B-5.1-BF16-00001-of-00033.gguf \ /mnt/data/models/ubergarm/GLM-5.1-GGUF/GLM-5.1-smol-IQ2_KS.gguf \ IQ2_KS \ 128 ```
## smol-IQ1_KT 169.190 GiB (1.928 BPW) PPL over 565 chunks for n_ctx=512 = 4.6654 +/- 0.02830 NOTE: Actual used RAM/VRAM will be about 163.046 GiB despite larger model size reported due to unused blk.78/indexer/nextn tensors.
👈 Secret Recipe ```bash #!/usr/bin/env bash custom=" # 79 Repeating Layers [0-78] ## Attention [0-78] blk\..*\.attn_k_b\.weight=q8_0 blk\..*\.attn_v_b\.weight=q8_0 blk\..*\.attn_kv_a_mqa\.weight=q8_0 blk\..*\.attn_q_a\.weight=iq6_k blk\..*\.attn_q_b\.weight=iq6_k blk\..*\.attn_output\.weight=iq6_k # First 3 Dense Layers [0-2] blk\..*\.ffn_down\.weight=iq5_ks blk\..*\.ffn_(gate|up)\.weight=iq5_ks # Shared Expert Layers [3-78] blk\..*\.ffn_down_shexp\.weight=iq5_ks blk\..*\.ffn_(gate|up)_shexp\.weight=iq5_ks # Routed Experts Layers [3-78] # NOTE: blk.78.* NOT implemented at time of quantizing so no imatrix data available blk\.(78)\.ffn_down_exps\.weight=iq5_ks blk\.(78)\.ffn_(gate|up)_exps\.weight=iq5_ks blk\..*\.ffn_down_exps\.weight=iq1_kt blk\..*\.ffn_(gate|up)_exps\.weight=iq1_kt # Lightning indexer tensors [0-78] # NOTE: indexer.* NOT implemented at time of quantizing so no imatrix data available blk\..*\.indexer\.proj\.weight=q8_0 blk\..*\.indexer\.attn_k\.weight=q8_0 blk\..*\.indexer\.attn_q_b\.weight=iq6_k # NextN MTP Layer [78] # NOTE: nextn.* NOT implemented at time of quantizing so no imatrix data available blk\..*\.nextn\.eh_proj\.weight=q8_0 # Non-Repeating Layers token_embd\.weight=iq4_k output\.weight=iq6_k " custom=$( echo "$custom" | grep -v '^#' | \ sed -Ez 's:\n+:,:g;s:,$::;s:^,::' ) numactl -N ${SOCKET} -m ${SOCKET} \ ./build/bin/llama-quantize \ --custom-q "$custom" \ --imatrix /mnt/data/models/ubergarm/GLM-5.1-GGUF/imatrix-GLM-5.1-BF16.dat \ /mnt/data/models/ubergarm/GLM-5.1-GGUF/GLM-256x22B-5.1-BF16-00001-of-00033.gguf /mnt/data/models/ubergarm/GLM-5.1-GGUF/GLM-5.1-smol-IQ1_KT.gguf \ IQ1_KT \ 128 ```
## Quick Start ```bash # Clone and checkout $ git clone https://github.com/ikawrakow/ik_llama.cpp $ cd ik_llama.cpp # Build for hybrid CPU+CUDA $ cmake -B build -DCMAKE_BUILD_TYPE=Release -DGGML_CUDA=ON $ cmake --build build --config Release -j $(nproc) # Download Quants $ pip install huggingface_hub $ hf download --local-dir ./GLM-5.1-GGUF/ --include=smol-IQ2_KS/*.gguf ubergarm/GLM-5.1-GGUF # Hybrid CPU and Single GPU # *NOTE* -fit might work on ik_llama.cpp now so give it a try ./build/bin/llama-server \ --model "$model"\ --alias ubergarm/GLM-5.1 \ -muge \ --merge-qkv \ --ctx-size 131072 \ -ctk f16 \ -mla 3 \ -amb 512 \ -ngl 999 \ --n-cpu-moe 50 \ --parallel 1 \ --threads 96 \ --threads-batch 128 \ --host 127.0.0.1 \ --port 8080 \ --no-mmap \ -cram 8192 \ --jinja # CPU-Only numactl -N ${SOCKET} -m ${SOCKET} \ ./build/bin/llama-server \ --model "$model"\ --alias ubergarm/GLM-5.1 \ -muge \ --merge-qkv \ --ctx-size 131072 \ -ctk q8_0 \ -mla 3 \ --parallel 1 \ --threads 96 \ --threads-batch 128 \ --numa numactl \ --host 127.0.0.1 \ --port 8080 \ --no-mmap \ -cram 8192 \ --jinja ``` You can also bring your own template with `--chat-template-file myTemplate.jinja`. Adjust caching with `-cram ` No `-sm graph` support as of today for MLA models like DeepSeek, Kimi, and both GLM-5s. ## QAT Speculation Assuming GLM-5.1 uses similar training as GLM-5 including INT4 QAT, there may be some tweaks to the quantization algorithm to match that target better. > #### 2.4.3 INT4 Quantization-aware training > To provide better accuracy at low-precision, we apply INT4 QAT in the SFT stage. Moreover, to further mitigate the training time overhead, we have developed a quantization kernel applicable to both training and offline weight quantization, which ensures bitwise-identical behavior between training and inference. > https://arxiv.org/html/2602.15763v2 jukofyork mentioned useful links for details and experimental modified `q4_K` quantization implementation patch: * https://github.com/zai-org/GLM-5/issues/21 * https://github.com/ywhhh/vllm-ascend-afd/blob/main/vllm_ascend/quantization/w4a8_dynamic.py * https://github.com/ggml-org/llama.cpp/pull/17064#issuecomment-3528891329 * https://github.com/ggml-org/llama.cpp/pull/19460#issuecomment-4200617220 I may try that patch to `quantize_row_q4_0_ref()` to change `const float d = max / -8;` to `-7` similar to how we did Kimi-K2's `Q4_X` quantization type without imatrix on routed experts? Or try jukofyork's modified q4_K? I'll play around with some low 4ish BPW quants. ## References * [ik_llama.cpp](https://github.com/ikawrakow/ik_llama.cpp) * [Getting Started Guide (already out of date lol)](https://github.com/ikawrakow/ik_llama.cpp/discussions/258) * [ubergarm-imatrix-calibration-corpus-v02.txt](https://gist.github.com/ubergarm/edfeb3ff9c6ec8b49e88cdf627b0711a?permalink_comment_id=5682584#gistcomment-5682584)