[THUDM/ChatGLM-6B][Help] generate方法和chat方法的调用结果不一致

2024-05-20 692 views
5

同一个内容总结的案例测试,使用generate方法生成的答案的token达到了300多个,而chat方法的token只有100多个,请问一下,这大概是什么原因?是有啥参数设置吗?

因为想尝试通过generate方法去批量调用模型,发现效果·跟chat方法有出入,希望能够解决两种方法生成的答案token参数相差过大的问题。

- 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

回答

2

想得到具体结果的话,top_p和temperature都设为0.01, do_sample设为False,应该是差在do_sample这个参数上了,可以试试

3

想得到具体结果的话,top_p和temperature都设为0.01, do_sample设为False,应该是差在do_sample这个参数上了,可以试试

问题得到了解决,但是我有点好奇的是,generate方法生成的接口耗时比chat的接口耗时要久得多,看了一下model_chatglm.py文件,chat方法里面其实是调用了generate方法的,反而性能更好,这是为什么呢

6

想得到具体结果的话,top_p和temperature都设为0.01, do_sample设为False,应该是差在do_sample这个参数上了,可以试试

问题得到了解决,但是我有点好奇的是,generate方法生成的接口耗时比chat的接口耗时要久得多,看了一下model_chatglm.py文件,chat方法里面其实是调用了generate方法的,反而性能更好,这是为什么呢

我这边简单测试了10个样例,输出时间基本一致

6

能方便把你的测试代码共享一下吗

# 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)
6

想得到具体结果的话,top_p和temperature都设为0.01, do_sample设为False,应该是差在do_sample这个参数上了,可以试试

问题得到了解决,但是我有点好奇的是,generate方法生成的接口耗时比chat的接口耗时要久得多,看了一下model_chatglm.py文件,chat方法里面其实是调用了generate方法的,反而性能更好,这是为什么呢

我这边简单测试了10个样例,输出时间基本一致

能把你的测试验证的代码共享一下吗?我现在测试一个内容长度为2000左右的文本做内容总结,generate需要6-7s,但是chat是只需要4s左右,耗时相差有点大

9

哦 我测试了下长度30左右的文本,没搞那么大。

3

哦 我测试了下长度30左右的文本,没搞那么大。

好的,我再验证一下

5

求问chat方法,有办法实现批量推理吗?

5

求问chat方法,有办法实现批量推理吗?

同问,请问兄弟你现在找到答案了吗?

0

想得到具体结果的话,top_p和temperature都设为0.01, do_sample设为False,应该是差在do_sample这个参数上了,可以试试

问题得到了解决,但是我有点好奇的是,generate方法生成的接口耗时比chat的接口耗时要久得多,看了一下model_chatglm.py文件,chat方法里面其实是调用了generate方法的,反而性能更好,这是为什么呢

请问model_chatglm.py这个文件应该在哪找呢,想看看chat怎么调用generate

5

想得到具体结果的话,top_p和temperature都设为0.01, do_sample设为False,应该是差在do_sample这个参数上了,可以试试

do_sample 都设置为false了,topp和temp还有用吗?

4

想得到具体结果的话,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”,也对我无效,请问有人搞清楚原因了吗。

1

看了一下chat方法实现的源码,它调用了generate方法,有以下更改:

  1. 对input_ids进行了修改,例如输入“你好”,直接tokenize得到的input_ids是['gMASK', 'sop', '▁你', '好'],chat中调用方法build_chat_input将input_ids变成了['[gMASK]', 'sop', '<|user|>', '▁', '<0x0A>', '▁你', '好', '<|assistant|>']
  2. 更改了参数logits_processer和eos_token_id

仅仅更改这些参数就会导致差异较大,也是不太理解,有知道的小伙伴吗?