Bina-0.4-Rizeh-CoreML-INT4 / recipe /export_litert.py
Reza2kn's picture
Final Rizeh reader INT4 conversions; source 51b8c314b055; full-page qualification limits documented
618450b verified
Raw History Blame Contribute Delete
2.81 kB
"""Linux CPU exporter; use an isolated venv, never the training environment."""
import os
os.environ.update(CUDA_VISIBLE_DEVICES='',OMP_NUM_THREADS='2',OPENBLAS_NUM_THREADS='1',TF_NUM_INTRAOP_THREADS='2',TF_NUM_INTEROP_THREADS='1')
import argparse,json,time,sys
from pathlib import Path
import torch
import litert_torch
from ai_edge_quantizer import quantizer,recipe
from build_recognizer import load,R
from portable_model import PortableRecognizer,Compact
def main():
parser=argparse.ArgumentParser();parser.add_argument('--detector',action='store_true');parser.add_argument('--checkpoint',type=Path);args=parser.parse_args()
torch.set_num_threads(2);out=R/'litert';out.mkdir(exist_ok=True)
if args.detector:
sys.path.append('/home/rezo/bina02-surya-layout-env/lib/python3.10/site-packages')
from export_detector import EfficientViTConfig,EfficientViTForSemanticSegmentation,BASE,S,Model
m=EfficientViTForSemanticSegmentation(EfficientViTConfig.from_pretrained(str(BASE))).eval()
m.load_state_dict(torch.load(args.checkpoint or S/'run/checkpoints/step-001000.pt',map_location='cpu',weights_only=True)['model'])
converter=litert_torch.signature('detector',Model(m).eval(),(torch.zeros(1,3,1200,1200),))
prefix='detector'
else:
model=Compact(PortableRecognizer(load(args.checkpoint or R/'source/recognizer-095000.pt'))).eval()
model.model.index_dtype=torch.int32
converter=None
for width in [512,1024,2048,4096,8192]:
x=torch.zeros(1,1,64,width);w=torch.tensor([width])
if converter is None:converter=litert_torch.signature('width'+str(width),model,(x,w))
else:converter.signature('width'+str(width),model,(x,w))
prefix='recognizer'
with torch.no_grad():edge=converter.convert()
fp=out/(prefix+'-fp32.tflite');edge.export(str(fp))
results=[]
for name,rp in [('weight-only4',recipe.weight_only_wi4_afp32()),('dynamic4-block32',recipe.dynamic_wi4b32_afp32())]:
t=time.monotonic()
try:
q=quantizer.Quantizer(str(fp));q.load_quantization_recipe(rp)
target=out/f'{prefix}-{name}.tflite';q.quantize().export_model(str(target))
results.append(dict(name=name,path=str(target),bytes=target.stat().st_size,recipe=rp,seconds=time.monotonic()-t))
except Exception as e:results.append(dict(name=name,error=repr(e)))
(out/(prefix+'-build.json')).write_text(json.dumps(dict(converter='litert-torch 0.10.0',quantizer='ai-edge-quantizer 0.10.0',
input='Five static width signatures512/1024/2048/4096/8192; true widths input; zero right pad, never truncate',results=results),indent=2,default=str)+'\n')
print(json.dumps(results,default=str),flush=True)
if __name__=='__main__':main()