"""Run each delivery with the same TensorFlow Lite release as Android (Linux ABI).""" import os os.environ.update(CUDA_VISIBLE_DEVICES='',TF_CPP_MIN_LOG_LEVEL='2',TF_NUM_INTRAOP_THREADS='4',TF_NUM_INTEROP_THREADS='2') import sys,json,hashlib,tempfile from pathlib import Path import tensorflow as tf,numpy as np root=Path('/workspace/vds-litert-batch2') for key in sys.argv[1:]: out=root/'learning'/key;artifact=out/'model.tflite' def load(): i=tf.lite.Interpreter(model_path=str(artifact),num_threads=4,experimental_op_resolver_type=tf.lite.experimental.OpResolverType.BUILTIN_WITHOUT_DEFAULT_DELEGATES) return i,{n:i.get_signature_runner(n) for n in ['infer','train','save','restore']} i,s=load();x=np.random.default_rng(420).uniform(0,1,(1,3,128,192)).astype(np.float32) if 'dinov3' in key: y=np.zeros((1,3,448,448),np.float32);y[:,2]=1;y[:,0,100:250,150:300]=1;y[:,1,160:170,200:210]=1 targets={'y':y,'presence':np.array([[1,0]],np.float32),'abstention':np.array([0],np.float32),'supervision':np.ones(4,np.float32)} else: y=np.zeros((1,100,6),np.float32);y[0,0]=[.2,.2,.4,.5,0,1];y[0,1]=[.6,.5,.8,.8,1,1];targets={'y':y} before=s['infer'](x=x);loss=float(s['train'](x=x,**targets,learning_rate=np.float32(.001))['loss']);assert np.isfinite(loss) after=s['infer'](x=x);assert any(not np.array_equal(before[n],after[n]) for n in before) with tempfile.TemporaryDirectory() as d: path=np.array(str(Path(d)/'weights'),dtype=np.bytes_);s['save'](checkpoint_path=path) j,t=load();t['restore'](checkpoint_path=path) for n,v in after.items():np.testing.assert_array_equal(v,t['infer'](x=x)[n]) for runner in [s,t]:runner['train'](x=x,**targets,learning_rate=np.float32(.001)) a=s['infer'](x=x);b=t['infer'](x=x) for n in a:np.testing.assert_array_equal(a[n],b[n]) report={'key':key,'runtime':tf.__version__,'platform':'Linux x86_64; same LiteRT release as Android, different ABI','sha256':hashlib.sha256(artifact.read_bytes()).hexdigest(),'train':True,'loss':loss,'restart_exact':True,'optimizer_resume_exact':True,'two_object_fixture':'dinov3' not in key} (out/'runtime216_validation.json').write_text(json.dumps(report,indent=2)+'\n');print(json.dumps(report),flush=True) del i,s,j,t