Spaces:
Sleeping
Sleeping
import spaces | |
import gradio as gr | |
from transformers import Trainer, TrainingArguments, AutoTokenizer, AutoModelForSeq2SeqLM | |
from transformers import DataCollatorForSeq2Seq | |
from datasets import load_dataset, concatenate_datasets, load_from_disk | |
import traceback | |
import os | |
from huggingface_hub import login | |
def fine_tune_model(model_name, dataset_name, hub_id, api_key, num_epochs, batch_size, lr, grad): | |
try: | |
#login(api_key.strip()) | |
# Load the model and tokenizer | |
model = AutoModelForSeq2SeqLM.from_pretrained(model_name.strip(), num_labels=2) | |
# Set training arguments | |
training_args = TrainingArguments( | |
output_dir='/data/results', | |
eval_strategy="steps", # Change this to steps | |
save_strategy='steps', | |
learning_rate=lr*0.00001, | |
per_device_train_batch_size=int(batch_size), | |
per_device_eval_batch_size=int(batch_size), | |
num_train_epochs=int(num_epochs), | |
weight_decay=0.01, | |
gradient_accumulation_steps=int(grad), | |
max_grad_norm = 1.0, | |
load_best_model_at_end=True, | |
metric_for_best_model="accuracy", | |
greater_is_better=True, | |
logging_dir='/data/logs', | |
logging_steps=10, | |
#push_to_hub=True, | |
hub_model_id=hub_id.strip(), | |
fp16=True, | |
#lr_scheduler_type='cosine', | |
save_steps=100, # Save checkpoint every 500 steps | |
save_total_limit=3, | |
) | |
# Check if a checkpoint exists and load it | |
max_length = 128 | |
# Load the dataset | |
dataset = load_dataset(dataset_name.strip()) | |
tokenizer = AutoTokenizer.from_pretrained(model_name) | |
# Tokenize the dataset | |
def tokenize_function(examples): | |
# Assuming 'text' is the input and 'target' is the expected output | |
model_inputs = tokenizer( | |
examples['text'], | |
max_length=max_length, # Set to None for dynamic padding | |
padding=True, # Disable padding here, we will handle it later | |
truncation=True, | |
) | |
# Setup the decoder input IDs (shifted right) | |
labels = tokenizer( | |
examples['target'], | |
max_length=max_length, # Set to None for dynamic padding | |
padding=True, # Disable padding here, we will handle it later | |
truncation=True, | |
text_target=examples['target'] # Use text_target for target text | |
) | |
# Add labels to the model inputs | |
model_inputs["labels"] = labels["input_ids"] | |
tokenized_datasets = dataset.map(tokenize_function, batched=True) | |
tokenized_datasets['train'].save_to_disk(f'/data/{hub_id.strip()}_train_dataset') | |
tokenized_datasets['test'].save_to_disk(f'/data/{hub_id.strip()}_test_dataset') | |
# Create Trainer | |
trainer = Trainer( | |
model=model, | |
args=training_args, | |
train_dataset=tokenized_datasets['train'], | |
eval_dataset=tokenized_datasets['test'], | |
compute_metrics=compute_metrics, | |
#callbacks=[LoggingCallback()], | |
) | |
# Fine-tune the model | |
trainer.train() | |
trainer.push_to_hub(commit_message="Training complete!") | |
except Exception as e: | |
return f"An error occurred: {str(e)}, TB: {traceback.format_exc()}" | |
return 'DONE!'#model | |
''' | |
# Define Gradio interface | |
def predict(text): | |
model = AutoModelForSeq2SeqLM.from_pretrained(model_name.strip(), num_labels=2) | |
tokenizer = AutoTokenizer.from_pretrained(model_name) | |
inputs = tokenizer(text, return_tensors="pt", padding=True, truncation=True) | |
outputs = model(inputs) | |
predictions = outputs.logits.argmax(dim=-1) | |
return predictions.item() | |
''' | |
# Create Gradio interface | |
try: | |
iface = gr.Interface( | |
fn=fine_tune_model, | |
inputs=[ | |
gr.Textbox(label="Model Name (e.g., 'google/t5-efficient-tiny-nh8')"), | |
gr.Textbox(label="Dataset Name (e.g., 'imdb')"), | |
gr.Textbox(label="HF hub to push to after training"), | |
gr.Textbox(label="HF API token"), | |
gr.Slider(minimum=1, maximum=10, value=3, label="Number of Epochs", step=1), | |
gr.Slider(minimum=1, maximum=2000, value=1, label="Batch Size", step=1), | |
gr.Slider(minimum=1, maximum=1000, value=1, label="Learning Rate (e-5)", step=1), | |
gr.Slider(minimum=1, maximum=100, value=1, label="Gradient accumulation", step=1), | |
], | |
outputs="text", | |
title="Fine-Tune Hugging Face Model", | |
description="This interface allows you to fine-tune a Hugging Face model on a specified dataset." | |
) | |
''' | |
iface = gr.Interface( | |
fn=predict, | |
inputs=[ | |
gr.Textbox(label="Query"), | |
], | |
outputs="text", | |
title="Fine-Tune Hugging Face Model", | |
description="This interface allows you to test a fine-tune Hugging Face model." | |
) | |
''' | |
# Launch the interface | |
iface.launch() | |
except Exception as e: | |
print(f"An error occurred: {str(e)}, TB: {traceback.format_exc()}") | |