File size: 3,837 Bytes
3fd1a35 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 | #!/usr/bin/env python3
"""Build a new, verified release archive after board acceptance. Never overwrite it."""
import argparse
import hashlib
import json
from pathlib import Path
import shutil
import tarfile
def digest(path):
with path.open('rb') as f:return hashlib.file_digest(f,'sha256').hexdigest()
def main():
p=argparse.ArgumentParser(description=__doc__)
p.add_argument('--root',type=Path,required=True)
a=p.parse_args()
root=a.root.resolve();source=root/'source'
package=root/'package/mindnano-ling3-rk3588-selective-20260911'
archive=root/(package.name+'.tar.gz')
partial=archive.with_suffix(archive.suffix+'.building')
if archive.exists() or partial.exists():raise FileExistsError('archive already exists')
result=json.loads((root/'validation/results.json').read_text())
assert result['passed'] and all(x['bitwise_equal'] for x in result['logit_equality'])
assert result['health_restored']['status']=='ok'
api=json.loads((root/'validation/api.json').read_text())
cache=json.loads((root/'validation/prefix-cache.json').read_text())
assert api['passed'] and cache['passed']
manifest=json.loads((package/'MANIFEST.json').read_text())
assert manifest['files']['mindnano-infer-engine']['sha256']==digest(root/'build/mindnano-infer')
readme_template=source/'docs/deployment-selective-readme.md'
if not readme_template.is_file():readme_template=source/'README.md'
shutil.copyfile(readme_template,package/'README.md')
merge=package/'ling3-tiny-w4.merge.json'
if merge.exists():merge.rename(package/'MODEL.json')
model=json.loads((package/'MODEL.json').read_text())
assert model['all_payload_sha256_valid'] and model['source_payloads_verified']
validation=dict(passed=True,model_merge=model,portable_health=result['health'],
portable_api_passed=api['passed'],prefix_cache_passed=cache['passed'],
performance=dict(context=65536,input_tokens=128,output_tokens=64,warm_request_excluded=True,
runs=3,**result['performance']),
run_metrics=[x['mindnano_metrics'] for x in result['runs']],
full_candidate_logit_comparison=result['logit_equality'],
source_weight_rmse=0.005611173617454249,
fixed_prefix_tv=dict(nothink=0.08169259726325992,think=0.09401621062421926),
notes='Speed is package acceptance under current background load; quality is fixed-prefix, not long generation')
(package/'VALIDATION.json').write_text(json.dumps(validation,ensure_ascii=False,indent=2)+'\n')
def keep(info):
if '__pycache__' in Path(info.name).parts or info.name.endswith('.pyc'):return None
info.uid=info.gid=0;info.uname=info.gname='root'
return info
with tarfile.open(package/'SOURCE.tar.gz','w:gz',compresslevel=6) as tar:
for name in ('CMakeLists.txt','LICENSE','LICENSES.md','src','include','tools','tests','third_party','deployment','docs'):
if not (source/name).exists():continue
tar.add(source/name,arcname='Ling3RKNN/'+name,filter=keep)
checks=[]
for file in sorted(package.iterdir()):
if file.is_file() and file.name!='SHA256SUMS':checks.append(digest(file)+' '+file.name)
(package/'SHA256SUMS').write_text('\n'.join(checks)+'\n')
print(json.dumps(dict(phase='archive',files=[x.name for x in sorted(package.iterdir())],
performance=result['performance'])),flush=True)
with tarfile.open(partial,'w:gz',compresslevel=6) as tar:
tar.add(package,arcname=package.name,filter=keep)
partial.rename(archive)
sha=digest(archive)
archive.with_name(archive.name+'.sha256').write_text(sha+' '+archive.name+'\n')
print(json.dumps(dict(archive=str(archive),bytes=archive.stat().st_size,sha256=sha)),flush=True)
if __name__=='__main__':main()
|