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)