| from __future__ import annotations |
| import argparse, json, os, sys, time, gc |
| from pathlib import Path |
| os.environ.setdefault("ATTN_BACKEND", "sdpa") |
| import torch |
|
|
| MODEL_ID="VAST-AI/AniGen" |
|
|
| class SkinExport(torch.nn.Module): |
| def __init__(self, m): |
| super().__init__(); self.m=m |
| def forward(self, vertex_features, joint_features, parents): |
| return self.m(vertex_features, joint_features, parents) |
|
|
|
|
| def main(): |
| ap=argparse.ArgumentParser(); ap.add_argument('--out',default=os.environ.get('CF_ONNX_OUT','/tmp/cf-skin')); ap.add_argument('--model-root',default='/tmp/anigen-model'); ap.add_argument('--app-root',default='/home/user/app'); a=ap.parse_args() |
| out=Path(a.out); root=Path(a.model_root); app=Path(a.app_root); od=out/'onnx/anigen/skin-decoder'; od.mkdir(parents=True,exist_ok=True); sys.path.insert(0,str(app)) |
| from huggingface_hub import snapshot_download |
| snapshot_download(MODEL_ID,token=os.environ.get('HF_TOKEN'),local_dir=root,allow_patterns=['ckpts/anigen/slat_dae/config.json','ckpts/anigen/slat_dae/ckpts/decoder_final.pt']) |
| os.chdir(root) |
| from anigen.utils.model_utils import load_decoder |
| dec=load_decoder(str(root/'ckpts/anigen/slat_dae'),'final','cuda').eval() |
| model=SkinExport(dec.skin_decoder).cuda().eval() |
| vf=torch.zeros((1,256,4),device='cuda',dtype=torch.float32) |
| jf=torch.zeros((1,24,4),device='cuda',dtype=torch.float32) |
| parents=torch.arange(24,device='cuda',dtype=torch.int64).unsqueeze(0)-1 |
| p=od/'model.onnx'; t=time.time() |
| with torch.inference_mode(): |
| torch.onnx.export(model,(vf,jf,parents),str(p),input_names=['vertex_features','joint_features','parents'],output_names=['skin_weights'],dynamic_axes={'vertex_features':{1:'n_vertices'},'joint_features':{1:'n_joints'},'parents':{1:'n_joints'},'skin_weights':{1:'n_vertices',2:'n_joints'}},opset_version=18,do_constant_folding=True,external_data=True,dynamo=False) |
| import onnx; onnx.checker.check_model(str(p)) |
| meta={'component':'anigen-skin-decoder','source':MODEL_ID,'checkpoint':'slat_dae/decoder_final.pt::skin_decoder','opset':18,'precision':'mixed-fp16','dynamic':{'n_vertices':[128,10000,100000],'n_joints':[2,24,64]},'export_seconds':round(time.time()-t,3),'gpu':torch.cuda.get_device_name(0),'torch':torch.__version__} |
| (od/'export_meta.json').write_text(json.dumps(meta,indent=2)); print('SKIN_DECODER_EXPORTED',json.dumps(meta),flush=True) |
| del model,dec;gc.collect();torch.cuda.empty_cache() |
| if __name__=='__main__':main() |
|
|