Tlntin/Qwen-TensorRT-LLM

build完之后跑cli_chat.py报错

Closed this issue · 15 comments

拉取的是官方提供的镜像,公司的硬件是V100 16g, 使用的了qwen1.8b, 14b和72b进行编译,build完之后要进行推理,都出现了以下报错,不太清楚具体是哪里出现了问题,可以帮忙解答一下吗?因为公司不允许截图,麻烦看一下照片了,感谢。
addffc505f82350a46886bf2fc24108
bc3b33d23f4bea3a38780b8d9d54841
5753e7f8a58c1b6cd57ca7a59b15fb6
526e78f337e944d45ee311f90ff1e83

Tlntin commented

容器用的那个?什么版本?项目用的哪个分支?是main分支吗?

就 readme那个
docker pull registry.cn-guangzhou.aliyuncs.com/tlntin/tensorrt_llm:v0.6.1

用的是main分支

Tlntin commented

了解,看情况你是用了qwen-xxx-chat-int4模型,这个是gptq编译的,之前有人也出过和你类似的问题。造成的原因是,比较老的卡TensortRT-LLM还不是完全支持,导致这个地方会报错。
推荐使用qwen-xxx-chat fp16模型,用weight only int4/int8去做编译运行,而不是gptq-int4。

好的吧,那我明天去试试看,感谢

Tlntin commented

不客气

@Tlntin
尝试了一下,qwen1.8b的fp16模型用Int4去编译是没有问题的,编译好的engine去跑run.py和cli_chat.py,尝试了一些例子,输出也看着还行,但要去跑summarize.py脚本的时候,按照官方的步骤下载了数据集和解压,hf model是可以输出rouge值的,但是编译好的engine各项rouge值就都为0。
还有就是编译好的weight only int4模型要占用9个g左右的显存,而qwen1.8b的gptq int4只需要占用4g左右的显存而已,这个是什么原因?
下面是summarize.py的输入和输出
efa051267699b2f35ecee8254ade1a6
a6c6acd05345c304dd418a6266abddd
4043e5746422993f0333c01df570447
281e1485311686d65cfe7da430ffed2
e89ebf80323a46f9a364b55d2028a65

Tlntin commented

你上面的图,data_type=fp32?,这里用默认的fp16就行。
并且你的tokenkenizer_dir为啥还是用的xxx-chat-int4呢?这里得用xxx-chat吧,也就是和原版一样的fp16的模型对应的tokenizer。
至于你说的weight only int4模型要占用9个g左右的显存,这个可能也和你刚刚用fp32有关,你可以再试一次。
除此自外,可能和padding也有关系,你可以尝试加上下面这俩参数,减少显存占用,并且去掉padding(默认padding到最大输入)

--remove_input_padding \
                --enable_context_fmha

这里主要是想要对比qwen官方gptq int4和你们编译的engine(weight only int4)的效果对比。第一个命令是hf的模型,因为是gptq,所有加data_type=fp32才不会去执行mode.half()这行代码,不然会报错。第二个命令才是跑编译好的engine,刚刚试了一下xxx-chat的tokenizer dir,rouge值输出也还是零。
占用9个g显存这个问题我刚刚试了一下修改build时候的max_input_len和max_new_tokens(第一次build的时候这两个值都是设置到8192), 这两个值降低到2048后显存的占用就来到4个g左右了,看来build时候max_input_len和max_new_tokens的预设值也会影响显存的占用?

Tlntin commented

这里主要是想要对比qwen官方gptq int4和你们编译的engine(weight only int4)的效果对比。第一个命令是hf的模型,因为是gptq,所有加data_type=fp32才不会去执行mode.half()这行代码,不然会报错。第二个命令才是跑编译好的engine,刚刚试了一下xxx-chat的tokenizer dir,rouge值输出也还是零。 占用9个g显存这个问题我刚刚试了一下修改build时候的max_input_len和max_new_tokens(第一次build的时候这两个值都是设置到8192), 这两个值降低到2048后显存的占用就来到4个g左右了,看来build时候max_input_len和max_new_tokens的预设值也会影响显存的占用?

是的,默认会自动padding到最大输入,所以会影响。你加上我刚刚说的那两个参数,也可以解决这个问题。
至于你刚刚说的summarize.py输出为0问题,我本机也测试一下看看。

好的,我这边再build试试。麻烦了谢谢

刚刚试了一下,build的时候加上这两个参数,gpu显存占用并不会减,还是9个g左右(纯模型载入,还没有进行推理)。remove_input_padding这个参数我是build的时候就一直有加,再加上enable_context_fmha后也是没有效果。

Tlntin commented

哦哦,了解。
我这边测试summarize.py正常,用的最新代码的main分支,也就是0.6.1版本。

编译

python build.py --hf_model_dir ./qwen_1_8b_chat \
                --dtype float16 \
                --remove_input_padding \
                --use_weight_only \
                --weight_only_precision int4 \
                --output_dir ./tmp/Qwen/1_8B/trt_engines/int4_weight_only/1-gpu/

运行

python3 run.py --max_new_tokens=50 \
               --tokenizer_dir ./qwen_1_8b_chat \
               --engine_dir=./tmp/Qwen/1_8B/trt_engines/int4_weight_only/1-gpu/
  • 输出
Input: "<|im_start|>system
You are a helpful assistant.<|im_end|>
<|im_start|>user
你好,请问你叫什么?<|im_end|>
<|im_start|>assistant
"
Output: "我是来自阿里云的大规模语言模型,我叫通义千问。"

模型总结

python3 summarize.py --backend=trt_llm \
    --tokenizer_dir ./qwen_1_8b_chat \
    --engine_dir ./tmp/Qwen/1_8B/trt_engines/int4_weight_only/1-gpu/
  • 输出结果
[12/20/2023-04:00:01] [TRT-LLM] [I] TensorRT-LLM (total latency: 7.420945167541504 sec)
[12/20/2023-04:00:01] [TRT-LLM] [I] TensorRT-LLM beam 0 result
[12/20/2023-04:00:01] [TRT-LLM] [I]   rouge1 : 23.610255735457482
[12/20/2023-04:00:01] [TRT-LLM] [I]   rouge2 : 6.808532948628601
[12/20/2023-04:00:01] [TRT-LLM] [I]   rougeL : 15.347208791973477
[12/20/2023-04:00:01] [TRT-LLM] [I]   rougeLsum : 18.436366805674133

文件相关

ls -lh tmp/Qwen/1_8B/trt_engines/int4_weight_only/1-gpu/
total 1.8G
-rw-r--r-- 1 root root 1.4K Dec 20 03:58 config.json
-rw-r--r-- 1 root root  65K Dec 20 03:58 model.cache
-rw-r--r-- 1 root root 1.8G Dec 20 03:58 qwen_float16_tp1_rank0.engine

哦哦,了解。 我这边测试summarize.py正常,用的最新代码的main分支,也就是0.6.1版本。

编译

python build.py --hf_model_dir ./qwen_1_8b_chat \
                --dtype float16 \
                --remove_input_padding \
                --use_weight_only \
                --weight_only_precision int4 \
                --output_dir ./tmp/Qwen/1_8B/trt_engines/int4_weight_only/1-gpu/

运行

python3 run.py --max_new_tokens=50 \
               --tokenizer_dir ./qwen_1_8b_chat \
               --engine_dir=./tmp/Qwen/1_8B/trt_engines/int4_weight_only/1-gpu/
  • 输出
Input: "<|im_start|>system
You are a helpful assistant.<|im_end|>
<|im_start|>user
你好,请问你叫什么?<|im_end|>
<|im_start|>assistant
"
Output: "我是来自阿里云的大规模语言模型,我叫通义千问。"

模型总结

python3 summarize.py --backend=trt_llm \
    --tokenizer_dir ./qwen_1_8b_chat \
    --engine_dir ./tmp/Qwen/1_8B/trt_engines/int4_weight_only/1-gpu/
  • 输出结果
[12/20/2023-04:00:01] [TRT-LLM] [I] TensorRT-LLM (total latency: 7.420945167541504 sec)
[12/20/2023-04:00:01] [TRT-LLM] [I] TensorRT-LLM beam 0 result
[12/20/2023-04:00:01] [TRT-LLM] [I]   rouge1 : 23.610255735457482
[12/20/2023-04:00:01] [TRT-LLM] [I]   rouge2 : 6.808532948628601
[12/20/2023-04:00:01] [TRT-LLM] [I]   rougeL : 15.347208791973477
[12/20/2023-04:00:01] [TRT-LLM] [I]   rougeLsum : 18.436366805674133

文件相关

ls -lh tmp/Qwen/1_8B/trt_engines/int4_weight_only/1-gpu/
total 1.8G
-rw-r--r-- 1 root root 1.4K Dec 20 03:58 config.json
-rw-r--r-- 1 root root  65K Dec 20 03:58 model.cache
-rw-r--r-- 1 root root 1.8G Dec 20 03:58 qwen_float16_tp1_rank0.engine

想问问这个build之后跑summarize.py的显存占用大概是多少?

Tlntin commented

想问问这个build之后跑summarize.py的显存占用大概是多少?

7G左右,默认max_input_size=6144