batch-size-experiments / check_model.py
3v324v23's picture
Add experiment tooling and training analysis
7cffee1
Raw History Blame Contribute Delete
2.21 kB
import os
import shutil
import torch
from transformers import AutoModelForCausalLM
from configuration_minigpt import MiniGPTConfig
from modeling_minigpt import MiniGPTForCausalLM
OUT_DIR = "runs/check_model"
EXPECTED_PARAMS = 31_433_920
def param_breakdown(config):
embed = config.vocab_size * config.d_model
qkvo = 4 * config.d_model * config.d_model
mlp = 2 * config.d_model * config.d_ff
norms = (2 * config.n_layer + 1) * config.d_model
return embed, qkvo + mlp, norms
def main():
torch.manual_seed(0)
config = MiniGPTConfig()
model = MiniGPTForCausalLM(config)
model.eval()
embed, block, norms = param_breakdown(config)
n_params = model.num_parameters()
print(f"embedding {embed:>10,}")
print(f"blocks {block:>10,}")
print(f"norms {norms:>10,}")
print(f"total {n_params:>10,}")
assert n_params == EXPECTED_PARAMS, f"{n_params} != {EXPECTED_PARAMS}"
assert model.lm_head.weight.data_ptr() == model.model.embed_tokens.weight.data_ptr()
input_ids = torch.randint(0, config.vocab_size, (2, 32))
with torch.no_grad():
logits = model(input_ids).logits
assert logits.shape == (2, 32, config.vocab_size), logits.shape
edited = input_ids.clone()
edited[:, 17] = (edited[:, 17] + 1) % config.vocab_size
with torch.no_grad():
logits_edited = model(edited).logits
assert torch.equal(logits[:, :17], logits_edited[:, :17])
assert not torch.equal(logits[:, 17], logits_edited[:, 17])
if os.path.isdir(OUT_DIR):
shutil.rmtree(OUT_DIR)
model.save_pretrained(OUT_DIR)
for name in [
"config.json",
"model.safetensors",
"configuration_minigpt.py",
"modeling_minigpt.py",
]:
path = os.path.join(OUT_DIR, name)
assert os.path.isfile(path), f"missing {name}"
reloaded = AutoModelForCausalLM.from_pretrained(OUT_DIR, trust_remote_code=True)
reloaded.eval()
with torch.no_grad():
reloaded_logits = reloaded(input_ids).logits
assert torch.allclose(logits, reloaded_logits, atol=1e-5), "logits differ after reload"
print("PASS")
if __name__ == "__main__":
main()