-
Notifications
You must be signed in to change notification settings - Fork 5.2k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[BUG/Help]开batch预测时,模型结果不一致。 #841
Comments
有可能是显卡计算的精度误差导致的。只要生成结果都合理即可吧 |
相同环境相同显卡,也降低了各种生成稳定性的参数。部署的还是想结果可复现吧,不开batch预测速度太慢了 |
我看eval时候,样本都是padding在前面的,这个是为啥呢 |
因为自回归预测时,结果会依据上一个字符。所以如果按照常规pad右边,很大程度上依赖pad在输出,不太合理。因此pad在左边,让模型尽可能地依赖输入,减少pad的影响吧。(个人理解) |
这个我理解,那和我单条输入的时候是一样的吗?padding在左边,那句子的position_ids也会变啊,如果说是相对位置编码不受这个影响我可以认同,那使别的绝对位置编码的decoder模型如果padding在左边,那position_embedding就很不同了 |
是的,按道理来说,应该会忽略pad的值。所以这个感觉更像是是transformer的一个bug吧 |
我的困惑点是在是否使用use_cache,如果不使用那padding在右边也可以,只要解码出下一个token_ids时候接到上次padding之前,如下所示: # 原始输入
input = tensor([[1,2,3,4,5], [1,2,0,0,0]])
# 解码得到各自的结果是6, 3,那下一次输入的就应该是
input_new = tensor([[1,2,3,4,5,6], [1,2,3,0,0,0]]) 但是如果使用use_cache,那past_key_value这些就很难处理了,所以padding在左边是最简单的选择,但是不明白其合理性 |
刚才测试了下,我的目的是想得到确定的结果,在参数do_sample=False,temperature=0.01,top_p=0.01,num_beams=1下,试验了bs=1/32, use_cache=True/Flase。结果use_cache设置True、False对结果无影响。不同的bs对结果有影响。 |
请问一下,我在batch预测时,比较了batchsize=1和batchsize=24的情况下,其中batchsize=24的效率是batchsize=1的4倍,但是消耗的显存也是4倍,那是不是可以理解为我在batchsize=1的情况下多个几个副本也能达到batchsize=24的效果,实际上的推理速度并没有提升? |
你好,如果batch推理的话,肯定是pad_on_left的,pad_on_right相当于是根据pad_token来生成next_token。 我这边尝试了一些batch推理的, pad_on_left的结果应该是ok的 [PROMPT] [OUTPUT]
如果咳嗽症状持续时间较长或严重影响日常生活,建议及时就医。 以上建议仅供参考,具体实施前请咨询医生或专业人士。 咳嗽是常见的症状,如果症状轻微,可以通过一些自我缓解措施来缓解。但如果咳嗽症状严重 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< [PROMPT] [OUTPUT] <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< [PROMPT] [OUTPUT] GPT-3是一种大型语言模型,由OpenAI开发,可以用于生成高质量的自然语言文本。它可以生成文本、回答问题、进行对话、撰写文章等,并且可以针对特定的任务进行训练和调优。GPT-3在自然语言生成领域的研究和应用具有很高的价值,已经被广泛应用于各种应用场景中。 ChatGPT是GPT-3模型的一个变体,用于在聊天对话中生成文本。它可以针对给定的输入文本生成连续的文本回复,其文本内容基于预先编写的算法和规则,而不是基于人类的经验或知识。 希望这些信息能对您有所帮助。如果您有其他问题,请随时问我。 敬礼! chatgpt人工智能工程师2023年2月24日 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< [PROMPT] [OUTPUT] def quicksort(arr):
if len(arr) <= 1:
return arr
else:
pivot = arr[0]
left = []
right = []
for i in range(1, len(arr)):
if arr[i] < pivot:
left.append(arr[i])
else:
right.append(arr[i])
return quicksort(left) + [pivot] + quicksort(right) 这个函数接受一个列表 例如,要对以下列表进行快速排序: arr = [3, 6, 1, 8, 5, 2, 9, 4, 7] 调用 [1, 2, 3, 4, 5, 6, 7, 8, 9] <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< |
batch中较短的pad不会影响,batch中尝试结合下长短文本结合(eg:400/20),会发现短文本在长pad下,输出会和不开batch预测短文本不一致。参考https://huggingface.co/THUDM/chatglm-6b/blob/main/test_modeling_chatglm.py#L120,开batch结果不一致 |
@irasin 是的,我看了下padding在左边,其position_ids也是从非padding位置开始的,这样不仅是chatglm,应该所有的decoder架构的都可以padding在左边来实现batch_generate |
我也是batch预测和单条不一致,问下解决了么? |
https://huggingface.co/THUDM/chatglm-6b/blob/main/test_modeling_chatglm.py#L120 这个可以,不能只传input_ids |
确实是这样的,但是chatglm相比其他的模型还是要特殊一点的,由于涉及到position_2d,做batch_generation的时候,两种position的处理方式还不一样,这个需要注意一下 |
transformers==4.30.2 |
试试传入use_fast=False |
和padding没关系吧,是fp16精度问题 |
这个问题解决了吗 |
能把你初始化 model 的代码贴一下吗?我用 llama2 的时候遇到了同样问题,
改成
后这种现象会有所缓解,但没完全消失。 |
我也有这种问题, batch_size=1 和 batch_size=10 的时候 同一个输入推理出来的不一样,这个怎么办吗 |
同问,到底是什么原因呀 |
Is there an existing issue for this?
Current Behavior
p-tuning模型后,模型开batch预测时,tokenizer时使用pad填充,使用generate方法预测时,结果和单条预测不一致(已设置 do_sample=False, temperature=0.01,top_p=0.01等确保模型输出稳定性。重复多次,batch的结果始终和单条预测结果对不齐)。类似问题有搜索到huggingface/transformers#14521
,请问这是transformer的问题么?
Expected Behavior
No response
Steps To Reproduce
Environment
Anything else?
No response
The text was updated successfully, but these errors were encountered: