PaddlePaddle/PaddleOCR · error · ValueError
If `eos_token_id` is defined, make sure that `pad_token_id`
Error message
If `eos_token_id` is defined, make sure that `pad_token_id` is defined.
What it means
In the manual greedy generation loop, once sequences finish they are replaced by pad_token_id (next_tokens * unfinished + pad * finished). If eos_token_id is configured but pad_token_id is not, the loop cannot mark finished sequences, so it raises this ValueError demanding pad_token_id be defined.
Source
Thrown at ppocr/modeling/heads/rec_unimernet_head.py:2464
pad_token_id = self.pad_token_id
eos_token_id = [self.eos_token_id]
eos_token = self.eos_token_id
unfinished_sequences = paddle.ones(batch_size, dtype=paddle.int64)
for idx in range(self.max_seq_len):
model_inputs = self.prepare_inputs_for_generation(input_ids, **model_kwargs)
outputs = self.generate_single_iter(
**model_inputs,
return_dict=True,
output_attentions=False,
output_hidden_states=False,
)
next_token_logits = outputs.logits[:, -1, :]
next_tokens_scores = self.logits_processor(input_ids, next_token_logits)
next_tokens = paddle.argmax(next_tokens_scores, axis=-1)
if eos_token_id is not None:
if pad_token_id is None:
raise ValueError(
"If `eos_token_id` is defined, make sure that `pad_token_id` is defined."
)
next_tokens = next_tokens * unfinished_sequences + pad_token_id * (
1 - unfinished_sequences
)
input_ids = paddle.concat([input_ids, next_tokens[:, None]], axis=-1)
model_kwargs = self._update_model_kwargs_for_generation(
outputs,
model_kwargs,
is_encoder_decoder=self.config_decoder.is_encoder_decoder,
)
unfinished_sequences = unfinished_sequences & ~self.stopping_criteria(
input_ids
).cast(paddle.int64)
if (
eos_token is not None
and (View on GitHub (pinned to 2661c7c0ef)
Solutions
- Set pad_token_id in generation_config (commonly equal to eos or a dedicated pad token)
- Or pass pad_token_id=... explicitly to generate()
- If no pad token exists, map pad_token_id to eos_token_id
Example fix
# before GenerationConfig(eos_token_id=2) # after GenerationConfig(eos_token_id=2, pad_token_id=2)
Defensive patterns
Strategy: validation
Validate before calling
if generation_config.eos_token_id is not None:
generation_config.pad_token_id = generation_config.pad_token_id or generation_config.eos_token_id Prevention
- Always define pad_token_id alongside eos_token_id in generation configs
- Map pad to eos when the tokenizer has no dedicated pad token
When it happens
Trigger: Running generate on the UniMERNet head with generation_config (or generate args) containing eos_token_id but pad_token_id=None.
Common situations: Configs ported from HF models that relied on the library's default pad fallback; user tokenizers where pad was never assigned; fine-tuned checkpoints that saved partial generation configs.
Related errors
- `decoder_start_token_id` or `bos_token_id` has to be defined
- Please set inference model dir in Global.inference_model or
- Sliding window is currently only implemented for causal mask
- embed_dim must be divisible by num_heads (got `embed_dim`: {
- Make sure that all the required parameters: {list(function_a
AI-assisted analysis of PaddlePaddle/PaddleOCR@2661c7c0ef (2026-08-14).
Data as JSON: /api/errors/26e843e37643fe81.
Report an issue: GitHub.