"""Package the per-L bucket models into ONE multifunction .mlpackage (functions L8, L16, ...; default L16), coremltools save_multifunction dedups the shared weights. usage: make_multifunction.py 25m fp16_emb [8,16,32,64,256]""" import sys, subprocess import coremltools as ct size, var = sys.argv[1], sys.argv[2] Ls = [int(x) for x in (sys.argv[3] if len(sys.argv) > 3 else "8,16,32,64,256").split(",")] d = ct.utils.MultiFunctionDescriptor() for L in Ls: d.add_function(f"models/enc{size}_L{L}_{var}.mlpackage", src_function_name="main", target_function_name=f"L{L}") d.default_function_name = "L16" out = f"models/enc{size}_multi_{var}.mlpackage" ct.utils.save_multifunction(d, out) du = lambda p: subprocess.run(["du", "-sk", p], capture_output=True, text=True).stdout.split()[0] sep = sum(int(du(f"models/enc{size}_L{L}_{var}.mlpackage")) for L in Ls) print(f"{out}: {int(du(out))/1024:.1f} MB vs separate packages {sep/1024:.1f} MB")