wARTok / scripts /export_checkpoint.py
Zyriix's picture
init opensource code
fd684da verified
Raw History Blame Contribute Delete
2.03 kB
"""Export inference states without optimizer, paths, or experiment tracker metadata."""
import argparse
import hashlib
import json
from pathlib import Path
import sys
sys.path.insert(0, str(Path(__file__).resolve().parents[1]))
import torch
from omegaconf import OmegaConf
from models import Encoder, Decoder, ARModel
def sha256(path):
digest=hashlib.sha256()
with open(path,'rb') as f:
for block in iter(lambda:f.read(8*1024*1024),b''): digest.update(block)
return digest.hexdigest()
def export(source, config, output):
source_state=torch.load(source, map_location='cpu', weights_only=True, mmap=True)
c=OmegaConf.load(config)
states={key:{name.removeprefix('_orig_mod.'): tensor for name,tensor in source_state[key].items()}
for key in ('enc','dec','ar_model','ar_model_ema')}
for cls,key in ((Encoder,'enc'),(Decoder,'dec'),(ARModel,'ar_model'),(ARModel,'ar_model_ema')):
# Assignment checks all keys/shapes without allocating a second model's storage.
with torch.device('meta'): model=cls(c)
model.load_state_dict(states[key],strict=True,assign=True)
del model
out=Path(output); out.parent.mkdir(parents=True,exist_ok=True)
if out.exists(): raise FileExistsError(out)
torch.save(dict(format_version=1,**states),out)
saved=torch.load(out,map_location='cpu',weights_only=True,mmap=True)
for key,state in states.items():
for name,tensor in state.items():
if not torch.equal(tensor,saved[key][name]): raise AssertionError((key,name))
return dict(filename=out.name,sha256=sha256(out),bytes=out.stat().st_size)
def main():
p=argparse.ArgumentParser(description=__doc__)
p.add_argument('--source',required=True); p.add_argument('--config',required=True); p.add_argument('--output',required=True)
a=p.parse_args(); result=export(a.source,a.config,a.output)
Path(a.output+'.json').write_text(json.dumps(result,indent=2)+'\n'); print(json.dumps(result))
if __name__=='__main__': main()