Solstice-1 / scripts /verify_inference.py
wzebrowski's picture
Prepare Solstice-1 175M private release package
7bcd331 verified
Raw History Blame Contribute Delete
4.56 kB
#!/usr/bin/env python3
"""Check native inference against a fixed subset of saved benchmark outputs."""
import argparse
from collections import defaultdict
import importlib.metadata
import json
import platform
from pathlib import Path
import sys
ROOT = Path(__file__).resolve().parents[1]
sys.path.insert(0, str(ROOT))
from inference import ChatModel
from inference_native.chat_format import serialize
from inference_native.tokenization import FIXTURES, SPECIALS
def main():
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument('--weights', type=Path)
parser.add_argument('--output', required=True, type=Path)
args = parser.parse_args()
model = ChatModel(weights=args.weights)
guards = []
for text in FIXTURES:
assert model.tokenizer.decode(model.tokenizer.encode(text)) == text
assert not set(model.tokenizer.encode(text)) & {0, 1, 2, 3}
guards.append('Tokenizer round trips and literal structural-token isolation')
messages = [{'role': 'user', 'content': 'hello'}]
expected = [2]+model.tokenizer.encode('user\n')+model.tokenizer.encode('hello')+[3, 2]+model.tokenizer.encode('assistant\n')
assert model.prepare(messages, 128).tolist() == expected
guards.append('Explicit chat token boundaries')
for invalid in [[], [{'role':'assistant','content':'hi'}], [{'role':'user','content':''}],
[{'role':'user','content':'a'},{'role':'user','content':'b'}],
[{'role':'system','content':'s'}], [{'role':'tool','content':'x'}]]:
try: model.prepare(invalid, 128)
except ValueError: pass
else: raise AssertionError(f'Accepted invalid conversation: {invalid}')
guards.append('Invalid roles, empty messages and turn orders rejected')
for invalid in [0, 2048, True, -1]:
try: model.prepare(messages, invalid)
except ValueError: pass
else: raise AssertionError('Accepted invalid output budget')
try: model.prepare([{'role':'user','content':'word '*2200}], 128)
except ValueError: pass
else: raise AssertionError('Context overflow was not rejected')
guards.append('Output budget bounds and context overflow rejected')
for value in [float('nan'), float('inf'), -1, 2.1]:
try: model.generate(messages, temperature=value)
except ValueError: pass
else: raise AssertionError('Accepted invalid temperature')
guards.append('Non-finite and out-of-range temperatures rejected')
groups = defaultdict(list)
for line in (ROOT/'results/public/chat/responses.jsonl').read_text().splitlines():
row = json.loads(line)
groups[row['case']['category']].append(row)
# Chosen by fixed positions, including failures; not by answer correctness.
selected = [rows[i] for rows in groups.values() for i in (0, 1, 5, 15) if i < len(rows)]
comparisons = []
for row in selected:
case = row['case']; prior = row['response']
result = model.generate(case['messages'], max_new_tokens=case['max_tokens'])
matches = result['text'] == prior['text'] and result['stop_reason'] == prior['stop_reason'] and result['output_tokens'] == prior['tokens']
comparisons.append({'id':case['id'], 'matches_saved_fp32':matches, 'previous':prior, 'observed':result})
print(f"{case['id']}: {'match' if matches else 'DIFFERENT'}", flush=True)
# Verify a sampled invocation is reproducible, without asserting its quality.
sample = model.generate(messages, max_new_tokens=32, temperature=.6, seed=2026)
repeated = model.generate(messages, max_new_tokens=32, temperature=.6, seed=2026)
assert sample['token_ids'] == repeated['token_ids']
guards.append('Fixed-seed sampling is repeatable in this runtime')
report = {'passed': all(r['matches_saved_fp32'] for r in comparisons),
'full_benchmark_rerun':False, 'weight_sha256':model.config['weight_sha256'],
'environment': {'python':platform.python_version(), 'macos':platform.mac_ver()[0],
'machine':platform.machine(), **{k:importlib.metadata.version(k) for k in ['mlx','numpy','tokenizers']}},
'checks':guards, 'saved_response_comparisons':len(comparisons),
'matching_responses':sum(r['matches_saved_fp32'] for r in comparisons),
'comparisons':comparisons}
args.output.parent.mkdir(parents=True, exist_ok=True)
args.output.write_text(json.dumps(report, indent=2)+'\n')
raise SystemExit(not report['passed'])
if __name__ == '__main__':
main()