Как сгенерировать текст, используя модель GPT2 с преобразователями Huggingface?

Я хотел использовать GPT2Tokenizer, AutoModelForCausalLM для генерации (переписывания) образца текста. я пыталсяtransformers==4.10.0,transformers==4.30.2и--upgrade git+https://github.com/huggingface/transformers.git, однако я получаю ошибкуAttributeError: 'GPT2LMHeadModel' object has no attribute 'compute_transition_scores.

Мой код выглядит следующим образом:

      from transformers import GPT2Tokenizer, AutoModelForCausalLM
import numpy as np
import pandas as pd


x = "sample Text" #df_toxic['text'].iloc[0]

tokenizer = GPT2Tokenizer.from_pretrained("gpt2")
model = AutoModelForCausalLM.from_pretrained("gpt2")
tokenizer.pad_token_id = tokenizer.eos_token_id
inputs = tokenizer(x, return_tensors="pt")

# Example 1: Print the scores for each token generated with Greedy Search
outputs = model.generate(**inputs, max_new_tokens=5, return_dict_in_generate=True, output_scores=True)
transition_scores = model.compute_transition_scores(
    outputs.sequences, outputs.scores, normalize_logits=True
)
# input_length is the length of the input prompt for decoder-only models, like the GPT family, and 1 for
# encoder-decoder models, like BART or T5.
input_length = 1 if model.config.is_encoder_decoder else inputs.input_ids.shape[1]
generated_tokens = outputs.sequences[:, input_length:]
for tok, score in zip(generated_tokens[0], transition_scores[0]):
    # | token | token string | logits | probability
    print(f"| {tok:5d} | {tokenizer.decode(tok):8s} | {score.numpy():.3f} | {np.exp(score.numpy()):.2%}")

Я получил ошибку:

      Setting `pad_token_id` to `eos_token_id`:50256 for open-end generation.
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
Cell In [21], line 3
      1 # Example 1: Print the scores for each token generated with Greedy Search
      2 outputs = model.generate(**inputs, max_new_tokens=5, return_dict_in_generate=True, output_scores=True)
----> 3 transition_scores = model.compute_transition_scores(
      4     outputs.sequences, outputs.scores, normalize_logits=True
      5 )
      6 # # input_length is the length of the input prompt for decoder-only models, like the GPT family, and 1 for
      7 # # encoder-decoder models, like BART or T5.
      8 # input_length = 1 if model.config.is_encoder_decoder else inputs.input_ids.shape[1]
   (...)
     11 #     # | token | token string | logits | probability
     12 #     print(f"| {tok:5d} | {tokenizer.decode(tok):8s} | {score.numpy():.3f} | {np.exp(score.numpy()):.2%}")

File /usr/local/lib/python3.9/dist-packages/torch/nn/modules/module.py:1207, in Module.__getattr__(self, name)
   1205     if name in modules:
   1206         return modules[name]
-> 1207 raise AttributeError("'{}' object has no attribute '{}'".format(
   1208     type(self).__name__, name))

AttributeError: 'GPT2LMHeadModel' object has no attribute 'compute_transition_scores'

1 ответ

Чтобы создать текст с помощьюtransformersи модель GPT2. Если вы не особо заинтересованы в изменении различных функций генерации, вы можете использовать функцию конвейера, например

      from transformers import pipeline

generator = pipeline('text-generation', model='gpt2')
generator("Hello world, continue... ")

[вне]:

      [{'generated_text': 'Hello world, continue... !! A group of two great people from Finland came to my office and brought me with them, and I got some beautiful drawings with the colours. I thought I gave it to the artist but that was not the case.'}]

Если вам как-то придется использовать иAutoModelForCausalLMВместо того, чтобы использоватьpipeline, можешь попробоватьAutoTokenizerвместоGPT2Tokenizer, например

      from transformers import AutoTokenizer, AutoModelForCausalLM

tokenizer = AutoTokenizer.from_pretrained("gpt2")
model = AutoModelForCausalLM.from_pretrained("gpt2")
tokenizer.pad_token_id = tokenizer.eos_token_id


x = "Hello world, ..."
inputs = tokenizer(x, return_tensors="pt")

from transformers import AutoTokenizer, AutoModelForCausalLM

tokenizer = AutoTokenizer.from_pretrained("gpt2")
model = AutoModelForCausalLM.from_pretrained("gpt2")
tokenizer.pad_token_id = tokenizer.eos_token_id


x = "Hello world, ..."
inputs = tokenizer(x, return_tensors="pt")

model_outputs = model.generate(**inputs, max_new_tokens=5, return_dict_in_generate=True, output_scores=True)

generated_tokens_ids = model_outputs.sequences[0]

tokenizer.decode(generated_tokens_ids)

[вне]:

      Hello world,...\n\nI'm sorry

Чтобы использоватьcompute_transition_scoresфункция реализована в https://discuss.huggingface.co/t/announcement-generation-get-probabilities-for-generated-output/30075/24

Сначала убедитесь, что у вас действительно установлена ​​обновленная версия трансформаторов, выполнив:

      import transformers
print(transformers.__version__)

Если версия выпущена после реализации этой функции, это не должно вызывать ошибок:

      from transformers import AutoTokenizer, AutoModelForCausalLM

tokenizer = AutoTokenizer.from_pretrained("gpt2")
model = AutoModelForCausalLM.from_pretrained("gpt2")
tokenizer.pad_token_id = tokenizer.eos_token_id

model.compute_transition_scores

[вне]:

      <bound method GenerationMixin.compute_transition_scores of GPT2LMHeadModel(...)

Если вы видитеAttributeError,

      AttributeError: 'GPT2LMHeadModel' object has no attribute 'compute_transition_scores'

скорее всего, ваше текущее ядро ​​Python (возможно, внутри Jupyter) не то, что у вас есть в вашемpip. Если да, проверьте свой исполняемый файл:

      import sys
sys.executable

Тогда вы должны увидеть что-то вроде:

      /usr/bin/python3

После этого вместо простогоpip install -U transformersповторно используйте этот бинарный файл Python и выполните:

      /usr/bin/python3 -m pip install -U transformers

Смотрите также:

Другие вопросы по тегам