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
- 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
- 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
- Persist decoder_start_token_id in every checkpoint's generation_config
- Smoke-test generate() with batch size 1 right after loading a model
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
- Make sure that all the required parameters: {list(function_a
- If `eos_token_id` is defined, make sure that `pad_token_id`
- 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`: {
AI-assisted analysis of PaddlePaddle/PaddleOCR@2661c7c0ef (2026-08-14).
Data as JSON: /api/errors/4814dac270ae4ea3.
Report an issue: GitHub.