teolm30 commited on
Commit
bea7aa9
·
verified ·
1 Parent(s): ad7abb6

Upload train.py with huggingface_hub

Browse files
Files changed (1) hide show
  1. train.py +88 -47
train.py CHANGED
@@ -1,54 +1,95 @@
 
 
1
  """
2
- Ult1-Coding Fine-Tuning Script
3
- Fine-tune on any code dataset.
4
- Requires GPU with ~10 GB VRAM.
5
-
6
- Usage:
7
- python train.py --dataset bigcode/the-stack-dedup --subset data/python
8
- """
9
- import torch, argparse, os
10
- from transformers import AutoModelForCausalLM, AutoTokenizer, TrainingArguments, Trainer, DataCollatorForSeq2Seq
11
  from peft import LoraConfig, get_peft_model, TaskType
12
- from datasets import load_dataset
13
-
14
- parser = argparse.ArgumentParser()
15
- parser.add_argument("--model", default="teolm30/Ult1-coding")
16
- parser.add_argument("--dataset", default="code_search_net")
17
- parser.add_argument("--subset", default="python")
18
- parser.add_argument("--lr", type=float, default=2e-4)
19
- parser.add_argument("--epochs", type=int, default=1)
20
- parser.add_argument("--max_length", type=int, default=1024)
21
- parser.add_argument("--output", default="./ult1_coding_finetuned")
22
- args = parser.parse_args()
23
-
24
- os.makedirs(args.output, exist_ok=True)
25
-
26
- model = AutoModelForCausalLM.from_pretrained(args.model, torch_dtype=torch.bfloat16, device_map="auto")
27
- tokenizer = AutoTokenizer.from_pretrained(args.model)
28
- if tokenizer.pad_token is None:
29
- tokenizer.pad_token = tokenizer.eos_token
30
-
31
- lora_config = LoraConfig(r=16, lora_alpha=32, target_modules=["q_proj","k_proj","v_proj","o_proj"], task_type=TaskType.CAUSAL_LM)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
32
  model = get_peft_model(model, lora_config)
33
  model.print_trainable_parameters()
34
 
35
- dataset = load_dataset(args.dataset, split="train", streaming=True).take(5000)
36
- def fmt(ex):
37
- code = ex.get("code") or ex.get("content") or ex.get("func_code_string") or str(ex)
38
- return {"text": f"<|im_start|>user\nWrite code:\n<|im_end|>\n<|im_start|>assistant\n{code}<|im_end|>"}
39
- dataset = dataset.map(fmt)
40
- def tok(exs):
41
- return tokenizer(exs["text"], truncation=True, max_length=args.max_length, padding="max_length")
42
- dataset = dataset.map(tok, remove_columns=[c for c in dataset.column_names if c != "text"], batched=True)
43
-
44
- args_t = TrainingArguments(
45
- output_dir=args.output, per_device_train_batch_size=2, gradient_accumulation_steps=8,
46
- num_train_epochs=args.epochs, learning_rate=args.lr, logging_steps=10,
47
- save_strategy="epoch", bf16=True, report_to="none",
48
  )
49
- trainer = Trainer(model=model, args=args_t, train_dataset=dataset,
50
- data_collator=DataCollatorForSeq2Seq(tokenizer, pad_to_multiple_of=8))
 
 
 
 
 
51
  trainer.train()
52
- model.save_pretrained(args.output)
53
- tokenizer.save_pretrained(args.output)
54
- print(f"Saved to {args.output}")
 
 
 
 
 
 
 
 
1
+ """Ult1-Coding GPU fine-tuning script.
2
+ Usage: python train_coding.py (requires 8+ GB VRAM GPU)
3
  """
4
+ import json, torch, warnings
5
+ from datasets import Dataset
6
+ from transformers import (
7
+ AutoModelForCausalLM, AutoTokenizer, TrainingArguments, Trainer
8
+ )
 
 
 
 
9
  from peft import LoraConfig, get_peft_model, TaskType
10
+ from huggingface_hub import HfApi
11
+ warnings.filterwarnings("ignore")
12
+
13
+ import os
14
+ HF_TOKEN = os.getenv("HF_TOKEN", "")
15
+ MODEL_ID = "Qwen/Qwen2.5-3B-Instruct"
16
+ REPO_ID = "teolm30/Ult1-coding"
17
+
18
+ def format_example(example):
19
+ return {
20
+ "text": f"<|im_start|>user\n{example['instruction']}<|im_end|>\n<|im_start|>assistant\n{example['response']}<|im_end|>\n"
21
+ }
22
+
23
+ print("Loading tokenizer...")
24
+ tokenizer = AutoTokenizer.from_pretrained(MODEL_ID)
25
+ tokenizer.pad_token = tokenizer.eos_token
26
+
27
+ print("Loading training data from HF...")
28
+ api = HfApi()
29
+ data_path = api.hf_hub_download(repo_id=REPO_ID, filename="training_data.json", token=HF_TOKEN)
30
+ with open(data_path, "r") as f:
31
+ raw_data = json.load(f)
32
+
33
+ formatted = [format_example(ex) for ex in raw_data]
34
+ dataset = Dataset.from_list(formatted)
35
+
36
+ def tokenize_fn(examples):
37
+ result = tokenizer(
38
+ examples["text"], truncation=True, max_length=512,
39
+ padding="max_length", return_tensors=None
40
+ )
41
+ result["labels"] = result["input_ids"].copy()
42
+ return result
43
+
44
+ dataset = dataset.map(tokenize_fn, remove_columns=["text"], batched=True)
45
+ dataset = dataset.train_test_split(test_size=0.1)
46
+
47
+ print(f"Training samples: {len(dataset['train'])}, Validation: {len(dataset['test'])}")
48
+
49
+ print("Loading model...")
50
+ model = AutoModelForCausalLM.from_pretrained(
51
+ MODEL_ID, torch_dtype=torch.bfloat16,
52
+ device_map="auto", attn_implementation="flash_attention_2",
53
+ )
54
+
55
+ model.train()
56
+ lora_config = LoraConfig(
57
+ r=16, lora_alpha=32, lora_dropout=0.05,
58
+ target_modules=["q_proj", "k_proj", "v_proj", "o_proj",
59
+ "gate_proj", "up_proj", "down_proj"],
60
+ bias="none", task_type=TaskType.CAUSAL_LM,
61
+ )
62
  model = get_peft_model(model, lora_config)
63
  model.print_trainable_parameters()
64
 
65
+ training_args = TrainingArguments(
66
+ output_dir="./ult1_coding_trained",
67
+ per_device_train_batch_size=1,
68
+ gradient_accumulation_steps=4,
69
+ learning_rate=3e-4,
70
+ num_train_epochs=3,
71
+ logging_steps=1,
72
+ save_strategy="epoch",
73
+ evaluation_strategy="epoch",
74
+ bf16=True,
75
+ gradient_checkpointing=True,
76
+ logging_dir="./logs",
 
77
  )
78
+
79
+ trainer = Trainer(
80
+ model=model, args=training_args,
81
+ train_dataset=dataset["train"],
82
+ eval_dataset=dataset["test"],
83
+ )
84
+
85
  trainer.train()
86
+ model.save_pretrained("./ult1_coding_trained/final", safe_serialization=True)
87
+ tokenizer.save_pretrained("./ult1_coding_trained/final")
88
+
89
+ api.upload_folder(
90
+ folder_path="./ult1_coding_trained/final",
91
+ repo_id=REPO_ID, token=HF_TOKEN,
92
+ commit_message="Ult1-Coding trained adapter - GPU fine-tuned on coding data",
93
+ ignore_patterns=["*.pt", "checkpoint-*"],
94
+ )
95
+ print(f"Trained model uploaded to https://huggingface.co/{REPO_ID}")