Sync InvoiceGuard code for GRPO training job
Browse files- training/launch_hf_job.py +10 -0
- training/rollout.py +6 -0
- training/train_grpo.py +16 -1
training/launch_hf_job.py
CHANGED
|
@@ -84,10 +84,16 @@ def submit_job(args: argparse.Namespace, code_repo_id: str) -> None:
|
|
| 84 |
"BASE_MODEL": args.base_model,
|
| 85 |
"TRACKIO_PROJECT": args.trackio_project,
|
| 86 |
"TRACKIO_RUN_NAME": args.run_name,
|
|
|
|
|
|
|
| 87 |
},
|
| 88 |
script_args=[
|
| 89 |
"--num-iterations", str(args.num_iterations),
|
| 90 |
"--group-size", str(args.group_size),
|
|
|
|
|
|
|
|
|
|
|
|
|
| 91 |
] + (["--max-train-tasks", str(args.max_train_tasks)]
|
| 92 |
if args.max_train_tasks else []),
|
| 93 |
)
|
|
@@ -115,6 +121,10 @@ def main() -> None:
|
|
| 115 |
p.add_argument("--num-iterations", type=int, default=3)
|
| 116 |
p.add_argument("--group-size", type=int, default=4)
|
| 117 |
p.add_argument("--max-train-tasks", type=int, default=None)
|
|
|
|
|
|
|
|
|
|
|
|
|
| 118 |
p.add_argument("--trackio-project", default="invoiceguard-round2")
|
| 119 |
p.add_argument("--run-name", default="qwen25-7b-grpo")
|
| 120 |
p.add_argument("--skip-upload", action="store_true",
|
|
|
|
| 84 |
"BASE_MODEL": args.base_model,
|
| 85 |
"TRACKIO_PROJECT": args.trackio_project,
|
| 86 |
"TRACKIO_RUN_NAME": args.run_name,
|
| 87 |
+
"PYTORCH_CUDA_ALLOC_CONF": "expandable_segments:True",
|
| 88 |
+
"TOKENIZERS_PARALLELISM": "false",
|
| 89 |
},
|
| 90 |
script_args=[
|
| 91 |
"--num-iterations", str(args.num_iterations),
|
| 92 |
"--group-size", str(args.group_size),
|
| 93 |
+
"--eval-holdout-canonical", str(args.eval_holdout_canonical),
|
| 94 |
+
"--eval-holdout-hard", str(args.eval_holdout_hard),
|
| 95 |
+
"--max-new-tokens", str(args.max_new_tokens),
|
| 96 |
+
"--max-prompt-tokens", str(args.max_prompt_tokens),
|
| 97 |
] + (["--max-train-tasks", str(args.max_train_tasks)]
|
| 98 |
if args.max_train_tasks else []),
|
| 99 |
)
|
|
|
|
| 121 |
p.add_argument("--num-iterations", type=int, default=3)
|
| 122 |
p.add_argument("--group-size", type=int, default=4)
|
| 123 |
p.add_argument("--max-train-tasks", type=int, default=None)
|
| 124 |
+
p.add_argument("--eval-holdout-canonical", type=int, default=3)
|
| 125 |
+
p.add_argument("--eval-holdout-hard", type=int, default=3)
|
| 126 |
+
p.add_argument("--max-new-tokens", type=int, default=96)
|
| 127 |
+
p.add_argument("--max-prompt-tokens", type=int, default=2048)
|
| 128 |
p.add_argument("--trackio-project", default="invoiceguard-round2")
|
| 129 |
p.add_argument("--run-name", default="qwen25-7b-grpo")
|
| 130 |
p.add_argument("--skip-upload", action="store_true",
|
training/rollout.py
CHANGED
|
@@ -75,6 +75,7 @@ def rollout_episode(
|
|
| 75 |
temperature: float = 1.0,
|
| 76 |
top_p: float = 0.95,
|
| 77 |
max_new_tokens: int = 160,
|
|
|
|
| 78 |
device: Optional[torch.device] = None,
|
| 79 |
) -> Trajectory:
|
| 80 |
"""
|
|
@@ -97,6 +98,8 @@ def rollout_episode(
|
|
| 97 |
prompt_text,
|
| 98 |
return_tensors="pt",
|
| 99 |
add_special_tokens=False,
|
|
|
|
|
|
|
| 100 |
).to(device)
|
| 101 |
prompt_ids = prompt_enc.input_ids[0]
|
| 102 |
|
|
@@ -110,6 +113,9 @@ def rollout_episode(
|
|
| 110 |
)
|
| 111 |
completion_ids = gen[0, prompt_ids.shape[0]:]
|
| 112 |
completion_text = tokenizer.decode(completion_ids, skip_special_tokens=True)
|
|
|
|
|
|
|
|
|
|
| 113 |
|
| 114 |
messages.append({"role": "assistant", "content": completion_text})
|
| 115 |
|
|
|
|
| 75 |
temperature: float = 1.0,
|
| 76 |
top_p: float = 0.95,
|
| 77 |
max_new_tokens: int = 160,
|
| 78 |
+
max_prompt_tokens: int = 2048,
|
| 79 |
device: Optional[torch.device] = None,
|
| 80 |
) -> Trajectory:
|
| 81 |
"""
|
|
|
|
| 98 |
prompt_text,
|
| 99 |
return_tensors="pt",
|
| 100 |
add_special_tokens=False,
|
| 101 |
+
truncation=True,
|
| 102 |
+
max_length=max_prompt_tokens,
|
| 103 |
).to(device)
|
| 104 |
prompt_ids = prompt_enc.input_ids[0]
|
| 105 |
|
|
|
|
| 113 |
)
|
| 114 |
completion_ids = gen[0, prompt_ids.shape[0]:]
|
| 115 |
completion_text = tokenizer.decode(completion_ids, skip_special_tokens=True)
|
| 116 |
+
del gen
|
| 117 |
+
if torch.cuda.is_available():
|
| 118 |
+
torch.cuda.empty_cache()
|
| 119 |
|
| 120 |
messages.append({"role": "assistant", "content": completion_text})
|
| 121 |
|
training/train_grpo.py
CHANGED
|
@@ -171,7 +171,8 @@ class TrainConfig:
|
|
| 171 |
# Sampling
|
| 172 |
sample_temperature: float = 1.0
|
| 173 |
sample_top_p: float = 0.95
|
| 174 |
-
max_new_tokens: int =
|
|
|
|
| 175 |
|
| 176 |
# LoRA
|
| 177 |
lora_r: int = 16
|
|
@@ -397,6 +398,7 @@ def train(cfg: TrainConfig) -> None:
|
|
| 397 |
temperature=0.0001, # near-greedy for eval
|
| 398 |
top_p=1.0,
|
| 399 |
max_new_tokens=cfg.max_new_tokens,
|
|
|
|
| 400 |
device=device,
|
| 401 |
)
|
| 402 |
scores.append(traj.grader_score)
|
|
@@ -528,6 +530,7 @@ def train(cfg: TrainConfig) -> None:
|
|
| 528 |
temperature=cfg.sample_temperature,
|
| 529 |
top_p=cfg.sample_top_p,
|
| 530 |
max_new_tokens=cfg.max_new_tokens,
|
|
|
|
| 531 |
device=device,
|
| 532 |
)
|
| 533 |
trajectories.append(traj)
|
|
@@ -692,6 +695,10 @@ def _parse_args() -> TrainConfig:
|
|
| 692 |
p.add_argument("--seed", type=int, default=None)
|
| 693 |
p.add_argument("--no-4bit", action="store_true")
|
| 694 |
p.add_argument("--no-gradient-checkpointing", action="store_true")
|
|
|
|
|
|
|
|
|
|
|
|
|
| 695 |
args = p.parse_args()
|
| 696 |
|
| 697 |
cfg = TrainConfig()
|
|
@@ -707,6 +714,14 @@ def _parse_args() -> TrainConfig:
|
|
| 707 |
cfg.lr = args.lr
|
| 708 |
if args.seed is not None:
|
| 709 |
cfg.seed = args.seed
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 710 |
if args.no_push:
|
| 711 |
cfg.push_to_hub = False
|
| 712 |
if args.no_4bit:
|
|
|
|
| 171 |
# Sampling
|
| 172 |
sample_temperature: float = 1.0
|
| 173 |
sample_top_p: float = 0.95
|
| 174 |
+
max_new_tokens: int = 96
|
| 175 |
+
max_prompt_tokens: int = 2048
|
| 176 |
|
| 177 |
# LoRA
|
| 178 |
lora_r: int = 16
|
|
|
|
| 398 |
temperature=0.0001, # near-greedy for eval
|
| 399 |
top_p=1.0,
|
| 400 |
max_new_tokens=cfg.max_new_tokens,
|
| 401 |
+
max_prompt_tokens=cfg.max_prompt_tokens,
|
| 402 |
device=device,
|
| 403 |
)
|
| 404 |
scores.append(traj.grader_score)
|
|
|
|
| 530 |
temperature=cfg.sample_temperature,
|
| 531 |
top_p=cfg.sample_top_p,
|
| 532 |
max_new_tokens=cfg.max_new_tokens,
|
| 533 |
+
max_prompt_tokens=cfg.max_prompt_tokens,
|
| 534 |
device=device,
|
| 535 |
)
|
| 536 |
trajectories.append(traj)
|
|
|
|
| 695 |
p.add_argument("--seed", type=int, default=None)
|
| 696 |
p.add_argument("--no-4bit", action="store_true")
|
| 697 |
p.add_argument("--no-gradient-checkpointing", action="store_true")
|
| 698 |
+
p.add_argument("--eval-holdout-canonical", type=int, default=None)
|
| 699 |
+
p.add_argument("--eval-holdout-hard", type=int, default=None)
|
| 700 |
+
p.add_argument("--max-new-tokens", type=int, default=None)
|
| 701 |
+
p.add_argument("--max-prompt-tokens", type=int, default=None)
|
| 702 |
args = p.parse_args()
|
| 703 |
|
| 704 |
cfg = TrainConfig()
|
|
|
|
| 714 |
cfg.lr = args.lr
|
| 715 |
if args.seed is not None:
|
| 716 |
cfg.seed = args.seed
|
| 717 |
+
if args.eval_holdout_canonical is not None:
|
| 718 |
+
cfg.eval_holdout_canonical = args.eval_holdout_canonical
|
| 719 |
+
if args.eval_holdout_hard is not None:
|
| 720 |
+
cfg.eval_holdout_hard = args.eval_holdout_hard
|
| 721 |
+
if args.max_new_tokens is not None:
|
| 722 |
+
cfg.max_new_tokens = args.max_new_tokens
|
| 723 |
+
if args.max_prompt_tokens is not None:
|
| 724 |
+
cfg.max_prompt_tokens = args.max_prompt_tokens
|
| 725 |
if args.no_push:
|
| 726 |
cfg.push_to_hub = False
|
| 727 |
if args.no_4bit:
|