1. llama.cpp 量化 qwen-14b 到 int4
先安装 llama.cpp,编译安装会比较久。
git clone https://github.com/ggerganov/llama.cpp
cd llama.cpp && git pull && make clean && LLAMA_CUBLAS=1 make
pip install -r llama.cpp/requirements.txt
执行 hftogguf 转换,类型选择 f16,路径是llama.cpp/convert-hf-to-gguf.py
,这里指定输出路径为Qwen-14B-fp16
.
!python convert-hf-to-gguf.py /root/autodl-tmp/qwen/Qwen-14B --outfile Qwen-14B-fp16 --outtype f16
选择量化的方法,参考 quant llama2 和 llm-course. 具体来说:
- q2_k:在注意力机制的
vw
和前馈网络的w2
张量上使用Q4_K
,其他张量使用Q2_K
。 - q3_k_l:在注意力的
wv
、wo
和前馈网络的w2
张量上使用Q5_K
,其他使用Q3_K
。 - q3_k_m:在注意力的
wv
、wo
和前馈网络的w2
张量上使用Q4_K
,其他使用Q3_K
。 - q3_k_s:所有张量都使用
Q3_K
。 - q4_0:原始的 4 位量化方法。
- q4_1:比
q4_0
准确度更高,但不如q5_0
。然而推理速度比q5
模型更快。 - q4_k_m:一半的注意力
wv
和前馈网络的w2
张量使用Q6_K
,其他使用Q4_K
。 - q4_k_s:所有张量都使用
Q4_K
。 - q5_0:准确度更高,资源使用更多,推理速度更慢。
- q5_1:准确度、资源使用和推理速度都比
q5_0
更高、更多、更慢。 - q5_k_m:一半的注意力
wv
和前馈网络的w2
张量使用Q6_K
,其他使用Q5_K
。 - q5_k_s:所有张量都使用
Q5_K
。 - q6_k:所有张量都使用
Q8_K
。 - q8_0:与
float16
几乎无法区分。资源使用高且速度慢。不推荐大多数用户使用。
一般来说,我推荐使用 Q5_K_M
,因为它保留了模型的大部分性能。或者,如果你想节省一些内存,可以使用Q4_K_M
。通常,K_M
版本比 K_S
版本更好。我不推荐使用 Q2_K
或Q3_*
版本,因为它们会大幅降低模型性能。
QUANTIZATION_METHODS = ["q4_k_m", "q5_k_m"]
fp16 = "Qwen-14B-fp16"
for method in QUANTIZATION_METHODS:
qtype = f"Qwen-14B.{method.upper()}.gguf"
!./llama.cpp/quantize {fp16} {qtype} {method}
接下来我们就可以看到大量的 layer 被指定 method 量化了:
main: build = 2522 (a0e584de)
main: built with cc (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0 for x86_64-linux-gnu
main: quantizing '/root/autodl-tmp/Qwen-14B-fp16' to 'Qwen-14B.Q4_K_M.gguf' as Q4_K_M
llama_model_loader: loaded meta data with 17 key-value pairs and 323 tensors from /root/autodl-tmp/Qwen-14B-fp16 (version GGUF V3 (latest))
llama_model_loader: Dumping metadata keys/values. Note: KV overrides do not apply in this output.
llama_model_loader: - kv 0: general.architecture str = qwen
llama_model_loader: - kv 1: general.name str = Qwen
llama_model_loader: - kv 2: qwen.context_length u32 = 8192
llama_model_loader: - kv 3: qwen.block_count u32 = 40
llama_model_loader: - kv 4: qwen.embedding_length u32 = 5120
llama_model_loader: - kv 5: qwen.feed_forward_length u32 = 27392
llama_model_loader: - kv 6: qwen.rope.freq_base f32 = 10000.000000
llama_model_loader: - kv 7: qwen.rope.dimension_count u32 = 128
llama_model_loader: - kv 8: qwen.attention.head_count u32 = 40
llama_model_loader: - kv 9: qwen.attention.layer_norm_rms_epsilon f32 = 0.000001
llama_model_loader: - kv 10: tokenizer.ggml.model str = gpt2
llama_model_loader: - kv 11: tokenizer.ggml.tokens arr[str,152064] = ["!", "\"", "#", "$", "%", "&", "'", ...
llama_model_loader: - kv 12: tokenizer.ggml.token_type arr[i32,152064] = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, ...
llama_model_loader: - kv 13: tokenizer.ggml.merges arr[str,151387] = ["Ġ Ġ", "ĠĠ ĠĠ", "i n", "Ġ t",...
llama_model_loader: - kv 14: tokenizer.ggml.bos_token_id u32 = 151643
llama_model_loader: - kv 15: tokenizer.ggml.eos_token_id u32 = 151643
llama_model_loader: - kv 16: tokenizer.ggml.unknown_token_id u32 = 151643
llama_model_loader: - type f32: 121 tensors
llama_model_loader: - type f16: 202 tensors
llama_model_quantize_internal: meta size = 5950528 bytes
[ 1/ 323] blk.0.attn_qkv.bias - [15360, 1, 1, 1], type = f32, size = 0.059 MB
[ 2/ 323] blk.0.attn_qkv.weight - [ 5120, 15360, 1, 1], type = f16, converting to q5_K .. size = 150.00 MiB -> 51.56 MiB
[ 3/ 323] blk.0.attn_output.weight - [ 5120, 5120, 1, 1], type = f16, converting to q4_K .. size = 50.00 MiB -> 14.06 MiB
[ 4/ 323] blk.0.attn_norm.weight - [ 5120, 1, 1, 1], type = f32, size = 0.020 MB
[ 5/ 323] blk.0.ffn_norm.weight - [ 5120, 1, 1, 1], type = f32, size = 0.020 MB
[ 6/ 323] blk.0.ffn_up.weight - [ 5120, 13696, 1, 1], type = f16, converting to q4_K .. size = 133.75 MiB -> 37.62 MiB
[ 7/ 323] blk.0.ffn_gate.weight - [ 5120, 13696, 1, 1], type = f16, converting to q4_K .. size = 133.75 MiB -> 37.62 MiB
[ 8/ 323] token_embd.weight - [ 5120, 152064, 1, 1], type = f16, converting to q4_K .. size = 1485.00 MiB -> 417.66 MiB
[ 9/ 323] blk.0.ffn_down.weight - [13696, 5120, 1, 1], type = f16,
2. 推理
这里参考 llama.cpp 部署通义千问 Qwen-14B, 修改 examples/chat.sh
为:
./main -m /root/Qwen-14B.Q4_K_M.gguf -c 512 -b 1024 -n 256 --keep 48 \
--repeat_penalty 1.0 --color -i \
-r "User:" -f prompts/chat-with-bob.txt
然后sh llama.cpp/examples/chat.sh
。
Inference
[1] llm quant
正文完