Spaces:
Sleeping
Sleeping
File size: 3,913 Bytes
c990840 b65febf c990840 23a651c 62c1e68 c990840 23a651c c990840 23a651c 62c1e68 b65febf 62c1e68 b65febf 62c1e68 b65febf 62c1e68 b65febf 62c1e68 b65febf 62c1e68 be94bde b65febf 62c1e68 be94bde b65febf 62c1e68 b65febf a725c70 b65febf 62c1e68 b65febf 62c1e68 23a651c be94bde b65febf 62c1e68 c990840 b65febf 23a651c c990840 b65febf 23a651c b65febf 23a651c b65febf 23a651c c990840 62c1e68 |
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 |
"""
𧬠HIVEMIND GPU WORKER v5
Training LoRA adapters (trl 0.7.x compatible)
"""
import gradio as gr
import os
import traceback
HF_TOKEN = os.environ.get("HF_TOKEN", "")
def train_agent(agent_name: str, skill: str, epochs: int = 2):
"""Trenira LoRA i uploaduje na HF"""
try:
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer, TrainingArguments
from peft import LoraConfig, get_peft_model
from trl import SFTTrainer
from datasets import Dataset
from huggingface_hub import HfApi, login
from datetime import datetime
log = [f"π Starting: {agent_name} - {skill}"]
if not HF_TOKEN:
return "β HF_TOKEN not set!"
login(token=HF_TOKEN)
api = HfApi(token=HF_TOKEN)
task_id = f"{agent_name[:8].lower().replace(' ','')}-{datetime.now().strftime('%m%d%H%M%S')}"
log.append("π¦ Loading TinyLlama...")
model = AutoModelForCausalLM.from_pretrained(
"TinyLlama/TinyLlama-1.1B-Chat-v1.0",
torch_dtype=torch.float32,
low_cpu_mem_usage=True
)
tokenizer = AutoTokenizer.from_pretrained("TinyLlama/TinyLlama-1.1B-Chat-v1.0")
tokenizer.pad_token = tokenizer.eos_token
log.append("π§ Setting up LoRA...")
lora = LoraConfig(r=8, lora_alpha=16, target_modules=["q_proj","v_proj"], lora_dropout=0.05, bias="none", task_type="CAUSAL_LM")
model = get_peft_model(model, lora)
trainable = sum(p.numel() for p in model.parameters() if p.requires_grad)
log.append(f" Trainable: {trainable:,}")
texts = [
f"<|user|>\nWhat is {skill}?</s>\n<|assistant|>\n{skill} is fundamental.</s>",
f"<|user|>\nExplain {skill}</s>\n<|assistant|>\n{skill} optimizes models.</s>",
f"<|user|>\nHow to {skill}?</s>\n<|assistant|>\nApply techniques.</s>",
]
dataset = Dataset.from_dict({"text": texts})
log.append(f"π Dataset: {len(dataset)} samples")
log.append(f"ποΈ Training {epochs} epoch(s)...")
trainer = SFTTrainer(
model=model,
train_dataset=dataset,
dataset_text_field="text",
max_seq_length=128,
tokenizer=tokenizer,
args=TrainingArguments(
output_dir="./out",
num_train_epochs=epochs,
per_device_train_batch_size=1,
learning_rate=2e-4,
save_strategy="no",
report_to="none",
logging_steps=1,
fp16=False,
),
)
result = trainer.train()
log.append(f"β
Done! Loss: {result.training_loss:.4f}")
model.save_pretrained("./lora")
tokenizer.save_pretrained("./lora")
repo_id = f"Pista1981/hivemind-hf-{task_id}"
log.append(f"π€ Uploading to {repo_id}...")
api.create_repo(repo_id=repo_id, exist_ok=True, private=False)
api.upload_folder(folder_path="./lora", repo_id=repo_id)
log.append(f"β
https://huggingface.co/{repo_id}")
return "\n".join(log)
except Exception as e:
return f"β {e}\n\n{traceback.format_exc()}"
with gr.Blocks(title="Hivemind Worker") as demo:
gr.Markdown("# 𧬠Hivemind GPU Worker v5")
with gr.Row():
agent_input = gr.Textbox(label="Agent", value="TestAgent")
skill_input = gr.Textbox(label="Skill", value="optimization")
epochs_input = gr.Slider(1, 3, value=1, step=1, label="Epochs")
train_btn = gr.Button("π Train", variant="primary")
output = gr.Textbox(label="Output", lines=12)
train_btn.click(fn=train_agent, inputs=[agent_input, skill_input, epochs_input], outputs=output)
demo.launch(show_error=True)
|