即使将padding_side设置为'left',HuggingFace AutoModelForCasualLM仍会发出“decoder-only architecture”警告。

11

我正在使用AutoModelForCausalLMAutoTokenizer来生成DialoGPT的文本输出。

不知何故,即使使用huggingface提供的示例,我仍然会收到以下警告:

正在使用仅解码器架构,但检测到右填充!为了获得正确的生成结果,请在初始化标记器时设置padding_side='left'

from transformers import AutoModelForCausalLM, AutoTokenizer
import torch


tokenizer = AutoTokenizer.from_pretrained("microsoft/DialoGPT-medium")
model = AutoModelForCausalLM.from_pretrained("microsoft/DialoGPT-medium")

# Let's chat for 5 lines
for step in range(5):
    # encode the new user input, add the eos_token and return a tensor in Pytorch
    new_user_input_ids = tokenizer.encode(input(">> User:") + tokenizer.eos_token, return_tensors='pt')

    # append the new user input tokens to the chat history
    bot_input_ids = torch.cat([chat_history_ids, new_user_input_ids], dim=-1) if step > 0 else new_user_input_ids

    # generated a response while limiting the total chat history to 1000 tokens, 
    chat_history_ids = model.generate(bot_input_ids, max_length=1000, pad_token_id=tokenizer.eos_token_id)

    # pretty print last ouput tokens from bot
    print("DialoGPT: {}".format(tokenizer.decode(chat_history_ids[:, bot_input_ids.shape[-1]:][0], skip_special_tokens=True)))

代码由微软在Huggingface的模型卡上提供

我尝试将padding_side='left'添加到分词器中,但这并没有改变任何东西。 显然(从一些阅读中)DialoGPT希望填充在右侧? 我无法弄清楚这个问题,在我尝试谷歌搜索时也没有多少结果。

我能够通过以下方式抑制警告:

from transformers.utils import logging

logging.set_verbosity_info()

但这似乎不是最好的答案?


你能找到任何解决方案吗? - Anurag Chaudhary
3个回答

8

在这个上下文中,“填充”是指“tokenizer.eos_token”,当前你正在将填充放置在用户输入的右侧,错误提示需要正确的结果添加左侧填充。你需要这样做:

new_user_input_ids = tokenizer.encode(tokenizer.eos_token + input(">> User:"), return_tensors='pt', padding=True)


1
transformers的版本降级到4.22.2,以避免出现警告信息(我检查了从4.23.0到最新版本4.26.1都会显示警告信息)。如果您将tokenizer.eos_token更改为左侧输入文本,则可能会生成不正确的输出。

同意,将填充位置更改后,输出不正确,降级起作用了!谢谢。 - Atiqullah Ahmadzai
1
同意,更改填充位置后的输出是不正确的,降级成功!谢谢。 - Atiqullah Ahmadzai

1
当你有一批输入序列但大小不均时,会添加填充标记。对于仅解码器架构,你不希望在左侧添加填充标记,因为这样就要求模型根据前缀标记预测其余标记。如果其余标记只是填充标记,那么模型将愉快地学习输出填充标记。因此,这通常是一个错误,Huggingface代码可以检测到这个错误。这个错误通常发生是因为人们在训练分词器时忘记设置这个属性。例如,CodeGen分词器设置为右填充。要修复这个问题,你可以像这样将它传递给加载函数:
tokenizer = AutoTokenizer.from_pretrained("Salesforce/codegen-350M-mono", padding_size="left")

对于 CodeGen 模型来说,这似乎会产生很大的影响,所以我认为这个警告不应该被轻视。
你可以在这里尝试示例:https://github.com/sytelus/jupyter_nbs/blob/main/codegen_decoding.ipynb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接