InternLM / lmdeploy

LMDeploy is a toolkit for compressing, deploying, and serving LLMs.
https://lmdeploy.readthedocs.io/en/latest/
Apache License 2.0
4.19k stars 377 forks source link

请教下如何在已经4bit量化的模型上继续做KV量化 #1056

Closed zhanghui-china closed 7 months ago

zhanghui-china commented 7 months ago

Checklist

Describe the bug

生成的4bit模型HF格式的模型目录是 ~/lmdeploy-internlm/quant_output

aecba9af63de36531a23d87be836931

生成的4bit模型TurboMind格式的目录是 ~/lmdeploy-internlm/internlm-chat-7b-quant

937e968ee9d1166aa2c3c65f64058fe

Reproduction

后续操作有几个步骤: 1.计算minmax lmdeploy lite calibrate \ --model /root/share/temp/model_repos/internlm-chat-7b/ \ --calib_dataset "c4" \ --calib_samples 128 \ --calib_seqlen 2048 \ --work_dir ./dir_a

请问dir_a目录是随便写个空的目录,还是写到前面某个目录中去。

2.通过 minmax 获取量化参数 lmdeploy lite kv_qparams \ --work_dir ./dir_b \ --turbomind_dir workspace/triton_models/weights/ \ --kv_sym False \ --num_tp 1

请问下dir_b是什么目录,是不是上面1步骤留下的目录。 turbomind_dir 是不是应该填前面的internlm-chat-7b-quant目录(这个目录是4bit 量化成HF格式后,再做convert后留下的)

Environment

ubuntu 22.04

Error traceback

No response

zhanghui-china commented 7 months ago

这边我对InternLM一代模型的操作流程如下: image

mkdir ~/lmdeploy-internlm cd ~/lmdeploy-internlm pip install 'lmdeploy[all]==v0.2.0' image

先进行4bit量化: lmdeploy lite auto_awq /root/shishen/internlm-chat-7b --calib-dataset c4 --w-bits 4 --w-group-size 128 --work-dir ./quant_output

这个命令,会将原始的HF格式的模型权重文件,转换为4bit量化的HF格式的模型权重文件 查看结果目录:./quant_output image

lmdeploy convert internlm-chat-7b quant_output --dst-path internlm-chat-7b-quant --model-format awq --group-size 128

这个命令,会将前面转换好的4bit量化的HF格式的模型权重文件,转换为TurboMind格式 查看结果目录:./internlm-chat-7b-quant image

测试一下转换好的4bit模型: lmdeploy chat turbomind ./internlm-chat-7b-quant image

image

zhanghui-china commented 7 months ago

在这个基础上,我打算在实现lkv量化。 于是,执行了以下命令计算minmax

`# 计算 minmax

export HF_MODEL=./internlm-chat-7b lmdeploy lite calibrate \ $HF_MODEL \ --calib-dataset 'c4' \ --calib-samples 128 \ --calib-seqlen 2048 \ --work-dir $HF_MODEL`

image image

在原来的HF模型下生成的结果如下: image

生成了4个新的pth文件。

zhanghui-china commented 7 months ago

# 通过 minmax 获取量化参数 lmdeploy lite kv_qparams \ $HF_MODEL \ --turbomind_dir ./internlm-chat-7b-quant/triton_models/weights/ \ --kv_sym False \ --num_tp 1

image 执行这个命令就报错了!

貌似lmdeploy 0.1.0,0.2.0和0.2.1的命令参数有区别。

根据这个文档 https://github.com/InternLM/lmdeploy/blob/main/docs/zh_cn/quantization/kv_int8.md 没看到 lmdeploy lite kv_qparams 这个该怎么使用。

RunningLeon commented 7 months ago

hi, from lmdeploy0.2.0, you don't need to explicitly convert hf to turbomind. After you do w4, you can try lmdeploy chat turbomind ./internlm-chat-7b-4bit --model-format awq --quant-policy 4. make sure that ./internlm-chat-7b-4bit has the calibration files like inputs_stats.pth, outputs_stats.pth, key_stats.pth and value_stats.pth.

zhanghui-china commented 7 months ago

我把操作过程写一下:

conda activate lmdeploynew

cd ~/lmdeploy-internlm2

pip list|grep lmdeploy image 确认是最新版本。

先将原始HF模型(internlm2-chat-7b)转为 TurboMind格式:

rm -rf workspace

lmdeploy convert internlm2-chat-7b ./internlm2-chat-7b --dst-path ./workspace_internlm2_turbomind 结果目录:./workspace_internlm2_turbomind 修改 ~/lmdeploy-internlm2/workspace_internlm2_turbomind/triton_models/weights/config.ini

cache_max_entry_count = 0.2

试一下原始模型:

lmdeploy chat turbomind ./workspace_internlm2_turbomind image 显存占用20G: image

这部分是第一步骤,通过原始HF模型(目录:./internlm2-chat-7b),生成了TurboMind模型(目录: ./workspace_internlm2_turbomind),并做了验证,没有问题。

zhanghui-china commented 7 months ago

开始在原始模型上做4bit量化:

cp ./lmdeploytest/calib_dataloader.py ./anaconda3/envs/lmdeploynew/lib/python3.10/site-packages/lmdeploy/lite/utils/calib_dataloader.py

lmdeploy lite auto_awq ./internlm2-chat-7b --w-bits 4 --w-group-size 128 --work-dir ./internlm2-chat-7b-4bit --calib-dataset c4 生成结果如下: ./internlm2-chat-7b-4bit image 转成TurboMind格式: lmdeploy convert internlm2-chat-7b ./internlm2-chat-7b-4bit --dst-path ./workspace_internlm2_4bit_turbomind --model-format awq --group-size 128 结果目录:./workspace_internlm2_4bit_turbomind vi ./workspace_internlm2_4bit_turbomind/triton_models/weights/config.ini

修改 cache_max_entry_count = 0.2

lmdeploy chat turbomind ./workspace_internlm2_4bit_turbomind image 显存占用:11.1G左右。 image

vi ./workspace_internlm2_4bit_turbomind/triton_models/weights/config.ini

修改 cache_max_entry_count = 0.1

lmdeploy chat turbomind ./workspace_internlm2_4bit_turbomind image 显存占用:8.6G左右。 image

zhanghui-china commented 7 months ago

前面两步都没有啥问题。

zhanghui-china commented 7 months ago

下面开始做 kv量化。 我打算基于 4bit的HF模型:./internlm2-chat-7b-4bit 做kv量化。

有疑问的命令主要在这里: 在4bit模型基础上继续KV量化:

计算

lmdeploy lite calibrate ./internlm2-chat-7b-4bit --calib-dataset 'c4' --calib-samples 128 --calib-seqlen 2048 --work-dir ./workspace_kv 生成的文件如下: ./workspace_kv image

获取量化参数

lmdeploy lite kv_qparams ./workspace_kv ./workspace_internlm2_4bit_turbomind/triton_models/weights/ --num-tp 1 image

生成的参数叠加在 ./workspace_internlm2_4bit_turbomind/triton_models/weights/ image

修改 ./workspace_internlm2_4bit_turbomind/triton_models/weights/config.ini

quant_policy = 4

lmdeploy chat turbomind ./workspace_internlm2_4bit_turbomind image image

好像量化完,模型问答就失效了。

zhanghui-china commented 7 months ago

根据前面老师的提示: 我们将 ./workspace_kv 下的4个文件直接复制到 4bit量化的HF模型目录 ./internlm-chat-7b-4bit下:

cp ./workspace_kv/* ./internlm2-chat-7b-4bit image lmdeploy chat turbomind ./internlm2-chat-7b-4bit --model-format awq --quant-policy 4 image image

模型问答也是失效的。

RunningLeon commented 7 months ago

@zhanghui-china hi, you need to input the original hf model instead of int4-hf model in calibration. BTW, no need to do convert if you do not use tritonserver.

lmdeploy lite calibrate ./internlm2-chat-7b-4bit --calib-dataset 'c4' --calib-samples 128 --calib-seqlen 2048 --work-dir ./workspace_kv 生成的文件如下: ./workspace_kv

zhanghui-china commented 7 months ago

所以正确的过程应该是:

lmdeploy lite calibrate ./internlm2-chat-7b --calib-dataset 'c4' --calib-samples 128 --calib-seqlen 2048 --work-dir ./workspace_kv

lmdeploy lite kv_qparams ./workspace_kv ./workspace_internlm2_4bit_turbomind/triton_models/weights/ --num-tp 1

修改weight下config.ini文件:

quant_policy = 4

lmdeploy chat turbomind workspace_internlm2_4bit_turbomind --model-format awq --quant-policy 4

image image

这样做是可以的。

zhanghui-china commented 7 months ago

最后整理的结论供大家参考:

关于 int4量化和叠加kv cache的方法终于搞清楚了:

(1)

将HF格式的模型转为turbomind格式 lmdeploy convert internlm2-chat-7b ./internlm2-chat-7b --dst-path ./workspace_internlm2_turbomind

启动原模型: cache_max_entry_count = 0.2 (config.ini) lmdeploy chat turbomind ./workspace_internlm2_turbomind

(2)

将HF格式的模型进行4bit量化,直接转为HF格式的4bit模型 lmdeploy lite auto_awq ./internlm2-chat-7b --w-bits 4 --w-group-size 128 --work-dir ./internlm2-chat-7b-4bit --calib-dataset c4 将量化后的HF格式的4bit模型转为 turbomind格式 lmdeploy convert internlm2-chat-7b ./internlm2-chat-7b-4bit --dst-path ./workspace_internlm2_4bit_turbomind --model-format awq --group-size 128

启动4bit模型: cache_max_entry_count = 0.1 lmdeploy chat turbomind ./workspace_internlm2_4bit_turbomind

(3) 将HF格式的模型进行计算minmax(注意此时不是针对 4bit的HF模型,而是针对原始的HF模型) lmdeploy lite calibrate ./internlm2-chat-7b --calib-dataset 'c4' --calib-samples 128 --calib-seqlen 2048 --work-dir ./workspace_kv

获取量化参数(注意此时是把结果放到 turbomind的4bit模型weight目录下 lmdeploy lite kv_qparams ./workspace_kv ./workspace_internlm2_4bit_turbomind/triton_models/weights/ --num-tp 1 quant_policy = 4

启动4bit+kvcache模型: lmdeploy chat turbomind workspace_internlm2_4bit_turbomind --model-format awq --quant-policy 4

感谢 @H.Lyu 及其lmdeploy团队的老师给与支持。