ChatGLM-6B
ChatGLM-6B copied to clipboard
[Help] generate方法和chat方法的调用结果不一致
Is there an existing issue for this?
- [X] I have searched the existing issues
Current Behavior
同一个内容总结的案例测试,使用generate方法生成的答案的token达到了300多个,而chat方法的token只有100多个,请问一下,这大概是什么原因?是有啥参数设置吗?
Expected Behavior
因为想尝试通过generate方法去批量调用模型,发现效果·跟chat方法有出入,希望能够解决两种方法生成的答案token参数相差过大的问题。
Steps To Reproduce
Environment
- OS:Ubuntu 20.04
- Python:3.8
- Transformers:4.28.0dev0
- PyTorch: 2.0.0
- CUDA Support (`python -c "import torch; print(torch.cuda.is_available())"`) :True
Anything else?
想得到具体结果的话,top_p和temperature都设为0.01, do_sample设为False,应该是差在do_sample这个参数上了,可以试试
想得到具体结果的话,top_p和temperature都设为0.01, do_sample设为False,应该是差在do_sample这个参数上了,可以试试
问题得到了解决,但是我有点好奇的是,generate方法生成的接口耗时比chat的接口耗时要久得多,看了一下model_chatglm.py文件,chat方法里面其实是调用了generate方法的,反而性能更好,这是为什么呢
想得到具体结果的话,top_p和temperature都设为0.01, do_sample设为False,应该是差在do_sample这个参数上了,可以试试
问题得到了解决,但是我有点好奇的是,generate方法生成的接口耗时比chat的接口耗时要久得多,看了一下model_chatglm.py文件,chat方法里面其实是调用了generate方法的,反而性能更好,这是为什么呢
我这边简单测试了10个样例,输出时间基本一致
能方便把你的测试代码共享一下吗
# chat
max_length = 2048
top_p = 0.01 # 越小越确定
temperature = 0.01 # 越小越确定
import time
t1 = time.time()
for _ in range(10):
input = 'xxxx'
response, history = model.chat(tokenizer, input, history=[], max_length=max_length, top_p=top_p, temperature=temperature, do_sample=False)
print(input, end=' ')
gprint(response)
print('耗时:', time.time()-t1)
# generate
max_length = 2048
top_p = 0.01 # 越小越确定
temperature = 0.01 # 越小越确定
t1 = time.time()
for _ in range(10):
input = 'xxx '
inputs = tokenizer(
input,
max_length=max_length,
return_tensors="pt"
)
inputs = inputs.to('cuda')
gen_kwargs = {"max_length": max_length, "num_beams": 1, "do_sample": False, "top_p": 0.01,
"temperature": 0.01, "logits_processor": None, "use_cache": True}
outputs = model.generate(**inputs, **gen_kwargs)
print(tokenizer.decode(outputs[0]))
print('耗时:', time.time()-t1)
想得到具体结果的话,top_p和temperature都设为0.01, do_sample设为False,应该是差在do_sample这个参数上了,可以试试
问题得到了解决,但是我有点好奇的是,generate方法生成的接口耗时比chat的接口耗时要久得多,看了一下model_chatglm.py文件,chat方法里面其实是调用了generate方法的,反而性能更好,这是为什么呢
我这边简单测试了10个样例,输出时间基本一致
能把你的测试验证的代码共享一下吗?我现在测试一个内容长度为2000左右的文本做内容总结,generate需要6-7s,但是chat是只需要4s左右,耗时相差有点大
哦 我测试了下长度30左右的文本,没搞那么大。
哦 我测试了下长度30左右的文本,没搞那么大。
好的,我再验证一下
求问chat方法,有办法实现批量推理吗?
求问chat方法,有办法实现批量推理吗?
同问,请问兄弟你现在找到答案了吗?
想得到具体结果的话,top_p和temperature都设为0.01, do_sample设为False,应该是差在do_sample这个参数上了,可以试试
问题得到了解决,但是我有点好奇的是,generate方法生成的接口耗时比chat的接口耗时要久得多,看了一下model_chatglm.py文件,chat方法里面其实是调用了generate方法的,反而性能更好,这是为什么呢
请问model_chatglm.py这个文件应该在哪找呢,想看看chat怎么调用generate
想得到具体结果的话,top_p和temperature都设为0.01, do_sample设为False,应该是差在do_sample这个参数上了,可以试试
do_sample 都设置为false了,topp和temp还有用吗?
想得到具体结果的话,top_p和temperature都设为0.01, do_sample设为False,应该是差在do_sample这个参数上了,可以试试
问题得到了解决,但是我有点好奇的是,generate方法生成的接口耗时比chat的接口耗时要久得多,看了一下model_chatglm.py文件,chat方法里面其实是调用了generate方法的,反而性能更好,这是为什么呢
我和HL0718遇到的问题一样,我输入的文本比较长,500~3000个字左右,chat方法的效果普遍好于generate方法,看了modeling_chatglm.py,仍然找不到原因。“top_p和temperature都设为0.01, do_sample设为False”,也对我无效,请问有人搞清楚原因了吗。
看了一下chat方法实现的源码,它调用了generate方法,有以下更改:
- 对input_ids进行了修改,例如输入“你好”,直接tokenize得到的input_ids是['gMASK', 'sop', '▁你', '好'],chat中调用方法build_chat_input将input_ids变成了['[gMASK]', 'sop', '<|user|>', '▁', '<0x0A>', '▁你', '好', '<|assistant|>']
- 更改了参数logits_processer和eos_token_id
仅仅更改这些参数就会导致差异较大,也是不太理解,有知道的小伙伴吗?
看了一下chat方法实现的源码,它调用了generate方法,有以下更改:
- 对input_ids进行了修改,例如输入“你好”,直接tokenize得到的input_ids是['gMASK', 'sop', '▁你', '好'],chat中调用方法build_chat_input将input_ids变成了['[gMASK]', 'sop', '<|user|>', '▁', '<0x0A>', '▁你', '好', '<|assistant|>']
- 更改了参数logits_processer和eos_token_id
仅仅更改这些参数就会导致差异较大,也是不太理解,有知道的小伙伴吗?
因为chat版本的模型是根据这个格式进行对话微调的,所以chat方式要进行模板添加,如果要使用generate需要自己加载chat模板