Tlntin/Qwen-TensorRT-LLM

测试hf吞吐OOM以及triton并发、流式输出问题

Closed this issue · 23 comments

请问大佬,我在测试qwen14b的hf模型出现一个问题,这是我的几个启动命令,都会报OOM的错误 ,我是用的两个V100 32G显卡。
mpirun -n 2 --allow-run-as-root python3 benchmark.py --backend=hf \ --tokenizer_dir /root/model_repo \ --hf_model_dir=/root/model_repo \ --dataset=/root/TensorRT-LLM/examples/qwen/ShareGPT_V3_unfiltered_cleaned_split.json \ --hf_max_batch_size=1

mpirun -n 2 --allow-run-as-root python3 benchmark.py --backend=hf \ --tokenizer_dir /root/model_repo \ --hf_model_dir=/root/model_repo \ --dataset=/root/TensorRT-LLM/examples/qwen/ShareGPT_V3_unfiltered_cleaned_split.json \ --hf_max_batch_size=1

CUDA_VISIBLE_DEVICES=0,1 python3 benchmark.py --backend=hf \ --tokenizer_dir=/root/model_repo \ --hf_model_dir=/root/model_repo \ --dataset=/root/TensorRT-LLM/examples/qwen/ShareGPT_V3_unfiltered_cleaned_split.json \ --hf_max_batch_size=1

请问该如何处理呢?还有想请问大佬,tensorrt+triton部署之后如何能测支持的并发量呢?

benchmark没测试过多卡。可以尝试在201行,改torch_type="auto"试试。

llm = AutoModelForCausalLM.from_pretrained(
        model,
        torch_dtype="auto",
        trust_remote_code=True
    )

如何测试triton并发:可以写一个多线程调用http接口,每个线程用不同的请求id和请求内容。观察返回时间,计算推理速度。

大佬您好,我想实现流式请求,我看tensorrtllm-backend中有个文档是这么请求:
`pip install SentencePiece
python3 scripts/launch_triton_server.py --world_size 1 --model_repo=llama_ifb/

python3 inflight_batcher_llm/client/inflight_batcher_llm_client.py --request-output-len 200 --tokenizer-dir ${HF_LLAMA_MODEL} --streaming
那我用您的环境这么请求报错: ”python3 inflight_batcher_llm/client/inflight_batcher_llm_client.py --request-output-len 200 --tokenizer-dir /tensorrtllm_backend/triton_model_repo/tensorrt_llm/model_repo/ --streaming --text "system\n你是一个大作家.\nuser\n请写一篇500字的小说\nassistant\n" --end-id 151643 --pad-id 151643“ 报错信息:=========
Using eos_token, but it is not set yet.
Using pad_token, but it is not set yet.
Traceback (most recent call last):
File "/tensorrtllm_backend/inflight_batcher_llm/client/inflight_batcher_llm_client.py", line 538, in
pad_id = tokenizer.encode(tokenizer.pad_token,
File "/usr/local/lib/python3.10/dist-packages/transformers/tokenization_utils_base.py", line 2373, in encode
encoded_inputs = self.encode_plus(
File "/usr/local/lib/python3.10/dist-packages/transformers/tokenization_utils_base.py", line 2781, in encode_plus
return self._encode_plus(
File "/usr/local/lib/python3.10/dist-packages/transformers/tokenization_utils.py", line 656, in _encode_plus
first_ids = get_input_ids(text)
File "/usr/local/lib/python3.10/dist-packages/transformers/tokenization_utils.py", line 642, in get_input_ids
raise ValueError(
ValueError: Input None is not valid. Should be a string, a list/tuple of strings or a list/tuple of integers.
或者说有其它能流式返回的请求方式吗? 我这种请求也是不能流式返回的,我看官方文档里说tensorrt_llm_blas中是可以流式返回的:curl -X POST localhost:8001/v2/models/tensorrt_llm_bls/generate
-d '{"text_input": "<|im_start|>system\n你是人工智能助手小王.<|im_end|>\n<|im_start|>user\n你好,你叫什么?<|im_end|>\n<|im_start|>assistant\n我是来源于xxx的小王\n<|im_start|>user\n你好小王,你来自哪个公司?<|im_end|>\n<|im_start|>assistant\n", "max_tokens": 50, "bad_words": "\n", "stop_words": "", "end_id": [151643], "pad_id": [151643]}'`

我这种请求也是不能流式返回的,我看官方文档里说tensorrt_llm_blas中是可以流式返回的:

将generate换成generate_stream就可以流式回答了

我这种请求也是不能流式返回的,我看官方文档里说tensorrt_llm_blas中是可以流式返回的:

将generate换成generate_stream就可以流式回答了

我刚试了下:
curl -X POST localhost:8001/v2/models/tensorrt_llm_bls/generate_stream \ -d '{"text_input": "<|im_start|>system\n你是人工智能助手小王.<|im_end|>\n<|im_start|>user\n你好,你叫什么?<|im_end|>\n<|im_start|>assistant\n我是来源于xxx的小王\n<|im_start|>user\n你好小王,你来自哪个公司?<|im_end|>\n<|im_start|>assistant\n", "max_tokens": 50, "bad_words": "\n", "stop_words": "", "end_id": [151643], "pad_id": [151643]}'
这种不能流式返回呀,他这个好像是sse数据,但是貌似是返回了一整条

他这个好像是sse数据,但是貌似是返回了一整条

你用python requests调用试试,curl有自动拼接sse返回。

他这个好像是sse数据,但是貌似是返回了一整条

你用python requests调用试试,curl有自动拼接sse返回。

python看了也一样,看了官方的几个issue,确实应该流式返回的,不知道为啥不能
`
curl -X POST localhost:8001/v2/models/tensorrt_llm_bls/generate_stream
-d '{"text_input": "<|im_start|>system\n你是一个大作家.<|im_end|>\n<|im_start|>user\n请写一篇50字的小说<|im_end|>\n<|im_start|>assistant\n", "max_tokens" : 54, "bad_words": "\n", "stop_words": "", "end_id": [151643], "pad_id": [151643],"stream": true }'

`

他这个好像是sse数据,但是貌似是返回了一整条

你用python requests调用试试,curl有自动拼接sse返回。

python看了也一样,看了官方的几个issue,确实应该流式返回的,不知道为啥不能 ` curl -X POST localhost:8001/v2/models/tensorrt_llm_bls/generate_stream -d '{"text_input": "<|im_start|>system\n你是一个大作家.<|im_end|>\n<|im_start|>user\n请写一篇50字的小说<|im_end|>\n<|im_start|>assistant\n", "max_tokens" : 54, "bad_words": "\n", "stop_words": "", "end_id": [151643], "pad_id": [151643],"stream": true }'

`

输出这个样子:
image

晚点我测试一下,请问你用的是qwen1还是qwen1.5呢?

待会我测试一下,请问你用的是qwen1还是qwen1.5呢?

额 不知道1和1.5的区别,我用的是qwen14B

那估计是1

@Tlntin 你好,我也遇到一个流式响应的问题。单机器上,转模型和trt推理都是正常的,但是用api.py启动服务,发现流式内容没法正常送出。排查了一下,发现for new_text in decoder.chat_stream(...): 这个循环是在正常输出流式内容的,但是fastapi没有及时把结果逐个送出去,而是是在模型全部输出完毕后,把所有的流式小片一次性在几乎同一时刻一起返回出去,客户端倒也能正常看到内容,但是体验就和非流式一样了。这个看上去像是里面有同步阻塞的操作,和fastapi有冲突。我不确定是不是trt-llm的特性,但是我也不确定是不是别的问题。谢谢

@Tlntin 你好,我也遇到一个流式响应的问题。单机器上,转模型和trt推理都是正常的,但是用api.py启动服务,发现流式内容没法正常送出。排查了一下,发现for new_text in decoder.chat_stream(...): 这个循环是在正常输出流式内容的,但是fastapi没有及时把结果逐个送出去,而是是在模型全部输出完毕后,把所有的流式小片一次性在几乎同一时刻一起返回出去,客户端倒也能正常看到内容,但是体验就和非流式一样了。这个看上去像是里面有同步阻塞的操作,和fastapi有冲突。我不确定是不是trt-llm的特性,但是我也不确定是不是别的问题。谢谢

windows会这样,Linux是正常的。

@dongteng 测试了一下和你一样stream模式没效果。这个貌似是新版triton引入的新bug。issues/348
之前0.5.0对应triton我记得stream模式是正常的,但是他有一个致命bug就是在生成过程中客户端中途断开连接会导致整个服务挂掉。
0.7.0解决了这个问题,但是貌似stream模式又挂掉了。
上面的issue/348看起来是2周前解决了,这几天我测试一下tensorrt-llm 0.8.0和其对应的新版triton,看看是否正常工作。

@dongteng 测试了一下和你一样stream模式没效果。这个貌似是新版triton引入的新bug。issues/348 之前0.5.0对应triton我记得stream模式是正常的,但是他有一个致命bug就是在生成过程中客户端中途断开连接会导致整个服务挂掉。 0.7.0解决了这个问题,但是貌似stream模式又挂掉了。 上面的issue/348看起来是2周前解决了,这几天我测试一下tensorrt-llm 0.8.0和其对应的新版triton,看看是否正常工作。

感谢大佬解答

在tensorrt_llm_bls中的model.py中打印看了下
image
发现从tensorrt_llm执行获得的迭代器里边只有一个,一次性全部给出了。
image
然后就不知道咋弄了,不知道.exec是如何实现的

@dongteng 已解决,gpt_model_type必须设置为inflight_batching才能支持stream模式。待会我更新一下教程。
image

triton最新部署教程已更新,文档地址

triton最新部署教程已更新,文档地址

多谢您,我这里看了很久试图找出原因 hh

请问大佬,default_config.py中的trt_max_batch_size 与并发量有关系吗?
我用2个V100 32G 部署了qwen14B
发现当trt_max_batch_size 为1的时候并发为2(使用apifox自动化测试和postman ,看响应时间得出的2)
当trt_max_batch_size 为2的时候 并发为4

请问大佬,default_config.py中的trt_max_batch_size 与并发量有关系吗? 我用2个V100 32G 部署了qwen14B 发现当trt_max_batch_size 为1的时候并发为2(使用apifox自动化测试和postman ,看响应时间得出的2) 当trt_max_batch_size 为2的时候 并发为4

@Tlntin

请问大佬,default_config.py中的trt_max_batch_size 与并发量有关系吗? 我用2个V100 32G 部署了qwen14B 发现当trt_max_batch_size 为1的时候并发为2(使用apifox自动化测试和postman ,看响应时间得出的2) 当trt_max_batch_size 为2的时候 并发为4

有关系