HuggingFace AutoModelForCasualLM "decoder-only architecture" warning, even after setting padding_side='left'
Asked Answered
Y

5

16

I'm using AutoModelForCausalLM and AutoTokenizer to generate text output with DialoGPT.

For whatever reason, even when using the provided examples from huggingface I get this warning:

A decoder-only architecture is being used, but right-padding was detected! For correct generation results, please set padding_side='left' when initializing the tokenizer.

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

Code provided by microsoft on the model card at huggingface

I've tried adding padding_side='left' to the tokenizer but that doesn't change anything. Apparently (from some reading) DialoGPT wants the padding on the right side anyways? I can't figure this out, there are few results when I tried googling it.

I was able to suppress the warnings like this:

from transformers.utils import logging

logging.set_verbosity_info()

But this doesn't seem like the best answer?

Yeo answered 9/12, 2022 at 20:39 Comment(1)
Are you able to find any solution for this?Shout
L
11

Padding in this context is referring to the "tokenizer.eos_token", and you are currently padding to the right of the user input and the error is saying that for correct results add padding to the left. You need to do this:

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

Lavonna answered 31/12, 2022 at 22:16 Comment(2)
This removed the warning but now it's sometimes not even responding: ` DialoGPT: neighbour DialoGPT: neighbour DialoGPT: DialoGPT: DialoGPT: `Allness
This will not work as after encountering the EOS token, the decoder won't generate anything.Roberson
M
1

Downgrade the version of transformers to 4.22.2 so that the warning message does not happen (I checked the version from 4.23.0 to the newest is 4.26.1 the warning message showed). If you change tokenizer.eos_token to the left input text, it maybe generates output incorrectly.

Merkley answered 27/2, 2023 at 10:56 Comment(1)
Agreed, the out was not correct after changing the padding place, downgrade worked !. thanksPortfolio
S
1

Padding tokens are added when you have batch of input sequence but of uneven sizes. For decoder-only architecture, you don't want to have padding tokens on left because you are then asking the model to predict rest of the tokens given prefix tokens. If rest of the tokens is just padding tokens then model will happily learn just outputting padding tokens. So this is usually a mistake and Huggingface code detects this. This mistake happens typically because people forget to set this attribute while training their tokenizer. For example, CodeGen tokenizer is set with right padding. To fix this, you can pass this to load function like this:

tokenizer = AutoTokenizer.from_pretrained("Salesforce/codegen-350M-mono", padding_size="left")

For CodeGen model this seems to make huge difference so I think this warning shouldn't be taken lightly.

You can play with example here: https://github.com/sytelus/jupyter_nbs/blob/main/codegen_decoding.ipynb

Scrambler answered 25/6, 2023 at 7:58 Comment(1)
padding_size should be padding_side?Milkmaid
M
1
from transformers.utils import logging
logging.get_logger("transformers").setLevel(logging.ERROR)

tokenizer = AutoTokenizer.from_pretrained("microsoft/DialoGPT-medium", padding_side='left')

The above code sets the logging level of the "transformers" logger to ERROR, which means only error messages will be displayed, and lower severity messages will be ignored.

Marylynnmarylynne answered 20/12, 2023 at 12:26 Comment(3)
What is this code doing and how does it solve the problem?Qintar
The code sets the logging level of the "transformers" logger to ERROR, which means only error messages will be displayed, and lower severity messages will be ignored.Marylynnmarylynne
Please edit the question to add these detailsQintar
O
0

According to the model card right padding is correct:

DialoGPT is a model with absolute position embeddings so it’s usually advised to pad the inputs on the right rather than the left.

This is confirmed by this github issue:

How do I separate dialog turns?

There ARE special tokens (<|endoftext|>, id=50256) between dialogue turns in multi-turn setup. Your input format should be like this:

Turn1 <|endoftext|> Turn2 <|endoftext|> ... TurnN

The developers clearly intended that you add an EOS token after every dialog turn, so you should just suppress the warning.

Oliverolivera answered 13/12, 2023 at 10:59 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.