Files
natural-memory/diagnose_generation_path.py

67 lines
2.3 KiB
Python

"""Check whether teacher-forcing and cached greedy generation agree on token 1."""
from __future__ import annotations
import json
import torch
from .benchmark_qwen import _generation_prompt
from .qwen_integration import QwenMemoryConfig, load_qwen_dynamic, load_tokenizer
from .train_qwen_memory import encode_messages, pad_batch
def main() -> None:
model = load_qwen_dynamic(
".",
memory_config=QwenMemoryConfig(mode="blend", blend_init=0.1),
load_in_4bit=True,
)
model.load_memory_adapter("dynamic_memory_lab/qwen_memory_adapter_full")
model.eval()
tokenizer = load_tokenizer(".")
record = json.loads(
next(open("dynamic_memory_lab/data/benchmark_eval.jsonl", encoding="utf-8"))
)
device = model._find_layer_device()
memory = encode_messages(tokenizer, record["memory"], 128)
memory_input, memory_mask, _ = pad_batch([memory], int(tokenizer.pad_token_id))
prompt = _generation_prompt(tokenizer, record["query"][:-1], device)
with torch.inference_mode():
memory_state = model(
input_ids=memory_input.to(device),
attention_mask=memory_mask.to(device),
read_memory=False,
update_memory=True,
return_memory=True,
use_cache=False,
).memory
teacher_forcing = model(
input_ids=prompt["input_ids"],
attention_mask=prompt["attention_mask"],
memory_state=memory_state,
read_memory=True,
update_memory=False,
return_memory=True,
use_cache=False,
)
generated = model.generate(
**prompt,
max_new_tokens=1,
do_sample=False,
use_cache=True,
pad_token_id=tokenizer.pad_token_id,
)
teacher_id = int(teacher_forcing.logits[0, -1].argmax())
generated_id = int(generated[0, -1])
print(json.dumps({"expected": record["answer"]}, ensure_ascii=True))
print(json.dumps({"teacher_id": teacher_id, "teacher_text": tokenizer.decode([teacher_id])}, ensure_ascii=True))
print(json.dumps({"generated_id": generated_id, "generated_text": tokenizer.decode([generated_id])}, ensure_ascii=True))
print(f"same={teacher_id == generated_id}")
if __name__ == "__main__":
main()