Search code examples
pythonmachine-learningpytorchhuggingface-tokenizers

Getting an exception with fine-tuning of model


I am trying to fine-tune a model. There is a dataset:

[
  {
    "sample": [
      " Какие советы помогут вам составить успешный бизнес-план?",
      "\n1. Изучите свой целевой рынок: поймите, кому вы продаете, насколько велика конкуренция и текущие тенденции.\n2. Определите свою бизнес-модель и стратегии: решите, какие продукты и услуги вы будете предлагать и как вы будете конкурировать на рынке.\n3. Наметьте свои финансовые прогнозы: оцените начальные затраты, прогнозы доходов и эксплуатационные расходы.\n4. Проанализируйте риски: определите потенциальные проблемы и разработайте стратегии для их смягчения.\n5. Разработайте маркетинговый план: спланируйте, как вы будете продвигать свой бизнес и привлекать новых клиентов.\n6. Установите вехи: установите краткосрочные и долгосрочные цели и разработайте план измерения прогресса."
    ]
  },
  {
    "sample": [
      " Опишите место, где вы оказываетесь в безмятежной обстановке средневековой гостиницы с экраном из рисовой бумаги.",
      " Прочные пасторские столы и низкие скамейки предлагают тихое место, где можно поесть и выпить еду, принесенную с собой или купленную в ближайшей пекарне. В задней части комнаты дверь, ведущая на кухню и в личные покои владельца, наполовину скрыта экраном из рисовой бумаги."
    ]
  }
]

And I tried to train it like:

import json
import torch
from transformers import AutoTokenizer, AutoModelWithLMHead, TextDataset, DataCollatorForLanguageModeling, Trainer, TrainingArguments

with open("dataset_final.json", "r", encoding="utf-8") as f:
    json_data = f.read()

data = json.loads(json_data)

samples = [d["sample"] for d in data]

tokenizer = AutoTokenizer.from_pretrained("tinkoff-ai/ruDialoGPT-medium")
model = AutoModelWithLMHead.from_pretrained("tinkoff-ai/ruDialoGPT-medium")

tokens = [tokenizer(sample)["input_ids"] for sample in samples]
tokens = [token for sublist in tokens for token in sublist]

dataset = TextDataset(tokens)
data_collator = DataCollatorForLanguageModeling(tokenizer=tokenizer, mlm=False)

training_args = TrainingArguments(
    output_dir="./results",
    evaluation_strategy="epoch",
    learning_rate=2e-5,
    per_device_train_batch_size=1,
    per_device_eval_batch_size=1,
    num_train_epochs=5,
    weight_decay=0.01,
)
trainer = Trainer(
    model=model,
    args=training_args,
    train_dataset=dataset,
    data_collator=data_collator,
)

trainer.train()

model.save_pretrained('new_model')

But it gives an exception like:

dataset = TextDataset(tokens)
TypeError: TextDataset.__init__() missing 2 required positional arguments: 'file_path' and 'block_size'

I tried to reverse the arguments, but it doesn't help.


Solution

  • TextDataset() requires a file in the file system to work properly

    you can save the sample on a file, and then use the TextDataset() with the saved file as parameter

    samples = [d["sample"] for d in data]
    
    with open("my_samples.txt", "w", encoding="utf-8") as f:
        f.write("\n".join(samples))
    
    dataset = TextDataset(
        file_path="my_samples.txt",
        block_size=tokenizer.max_len_single_sentence
    )