"""AutoTrain cloud script - trains Qwen 7B LoRA and pushes to HuggingFace Hub.""" import os import torch from datasets import load_dataset, concatenate_datasets from transformers import AutoTokenizer, AutoModelForCausalLM, TrainingArguments, BitsAndBytesConfig from peft import LoraConfig, get_peft_model from trl import SFTTrainer from huggingface_hub import login HF_TOKEN = os.environ["HF_TOKEN"] MODEL_ID = "Qwen/Qwen2.5-7B-Instruct" REPO_ID = "devsomosahub/agent-os-adapter-7b" OUTPUT_DIR = "./output" login(token=HF_TOKEN) print("Loading dataset from Hub...") ds = load_dataset("devsomosahub/agent-os-dataset", data_files="train.jsonl", split="train") def format_example(example): text = f"<|im_start|>system\nYou are a command adapter. Output ONLY valid JSON. No explanation.<|im_end|>\n<|im_start|>user\n{example['input']}<|im_end|>\n<|im_start|>assistant\n{example['output']}<|im_end|>" return {"text": text} ds = ds.map(format_example) ds = concatenate_datasets([ds, ds, ds, ds]) print(f"Dataset: {len(ds)} examples") print("Loading model (Q4)...") bnb_config = BitsAndBytesConfig(load_in_4bit=True, bnb_4bit_quant_type="nf4", bnb_4bit_compute_dtype=torch.float16) tokenizer = AutoTokenizer.from_pretrained(MODEL_ID, trust_remote_code=True) if tokenizer.pad_token is None: tokenizer.pad_token = tokenizer.eos_token model = AutoModelForCausalLM.from_pretrained(MODEL_ID, quantization_config=bnb_config, device_map="auto", trust_remote_code=True) lora_config = LoraConfig( r=32, lora_alpha=64, target_modules=["q_proj", "v_proj", "k_proj", "o_proj", "gate_proj", "up_proj", "down_proj"], lora_dropout=0.05, bias="none", task_type="CAUSAL_LM", ) model = get_peft_model(model, lora_config) model.print_trainable_parameters() print("Starting training...") training_args = TrainingArguments( output_dir=OUTPUT_DIR, num_train_epochs=7, per_device_train_batch_size=4, gradient_accumulation_steps=2, learning_rate=2e-4, fp16=True, logging_steps=10, save_strategy="steps", save_steps=500, warmup_ratio=0.1, lr_scheduler_type="cosine", report_to="none", push_to_hub=True, hub_model_id=REPO_ID, hub_token=HF_TOKEN, ) trainer = SFTTrainer( model=model, train_dataset=ds, args=training_args, processing_class=tokenizer, ) trainer.train() print("Pushing to Hub...") trainer.push_to_hub() model.push_to_hub(REPO_ID, token=HF_TOKEN) tokenizer.push_to_hub(REPO_ID, token=HF_TOKEN) print(f"DONE! Model at https://huggingface.co/{REPO_ID}")