vanishingradient commited on
Commit
147b723
·
verified ·
1 Parent(s): 4b87130

Add kaggle/train_grpo.py

Browse files
Files changed (1) hide show
  1. kaggle/train_grpo.py +61 -8
kaggle/train_grpo.py CHANGED
@@ -437,22 +437,26 @@ def langfuse_log_ckpt_eval(
437
  n_perfect = sum(1 for r in results if float(r.get("pass_frac") or 0) >= 1.0)
438
  n_resolved = sum(1 for r in results if r.get("resolved"))
439
 
 
 
440
  with lf.start_as_current_observation(
441
- name="kaggle-ckpt-eval",
442
  as_type="evaluator",
 
443
  metadata={
444
  "step": step,
445
  "hf_revision": hf_revision,
446
  "train_model_id": train_model_id,
447
  "wandb_run_id": wandb_run_id,
448
- "phase": "ckpt_eval",
449
  "harness": "deepagents-swe",
450
  },
451
  input={"step": step, "hf_revision": hf_revision, "n": n},
 
452
  ) as root:
453
  for r in results:
454
  with lf.start_as_current_observation(
455
- name=f"task:{r['task_id']}",
456
  as_type="span",
457
  input={"prompt": str(r.get("prompt", ""))[:2000]},
458
  ) as span:
@@ -482,13 +486,59 @@ def langfuse_log_ckpt_eval(
482
  lf.score_current_trace(name="n_perfect", value=float(n_perfect))
483
  lf.score_current_trace(name="n_resolved", value=float(n_resolved))
484
  lf.score_current_trace(name="checkpoint_step", value=float(step))
485
- trace_id = lf.get_current_trace_id() or ""
486
  lf.flush()
487
- print(
488
- f"[langfuse] ckpt-eval step={step} rev={hf_revision} "
489
- f"mean_reward={mean_reward:.3f} resolved={n_resolved}/{n} trace={trace_id}"
 
 
 
 
 
490
  )
491
- return {"langfuse_trace_id": trace_id, **summary}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
492
 
493
 
494
  # ---------------------------------------------------------------------------
@@ -944,6 +994,8 @@ def main(cfg: Cfg | None = None) -> None:
944
  bf16=use_bf16,
945
  fp16=use_fp16,
946
  remove_unused_columns=False,
 
 
947
  hub_model_id=cfg.hub_model_id,
948
  hub_token=os.environ["HF_TOKEN"],
949
  push_to_hub=False,
@@ -967,6 +1019,7 @@ def main(cfg: Cfg | None = None) -> None:
967
  )
968
  trainer = GRPOTrainer(
969
  model=model,
 
970
  args=args,
971
  train_dataset=train,
972
  processing_class=tokenizer,
 
437
  n_perfect = sum(1 for r in results if float(r.get("pass_frac") or 0) >= 1.0)
438
  n_resolved = sum(1 for r in results if r.get("resolved"))
439
 
440
+ # Own root trace (do not nest under / swallow per-rollout traces).
441
+ agg_trace_id = lf.create_trace_id()
442
  with lf.start_as_current_observation(
443
+ name=f"kaggle-ckpt-eval:step-{step}",
444
  as_type="evaluator",
445
+ trace_context={"trace_id": agg_trace_id},
446
  metadata={
447
  "step": step,
448
  "hf_revision": hf_revision,
449
  "train_model_id": train_model_id,
450
  "wandb_run_id": wandb_run_id,
451
+ "phase": "ckpt_eval_aggregate",
452
  "harness": "deepagents-swe",
453
  },
454
  input={"step": step, "hf_revision": hf_revision, "n": n},
455
+ end_on_exit=True,
456
  ) as root:
457
  for r in results:
458
  with lf.start_as_current_observation(
459
+ name=f"ckpt-summary:{r['task_id']}",
460
  as_type="span",
461
  input={"prompt": str(r.get("prompt", ""))[:2000]},
462
  ) as span:
 
486
  lf.score_current_trace(name="n_perfect", value=float(n_perfect))
487
  lf.score_current_trace(name="n_resolved", value=float(n_resolved))
488
  lf.score_current_trace(name="checkpoint_step", value=float(step))
 
489
  lf.flush()
490
+ _vlog(
491
+ "langfuse.ckpt_eval",
492
+ step=step,
493
+ rev=hf_revision,
494
+ mean_reward=mean_reward,
495
+ resolved=n_resolved,
496
+ n=n,
497
+ trace_id=agg_trace_id,
498
  )
499
+ return {"langfuse_trace_id": agg_trace_id, **summary}
500
+
501
+
502
+ def log_completions_reward(completions: list[Any], **kwargs: Any) -> list[float]:
503
+ """Side-channel: log raw model completions to W&B/console (reward always 0)."""
504
+ previews = []
505
+ for i, c in enumerate(completions):
506
+ if isinstance(c, list):
507
+ # conversational messages
508
+ bits = []
509
+ for m in c[-4:]:
510
+ if isinstance(m, dict):
511
+ role = m.get("role")
512
+ content = str(m.get("content") or "")[:400]
513
+ tcalls = m.get("tool_calls")
514
+ bits.append(f"{role}: {content}" + (f" tool_calls={tcalls}" if tcalls else ""))
515
+ else:
516
+ bits.append(str(m)[:400])
517
+ preview = " | ".join(bits)
518
+ else:
519
+ preview = str(c)[:800]
520
+ previews.append(preview)
521
+ _vlog("train.completion", i=i, preview=preview[:500], has_tool_calls=("tool_calls" in preview))
522
+
523
+ try:
524
+ import wandb
525
+
526
+ if wandb.run is not None:
527
+ n_with_tools = sum(1 for p in previews if "tool_calls" in p)
528
+ table = wandb.Table(columns=["i", "preview", "has_tool_calls"])
529
+ for i, p in enumerate(previews[:16]):
530
+ table.add_data(i, p[:1500], "tool_calls" in p)
531
+ wandb.log(
532
+ {
533
+ "train/completion_previews": table,
534
+ "train/n_completions": len(previews),
535
+ "train/n_completions_with_tool_calls_str": n_with_tools,
536
+ }
537
+ )
538
+ except Exception as e: # noqa: BLE001
539
+ _vlog("train.completion.wandb_failed", error=str(e))
540
+
541
+ return [0.0] * len(completions)
542
 
543
 
544
  # ---------------------------------------------------------------------------
 
994
  bf16=use_bf16,
995
  fp16=use_fp16,
996
  remove_unused_columns=False,
997
+ # log_completions_reward (0) + DeepAgentSWEEnv.get_reward (1)
998
+ reward_weights=[0.0, 1.0],
999
  hub_model_id=cfg.hub_model_id,
1000
  hub_token=os.environ["HF_TOKEN"],
1001
  push_to_hub=False,
 
1019
  )
1020
  trainer = GRPOTrainer(
1021
  model=model,
1022
+ reward_funcs=[log_completions_reward], # logs only; env get_reward still scores SWE
1023
  args=args,
1024
  train_dataset=train,
1025
  processing_class=tokenizer,