【Transformers】エラーValueError: Asking to pad but the tokenizer does not have a padding token. Please select a token to use as `pad_token`・・・・解決方法



1. エラーの内容
2. エラーの発生したコード
2.1. モデルの読み込み
モデルとしてllama3を使用します。トークナイザーを読み込みます。モデルは今回の問題と直接的に関係ないので、読み込みません。
from transformers import AutoTokenizer, AutoModelForCausalLM
import torch
model_id = "meta-llama/Meta-Llama-3-8B"
tokenizer = AutoTokenizer.from_pretrained(model_id)
2.2. 問題のあるコード
次に、以下のコードでエラーが発生しました。
prompt="Octave is "
# 入力に対して attention_mask を生成
inputs = tokenizer(prompt, return_tensors="pt", padding=True)
input_ids = inputs["input_ids"]
attention_mask = inputs["attention_mask"]
ここでは、ユーザーからの入力である「Octave is」をトークナイズし、attention_mask(注意マスク)を作成しようとしています。しかし、このコードを実行すると、ValueErrorが発生しました。
ValueError: Asking to pad but the tokenizer does not have a padding token. Please select a token to use as `pad_token` `(tokenizer.pad_token = tokenizer.eos_token e.g.)` or add a new pad token via `tokenizer.add_special_tokens({‘pad_token’: ‘[PAD]’})`.
日本語で説明すると、このエラーは次のような内容です。
トークナイザーに「padding token(埋め込み用のトークン)」が設定されていないため、padding=True
を指定するとエラーが発生しています。このエラーを解消するには、トークナイザーにpad_token
を指定する必要があります。
つまり、エラーを解消するためには、トークナイザーにpadding tokenを設定する必要があります。
3. 解決策
エラーを解決するために、以下の2つの方法があります。


3.1. 解決策1:eos_tokenをpad_tokenに設定する
1つ目の方法は、既にトークナイザーに定義されている終端トークン(eos_token)をpadding tokenとして利用する方法です。この方法では、以下のコードを追加するだけで、エラーを回避できます。
tokenizer.pad_token = tokenizer.eos_token
3.2. 解決策2: 新しいpadding tokenを追加する
もう一つの方法として、新しいトークンをpadding tokenとして追加する方法もあります。例えば、”[PAD]”という特別なトークンを追加する場合は、以下のようにコードを記述します。
tokenizer.add_special_tokens({'pad_token': '[PAD]'})
どちらの方法を選んでも、トークナイザーに埋め込みトークンが設定されるため、padding=True
の指定でエラーが発生しなくなります。
