PaddlePaddle/PaddleOCR · error · ValueError

`decoder_start_token_id` or `bos_token_id` has to be defined

Error message

`decoder_start_token_id` or `bos_token_id` has to be defined for encoder-decoder generation.

What it means

For encoder-decoder generation the first decoded token must come from somewhere; this helper resolves it from decoder_start_token_id or bos_token_id (argument, then generation_config). If both resolve to None it raises this ValueError because generation cannot build the initial [batch,1] decoder input.

Source

Thrown at ppocr/modeling/heads/rec_unimernet_head.py:2154

    def _get_decoder_start_token_id(
        self, decoder_start_token_id=None, bos_token_id=None
    ) -> int:
        decoder_start_token_id = (
            decoder_start_token_id
            if decoder_start_token_id is not None
            else self.generation_config.decoder_start_token_id
        )
        bos_token_id = (
            bos_token_id
            if bos_token_id is not None
            else self.generation_config.bos_token_id
        )
        if decoder_start_token_id is not None:
            return decoder_start_token_id
        elif bos_token_id is not None:
            return bos_token_id
        raise ValueError(
            "`decoder_start_token_id` or `bos_token_id` has to be defined for encoder-decoder generation."
        )

    def _prepare_decoder_input_ids_for_generation(
        self,
        batch_size,
        model_kwargs,
        decoder_start_token_id=None,
        bos_token_id=None,
    ):
        if model_kwargs is not None and "decoder_input_ids" in model_kwargs:
            decoder_input_ids = model_kwargs.pop("decoder_input_ids")
        elif "input_ids" in model_kwargs:
            decoder_input_ids = model_kwargs.pop("input_ids")
        else:
            decoder_input_ids = None

        decoder_start_token_id = self._get_decoder_start_token_id(

View on GitHub (pinned to 2661c7c0ef)

Solutions

  1. Set generation_config.decoder_start_token_id (or bos_token_id) to a valid token id, e.g. the tokenizer/pad id used during training
  2. Or pass decoder_start_token_id explicitly to generate()

Example fix

# before
generation_config = GenerationConfig(...)
# after
generation_config = GenerationConfig(
    ..., decoder_start_token_id=tokenizer.bos_token_id,
)
Defensive patterns

Strategy: validation

Validate before calling

start = (decoder_start_token_id
         or generation_config.decoder_start_token_id
         or generation_config.bos_token_id)
assert start is not None, 'set decoder_start_token_id or bos_token_id before generate'

Prevention

When it happens

Trigger: Calling generate on the UniMERNet head when neither decoder_start_token_id nor bos_token_id is passed and generation_config leaves both unset.

Common situations: Loading a fine-tuned checkpoint whose config dropped generation fields; building GenerationConfig manually and forgetting the start token; VQ-style tokenizers where bos was never defined.

Related errors


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