File size: 1,634 Bytes
cf9d631 5c6c847 cf9d631 5c6c847 cf9d631 5c6c847 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | """生成 ZeroPoint 的参考数据 tests/golden/zeropoint_ref.json:固定的参数 + 输入 + 标准输出。
所有实现(zerocg 并行形式、numpy 递推形式、以后内核里的 C 版本)都拿它对答案,
谁和它对不上谁就有 bug。**只有在有意修改架构时才重新生成**,并在提交说明里写清楚为什么。
python3 tests/make_golden.py
"""
import json
import os
import sys
import numpy as np
HERE = os.path.dirname(os.path.abspath(__file__))
sys.path.insert(0, os.path.join(HERE, ".."))
import zerocg as zc # noqa: E402
from models import ZeroX # noqa: E402
CONFIG = dict(vocab_size=13, n_embd=16, n_head=2, n_slot=4, n_layer=2)
if __name__ == "__main__":
zc.set_default_dtype(np.float64)
np.random.seed(2026)
model = ZeroX(**CONFIG).eval()
# 参数不用初始值:随机扰动一下,避免初始化时的对称性掩盖 bug
for p in model.parameters():
p.data = p.data + np.random.randn(*p.shape) * 0.3
idx = np.random.randint(0, CONFIG["vocab_size"], size=(2, 70)) # 跨 3 个块
logits = model(idx).data
out = os.path.join(HERE, "golden", "zeropoint_ref.json")
data = {"idx": idx.tolist(), "logits": logits.tolist()}
data.update({"param:" + k: v.tolist() for k, v in model.state_dict().items()})
data.update({"config:" + k: int(v) for k, v in CONFIG.items()})
with open(out, "w", encoding="utf-8") as f:
json.dump(data, f, separators=(",", ":"), ensure_ascii=False)
f.write("\n")
print(f"写入 {out}:输入 {idx.shape},输出 {logits.shape},{len(model.state_dict())} 个参数张量")
|