Closed zhanghui-china closed 7 months ago
这边我对InternLM一代模型的操作流程如下:
mkdir ~/lmdeploy-internlm cd ~/lmdeploy-internlm pip install 'lmdeploy[all]==v0.2.0'
先进行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
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
测试一下转换好的4bit模型: lmdeploy chat turbomind ./internlm-chat-7b-quant
在这个基础上,我打算在实现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`
在原来的HF模型下生成的结果如下:
生成了4个新的pth文件。
# 通过 minmax 获取量化参数 lmdeploy lite kv_qparams \ $HF_MODEL \ --turbomind_dir ./internlm-chat-7b-quant/triton_models/weights/ \ --kv_sym False \ --num_tp 1
执行这个命令就报错了!
貌似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 这个该怎么使用。
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
.
我把操作过程写一下:
conda activate lmdeploynew
cd ~/lmdeploy-internlm2
pip list|grep lmdeploy 确认是最新版本。
先将原始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 显存占用20G:
这部分是第一步骤,通过原始HF模型(目录:./internlm2-chat-7b),生成了TurboMind模型(目录: ./workspace_internlm2_turbomind),并做了验证,没有问题。
开始在原始模型上做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 转成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 显存占用:11.1G左右。
vi ./workspace_internlm2_4bit_turbomind/triton_models/weights/config.ini
修改 cache_max_entry_count = 0.1
lmdeploy chat turbomind ./workspace_internlm2_4bit_turbomind 显存占用:8.6G左右。
前面两步都没有啥问题。
下面开始做 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
lmdeploy lite kv_qparams ./workspace_kv ./workspace_internlm2_4bit_turbomind/triton_models/weights/ --num-tp 1
生成的参数叠加在 ./workspace_internlm2_4bit_turbomind/triton_models/weights/
修改 ./workspace_internlm2_4bit_turbomind/triton_models/weights/config.ini
quant_policy = 4
lmdeploy chat turbomind ./workspace_internlm2_4bit_turbomind
好像量化完,模型问答就失效了。
根据前面老师的提示: 我们将 ./workspace_kv 下的4个文件直接复制到 4bit量化的HF模型目录 ./internlm-chat-7b-4bit下:
cp ./workspace_kv/* ./internlm2-chat-7b-4bit lmdeploy chat turbomind ./internlm2-chat-7b-4bit --model-format awq --quant-policy 4
模型问答也是失效的。
@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
所以正确的过程应该是:
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
这样做是可以的。
最后整理的结论供大家参考:
关于 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团队的老师给与支持。
Checklist
Describe the bug
生成的4bit模型HF格式的模型目录是 ~/lmdeploy-internlm/quant_output
生成的4bit模型TurboMind格式的目录是 ~/lmdeploy-internlm/internlm-chat-7b-quant
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
Error traceback
No response