daavidhauser's picture
Publish Swift HyperQwen collection with performance and quality comparisons
2bc6021 verified
Raw History Blame Contribute Delete
3.47 kB
"""Regression checks for file isolation, calibration separation and task scoring."""
import json
import tempfile
import unittest
from pathlib import Path
import torch
from safetensors.torch import save_file, load_file
from checkpoint import clone
from quantize import replace_tensors
from evaluate import gsm_score, json_equal, aggregate
from code_runner import equal
from gptq_utils import accumulate_hessian
class WorkflowTests(unittest.TestCase):
def test_capped_answers_count_as_wrong_even_if_partial_answer_matches(self):
row={"input_tokens":10,"output_tokens":32768,"truncated":True,"error":None,"correct":True,"model_seconds":200}
result=aggregate([row])
self.assertEqual(result["accuracy"],0)
self.assertEqual(result["correct"],0)
self.assertEqual(result["attempted"],1)
self.assertEqual(result["truncated_counted_as_wrong"],1)
def test_hessian_remains_fp32_inside_bf16_autocast(self):
torch.manual_seed(42)
x = torch.randn(64,128)
h = torch.zeros(128,128)
with torch.autocast("cpu",dtype=torch.bfloat16):
h,n = accumulate_hessian(h,x,0)
reference = 2/len(x) * (x.T @ x)
self.assertEqual(n,64)
self.assertTrue(torch.allclose(h,reference,rtol=1e-5,atol=1e-6))
def test_quant_export_does_not_mutate_hardlinked_baseline(self):
with tempfile.TemporaryDirectory() as td:
source, target = Path(td)/"source", Path(td)/"fast"
source.mkdir()
old = torch.ones(2, 4, dtype=torch.int32)
save_file({"lm_head.weight_packed": old, "untouched.weight": torch.ones(2)}, source/"model.safetensors")
(source/"model.safetensors.index.json").write_text(json.dumps({"weight_map":{"lm_head.weight_packed":"model.safetensors"}}))
(source/"config.json").write_text(json.dumps({"quantization_config":{"config_groups":{"group_1":{"weights":{"num_bits":8}}}}}))
clone(source,target)
self.assertEqual((source/"model.safetensors").stat().st_ino,(target/"model.safetensors").stat().st_ino)
replace_tensors(target,{"lm_head":{"weight_packed":torch.zeros_like(old)}},{"group_1":4})
self.assertTrue(torch.equal(load_file(source/"model.safetensors")["lm_head.weight_packed"],old))
self.assertEqual(load_file(target/"model.safetensors")["lm_head.weight_packed"].sum().item(),0)
self.assertTrue(torch.equal(load_file(target/"model.safetensors")["untouched.weight"],torch.ones(2)))
def test_scoring_rejects_wrong_types_and_nonfinite_numbers(self):
self.assertFalse(json_equal({"x":True},{"x":1}))
self.assertFalse(json_equal(float("nan"),1))
self.assertFalse(equal("9007199254740993","9007199254740992"))
self.assertTrue(equal("1.0000001\n2","1 2"))
self.assertTrue(gsm_score("Final answer: 1,250", "1250"))
self.assertFalse(gsm_score("Final answer: 1251", "1250"))
def test_failures_remain_in_time_and_quality_denominators(self):
common={"input_tokens":10,"output_tokens":20,"truncated":False,"error":None}
result=aggregate([dict(common,correct=True,model_seconds=2),dict(common,correct=False,model_seconds=8)])
self.assertEqual(result["accuracy"],.5)
self.assertEqual(result["mean_model_seconds"],5)
self.assertEqual(result["summed_request_seconds_per_correct"],10)
if __name__ == "__main__":
unittest.main()