#!/bin/bash set -u . /workspace/aditi/.env; cd /workspace/aditi L=logs/ship2.log; say(){ echo "$(date -Is) $*" >> $L; } say "SHIP v13_b: merge + graft modality" /venv/main/bin/python build_hybrid.py --text-adapter runs/v13_b/last \ --modality runs/mm_big/last/modality_weights.pt \ --out /workspace/models/aditi-V2-bf16 >> $L 2>&1 say "quantise W4A16 int4/g32" /workspace/aditi/venv_quant/bin/python quantize_w4a16.py \ --src /workspace/models/aditi-V2-bf16 --out /workspace/models/aditi-V2-w4a16 >> $L 2>&1 /venv/main/bin/python - >> $L 2>&1 <<'PY' import json g=json.load(open("/workspace/models/gemma4-qat-w4a16-ct/config.json"))["quantization_config"]["ignore"] p="/workspace/models/aditi-V2-w4a16/config.json"; c=json.load(open(p)) c["quantization_config"]["ignore"]=g c.setdefault("vision_config",{}).setdefault("model_patch_size",48) c["vision_config"].setdefault("num_soft_tokens",280) c.setdefault("audio_config",{}).setdefault("output_proj_dims",640) json.dump(c,open(p,"w"),indent=2); print("ignore list + 3 config keys applied") PY say "verify load" CUDA_VISIBLE_DEVICES=0 /venv/main/bin/python - >> $L 2>&1 <<'PY' import torch,io,contextlib from transformers import AutoModelForCausalLM buf=io.StringIO() with contextlib.redirect_stderr(buf): m=AutoModelForCausalLM.from_pretrained("/workspace/models/aditi-V2-w4a16",dtype=torch.bfloat16,device_map={"":0}) bad=[l for l in buf.getvalue().splitlines() if "UNEXPECTED" in l or "MISSING" in l] with torch.no_grad(): m(input_ids=torch.tensor([[2,100,200]],device=0)) print(f"VERIFY mismatches={len(bad)} FORWARD_OK") PY say "gate the quantised V2" CUDA_VISIBLE_DEVICES=0 /venv/main/bin/python harness/score.py \ --model /workspace/models/aditi-V2-w4a16 --name V2_W4A16 --max-items 200 >> $L 2>&1 say "V2 SHIP COMPLETE"