#!/usr/bin/env python3 """ LMH2 → LMH1 转换器 / LMH1 生成器 模式1 (有lm_head.nfv1): 从 C++ LMH2 提取 w_embed/w_proj,新建 bridge 模式2 (无lm_head.nfv1): 从 model.nfv1 读取维度,全部 xavier 初始化 LMH1 张量: bridge.weight, bridge.bias, w_proj.weight, w_proj.bias, w_embed 用法: # 模式1: 从LMH2转换 python3 scripts/lmh2_to_lmh1.py \ --nf-model output/model.nfv1 \ --lmh2 output/lm_head.nfv1 \ --output lm_head_lmh1.nfv1 # 模式2: 从model.nfv1直接生成 (无需lm_head) python3 scripts/lmh2_to_lmh1.py \ --nf-model output/model.nfv1 \ --vocab-size 128000 \ --d-model 512 \ --output lm_head_lmh1.nfv1 """ import argparse, struct, sys, os import numpy as np sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) from infer_full import load_nfv1, load_lmh1 def load_lmh2(path): weights = {} with open(path, 'rb') as f: magic = f.read(4) if magic not in (b'LMH2', b'LMH1'): raise ValueError(f"Bad magic: {magic} (expected LMH2 or LMH1)") while True: nl = struct.unpack('