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()