Как сгенерировать текст, используя модель 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
Смотрите также: