1# Установка библиотек
2!pip install datasets
3!apt install git-lfs
4!pip install transformers
5!pip install sentencepiece
6!pip install rouge_score
7
8# Импорт библиотек
9import numpy as np
10from datasets import Dataset
11import tensorflow as
12import nltk
13from transformers import T5TokenizerFast, Seq2SeqTrainingArguments, Seq2SeqTrainer, AutoModelForSeq2SeqLM, DataCollatorForSeq2Seq
14import torch
15from transformers.optimization import Adafactor, AdafactorSchedule
16from datasets import load_dataset, load_metric
17
18# загрузка параметров
19raw_datasets = load_dataset("xsum")
20metric = load_metric("rouge")
21nltk.download('punkt')
22
23# Ввести свой ключ huggingface hyb
24from huggingface_hub import notebook_login
25notebook_login()
26
27# Определение параметров
28REPO = "t5-russian-summarization" # Введите наазвание название репозитория
29MODEL_NAME = "UrukHan/t5-russian-summarization" # Введите наазвание выбранной модели из хаба
30MAX_INPUT = 256 # Введите максимальную длинну входных данных в токенах (длинна входных фраз в словах (можно считать полслова токен))
31MAX_OUTPUT = 64 # Введите максимальную длинну прогнозов в токенах (можно уменьшить для задач суммризации или других задач где выход короче)
32BATCH_SIZE = 8
33DATASET = 'UrukHan/t5-russian-summarization' # Введите наазвание название датасета
34
35# Загрузка датасета использование других типов данных опишу ниже
36data = load_dataset(DATASET)
37
38# Загрузка модели и токенизатора
39tokenizer = T5TokenizerFast.from_pretrained(MODEL_NAME)
40model = AutoModelForSeq2SeqLM.from_pretrained(MODEL_NAME)
41
42model.config.max_length = MAX_OUTPUT # по умолчанию 20, поэтому во всех моделях прогнозы обрезаются выходные последовательности
43# Закоментить после первого соъранения в репозиторий свой необъязательно
44tokenizer.push_to_hub(repo_name)
45
46train = data['train']
47test = data['test'].train_test_split(0.02)['test'] # Уменьшил так тестовыу. выборку чтоб не ждать долго расчет ошибок между эпохами
48
49data_collator = DataCollatorForSeq2Seq(tokenizer, model=model) #return_tensors="tf"
50
51def compute_metrics(eval_pred):
52 predictions, labels = eval_pred
53 decoded_preds = tokenizer.batch_decode(predictions, skip_special_tokens=True)
54 # Replace -100 in the labels as we can't decode them.
55 labels = np.where(labels != -100, labels, tokenizer.pad_token_id)
56 decoded_labels = tokenizer.batch_decode(labels, skip_special_tokens=True)
57
58 # Rouge expects a newline after each sentence
59 decoded_preds = ["\n".join(nltk.sent_tokenize(pred.strip())) for pred in decoded_preds]
60 decoded_labels = ["\n".join(nltk.sent_tokenize(label.strip())) for label in decoded_labels]
61
62 result = metric.compute(predictions=decoded_preds, references=decoded_labels, use_stemmer=True)
63 # Extract a few results
64 result = {key: value.mid.fmeasure * 100 for key, value in result.items()}
65
66 # Add mean generated length
67 prediction_lens = [np.count_nonzero(pred != tokenizer.pad_token_id) for pred in predictions]
68 result["gen_len"] = np.mean(prediction_lens)
69
70 return {k: round(v, 4) for k, v in result.items()}
71
72training_args = Seq2SeqTrainingArguments(
73 output_dir = REPO,
74 #overwrite_output_dir=True,
75 evaluation_strategy='steps',
76 #learning_rate=2e-5,
77 eval_steps=5000,
78 save_steps=5000,
79 num_train_epochs=1,
80 predict_with_generate=True,
81 per_device_train_batch_size=BATCH_SIZE,
82 per_device_eval_batch_size=BATCH_SIZE,
83 fp16=True,
84 save_total_limit=2,
85 #generation_max_length=256,
86 #generation_num_beams=4,
87 weight_decay=0.005,
88 #logging_dir='logs',
89 push_to_hub=True,
90)
91
92# Выберем вручную оптимизатор. Т5 в оригинальной архитектуре использует Адафактор оптимизатор
93optimizer = Adafactor(
94 model.parameters(),
95 lr=1e-5,
96 eps=(1e-30, 1e-3),
97 clip_threshold=1.0,
98 decay_rate=-0.8,
99 beta1=None,
100 weight_decay=0.0,
101 relative_step=False,
102 scale_parameter=False,
103 warmup_init=False,
104)
105lr_scheduler = AdafactorSchedule(optimizer)
106
107trainer = Seq2SeqTrainer(
108 model=model,
109 args=training_args,
110 train_dataset = train,
111 eval_dataset = test,
112 optimizers = (optimizer, lr_scheduler),
113 tokenizer = tokenizer,
114 compute_metrics=compute_metrics
115)
116
117trainer.train()
118
119trainer.push_to_hub()