vllm-project / vllm

A high-throughput and memory-efficient inference and serving engine for LLMs
https://docs.vllm.ai
Apache License 2.0
29.17k stars 4.36k forks source link

baichuan-13b-chat用vllm来生成,很多测试数据(有长有短,没有超出长度限制)只能生成一个句号,而且有些示例在删掉一些字词或句子之后,就可以正常生成了,请问有可能是什么原因? #1643

Closed MrInouye closed 4 months ago

MrInouye commented 11 months ago

baichuan-13b-chat用vllm来生成,很多测试数据(有长有短,没有超出长度限制)只能生成一个句号,而且有些示例在删掉一些字词或句子之后,就可以正常生成了,请问有可能是什么原因?

import torch from vllm import LLM, SamplingParams sampling_params = SamplingParams(temperature=0, top_p=1, max_tokens=512) prompts_list=["用户遇到问题前来求助客服,他们的对话内容如下:\n'''\n客服:您好,请问是咨询功能的问题吗。\n用户:是的。\n客服:的什么问题。\n用户:问题。\n客服:是**什么。\n用户:我,它说被多少用户举报打不开了。\n客服:被封了对吗。\n用户:是的。\n客服:稍后,会给您来电手机绑定的微信,这是一个入口,您点击那个入口去提交一下被封的复审资料,由工作人员来进行核实的。\n用户:好的好的。\n客服:尽快提交一下,就不打扰您。\n'''\n请根据客服和用户的多轮对话,生成对话总结,总结内容包括两部分:\n1、问题描述:表示的是用户遇到的问题。\n2、客服方案:指的是客服提出的解决方案,如果用户不接受,客服会继续提出其他方案,每个方案都需要总结在“客服方案”部分。"] llm = LLM(model = './Baichuan-13B-Chat', trust_remote_code=True, dtype='float16', tensor_parallel_size=1) outputs=llm.generate(prompts_list, sampling_params) outputs[0].outputs[0].text

输出结果是一个句号 企业微信截图_16998783255972

yungangwu commented 11 months ago

需要设置sampling params,sampling_params = SamplingParams(temperature=0.3, top_k=5, top_p=0.85, max_tokens=1024, stop=["."]

repetition_penalty=1.05

                                            )
MrInouye commented 11 months ago

需要设置sampling params,sampling_params = SamplingParams(temperature=0.3, top_k=5, top_p=0.85, max_tokens=1024, stop=["."] # repetition_penalty=1.05 )

设置了也还是一样,只生成句号 企业微信截图_16999524943897

yungangwu commented 11 months ago

我之前遇到的同样的问题,是因为max_tokens默认最大值是16,所以有的数据生成一点就被截断了,后来我设置了这个参数就好了。还有一种解决方案,先将prompt过一遍tokenizer,以prompt_ids的形式输入,我之前在batch推理时,遇到了只生成一个句号的情况,通过这种方式解决了  

仵允港 @.***

 

------------------ 原始邮件 ------------------ 发件人: @.>; 发送时间: 2023年11月14日(星期二) 下午5:03 收件人: @.>; 抄送: @.>; @.>; 主题: Re: [vllm-project/vllm] baichuan-13b-chat用vllm来生成,很多测试数据(有长有短,没有超出长度限制)只能生成一个句号,而且有些示例在删掉一些字词或句子之后,就可以正常生成了,请问有可能是什么原因? (Issue #1643)

需要设置sampling params,sampling_params = SamplingParams(temperature=0.3, top_k=5, top_p=0.85, max_tokens=1024, stop=["."] # repetition_penalty=1.05 )

设置了也还是一样,只生成句号

— Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you commented.Message ID: @.***>

MrInouye commented 11 months ago

我之前遇到的同样的问题,是因为max_tokens默认最大值是16,所以有的数据生成一点就被截断了,后来我设置了这个参数就好了。还有一种解决方案,先将prompt过一遍tokenizer,以prompt_ids的形式输入,我之前在batch推理时,遇到了只生成一个句号的情况,通过这种方式解决了   仵允港 @.   ------------------ 原始邮件 ------------------ 发件人: @.>; 发送时间: 2023年11月14日(星期二) 下午5:03 收件人: @.>; 抄送: @.>; @.>; 主题: Re: [vllm-project/vllm] baichuan-13b-chat用vllm来生成,很多测试数据(有长有短,没有超出长度限制)只能生成一个句号,而且有些示例在删掉一些字词或句子之后,就可以正常生成了,请问有可能是什么原因? (Issue #1643) 需要设置sampling params,sampling_params = SamplingParams(temperature=0.3, top_k=5, top_p=0.85, max_tokens=1024, stop=["."] # repetition_penalty=1.05 ) 设置了也还是一样,只生成句号 — Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you commented.Message ID: @.>

我尝试过但是出现问题。

  1. 我只输入prompt,然后vllm的返回结果可以显示我输入的prompt和对应的prompt_token_ids。、 企业微信截图_16999489431134

  2. 但是我用百川的tokenizer将prompt_token_ids解码成中文,发现是乱码的。 企业微信截图_16999491701949

  3. 并且用百川的tokenizer将prompt转成prompt_token_ids,输入vllm会报错。 企业微信截图_16999535432063

yungangwu commented 11 months ago

我在之前测试batch推理时,遇到过你说的第一种情况,我当时对比了直接用tokenizer做encoder和用vllm做的encoder,我发现两者并不相同,我用的也是baichuan13b。后来我直接先过一遍tokenizer.encoder,调用vllm时,输入prompt_token_ids.

然后测试就是正常的了。当然,你的模型加载dtype是否是half?如果是half生成效果会降低的。改成float16

 

仵允港 @.***

 

------------------ 原始邮件 ------------------ 发件人: @.>; 发送时间: 2023年11月14日(星期二) 下午5:19 收件人: @.>; 抄送: @.>; @.>; 主题: Re: [vllm-project/vllm] baichuan-13b-chat用vllm来生成,很多测试数据(有长有短,没有超出长度限制)只能生成一个句号,而且有些示例在删掉一些字词或句子之后,就可以正常生成了,请问有可能是什么原因? (Issue #1643)

我之前遇到的同样的问题,是因为max_tokens默认最大值是16,所以有的数据生成一点就被截断了,后来我设置了这个参数就好了。还有一种解决方案,先将prompt过一遍tokenizer,以prompt_ids的形式输入,我之前在batch推理时,遇到了只生成一个句号的情况,通过这种方式解决了   仵允港 @.   … ------------------ 原始邮件 ------------------ 发件人: @.>; 发送时间: 2023年11月14日(星期二) 下午5:03 收件人: @.>; 抄送: @.>; @.>; 主题: Re: [vllm-project/vllm] baichuan-13b-chat用vllm来生成,很多测试数据(有长有短,没有超出长度限制)只能生成一个句号,而且有些示例在删掉一些字词或句子之后,就可以正常生成了,请问有可能是什么原因? (Issue #1643) 需要设置sampling params,sampling_params = SamplingParams(temperature=0.3, top_k=5, top_p=0.85, max_tokens=1024, stop=["."] # repetition_penalty=1.05 ) 设置了也还是一样,只生成句号 — Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you commented.Message ID: @.>

我尝试过但是出现问题。

我只输入prompt,然后vllm的返回结果可以显示我输入的prompt和对应的prompt_token_ids。、

但是我用百川的tokenizer将prompt_token_ids解码成中文,发现是乱码的。

并且用百川的tokenizer将prompt转成prompt_token_ids,输入vllm会报错。

— Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you commented.Message ID: @.***>

MrInouye commented 11 months ago

我在之前测试batch推理时,遇到过你说的第一种情况,我当时对比了直接用tokenizer做encoder和用vllm做的encoder,我发现两者并不相同,我用的也是baichuan13b。后来我直接先过一遍tokenizer.encoder,调用vllm时,输入prompt_token_ids. 然后测试就是正常的了。当然,你的模型加载dtype是否是half?如果是half生成效果会降低的。改成float16   仵允港 @.   ------------------ 原始邮件 ------------------ 发件人: @.>; 发送时间: 2023年11月14日(星期二) 下午5:19 收件人: @.>; 抄送: @.>; @.>; 主题: Re: [vllm-project/vllm] baichuan-13b-chat用vllm来生成,很多测试数据(有长有短,没有超出长度限制)只能生成一个句号,而且有些示例在删掉一些字词或句子之后,就可以正常生成了,请问有可能是什么原因? (Issue #1643) 我之前遇到的同样的问题,是因为max_tokens默认最大值是16,所以有的数据生成一点就被截断了,后来我设置了这个参数就好了。还有一种解决方案,先将prompt过一遍tokenizer,以prompt_ids的形式输入,我之前在batch推理时,遇到了只生成一个句号的情况,通过这种方式解决了   仵允港 @.   … ------------------ 原始邮件 ------------------ 发件人: @.>; 发送时间: 2023年11月14日(星期二) 下午5:03 收件人: @.>; 抄送: @.>; @.>; 主题: Re: [vllm-project/vllm] baichuan-13b-chat用vllm来生成,很多测试数据(有长有短,没有超出长度限制)只能生成一个句号,而且有些示例在删掉一些字词或句子之后,就可以正常生成了,请问有可能是什么原因? (Issue #1643) 需要设置sampling params,sampling_params = SamplingParams(temperature=0.3, top_k=5, top_p=0.85, max_tokens=1024, stop=["."] # repetition_penalty=1.05 ) 设置了也还是一样,只生成句号 — Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you commented.Message ID: @.> 我尝试过但是出现问题。 我只输入prompt,然后vllm的返回结果可以显示我输入的prompt和对应的prompt_token_ids。、 但是我用百川的tokenizer将prompt_token_ids解码成中文,发现是乱码的。 并且用百川的tokenizer将prompt转成prompt_token_ids,输入vllm会报错。 — Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you commented.Message ID: @.>

  1. 我看vllm的代码里面也是直接加载的AutoTokenizer,然后调用的tokenizer.encode(),不知道为什么会不一样。 企业微信截图_16999544666833 企业微信截图_16999498693102

  2. 你直接先过一遍tokenizer.encoder,是用的vllm做的encoder吗,怎么调用vllm的encode?

  3. 我加载vllm的时候是用的 dtype='float16'

yungangwu commented 11 months ago

我也看了源码并没有不一样,但是采用prompt_token_ids的推理才有正确结果。具体原因我也不太清除。我是预加载baichuan的tokenizer,先用它做tokenizer.encoder,用得到的token_id输入到vllm中  

仵允港 @.***

 

------------------ 原始邮件 ------------------ 发件人: @.>; 发送时间: 2023年11月14日(星期二) 下午5:37 收件人: @.>; 抄送: @.>; @.>; 主题: Re: [vllm-project/vllm] baichuan-13b-chat用vllm来生成,很多测试数据(有长有短,没有超出长度限制)只能生成一个句号,而且有些示例在删掉一些字词或句子之后,就可以正常生成了,请问有可能是什么原因? (Issue #1643)

我在之前测试batch推理时,遇到过你说的第一种情况,我当时对比了直接用tokenizer做encoder和用vllm做的encoder,我发现两者并不相同,我用的也是baichuan13b。后来我直接先过一遍tokenizer.encoder,调用vllm时,输入prompt_token_ids. 然后测试就是正常的了。当然,你的模型加载dtype是否是half?如果是half生成效果会降低的。改成float16   仵允港 @.   … ------------------ 原始邮件 ------------------ 发件人: @.>; 发送时间: 2023年11月14日(星期二) 下午5:19 收件人: @.>; 抄送: @.>; @.>; 主题: Re: [vllm-project/vllm] baichuan-13b-chat用vllm来生成,很多测试数据(有长有短,没有超出长度限制)只能生成一个句号,而且有些示例在删掉一些字词或句子之后,就可以正常生成了,请问有可能是什么原因? (Issue #1643) 我之前遇到的同样的问题,是因为max_tokens默认最大值是16,所以有的数据生成一点就被截断了,后来我设置了这个参数就好了。还有一种解决方案,先将prompt过一遍tokenizer,以prompt_ids的形式输入,我之前在batch推理时,遇到了只生成一个句号的情况,通过这种方式解决了   仵允港 @.   … ------------------ 原始邮件 ------------------ 发件人: @.>; 发送时间: 2023年11月14日(星期二) 下午5:03 收件人: @.>; 抄送: @.>; @.>; 主题: Re: [vllm-project/vllm] baichuan-13b-chat用vllm来生成,很多测试数据(有长有短,没有超出长度限制)只能生成一个句号,而且有些示例在删掉一些字词或句子之后,就可以正常生成了,请问有可能是什么原因? (Issue #1643) 需要设置sampling params,sampling_params = SamplingParams(temperature=0.3, top_k=5, top_p=0.85, max_tokens=1024, stop=["."] # repetition_penalty=1.05 ) 设置了也还是一样,只生成句号 — Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you commented.Message ID: @.> 我尝试过但是出现问题。 我只输入prompt,然后vllm的返回结果可以显示我输入的prompt和对应的prompt_token_ids。、 但是我用百川的tokenizer将prompt_token_ids解码成中文,发现是乱码的。 并且用百川的tokenizer将prompt转成prompt_token_ids,输入vllm会报错。 — Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you commented.Message ID: @.>

我看vllm的代码里面也是直接加载的AutoTokenizer,然后调用的tokenizer.encode(),不知道为什么会不一样。

你直接先过一遍tokenizer.encoder,是用的vllm做的encoder吗,怎么调用vllm的encode?

我加载vllm的时候是用的 dtype='float16'

— Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you commented.Message ID: @.***>

MrInouye commented 11 months ago

我也看了源码并没有不一样,但是采用prompt_token_ids的推理才有正确结果。具体原因我也不太清除。我是预加载baichuan的tokenizer,先用它做tokenizer.encoder,用得到的token_id输入到vllm中   仵允港 @.   ------------------ 原始邮件 ------------------ 发件人: @.>; 发送时间: 2023年11月14日(星期二) 下午5:37 收件人: @.>; 抄送: @.>; @.>; 主题: Re: [vllm-project/vllm] baichuan-13b-chat用vllm来生成,很多测试数据(有长有短,没有超出长度限制)只能生成一个句号,而且有些示例在删掉一些字词或句子之后,就可以正常生成了,请问有可能是什么原因? (Issue #1643) 我在之前测试batch推理时,遇到过你说的第一种情况,我当时对比了直接用tokenizer做encoder和用vllm做的encoder,我发现两者并不相同,我用的也是baichuan13b。后来我直接先过一遍tokenizer.encoder,调用vllm时,输入prompt_token_ids. 然后测试就是正常的了。当然,你的模型加载dtype是否是half?如果是half生成效果会降低的。改成float16   仵允港 @.   … ------------------ 原始邮件 ------------------ 发件人: @.>; 发送时间: 2023年11月14日(星期二) 下午5:19 收件人: @.>; 抄送: @.>; @.>; 主题: Re: [vllm-project/vllm] baichuan-13b-chat用vllm来生成,很多测试数据(有长有短,没有超出长度限制)只能生成一个句号,而且有些示例在删掉一些字词或句子之后,就可以正常生成了,请问有可能是什么原因? (Issue #1643) 我之前遇到的同样的问题,是因为max_tokens默认最大值是16,所以有的数据生成一点就被截断了,后来我设置了这个参数就好了。还有一种解决方案,先将prompt过一遍tokenizer,以prompt_ids的形式输入,我之前在batch推理时,遇到了只生成一个句号的情况,通过这种方式解决了   仵允港 @.   … ------------------ 原始邮件 ------------------ 发件人: @.>; 发送时间: 2023年11月14日(星期二) 下午5:03 收件人: @.>; 抄送: @.>; @.>; 主题: Re: [vllm-project/vllm] baichuan-13b-chat用vllm来生成,很多测试数据(有长有短,没有超出长度限制)只能生成一个句号,而且有些示例在删掉一些字词或句子之后,就可以正常生成了,请问有可能是什么原因? (Issue #1643) 需要设置sampling params,sampling_params = SamplingParams(temperature=0.3, top_k=5, top_p=0.85, max_tokens=1024, stop=["."] # repetition_penalty=1.05 ) 设置了也还是一样,只生成句号 — Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you commented.Message ID: @.> 我尝试过但是出现问题。 我只输入prompt,然后vllm的返回结果可以显示我输入的prompt和对应的prompt_token_ids。、 但是我用百川的tokenizer将prompt_token_ids解码成中文,发现是乱码的。 并且用百川的tokenizer将prompt转成prompt_token_ids,输入vllm会报错。 — Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you commented.Message ID: @.> 我看vllm的代码里面也是直接加载的AutoTokenizer,然后调用的tokenizer.encode(),不知道为什么会不一样。 你直接先过一遍tokenizer.encoder,是用的vllm做的encoder吗,怎么调用vllm的encode? 我加载vllm的时候是用的 dtype='float16' — Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you commented.Message ID: @.>

好的,感谢~~~

SitaoXie commented 11 months ago

请问解决了吗?我遇到了类似问题,微调好的模型在使用vllm框架生成长对话时总容易中断 Is it solved yet? I have a similar problem, the fine-tuning model is always easy to interrupt when using the vllm frame growth growth dialogue

异常输出/Exceptional output:

image

正常输出/Normal output:

image 我尝试了@yungangwu提供的先过tokenizer方法但未生效,代码如下: I tried the first tokenizer method provided by @yungangwu but not effective with the code below:

tokenizer = AutoTokenizer.from_pretrained(model_id)
sampling_params = SamplingParams(temperature=0.3, top_k=5, top_p=0.85, max_tokens=1024, stop=["</s>"])
outputs = llm.generate(sampling_params=sampling_params, prompt_token_ids=model_inputs)
soujie commented 11 months ago

我也遇见了同样的问题, 参考上面将SamplingParams 中的max_tokens 设置大一点就行了.

SitaoXie commented 11 months ago

我已找到问题所在,不算是vllm的问题。我使用的是llama2模型,微调并融合后使用transformer的AutoTokenizer编码会出现问题,但vllm的源码中调用了该函数。使用LlamaTokenizer先编码再传入prompt_token_ids来替代prompts就可以了。这种解决适用于离线批处理,openai风格server需修改vllm的源码

from vllm import LLM, SamplingParams
from transformers import LlamaTokenizer
tokenizer = LlamaTokenizer.from_pretrained(model_id)
llm = LLM(model=model_id)
model_inputs = []
for prompt in prompts:
  model_inputs.append(tokenizer(prompt, return_tensors="pt").to("cuda")["input_ids"][0].tolist())
sampling_params = SamplingParams(temperature=0, max_tokens=1024, stop=["</s>"])
outputs = llm.generate(sampling_params=sampling_params, prompt_token_ids=model_inputs)
Oscarjia commented 7 months ago

How about set "do_sample":False and "temperature":1?

Hang-shao commented 4 months ago

我调用本地化模型,输出的结果绝了,有兄弟知道什么问题么,或者怎么解决的。

from vllm import LLM, SamplingParams
prompts = [
    "你好",
    "你是谁"
]
sampling_params = SamplingParams(temperature=0.8, top_p=0.95, max_tokens=100)
llm = LLM(model="/home/trimps/llm_model/baichuan/Baichuan2-13B-Chat",tensor_parallel_size=2,trust_remote_code=True, tokenizer_mode='auto')
outputs = llm.generate(prompts, sampling_params)
#Print the outputs.
for output in outputs:
    prompt = output.prompt
    generated_text = output.outputs[0].text
    print(f"\n\n输出: {generated_text!r}")

image

输出的是什么玩意~~

hmellor commented 4 months ago

LLM.generate does not apply the chat template. If you must use LLM, make sure to apply the chat template with the tokenizer first.

However, I'd recommend using the OpenAI compatible server https://docs.vllm.ai/en/latest/serving/openai_compatible_server.html

realJaydenCheng commented 2 months ago

我调用本地化模型,输出的结果绝了,有兄弟知道什么问题么,或者怎么解决的。

from vllm import LLM, SamplingParams
prompts = [
    "你好",
    "你是谁"
]
sampling_params = SamplingParams(temperature=0.8, top_p=0.95, max_tokens=100)
llm = LLM(model="/home/trimps/llm_model/baichuan/Baichuan2-13B-Chat",tensor_parallel_size=2,trust_remote_code=True, tokenizer_mode='auto')
outputs = llm.generate(prompts, sampling_params)
#Print the outputs.
for output in outputs:
    prompt = output.prompt
    generated_text = output.outputs[0].text
    print(f"\n\n输出: {generated_text!r}")

image

输出的是什么玩意~~

不能直接对话,要加对话模版,组成完整的prompt才能对。百川的模型我不清楚怎么做,meta的llama可以参考https://llama.meta.com/docs/model-cards-and-prompt-formats/meta-llama-3/ ,百川应该也有类似的。

要让大模型能够对话,需要传入大模型能理解的形式(尤其是经过“指令微调”的模型)。如果是直接输入给大模型,那么大模型仍然只是一个有“续写”功能的模型。

xinlong-yang commented 3 weeks ago

我尝试了(1)增大max_tokens,没啥变化 (2)用AutoTokenizer先对prompts进行处理,也没啥变化 (3)在处理prompts的时候加入chat_template,此时推理正常。具体原因参考是vllm的LLM没有apply chat template