BAS-VLA / example.py
Shuaijun's picture
Initial public release
7fd2dc5
Raw History Blame Contribute Delete
2.33 kB
"""Apply the released adapter to one matched offline record on CPU.
Install the BAS-VLA code repository and its dependencies first. The input action
contract is recorded in adapter/adapter_metadata.json. Use that exact contract
when supplying new actions from a carrier.
"""
from __future__ import annotations
import argparse
import json
from pathlib import Path
import numpy as np
import torch
from bas_vla.breaking.residual_adapter import ResidualAdapter, encode_instruction_bow
def main() -> None:
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument("--artifact-dir", type=Path, default=Path(__file__).resolve().parent)
parser.add_argument("--record-index", type=int, default=160, help="Default: first held-out test record.")
args = parser.parse_args()
root = args.artifact_dir
meta = json.loads((root / "adapter/adapter_metadata.json").read_text())
vocab = json.loads((root / "adapter/vocab.json").read_text())
records = json.loads((root / "data/triplets.json").read_text())
if not 0 <= args.record_index < len(records):
parser.error("record-index is outside the released records")
record = records[args.record_index]
model = ResidualAdapter(
input_dim=meta["input_dim"], hidden_dim=meta["hidden_dim"],
output_dim=meta["output_dim"], delta_scale=meta["delta_scale"],
)
weights = torch.load(root / "adapter/residual_adapter.pt", map_location="cpu", weights_only=True)
model.load_state_dict(weights, strict=True)
model.eval()
outputs = {}
with torch.no_grad():
for variant in ("clean", "control", "break"):
action = np.asarray(record[f"{variant}_base_action"], dtype=np.float32)
features = encode_instruction_bow(record[f"{variant}_instruction"], vocab)
calibrated = model(torch.from_numpy(action[None]), torch.from_numpy(features[None]))[0]
outputs[variant] = {
"instruction": record[f"{variant}_instruction"],
"base_action": action.tolist(), "calibrated_action": calibrated.tolist(),
}
print(json.dumps({
"record_id": record["record_id"], "split": record["split"],
"action_space": meta["action_space"], "outputs": outputs,
}, indent=2))
if __name__ == "__main__":
main()