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

  1. Set pad_token_id in generation_config (commonly equal to eos or a dedicated pad token)
  2. Or pass pad_token_id=... explicitly to generate()
  3. 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

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


AI-assisted analysis of PaddlePaddle/PaddleOCR@2661c7c0ef (2026-08-14). Data as JSON: /api/errors/26e843e37643fe81. Report an issue: GitHub.