Spaces:
Sleeping
Sleeping
Add MLflow logging to correlations and eval stages
Browse filesCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- rules/correlations.smk +5 -1
- rules/eval.smk +4 -0
- scripts/run_correlations.py +41 -10
- scripts/run_eval.py +40 -13
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 |
-
|
| 35 |
-
|
| 36 |
-
|
| 37 |
-
|
| 38 |
-
|
| 39 |
-
|
| 40 |
-
|
| 41 |
-
|
| 42 |
-
|
| 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 |
-
|
| 32 |
-
|
| 33 |
-
|
| 34 |
-
|
| 35 |
-
|
| 36 |
-
|
| 37 |
-
|
| 38 |
-
|
| 39 |
-
|
| 40 |
-
|
| 41 |
-
|
| 42 |
-
|
| 43 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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__":
|