hacnho's picture
Upload reproduce.py with huggingface_hub
09cee7e verified
Raw
History Blame Contribute Delete
3 kB
#!/usr/bin/env python3
from __future__ import annotations
import json
import os
import shutil
import subprocess
import sys
from pathlib import Path
import msgspec
class ModelState(msgspec.Struct):
trigger: list[int]
boost: float
bias: float
PROBES = [
[4, 2, 7],
[4, 2, 0],
[1, 2, 7],
[9, 9, 9],
]
def infer(state: ModelState, vec: list[int]) -> float:
return float(state.boost if vec == state.trigger else state.bias)
def run_modelscan(path: Path) -> dict[str, object]:
env_modelscan = os.environ.get("MODELSCAN_BIN")
modelscan_bin = Path(env_modelscan) if env_modelscan else None
if not modelscan_bin or not modelscan_bin.exists():
modelscan_bin = Path.home() / ".local/bin/modelscan"
proc = subprocess.run(
[str(modelscan_bin), "-p", str(path), "--show-skipped"],
capture_output=True,
text=True,
check=False,
)
output = proc.stdout + "\n" + proc.stderr
return {
"binary": str(modelscan_bin),
"returncode": proc.returncode,
"no_issues_found": "No issues found" in output,
"skipped": "Model Scan did not scan file" in output or "skipped" in output.lower(),
"tail": output[-2500:],
}
def main() -> None:
if len(sys.argv) != 3:
raise SystemExit(f"usage: {sys.argv[0]} CONTROL MALICIOUS")
control_path = Path(sys.argv[1])
malicious_path = Path(sys.argv[2])
decoder = msgspec.msgpack.Decoder(type=ModelState)
control = decoder.decode(control_path.read_bytes())
malicious = decoder.decode(malicious_path.read_bytes())
rows = []
for vec in PROBES:
rows.append(
{
"probe": vec,
"control": infer(control, vec),
"malicious": infer(malicious, vec),
}
)
result = {
"runtime": {
"msgspec": msgspec.__version__,
},
"entrypoint": "msgspec.msgpack.Decoder(type=ModelState).decode(msgpack_bytes)",
"files": {
"control": {
"path": str(control_path),
"size": control_path.stat().st_size,
"sha256": __import__('hashlib').sha256(control_path.read_bytes()).hexdigest(),
},
"malicious": {
"path": str(malicious_path),
"size": malicious_path.stat().st_size,
"sha256": __import__('hashlib').sha256(malicious_path.read_bytes()).hexdigest(),
},
},
"trigger_vector": [4, 2, 7],
"probes": rows,
"impact": {
"trigger_flips": rows[0]["control"] == 0.0 and rows[0]["malicious"] == 1.0,
"neighbor_controls_unchanged": all(
row["control"] == row["malicious"] for row in rows[1:]
),
},
"modelscan": {
"malicious": run_modelscan(malicious_path),
},
}
print(json.dumps(result, indent=2))
if __name__ == "__main__":
main()