Falln87 commited on
Commit
4d8daa4
·
verified ·
1 Parent(s): c498706

CLERK LoRA SFT trainer (TRL SFTTrainer), verified against trl examples/sft_qlora; pushes adapter to the Hub

Browse files
Files changed (1) hide show
  1. clerk/train_sft.py +109 -0
clerk/train_sft.py ADDED
@@ -0,0 +1,109 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """CLERK LoRA SFT training.
2
+
3
+ Trains the consolidation policy (and the ledger-reading answer head) via
4
+ LoRA on a small instruct model. Written against the verified API surface of
5
+ ``huggingface/trl`` examples/sft_qlora/sft_qlora.ipynb (SFTTrainer +
6
+ SFTConfig + LoraConfig, dataset with a single ``messages`` column,
7
+ ``max_length`` for sequence length, ``push_to_hub`` for Hub upload).
8
+
9
+ Usage:
10
+ python -m clerk.train_sft --train data/sft_train.jsonl \
11
+ --val data/sft_val.jsonl --hub-model-id Falln87/clerk-qwen2.5-0.5b-lora
12
+ """
13
+
14
+ from __future__ import annotations
15
+
16
+ import argparse
17
+
18
+ from datasets import load_dataset
19
+ from peft import LoraConfig
20
+ from trl import SFTConfig, SFTTrainer
21
+
22
+ BASE_MODEL = "Qwen/Qwen2.5-0.5B-Instruct"
23
+
24
+
25
+ def main() -> None:
26
+ import sys
27
+
28
+ ap = argparse.ArgumentParser(description="CLERK LoRA SFT")
29
+ ap.add_argument("--train", type=str, required=True)
30
+ ap.add_argument("--val", type=str, default=None)
31
+ ap.add_argument("--base-model", type=str, default=BASE_MODEL)
32
+ ap.add_argument("--hub-model-id", type=str,
33
+ default="Falln87/clerk-qwen2.5-0.5b-lora")
34
+ ap.add_argument("--output-dir", type=str, default="clerk-ckpt")
35
+ ap.add_argument("--lr", type=float, default=2e-4)
36
+ ap.add_argument("--epochs", type=float, default=2.0)
37
+ ap.add_argument("--max-length", type=int, default=2048)
38
+ ap.add_argument("--batch-size", type=int, default=2)
39
+ ap.add_argument("--grad-accum", type=int, default=8)
40
+ ap.add_argument("--lora-r", type=int, default=32)
41
+ ap.add_argument("--trackio-space-id", type=str, default=None)
42
+ ap.add_argument("--max-steps", type=int, default=-1)
43
+ args = ap.parse_args()
44
+
45
+ train = load_dataset("json", data_files=args.train, split="train")
46
+ train = train.remove_columns(
47
+ [c for c in train.column_names if c != "messages"])
48
+ assert train.column_names == ["messages"], train.column_names
49
+ assert len(train) > 0
50
+
51
+ if args.val:
52
+ val = load_dataset("json", data_files=args.val, split="train")
53
+ val = val.remove_columns(
54
+ [c for c in val.column_names if c != "messages"])
55
+ else:
56
+ val = None
57
+
58
+ peft_config = LoraConfig(
59
+ r=args.lora_r,
60
+ lora_alpha=args.lora_r,
61
+ target_modules=["q_proj", "k_proj", "v_proj", "o_proj",
62
+ "gate_proj", "up_proj", "down_proj"],
63
+ task_type="CAUSAL_LM",
64
+ )
65
+
66
+ training_args = SFTConfig(
67
+ model_init_kwargs={
68
+ "attn_implementation": "sdpa",
69
+ "dtype": "bfloat16",
70
+ "use_cache": True,
71
+ },
72
+ per_device_train_batch_size=args.batch_size,
73
+ gradient_accumulation_steps=args.grad_accum,
74
+ warmup_ratio=0.03,
75
+ num_train_epochs=args.epochs,
76
+ max_steps=args.max_steps,
77
+ learning_rate=args.lr,
78
+ optim="paged_adamw_8bit",
79
+ lr_scheduler_type="cosine",
80
+ logging_steps=20,
81
+ eval_strategy="steps" if val else "no",
82
+ eval_steps=200 if val else None,
83
+ per_device_eval_batch_size=args.batch_size,
84
+ report_to="trackio",
85
+ trackio_space_id=args.trackio_space_id,
86
+ output_dir=args.output_dir,
87
+ max_length=2048,
88
+ packing=False,
89
+ push_to_hub=True,
90
+ hub_model_id=args.hub_model_id,
91
+ seed=137,
92
+ data_seed=137,
93
+ )
94
+
95
+ trainer = SFTTrainer(
96
+ model=BASE_MODEL,
97
+ args=training_args,
98
+ train_dataset=train,
99
+ eval_dataset=val,
100
+ peft_config=peft_config,
101
+ )
102
+ trainer.train()
103
+ trainer.save_model(args.output_dir)
104
+ trainer.push_to_hub()
105
+ print("done: adapter pushed to", args.hub_model_id)
106
+
107
+
108
+ if __name__ == "__main__":
109
+ main()