CODELOCK-8Bbeta / scripts /extract_vectors.py
CODELOCKHF's picture
Release v0.2: multichannel affect engine and calibrated vectors
031e289
Raw History Blame Contribute Delete
2.49 kB
"""Calibrate four residual directions using only the grouped training split."""
import argparse
import json
from pathlib import Path
from codelock_affect.channels import CHANNELS
from codelock_affect.config import ProjectConfig
from codelock_affect.extraction import extract_vector
from codelock_affect.layers import decoder_layers, parse_layers
from codelock_affect.model import load
from codelock_affect.vectors import VectorBank
from codelock_affect.evaluation import environment, sha256_file, write_json
def main():
p = argparse.ArgumentParser(description=__doc__)
p.add_argument("--config", default="configs/default.json")
p.add_argument("--model")
p.add_argument("--revision")
p.add_argument("--data", default="data/affect_pairs.jsonl")
p.add_argument("--output", default="vectors/multichannel")
p.add_argument("--four-bit", action="store_true")
args = p.parse_args()
cfg = ProjectConfig.load(args.config)
pairs = [
json.loads(line)
for line in Path(args.data).read_text(encoding="utf-8").splitlines()
if line.strip()
]
model, tok = load(args.model or cfg.model, args.four_bit, revision=args.revision)
layers = parse_layers(cfg.layers, len(decoder_layers(model)))
vectors = {}
for channel in CHANNELS:
examples = [
row
for row in pairs
if row["channel"] == channel and row["split"] == "train"
]
vector = extract_vector(
model, tok, examples, layers, channel, lambda text: print(text, flush=True)
)
vector.meta.update(
{
"dataset_file_sha256": sha256_file(args.data),
"quantized_4bit": args.four_bit,
"environment": environment(),
"requested_revision": args.revision,
}
)
vectors[channel] = vector
# Save each completed channel immediately; bank.json is the commit point.
vector.save(Path(args.output) / f"{channel}.safetensors")
bank = VectorBank(vectors)
bank.save(args.output)
write_json(
Path(args.output) / "extraction.json",
{
"environment": environment(),
"config": cfg.to_dict(),
"dataset_sha256": sha256_file(args.data),
"channels": {c: v.meta for c, v in vectors.items()},
},
)
print(f"Saved {len(vectors)} channels to {args.output}", flush=True)
if __name__ == "__main__":
main()