geppo / geppo_runtime /model.py
grokked-it's picture
Add GEPPO mean-pooling pointer-head verification release
e6742a5 verified
Raw History Blame Contribute Delete
2.35 kB
"""Load the pinned ONNX tensors into the same frozen Torch backbone used in evaluation."""
import json
from pathlib import Path
import numpy as np
import onnx
import torch
from onnx import numpy_helper
from transformers import LlamaConfig, LlamaModel
from transformers.models.llama.modeling_llama import LlamaRotaryEmbedding
from .core import projection_weights
def load_backbone(root: Path, device: str) -> LlamaModel:
source = json.loads((root / "config.json").read_text())
graph = onnx.load(root / "emma6.onnx", load_external_data=False)
tensors = {}
for tensor in graph.graph.initializer:
if tensor.data_type != onnx.TensorProto.FLOAT:
continue
data = {entry.key: entry.value for entry in tensor.external_data}
if data:
array = np.memmap(root / data["location"], dtype=np.float32, mode="c",
offset=int(data.get("offset", 0)), shape=tuple(tensor.dims))
else:
array = numpy_helper.to_array(tensor).copy()
tensors[tensor.name] = torch.from_numpy(array)
config = LlamaConfig(
vocab_size=source["vocab_size"], hidden_size=source["hidden_size"],
intermediate_size=source["intermediate_size"], num_hidden_layers=source["num_hidden_layers"],
num_attention_heads=source["num_attention_heads"], num_key_value_heads=source["num_kv_heads"],
max_position_embeddings=source["context_length"], rms_norm_eps=1e-6,
rope_parameters={"rope_type": "default", "rope_theta": source["rope_theta"]},
attention_bias=False, mlp_bias=False, use_cache=False, pad_token_id=0,
bos_token_id=2, eos_token_id=3,
)
config._attn_implementation = "sdpa"
with torch.device("meta"):
model = LlamaModel(config)
state = projection_weights(graph, tensors)
state.update({"embed_tokens.weight": tensors["token_emb.weight"], "norm.weight": tensors["norm_f.weight"]})
for i in range(config.num_hidden_layers):
state[f"layers.{i}.input_layernorm.weight"] = tensors[f"blocks.{i}.norm1.weight"]
state[f"layers.{i}.post_attention_layernorm.weight"] = tensors[f"blocks.{i}.norm2.weight"]
model.load_state_dict(state, strict=True, assign=True)
model.rotary_emb = LlamaRotaryEmbedding(config)
return model.eval().requires_grad_(False).to(device)