angerami Claude Sonnet 4.6 commited on
Commit
dbd0f5c
·
1 Parent(s): 92dcf5b

Add MLflow logging to correlations and eval stages

Browse files

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

rules/correlations.smk CHANGED
@@ -27,6 +27,8 @@ rule correlations:
27
  circuits=" ".join(config.get("correlation", {}).get("circuits", ["QK"])),
28
  metrics=" ".join(config.get("correlation", {}).get("metrics", ["frob_cosine"])),
29
  cache_dir=config["cache_dir"],
 
 
30
  shell:
31
  """
32
  python scripts/run_correlations.py \
@@ -35,5 +37,7 @@ rule correlations:
35
  --out-dir correlations \
36
  --cache-dir {params.cache_dir} \
37
  --circuits {params.circuits} \
38
- --metrics {params.metrics}
 
 
39
  """
 
27
  circuits=" ".join(config.get("correlation", {}).get("circuits", ["QK"])),
28
  metrics=" ".join(config.get("correlation", {}).get("metrics", ["frob_cosine"])),
29
  cache_dir=config["cache_dir"],
30
+ mlflow_uri=config["mlflow_uri"],
31
+ mlflow_experiment=config["mlflow_experiment"],
32
  shell:
33
  """
34
  python scripts/run_correlations.py \
 
37
  --out-dir correlations \
38
  --cache-dir {params.cache_dir} \
39
  --circuits {params.circuits} \
40
+ --metrics {params.metrics} \
41
+ --mlflow-uri {params.mlflow_uri} \
42
+ --mlflow-experiment {params.mlflow_experiment}
43
  """
rules/eval.smk CHANGED
@@ -40,6 +40,8 @@ rule eval:
40
  params:
41
  p=_eval_params,
42
  cache_dir=config["cache_dir"],
 
 
43
  shell:
44
  """
45
  python scripts/run_eval.py \
@@ -49,6 +51,8 @@ rule eval:
49
  --pile-tokens {params.p[pile_tokens]} \
50
  --out {output} \
51
  --cache {params.cache_dir} \
 
 
52
  {params.p[device_flag]} \
53
  {params.p[pile_cache_flag]}
54
  """
 
40
  params:
41
  p=_eval_params,
42
  cache_dir=config["cache_dir"],
43
+ mlflow_uri=config["mlflow_uri"],
44
+ mlflow_experiment=config["mlflow_experiment"],
45
  shell:
46
  """
47
  python scripts/run_eval.py \
 
51
  --pile-tokens {params.p[pile_tokens]} \
52
  --out {output} \
53
  --cache {params.cache_dir} \
54
+ --mlflow-uri {params.mlflow_uri} \
55
+ --mlflow-experiment {params.mlflow_experiment} \
56
  {params.p[device_flag]} \
57
  {params.p[pile_cache_flag]}
58
  """
scripts/run_correlations.py CHANGED
@@ -10,6 +10,10 @@ Examples:
10
  """
11
 
12
  import argparse
 
 
 
 
13
 
14
  from transformer_analysis.pair_pipeline import run_multi_circuit_analysis
15
 
@@ -24,23 +28,50 @@ def parse_args():
24
  p.add_argument("--metrics", nargs="+", default=["frob_cosine", "pearson_corr", "hist_jensen_shannon"])
25
  p.add_argument("--device", default=None)
26
  p.add_argument("--max-workers", type=int, default=4)
 
 
27
  return p.parse_args()
28
 
29
 
 
 
 
 
 
 
 
30
  def main():
31
  args = parse_args()
32
  revision = args.revision or None
33
 
34
- run_multi_circuit_analysis(
35
- model_name=args.model,
36
- revision=revision,
37
- circuits=tuple(args.circuits),
38
- metrics=tuple(args.metrics),
39
- cache_dir=args.cache_dir,
40
- out_dir=args.out_dir,
41
- device=args.device,
42
- max_workers=args.max_workers,
43
- )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
44
 
45
 
46
  if __name__ == "__main__":
 
10
  """
11
 
12
  import argparse
13
+ import subprocess
14
+ import time
15
+
16
+ import mlflow
17
 
18
  from transformer_analysis.pair_pipeline import run_multi_circuit_analysis
19
 
 
28
  p.add_argument("--metrics", nargs="+", default=["frob_cosine", "pearson_corr", "hist_jensen_shannon"])
29
  p.add_argument("--device", default=None)
30
  p.add_argument("--max-workers", type=int, default=4)
31
+ p.add_argument("--mlflow-uri", default="file:./mlruns")
32
+ p.add_argument("--mlflow-experiment", default="production")
33
  return p.parse_args()
34
 
35
 
36
+ def _git_sha():
37
+ try:
38
+ return subprocess.check_output(["git", "rev-parse", "--short", "HEAD"], text=True).strip()
39
+ except Exception:
40
+ return "unknown"
41
+
42
+
43
  def main():
44
  args = parse_args()
45
  revision = args.revision or None
46
 
47
+ mlflow.set_tracking_uri(args.mlflow_uri)
48
+ mlflow.set_experiment(args.mlflow_experiment)
49
+
50
+ rev_label = revision or "main"
51
+ run_name = f"{args.model}-{rev_label}-correlations"
52
+
53
+ with mlflow.start_run(run_name=run_name):
54
+ mlflow.log_params({
55
+ "model": args.model,
56
+ "revision": rev_label,
57
+ "circuits": ",".join(args.circuits),
58
+ "metrics": ",".join(args.metrics),
59
+ "max_workers": args.max_workers,
60
+ "git_sha": _git_sha(),
61
+ })
62
+
63
+ t0 = time.time()
64
+ run_multi_circuit_analysis(
65
+ model_name=args.model,
66
+ revision=revision,
67
+ circuits=tuple(args.circuits),
68
+ metrics=tuple(args.metrics),
69
+ cache_dir=args.cache_dir,
70
+ out_dir=args.out_dir,
71
+ device=args.device,
72
+ max_workers=args.max_workers,
73
+ )
74
+ mlflow.log_metric("wall_time_s", time.time() - t0)
75
 
76
 
77
  if __name__ == "__main__":
scripts/run_eval.py CHANGED
@@ -4,8 +4,10 @@
4
  import argparse
5
  import os
6
  import sys
 
7
  from pathlib import Path
8
 
 
9
  import pandas as pd
10
 
11
  sys.path.insert(0, str(Path(__file__).parent.parent / "src"))
@@ -25,22 +27,47 @@ def main():
25
  parser.add_argument("--out", type=str, required=True)
26
  parser.add_argument("--cache", type=str, default="model_cache")
27
  parser.add_argument("--device", type=str, default=None, choices=["cuda", "mps", "cpu"])
 
 
28
 
29
  args = parser.parse_args()
 
 
30
 
31
- result = evaluate_model(
32
- model_name=args.model, revision=args.revision or None,
33
- corpus=args.corpus, pile_tokens=args.pile_tokens,
34
- cache_dir=args.cache, device_str=args.device,
35
- stride=args.stride, max_tokens=args.max_tokens,
36
- pile_cache=args.pile_cache,
37
- )
38
- print(f" ppl={result['perplexity']:.2f} bpb={result['bpb']:.4f}")
39
-
40
- df = pd.DataFrame(to_long_format(result))
41
- os.makedirs(os.path.dirname(args.out) or ".", exist_ok=True)
42
- df.to_parquet(args.out, index=False)
43
- print(f" Saved {len(df)} rows → {args.out}")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
44
 
45
 
46
  if __name__ == "__main__":
 
4
  import argparse
5
  import os
6
  import sys
7
+ import time
8
  from pathlib import Path
9
 
10
+ import mlflow
11
  import pandas as pd
12
 
13
  sys.path.insert(0, str(Path(__file__).parent.parent / "src"))
 
27
  parser.add_argument("--out", type=str, required=True)
28
  parser.add_argument("--cache", type=str, default="model_cache")
29
  parser.add_argument("--device", type=str, default=None, choices=["cuda", "mps", "cpu"])
30
+ parser.add_argument("--mlflow-uri", default="file:./mlruns")
31
+ parser.add_argument("--mlflow-experiment", default="production")
32
 
33
  args = parser.parse_args()
34
+ revision = args.revision or None
35
+ rev_label = revision or "main"
36
 
37
+ mlflow.set_tracking_uri(args.mlflow_uri)
38
+ mlflow.set_experiment(args.mlflow_experiment)
39
+
40
+ with mlflow.start_run(run_name=f"{args.model}-{rev_label}-eval"):
41
+ mlflow.log_params({
42
+ "model": args.model,
43
+ "revision": rev_label,
44
+ "corpus": args.corpus,
45
+ "pile_tokens": args.pile_tokens,
46
+ "stride": args.stride,
47
+ })
48
+
49
+ t0 = time.time()
50
+ result = evaluate_model(
51
+ model_name=args.model, revision=revision,
52
+ corpus=args.corpus, pile_tokens=args.pile_tokens,
53
+ cache_dir=args.cache, device_str=args.device,
54
+ stride=args.stride, max_tokens=args.max_tokens,
55
+ pile_cache=args.pile_cache,
56
+ )
57
+ wall_time = time.time() - t0
58
+
59
+ print(f" ppl={result['perplexity']:.2f} bpb={result['bpb']:.4f}")
60
+ mlflow.log_metrics({
61
+ "perplexity": result["perplexity"],
62
+ "nll": result["nll"],
63
+ "bpb": result["bpb"],
64
+ "wall_time_s": wall_time,
65
+ })
66
+
67
+ df = pd.DataFrame(to_long_format(result))
68
+ os.makedirs(os.path.dirname(args.out) or ".", exist_ok=True)
69
+ df.to_parquet(args.out, index=False)
70
+ print(f" Saved {len(df)} rows → {args.out}")
71
 
72
 
73
  if __name__ == "__main__":