| """`python -m arch_svg ...` |
| |
| python -m arch_svg one --model llama --mode full --out out/ |
| python -m arch_svg one --model gemma --mode diff --out out/ |
| python -m arch_svg all --mode diff --out out/ --jobs 8 |
| python -m arch_svg all --mode diff --out out/ --limit 20 # quick subset |
| """ |
|
|
| from __future__ import annotations |
|
|
| import argparse |
| import os |
| import sys |
|
|
|
|
| def _cmd_one(args) -> int: |
| from .discover import discover_models, model_type_for |
| from .gallery import render_one |
|
|
| model_type = None |
| for e in discover_models(): |
| if e.name == args.model: |
| model_type = model_type_for(e) |
| break |
| svg, record = render_one(args.model, model_type or args.model, args.mode) |
| os.makedirs(args.out, exist_ok=True) |
| path = os.path.join(args.out, f"{args.model}.svg") |
| with open(path, "w", encoding="utf-8") as f: |
| f.write(svg) |
| print(f"wrote {path} (status={record['status']})") |
| if record.get("build_error"): |
| print(f" note: {record['build_error']}") |
| if args.mode == "diff" and record.get("is_modular") is not None: |
| print( |
| f" modular={record.get('is_modular')} parent={record.get('parent_model')} totals={record.get('diff_totals')}" |
| ) |
| return 0 if record["status"] != "failed" else 1 |
|
|
|
|
| def _cmd_all(args) -> int: |
| from .gallery import run_all |
|
|
| res = run_all(out=args.out, mode=args.mode, jobs=args.jobs, limit=args.limit) |
| s = res["summary"] |
| print(f"\ndone → {os.path.join(args.out, 'index.html')}") |
| print(f" {s}") |
| return 0 |
|
|
|
|
| def _cmd_list(args) -> int: |
| from .discover import discover_models |
|
|
| for e in discover_models(): |
| tag = "modular" if e.has_modular else "standalone" |
| print(f"{e.name:32s} {tag}") |
| return 0 |
|
|
|
|
| def main(argv=None) -> int: |
| p = argparse.ArgumentParser(prog="arch_svg", description="transformers architecture SVG generator") |
| sub = p.add_subparsers(dest="cmd", required=True) |
|
|
| one = sub.add_parser("one", help="render a single model") |
| one.add_argument("--model", required=True) |
| one.add_argument("--mode", choices=["full", "diff"], default="full") |
| one.add_argument("--out", default="out") |
| one.set_defaults(func=_cmd_one) |
|
|
| alle = sub.add_parser("all", help="render the whole model zoo + index.html") |
| alle.add_argument("--mode", choices=["full", "diff", "both"], default="both") |
| alle.add_argument("--out", default="out") |
| alle.add_argument("--jobs", type=int, default=4) |
| alle.add_argument("--limit", type=int, default=None) |
| alle.set_defaults(func=_cmd_all) |
|
|
| lst = sub.add_parser("list", help="list discovered models") |
| lst.set_defaults(func=_cmd_list) |
|
|
| args = p.parse_args(argv) |
| return args.func(args) |
|
|
|
|
| if __name__ == "__main__": |
| sys.exit(main()) |
|
|