pytorch 如何使用Huggingface训练器微调gpt-j

pdkcd3nj  于 2022-11-09  发布在  其他
关注(0)|答案(1)|浏览(207)

我尝试使用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.
tez616oj

tez616oj1#

我找到了看起来有效的方法,尽管现在我的内存不足,正在寻找处理它的方法。
data_collator参数似乎解决了我遇到的确切问题。

data_collator = DataCollatorForLanguageModeling(tokenizer, mlm=False)

trainer = Trainer(
    model=model,
    args=training_args,
    train_dataset=small_train_dataset,
    eval_dataset=small_eval_dataset,
    compute_metrics=compute_metrics,
    data_collator=data_collator,
)

相关问题