Spaces:
Runtime error
Runtime error
import os | |
import torch | |
import gradio as gr | |
from datasets import load_dataset, Dataset | |
from transformers import ( | |
AutoTokenizer, | |
AutoModelForCausalLM, | |
TrainingArguments, | |
Trainer, | |
DataCollatorForLanguageModeling | |
) | |
from peft import LoraConfig, get_peft_model | |
MODEL_NAME = "TinyLlama/TinyLlama-1.1B-Chat-v1.0" | |
DATASET_NAME = "embedding-data/Amazon-QA" | |
FINETUNED_MODEL_NAME = "tinyllama-shopify-lora" | |
def load_data(): | |
dataset = load_dataset(DATASET_NAME) | |
df = dataset['train'].to_pandas() | |
df = df.rename(columns={'query': 'question', 'pos': 'answer'})[['question', 'answer']] | |
df = df.dropna().astype(str) | |
df['answer'] = df['answer'].str.replace(r'\[\^.*?\^\]', '').str.strip() | |
return Dataset.from_pandas(df).train_test_split(test_size=0.1) # Now using imported Dataset | |
def setup_model(): | |
tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME) | |
tokenizer.pad_token = tokenizer.eos_token | |
model = AutoModelForCausalLM.from_pretrained( | |
MODEL_NAME, | |
device_map="auto", | |
torch_dtype=torch.float32 | |
) | |
peft_config = LoraConfig( | |
r=8, | |
lora_alpha=16, | |
target_modules=["q_proj", "k_proj", "v_proj", "o_proj"], | |
lora_dropout=0.05, | |
bias="none", | |
task_type="CAUSAL_LM" | |
) | |
return tokenizer, get_peft_model(model, peft_config) | |
def train_model(): | |
tokenizer, model = setup_model() | |
data = load_data() | |
def tokenize_function(examples): | |
text = [f"Question: {q}\nAnswer: {a}" for q, a in zip(examples["question"], examples["answer"])] | |
return tokenizer(text, truncation=True, max_length=256, padding="max_length") | |
tokenized_data = data.map(tokenize_function, batched=True, remove_columns=["question", "answer"]) | |
trainer = Trainer( | |
model=model, | |
args=TrainingArguments( | |
output_dir="./results", | |
per_device_train_batch_size=2, | |
num_train_epochs=1, | |
learning_rate=2e-5, | |
logging_steps=10, | |
save_strategy="steps", | |
save_steps=100, | |
optim="adamw_torch", | |
no_cuda=True | |
), | |
train_dataset=tokenized_data["train"], | |
data_collator=DataCollatorForLanguageModeling(tokenizer, mlm=False), | |
) | |
print("Starting training...") | |
trainer.train() | |
model.save_pretrained(FINETUNED_MODEL_NAME) | |
tokenizer.save_pretrained(FINETUNED_MODEL_NAME) | |
print("Training complete!") | |
def generate_response(message, history): | |
tokenizer = AutoTokenizer.from_pretrained(FINETUNED_MODEL_NAME) | |
model = AutoModelForCausalLM.from_pretrained(FINETUNED_MODEL_NAME, torch_dtype=torch.float32) | |
prompt = f"Question: {message}\nAnswer:" | |
inputs = tokenizer(prompt, return_tensors="pt") | |
outputs = model.generate(**inputs, max_new_tokens=64) | |
return tokenizer.decode(outputs[0], skip_special_tokens=True).split("Answer:")[-1] | |
def create_interface(): | |
if not os.path.exists(FINETUNED_MODEL_NAME): | |
print("Model not found. Starting training...") | |
train_model() | |
return gr.ChatInterface( | |
fn=generate_response, | |
examples=[ | |
"What's your return policy?", | |
"Do you ship internationally?", | |
"Is this waterproof?" | |
] | |
) | |
if __name__ == "__main__": | |
create_interface().launch() |