我尝试使用huggingface训练器来微调gpt-j,但失败得很惨,我遵循了引用bert的例子,但当然,gpt-j模型并不完全像bert模型。
这个错误表明模型没有产生损失,这很好,只是我不知道如何让它产生损失,也不知道如何改变训练者的预期。
我使用的是变形金刚4.22.2。我希望在我尝试使用GPU在Paperspace上做任何事情之前,能在CPU上运行这个程序。我确实在那里使用GPU做了一个初始尝试,收到了同样的错误,使用cuda的代码略有不同。
我怀疑我的方法是完全错误的,我发现了一个非常古老的使用8位量化来微调gpt-j的例子,但是即使是那个库也说它已经过时了。
我不确定我的错误是在使用我在bert例子中发现的compute_metrics()还是其他什么。任何建议都将受到感谢。或者,可能是我提供的配置标签的问题,但我已经尝试了不同的排列。
我知道什么是损失函数,但我不知道在这种情况下应该如何配置它。
我的代码:
from transformers import Trainer, TrainingArguments, AutoModelForCausalLM
from transformers import GPTJForCausalLM, AutoTokenizer
from datasets import load_dataset
import time
import torch
import os
import numpy as np
import evaluate
import sklearn
start = time.time()
GPTJ_FINE_TUNED_FILE = "./fine_tuned_models/gpt-j-6B"
print("Loading model")
model = GPTJForCausalLM.from_pretrained("EleutherAI/gpt-j-6B", low_cpu_mem_usage=True)
model.config.pad_token_id = model.config.eos_token_id
print("Loading tokenizer")
tokenizer = AutoTokenizer.from_pretrained("EleutherAI/gpt-j-6B")
tokenizer.pad_token = tokenizer.eos_token
print("Loading dataset")
current_dataset = load_dataset("wikitext", 'wikitext-103-v1')
current_dataset['train'] = current_dataset['train'].select(range(1200))
def tokenize_function(examples):
current_tokenizer_result = tokenizer(examples["text"], padding="max_length", truncation=True)
return current_tokenizer_result
print("Splitting and tokenizing dataset")
tokenized_datasets = current_dataset.map(tokenize_function, batched=True)
small_train_dataset = tokenized_datasets["train"].select(range(100))
print("Preparing training arguments")
training_args = TrainingArguments(output_dir=GPTJ_FINE_TUNED_FILE,
report_to='all',
logging_dir='./logs',
per_device_train_batch_size=1,
label_names=['input_ids', 'attention_mask'], # 'logits', 'past_key_values'
num_train_epochs=1,
no_cuda=True
)
metric = evaluate.load("accuracy")
def compute_metrics(eval_pred):
logits, labels = eval_pred
predictions = np.argmax(logits, axis=-1)
return metric.compute(predictions=predictions, references=labels)
trainer = Trainer(
model=model,
args=training_args,
train_dataset=small_train_dataset
)
print("Starting training")
trainer.train()
print(f"Finished fine-tuning in {time.time() - start}")
这将导致错误和堆栈跟踪:
File "xxx\ft_v3.py", line 66, in <module>
File "xxx\venv\lib\site-packages\transformers\trainer.py", line 1521, in train
return inner_training_loop(
File "xxx\venv\lib\site-packages\transformers\trainer.py", line 1763, in _inner_training_loop
tr_loss_step = self.training_step(model, inputs)
File "xxx\venv\lib\site-packages\transformers\trainer.py", line 2499, in training_step
loss = self.compute_loss(model, inputs)
File "xxx\venv\lib\site-packages\transformers\trainer.py", line 2544, in compute_loss
raise ValueError(
ValueError: The model did not return a loss from the inputs, only the following keys: logits,past_key_values. For reference, the inputs it received are input_ids,attention_mask.
1条答案
按热度按时间tez616oj1#
我找到了看起来有效的方法,尽管现在我的内存不足,正在寻找处理它的方法。
data_collator参数似乎解决了我遇到的确切问题。