Spaces:
Paused
Paused
File size: 4,592 Bytes
91feea3 a2c8f9a 60d30cc 91feea3 72b1673 91feea3 50b8512 21357fc 50b8512 181494a cc3b6f3 37c4d2f a2c8f9a a539a3b 60d30cc 91feea3 a539a3b 91feea3 d493478 c50213d 60d9a0b 181494a 72b1673 181494a 4b87cce 181494a 9acbf52 181494a 72b1673 7c6db05 72b1673 703edf3 72b1673 91feea3 72b1673 864967c 72b1673 91feea3 72b1673 91feea3 72b1673 a4f2192 72b1673 831f0b2 72b1673 91feea3 424c3fd |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 |
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#import streamlit as st #to use the shared secrets
from huggingface_hub import login
import gradio as gr
#from transformers import pipeline
import torch
from utils import *
from presets import *
from transformers import Trainer, TrainingArguments
#####################################################
#Hilfsfunktionen für das training
#####################################################
#Datensets in den Tokenizer schieben...
def tokenize_function(examples):
return tokenizer(examples["text"])
#Funktion, die den gegebenen Text aus dem Datenset gruppiert
def group_texts(examples):
# Concatenate all texts.
concatenated_examples = {k: sum(examples[k], []) for k in examples.keys()}
total_length = len(concatenated_examples[list(examples.keys())[0]])
# We drop the small remainder, we could add padding if the model supported it instead of this drop, you can
# customize this part to your needs.
total_length = (total_length // block_size) * block_size
# Split by chunks of max_len.
result = {
k: [t[i : i + block_size] for i in range(0, total_length, block_size)]
for k, t in concatenated_examples.items()
}
result["labels"] = result["input_ids"].copy()
return result
###################################################################################
#Access-Token (in Secrets)
#access_token = st.secrets["ACCESS_TOKEN"]
access_token = "hf_..."
login(token="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")
#Modelle und Tokenizer
model_name = "alexkueck/LIFineTuned"
#Alternativ mit beliebigen Modellen:
base_model = "project-baize/baize-v2-7b" #load_8bit = False (in load_tokenizer_and_model)
#base_model = "TheBloke/airoboros-13B-HF" #load_8bit = False (in load_tokenizer_and_model)
#base_model = "EleutherAI/gpt-neo-1.3B" #load_8bit = False (in load_tokenizer_and_model)
#base_model = "TheBloke/airoboros-13B-HF" #load_8bit = True
tokenizer,model,device = load_tokenizer_and_model(base_model, access_token, False)
dataset_neu = daten_laden("alexkueck/tis")
#dataset_neu = daten_laden("EleutherAI/pile")
#############################################
#Vorbereiten für das Training der neuen Daten
#############################################
#alles zusammen auf das neue datenset anwenden - batched = True und 4 Prozesse, um die Berechnung zu beschleunigen. Die "text" - Spalte braucht man anschließend nicht mehr, daher weglassen.
tokenized_datasets = dataset_neu.map(tokenize_function, batched=True, num_proc=4, remove_columns=["id","text"])
print (tokenized_datasets["train"][4])
#den Text nun zusammenführen (concatenieren) und anschließend in kleine Häppchen aufteilen (block_size=128), die verarbeitet werden können
#das macht die map-Funktion und das Attribut batched = True
#man könnte das weglassen, wenn jeder Satz einzeln gegeben wurde in den Texten...
#eigentlich nimmt man als block_size die max. Länge in der das Model trainiert wurde -> könnte aber zu groß sein für den RAm der GPU , daher hier 128 gewählt
# block_size = tokenizer.model_max_length
block_size = 128
#nochmal die map-Funktion auf das bereits tokenisierte Datenset anwenden
#die bereits tokenisierten Datensatze ändern sich dadurch: die samples enthalten nun Mengen aus block_size Tokens
lm_datasets = tokenized_datasets.map(
group_texts,
batched=True,
batch_size=1000,
num_proc=4,
)
#die Daten wurden nun "gereinigt" und für das Model vorbereitet.
#z.B. anschauen mit: tokenizer.decode(lm_datasets["train"][1]["input_ids"])
####################################################
#Training
####################################################
#Training Args
model_name = base_model.split("/")[-1]
training_args = TrainingArguments(
f"{model_name}/LIFineTuned",
evaluation_strategy = "epoch",
learning_rate=2e-5,
weight_decay=0.01,
push_to_hub=True,
)
############################################
def trainieren_neu(name):
#Trainer zusammenstellen
trainer = Trainer(
model=model,
args=training_args,
train_dataset=lm_datasets["train"],
)
#trainer ausführen
trainer.train()
#in den Hub laden
trainer.push_to_hub()
#######################################################################
#Darstellung mit Gradio
with gr.Blocks() as demo:
name = gr.Textbox(label="Model")
output = gr.Textbox(label="Output Box")
start_btn = gr.Button("Start")
start_btn.click(fn=trainieren_neu, inputs=name, outputs=output, api_name="trainieren_neu")
demo.launch()
|