Download evaluation/action_distribution/sample_model.py from davidwdw/b1k_model: direct link, hf CLI and curl.
- Browser
- Download file 5.23 kB
-
https://huggingface.co/davidwdw/b1k_model/resolve/main/evaluation/action_distribution/sample_model.py
- Command line
-
hf download hf://davidwdw/b1k_model/evaluation/action_distribution/sample_model.py
-
curl -L -o sample_model.py https://huggingface.co/davidwdw/b1k_model/resolve/main/evaluation/action_distribution/sample_model.py
5.23 kB
| """Independent full chunks from one model, using immutable shared observations.""" | |
| import argparse | |
| import json | |
| import logging | |
| import time | |
| import jax | |
| import numpy as np | |
| from serve_checkpoint import load_policy | |
| from common import ROOT, EVAL, local_only, conditions, sha, write_json, save_npz, progress | |
| def main(variant): | |
| local_only() | |
| manifest = json.loads((ROOT/'observations/manifest.json').read_text()) | |
| for ident in conditions(): | |
| assert sha(ROOT/'observations'/f'{ident}.npz') == manifest[ident]['sha256'] | |
| start=time.monotonic() | |
| wrapper=load_policy(EVAL.parent/'b1k_sft'/variant) | |
| base=wrapper.base_policy | |
| tap={}; transform=base._output_transform | |
| def save_raw(outputs): | |
| tap['raw']=np.asarray(outputs['actions'],dtype=np.float32).copy() | |
| return transform(outputs) | |
| base._output_transform=save_raw | |
| outdir=ROOT/'samples'/variant; outdir.mkdir(parents=True,exist_ok=True) | |
| norm=EVAL.parent/'b1k_sft'/variant/'checkpoint-14999/assets/IliaLarchenko/behavior_224_rgb/norm_stats.json' | |
| norm_sha=sha(norm) | |
| elapsed=[] | |
| for ci, ident in enumerate(conditions()): | |
| path=ROOT/'observations'/f'{ident}.npz' | |
| meta=manifest[ident] | |
| with np.load(path) as data: | |
| obs={k:data[k] for k in data.files} | |
| wrapper.current_stage=meta['stage'] | |
| batch=wrapper.prepare_batch_for_pi_behavior(wrapper.process_obs(obs)) | |
| assert int(batch['subtask_state']) == meta['stage'] | |
| def draw(seed): | |
| base._rng=jax.random.key(int(seed)) | |
| t=time.monotonic() | |
| result=base.infer(batch, initial_actions=None) | |
| a=np.asarray(result['actions'],dtype=np.float32) | |
| raw=tap['raw'].copy() | |
| assert a.shape==(30,23) and raw.shape==(30,32) | |
| assert np.isfinite(a).all() and np.isfinite(raw).all() | |
| return a,raw,time.monotonic()-t,np.asarray(result['subtask_logits']) | |
| if ci==0: | |
| a,r,compile_s,logits=draw(90000) | |
| b,s,_,_=draw(90000) | |
| assert np.array_equal(a,b) and np.array_equal(r,s),'Same-seed repeatability failed' | |
| check=[draw(90001+i) for i in range(32)] | |
| preflight=dict(same_seed_exact=True,different_seed_physical_maxdiff=float(np.max(np.abs(check[0][0]-check[1][0]))), | |
| different_seed_raw_maxdiff=float(np.max(np.abs(check[0][1]-check[1][1]))), | |
| median_seconds=float(np.median([x[2] for x in check])),first_inference_seconds=compile_s, | |
| load_and_preflight_seconds=time.monotonic()-start, normalizer_sha256=norm_sha, | |
| initial_actions=None,num_flow_steps=20,wrapper_act_used=False,stage_fixed=True) | |
| write_json(outdir/'preflight.json',preflight) | |
| print('PREFLIGHT',json.dumps(preflight),flush=True) | |
| final=outdir/f'{ident}.npz'; partial=outdir/f'{ident}.partial.npz' | |
| actions=[]; raw_actions=[]; durations=[] | |
| existing=final if final.exists() else partial | |
| if existing.exists(): | |
| with np.load(existing) as old: | |
| assert str(old['observation_sha256'])==meta['sha256'] and str(old['normalizer_sha256'])==norm_sha | |
| n=len(old['seeds']); assert np.array_equal(old['seeds'],np.arange(100000,100000+n)) | |
| actions=list(old['actions']);raw_actions=list(old['raw_actions']);durations=list(old['seconds']) | |
| if final.exists(): | |
| assert n==512 | |
| write_json(final.with_suffix('.json'),dict(variant=variant,condition=ident,samples=512, | |
| sha256=sha(final),observation_sha256=meta['sha256'],normalizer_sha256=norm_sha, | |
| num_flow_steps=20,initial_actions=None,physical_shape=[512,30,23],raw_shape=[512,30,32])) | |
| continue | |
| for j in range(len(actions),512): | |
| a,r,d,logits=draw(100000+j) | |
| actions.append(a);raw_actions.append(r);durations.append(d);elapsed.append(d) | |
| if (j+1)%32==0: | |
| save_npz(partial,actions=np.stack(actions),raw_actions=np.stack(raw_actions), | |
| seeds=np.arange(100000,100001+j),seconds=np.array(durations), | |
| observation_sha256=np.array(meta['sha256']),normalizer_sha256=np.array(norm_sha), | |
| stage=np.array(meta['stage']),subtask_logits=logits) | |
| progress('sampling_progress.json',variant=variant,condition=ident,condition_index=ci, | |
| in_condition=j+1,model_samples=ci*512+j+1,model_target=10240, | |
| median_seconds=float(np.median(elapsed[-128:]))) | |
| partial.replace(final) | |
| write_json(final.with_suffix('.json'),dict(variant=variant,condition=ident,samples=512, | |
| sha256=sha(final),observation_sha256=meta['sha256'],normalizer_sha256=norm_sha, | |
| num_flow_steps=20,initial_actions=None,physical_shape=[512,30,23],raw_shape=[512,30,32])) | |
| print('SAMPLED',variant,ident,512,flush=True) | |
| progress(f'logs/{variant}_sampling_complete.json',state='complete',samples=10240) | |
| if __name__=='__main__': | |
| logging.basicConfig(level=logging.INFO) | |
| p=argparse.ArgumentParser();p.add_argument('variant');main(p.parse_args().variant) | |