Table of Contents

DeepLearning/NLP

IndexError: index out of range in self

꼬꼬마코더 2024. 9. 4. 17:14
728x90
---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
Cell In[14], line 31
     26 sentence_encoded = tokenizer(instruction, 
     27                              add_special_tokens=True,
     28                              return_tensors="pt")  # Ensure tensors are returned for model input
     30 # Generate the summary using the model
---> 31 summary_ids = model.generate(
     32     sentence_encoded["input_ids"], 
     33     max_new_tokens=100
     34     # max_length=max_target_length, 
     35     # min_length=40, 
     36     # num_beams=5,  # Optional: control the generation strategy
     37     # early_stopping=True,  # Optional: stop early when all beams are finished
     38     # no_repeat_ngram_size=2,
     39 )
     41 # Decode the encoded sentence, skipping special tokens
     42 sentence_decoded = tokenizer.decode(
     43     summary_ids[0],  # Select the first (and usually only) sequence generated
     44     skip_special_tokens=True  # Skip special tokens in the final output
     45     )

File /opt/conda/lib/python3.10/site-packages/torch/utils/_contextlib.py:115, in context_decorator.<locals>.decorate_context(*args, **kwargs)
    112 @functools.wraps(func)
    113 def decorate_context(*args, **kwargs):
    114     with ctx_factory():
--> 115         return func(*args, **kwargs)

File /opt/conda/lib/python3.10/site-packages/transformers/generation/utils.py:1286, in GenerationMixin.generate(self, inputs, generation_config, logits_processor, stopping_criteria, prefix_allowed_tokens_fn, synced_gpus, streamer, **kwargs)
   1278         logger.warning(
   1279             "A decoder-only architecture is being used, but right-padding was detected! For correct "
   1280             "generation results, please set padding_side='left' when initializing the tokenizer."
   1281         )
   1283 if self.config.is_encoder_decoder and "encoder_outputs" not in model_kwargs:
   1284     # if model is encoder decoder encoder_outputs are created
   1285     # and added to model_kwargs
-> 1286     model_kwargs = self._prepare_encoder_decoder_kwargs_for_generation(
   1287         inputs_tensor, model_kwargs, model_input_name
   1288     )
   1290 # 5. Prepare input_ids which will be used for auto-regressive generation
   1291 if self.config.is_encoder_decoder:

File /opt/conda/lib/python3.10/site-packages/transformers/generation/utils.py:638, in GenerationMixin._prepare_encoder_decoder_kwargs_for_generation(self, inputs_tensor, model_kwargs, model_input_name)
    636 encoder_kwargs["return_dict"] = True
    637 encoder_kwargs[model_input_name] = inputs_tensor
--> 638 model_kwargs["encoder_outputs"]: ModelOutput = encoder(**encoder_kwargs)
    640 return model_kwargs

File /opt/conda/lib/python3.10/site-packages/torch/nn/modules/module.py:1518, in Module._wrapped_call_impl(self, *args, **kwargs)
   1516     return self._compiled_call_impl(*args, **kwargs)  # type: ignore[misc]
   1517 else:
-> 1518     return self._call_impl(*args, **kwargs)

File /opt/conda/lib/python3.10/site-packages/torch/nn/modules/module.py:1527, in Module._call_impl(self, *args, **kwargs)
   1522 # If we don't have any hooks, we want to skip the rest of the logic in
   1523 # this function, and just call forward.
   1524 if not (self._backward_hooks or self._backward_pre_hooks or self._forward_hooks or self._forward_pre_hooks
   1525         or _global_backward_pre_hooks or _global_backward_hooks
   1526         or _global_forward_hooks or _global_forward_pre_hooks):
-> 1527     return forward_call(*args, **kwargs)
   1529 try:
   1530     result = None

File /opt/conda/lib/python3.10/site-packages/transformers/models/t5/modeling_t5.py:985, in T5Stack.forward(self, input_ids, attention_mask, encoder_hidden_states, encoder_attention_mask, inputs_embeds, head_mask, cross_attn_head_mask, past_key_values, use_cache, output_attentions, output_hidden_states, return_dict)
    983 if inputs_embeds is None:
    984     assert self.embed_tokens is not None, "You have to initialize the model with valid token embeddings"
--> 985     inputs_embeds = self.embed_tokens(input_ids)
    987 batch_size, seq_length = input_shape
    989 # required mask seq length can be calculated via length of past

File /opt/conda/lib/python3.10/site-packages/torch/nn/modules/module.py:1518, in Module._wrapped_call_impl(self, *args, **kwargs)
   1516     return self._compiled_call_impl(*args, **kwargs)  # type: ignore[misc]
   1517 else:
-> 1518     return self._call_impl(*args, **kwargs)

File /opt/conda/lib/python3.10/site-packages/torch/nn/modules/module.py:1527, in Module._call_impl(self, *args, **kwargs)
   1522 # If we don't have any hooks, we want to skip the rest of the logic in
   1523 # this function, and just call forward.
   1524 if not (self._backward_hooks or self._backward_pre_hooks or self._forward_hooks or self._forward_pre_hooks
   1525         or _global_backward_pre_hooks or _global_backward_hooks
   1526         or _global_forward_hooks or _global_forward_pre_hooks):
-> 1527     return forward_call(*args, **kwargs)
   1529 try:
   1530     result = None

File /opt/conda/lib/python3.10/site-packages/torch/nn/modules/sparse.py:162, in Embedding.forward(self, input)
    161 def forward(self, input: Tensor) -> Tensor:
--> 162     return F.embedding(
    163         input, self.weight, self.padding_idx, self.max_norm,
    164         self.norm_type, self.scale_grad_by_freq, self.sparse)

File /opt/conda/lib/python3.10/site-packages/torch/nn/functional.py:2233, in embedding(input, weight, padding_idx, max_norm, norm_type, scale_grad_by_freq, sparse)
   2227     # Note [embedding_renorm set_grad_enabled]
   2228     # XXX: equivalent to
   2229     # with torch.no_grad():
   2230     #   torch.embedding_renorm_
   2231     # remove once script supports set_grad_enabled
   2232     _no_grad_embedding_renorm_(weight, input, max_norm, norm_type)
-> 2233 return torch.embedding(weight, input, padding_idx, scale_grad_by_freq, sparse)

IndexError: index out of range in self

입력된 ID가 어휘 크기(vocab size)를 초과한다는 것은, 모델이 사용하는 토크나이저가 생성한 토큰 ID가 모델의 어휘 범위 내에 있지 않다는 것을 의미합니다. 이를 이해하려면, 토크나이저와 어휘(vocabulary)의 관계를 먼저 설명해야 합니다.

어휘 크기 (Vocabulary Size)

모든 언어 모델에는 사전처럼 동작하는 **어휘집(vocabulary)**이 있습니다. 이 어휘집에는 모델이 처리할 수 있는 토큰(token) 들이 포함되어 있으며, 각 토큰은 고유한 숫자 ID로 매핑됩니다. 이 숫자 ID는 모델의 입력으로 사용됩니다.

예를 들어:

  • "Hello"라는 단어는 어휘에서 ID 1234로 매핑될 수 있습니다.
  • "world"는 ID 5678로 매핑될 수 있습니다.

모델이 처리할 수 있는 어휘의 크기는 한정되어 있습니다. 즉, 모델이 지원하는 어휘 크기만큼의 ID가 존재하며, 이 ID 범위를 벗어난 값이 입력되면 모델은 이를 처리할 수 없습니다.

문제의 원인

**"입력된 ID가 어휘 크기를 초과한다"**는 것은 토크나이저가 어떤 이유로든 어휘집에 없는 토큰을 생성했거나, 해당 토큰이 어휘집에서 유효한 범위 내의 ID로 매핑되지 않았다는 뜻입니다.

예를 들어:

  • 모델의 어휘 크기가 32,000이면, 모델이 처리할 수 있는 ID는 0에서 31,999까지입니다.
  • 하지만 만약 토크나이저가 32,000 이상의 ID를 생성했다면, 그 ID는 모델의 어휘 범위에 속하지 않기 때문에 모델이 처리할 수 없습니다.

이 문제가 발생하는 이유

  1. 특수 토큰 추가: 새로운 특수 토큰(예: #Person1#)을 추가했지만 모델이 그 토큰에 대한 임베딩을 학습하지 않았거나 모델의 어휘집이 이 추가된 토큰을 반영하지 않았을 수 있습니다. 모델의 임베딩 크기를 업데이트하지 않으면, 토크나이저는 새로운 토큰을 생성하지만 모델은 그 토큰에 대한 정보를 갖고 있지 않습니다.
  2. 잘못된 토크나이저 사용: 모델에 맞지 않는 토크나이저를 사용할 경우, 토크나이저가 모델의 어휘 크기를 넘어서는 토큰을 생성할 수 있습니다. 예를 들어, 잘못된 버전의 토크나이저를 사용하거나 모델과 일치하지 않는 토크나이저를 사용할 때 이러한 오류가 발생할 수 있습니다.

해결 방법

  1. 토크나이저에 특수 토큰 추가 후, 모델의 임베딩 테이블 크기 업데이트: 새로운 토큰을 추가할 경우, 모델의 임베딩 테이블 크기를 반드시 토크나이저의 어휘 크기에 맞춰 조정해야 합니다. 이 작업은 model.resize_token_embeddings(len(tokenizer))로 수행됩니다.
  2. 토크나이저와 모델의 일치 여부 확인: 토크나이저와 모델이 동일한 어휘집을 사용하고 있는지 확인합니다. 토크나이저와 모델이 일치하지 않으면 모델이 입력을 제대로 처리할 수 없습니다.

결론적으로, 입력된 ID가 어휘 크기를 초과한다는 것은 모델이 처리할 수 있는 토큰 범위를 벗어난 ID가 입력으로 사용되었다는 뜻이며, 이를 해결하려면 토크나이저와 모델의 어휘 크기와 설정을 일치시켜야 합니다.