#!/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 = "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" login(token="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") #Modelle und Tokenizer #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( "/model", 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()