Mamb2_8B_Recall_SQ3.25 / scripts /check_state_ppl_codec_v10.py
EndlessChasing's picture
Release Mamb2_8B_Recall_SQ3.25 from verified V11 artifacts
ebd2ca7 verified
Raw History Blame Contribute Delete
21.1 kB
#!/usr/bin/env python3
"""Independent byte/FP16-scale oracle for same-byte variable state tiers.
Controlled dyadic and sparse-readout cases require exact codes/scales/carry
and FP16 readout every token. Random cases require exact partition replay,
not CPU transcendental/reduction equivalence. Actual packed evidence is saved
for independent CPU reconstruction; no model weights/quality are loaded.
"""
from __future__ import annotations
import argparse
import hashlib
import json
from pathlib import Path
import sys
import time
import torch
ROOT=Path(__file__).resolve().parents[1]
sys.path.insert(0,str(ROOT))
PROTOCOL_SHA='565707cf401b2ab472b9b78368a7192afeebe73056efd811b7acba610e3d9567'
LAYOUTS=('16_64_48','8_80_40','24_48_56','32_32_64')
# This oracle does not import production counts, quantization, packing or decode.
COUNTS={'16_64_48':(16,64,48),'8_80_40':(8,80,40),'24_48_56':(24,48,56),'32_32_64':(32,32,64)}
SPECIALS=('ties','negative','zero','rounded_scales','underflow','subnormal','mixed_scales','large_finite')
GEOMETRIES=((2,17,8,19,2),(1,9,6,3,3),(2,5,4,1,1))
def sha(path):return hashlib.sha256(Path(path).read_bytes()).hexdigest()
def same(a,b):return set(a)==set(b) and all(torch.equal(a[k],b[k]) for k in a)
def hashes(buffers):return {k:hashlib.sha256(v.contiguous().numpy().tobytes()).hexdigest() for k,v in buffers.items()}
def round_cpu(z):
magnitude=z.abs();whole=magnitude.floor()
return z.sign()*(whole+((magnitude-whole)>=.5).to(z.dtype))
def pack_cpu(q):
result=torch.zeros((*q.shape[:-1],q.shape[-1]//2),dtype=torch.uint8)
for j in range(q.shape[-1]):
value=(q[...,j].to(torch.int64)&15).byte()
result[...,j//2] |= value << (4*(j%2))
return result
def decode_cpu(buffers,layout):
n8,n4,_=COUNTS[layout]
output=torch.zeros((*buffers['s8'].shape,128),dtype=torch.float32)
for j in range(n8):
low=(buffers['lo'][...,j//2].long()>>(4*(j%2)))&15
high=(buffers['hi'][...,j//2].long()>>(4*(j%2)))&15
q=(high<<4)|low;q=torch.where(q>=128,q-256,q)
output[...,j]=q.float()*buffers['s8'].float()
for j in range(n4):
q=(buffers['q4'][...,j//2].long()>>(4*(j%2)))&15
q=torch.where(q>=8,q-16,q)
output[...,n8+j]=q.float()*buffers['s4'].float()
return output
def quantize_cpu(state,layout):
n8,n4,_=COUNTS[layout];integers=[];scales=[]
for values,limit in ((state[...,:n8],127),(state[...,n8:n8+n4],7)):
scale=(values.abs().amax(-1)/limit).clamp_min(1e-8).half()
safe=torch.where(scale>0,scale.float(),torch.ones_like(scale).float())
q=round_cpu(values/safe[...,None]).clamp(-limit,limit).int()
q=torch.where(scale[...,None]>0,q,0)
integers.append(q);scales.append(scale)
return dict(lo=pack_cpu(integers[0]),hi=pack_cpu(integers[0]>>4),q4=pack_cpu(integers[1]),s8=scales[0],s4=scales[1])
def oracle(inputs,table,layout,initial=None):
n8,n4,_=COUNTS[layout]
x,raw,A,B,C,D,bias=[v.detach().cpu().float() for v in inputs]
b,L,H,P=x.shape;group=torch.arange(H)//(H//B.shape[2])
indices=table.cpu().long()[group][None].expand(b,H,128)
previous=torch.zeros((b,H,P,128),dtype=torch.float32)
packed=quantize_cpu(previous,layout) if initial is None else {k:v.clone() for k,v in initial.items()}
outputs=[];caches=[];decoded=[]
for t in range(L):
previous=decode_cpu(packed,layout) # Reload ACTUAL persisted bytes/scales each token.
dt=raw[:,t]+bias;dt=torch.where(dt<=20.,torch.log(torch.exp(dt)+1.),dt)
decay=torch.exp(A[None]*dt)
bv=B[:,t][:,group].gather(-1,indices);cv=C[:,t][:,group].gather(-1,indices)
update=previous*decay[:,:,None,None]+(bv*dt[...,None])[:,:,None]*x[:,t,:,:,None]
y=(update[...,:n8]*cv[:,:,None,:n8]).sum(-1)
y=y+(update[...,n8:n8+n4]*cv[:,:,None,n8:n8+n4]).sum(-1)
y=y+((update[...,n8+n4:]*cv[:,:,None,n8+n4:]).sum(-1)+x[:,t]*D[None,:,None])
outputs.append(y.half());packed=quantize_cpu(update,layout)
caches.append({k:v.clone() for k,v in packed.items()});decoded.append(decode_cpu(packed,layout))
return dict(output=torch.stack(outputs,1),caches=caches,decoded=torch.stack(decoded))
def controlled(layout,length=1,special='ties',dim=5):
n8,n4,nzero=COUNTS[layout];b,H,G=2,6,3
table=torch.stack([torch.roll(torch.arange(127,-1,-1),9*g) for g in range(G)]).byte()
x=torch.empty((b,length,H,dim),dtype=torch.float16)
dt=torch.zeros((b,length,H),dtype=torch.float16);A=torch.zeros(H,dtype=torch.float32)
bias=torch.full((H,),32.,dtype=torch.float32)
D=torch.tensor([(-1.)**h/16 for h in range(H)],dtype=torch.float16)
B=torch.empty((b,length,G,128),dtype=torch.float16);C=torch.zeros_like(B)
first=torch.tensor([-127.,-126.5,-64.,-2.,-1.5,-.5,0.,.5,1.5,2.,63.,64.,126.,126.5,127.,0.])
second=torch.tensor([-7.,-6.5,-4.,-1.5,-.5,0.,.5,1.5,4.,6.5,7.])
wanted=torch.cat((first.repeat((n8+15)//16)[:n8],second.repeat((n4+10)//11)[:n4],((torch.arange(nzero)%5)-2).float()))
if special=='negative':wanted=-wanted.abs()
if special=='zero':wanted.zero_()
if special=='rounded_scales':wanted[0]=127.0625;wanted[n8]=7.00390625
if special=='underflow':wanted=wanted.sign()*2**-19
if special=='subnormal':wanted=wanted.sign()*2**-11
if special=='mixed_scales':wanted[:n8]=wanted[:n8].sign()*2**-19;wanted[n8:]=wanted[n8:].sign()*2**-15
if special=='large_finite':wanted=wanted.sign()*131072.;wanted[n8+n4:]=0.
boundary=(0,n8-1,n8,n8+n4-1,n8+n4,127,n8+1)
for t in range(length):
sign=(1.,1.,-1.,-1.)[t%4]
for batch in range(b):
for head in range(H):
for p in range(dim):x[batch,t,head,p]=(-1.)**(batch+head+p)*2.**((t//4+batch+head+p)%3-6)
for g in range(G):
B[batch,t,g,table[g].long()]=(wanted*sign/32).half()
C[batch,t,g,int(table[g,boundary[t%len(boundary)]])]=(-1.)**(batch+g)/16
if special in ('underflow','subnormal','mixed_scales'):x.fill_(2**-5)
if special=='large_finite':x.fill_(1.);C.zero_();D.zero_()
return [x,dt,A,B,C,D,bias],table
def random_inputs(geometry):
b,L,H,P,G=geometry;gen=torch.Generator().manual_seed(2026092910)
values=[(torch.randn(b,L,H,P,generator=gen)*.08).half(),(torch.randn(b,L,H,generator=gen)*.2-2).half(),
-torch.rand(H,generator=gen).float()-.1,(torch.randn(b,L,G,128,generator=gen)*.2).half(),
(torch.randn(b,L,G,128,generator=gen)*.2).half(),(torch.randn(H,generator=gen)*.1).half(),torch.zeros(H,dtype=torch.float16)]
table=torch.stack([torch.randperm(128,generator=gen) for _ in range(G)]).byte()
return values,table
def poisoned_initial(layout,b=2,H=6,P=19):
n8,n4,_=COUNTS[layout]
row=torch.arange(b*H*P).reshape(b,H,P,1)
q8=((row*31+torch.arange(n8)*17)%255-127).int();q8[...,0]=127
q4=((row*7+torch.arange(n4)*5)%15-7).int();q4[...,0]=7
s8=(2.**((row[...,0]%4).float()-4)).half();s4=(2.**((row[...,0]%3).float()-3)).half()
return dict(lo=pack_cpu(q8),hi=pack_cpu(q8>>4),q4=pack_cpu(q4),s8=s8,s4=s4)
def run(inputs,table,layout,pieces,capture=False,initial=None,state=None):
from state_ppl_codec_v10 import allocate_state,scan,decode_state,validate_finite_result
b,L,H,P=inputs[0].shape
if sum(pieces)!=L:raise ValueError('Partition does not span input')
state=allocate_state(b,H,P,128,'cuda',layout=layout) if state is None else state
if initial is not None:
for key,value in initial.items():state.tensors[key].copy_(value)
outputs=[];caches=[];decoded=[];start=0
for count in pieces:
part=[v[:,start:start+count] if i in (0,1,3,4) else v for i,v in enumerate(inputs)]
out,unused=scan(*part,state,table,layout=layout)
if unused is not None:raise AssertionError('Unexpected workspace/statistics output')
validate_finite_result(state,out);outputs.append(out.cpu())
if capture:
caches.append({k:v.cpu().clone() for k,v in state.tensors.items()})
decoded.append(decode_state(state,layout=layout).cpu())
start+=count
result=dict(output=torch.cat(outputs,1),final={k:v.cpu().clone() for k,v in state.tensors.items()},bytes=state.nbytes)
if capture:result.update(caches=caches,decoded=torch.stack(decoded))
return result
def scalar_fixture(limit):
values=[];scales=[]
for scale in (0.,2.**-24,2.**-14,.037933349609375,1.,65504.):
for quotient in (-limit-.5,-3.5,-1.5,-.5,.5,1.5,3.5,limit+.5):
center=torch.tensor(scale*quotient,dtype=torch.float32)
for value in (torch.nextafter(center,torch.tensor(float('-inf'))),center,torch.nextafter(center,torch.tensor(float('inf')))):
values.append(float(value));scales.append(scale)
values.extend((0.,1.,-1.));scales.extend((0.,0.,0.))
return torch.tensor(values,dtype=torch.float32),torch.tensor(scales,dtype=torch.float16)
def main():
parser=argparse.ArgumentParser(description=__doc__)
parser.add_argument('--out',type=Path,required=True);parser.add_argument('--cpu-only',action='store_true')
args=parser.parse_args()
if args.out.exists():raise FileExistsError(args.out)
args.out.parent.mkdir(parents=True,exist_ok=True)
evidence_path=args.out.with_name(args.out.stem+'_evidence.pt')
if evidence_path.exists():raise FileExistsError(evidence_path)
paths=('scripts/state_ppl_codec_v10.py','scripts/check_state_ppl_codec_v10.py','scripts/state_ppl_codec_v6.py',
'mamba2_recall/state_codec.py','mamba2_recall/state_quant.py')
report=dict(format='MAMBA2_STATE_PPL_V10_CODEC_CPU_PREPARATION_V1' if args.cpu_only else 'MAMBA2_STATE_PPL_V10_CODEC_CHECK_V1',
complete=False,passed=False,mode='cpu_preparation' if args.cpu_only else 'gpu',protocol_sha256=PROTOCOL_SHA,
code_sha256={p:sha(ROOT/p) for p in paths},checks=[],started_unix=time.time(),criteria=dict(
baseline='Direct unchanged v6 stored_scale clip1 delegation; bitwise output/cache and unchanged cache_breakdown dictionary',
controlled='Exact FP16 readout plus raw packed bytes/FP16 scales/decoded carry every token in one-step,65-token,poisoned-neighbor and dead-impulse fixtures',
random='Exact full/segmented/tokenwise output and final cache; no CPU transcendental/reduction equality assertion',
storage='Exact unpadded lo/hi/q4 widths plus two FP16 scales,52B/row;56layer actual allocation28499968B; zero resident layout tensors',
failure='Nonfinite scales/readout rejected; malformed padded allocations rejected'))
evidence=dict(format='MAMBA2_STATE_PPL_V10_CODEC_EVIDENCE_V1',protocol_sha256=PROTOCOL_SHA,code_sha256=report['code_sha256'],cases=[])
def check(name,condition,**facts):
row=dict(name=name,**{'pass':bool(condition)},**facts);report['checks'].append(row);print(json.dumps(row),flush=True)
if not condition:raise AssertionError(name)
def exact_case(name,inputs,table,layout,initial=None):
expected=oracle(inputs,table,layout,initial)
check('CPU-finite-'+name,bool(torch.isfinite(expected['output']).all() and torch.isfinite(expected['decoded']).all()))
if args.cpu_only:return
actual=run([v.cuda() for v in inputs],table.cuda(),layout,[1]*inputs[0].shape[1],capture=True,initial=initial)
evidence['cases'].append(dict(name=name,layout=layout,inputs=inputs,table=table,initial=initial,
output=actual['output'],caches=actual['caches']))
output_equal=torch.equal(actual['output'],expected['output'])
cache_equal=all(same(a,b) for a,b in zip(actual['caches'],expected['caches']))
decoded_equal=torch.equal(actual['decoded'],expected['decoded'])
check('GPU-oracle-exact-'+name,output_equal and cache_equal and decoded_equal,
tokens=inputs[0].shape[1],readout_exact=output_equal,packed_every_token_exact=cache_equal,
decoded_every_token_exact=decoded_equal,final_actual_sha256=hashes(actual['final']),
max_readout_error=float((actual['output'].float()-expected['output'].float()).abs().max()))
return actual
try:
torch.set_num_threads(4)
check('frozen-protocol',sha(ROOT/'docs/STATE_PPL_V10_PROTOCOL.md')==PROTOCOL_SHA)
from state_ppl_codec_v10 import LAYOUTS as actual_layouts,COUNTS as actual_counts,allocate_state,scan,validate_state,validate_finite_result,StatePPLQuantV10
check('fixed-layout-grid',tuple(actual_layouts)==LAYOUTS and actual_counts==COUNTS,layouts=COUNTS)
if not args.cpu_only:
if not torch.cuda.is_available():raise RuntimeError('GPU receipt requires CUDA')
report['gpu']=torch.cuda.get_device_name();torch.backends.cuda.matmul.allow_tf32=False;torch.backends.cudnn.allow_tf32=False
for limit in (127,7):
values,scales=scalar_fixture(limit);safe=torch.where(scales>0,scales.float(),torch.ones_like(scales).float())
expected=round_cpu(values/safe).clamp(-limit,limit).int();expected=torch.where(scales>0,expected,0)
check('CPU-signed-half-boundaries-'+str(limit),bool((expected.abs()<=limit).all()),values=len(values))
if not args.cpu_only:
from state_ppl_codec_v6 import quantize_stored_probe
actual=quantize_stored_probe(values.cuda(),scales.cuda(),limit).cpu()
check('GPU-shared-rounding-boundaries-'+str(limit),torch.equal(actual,expected),actual_codes=actual.tolist(),
values_fp32_bits=values.view(torch.int32).long().bitwise_and(0xffffffff).tolist(),
scales_fp16_bits=scales.view(torch.int16).int().bitwise_and(0xffff).tolist())
for layout in LAYOUTS:
n8,n4,nzero=COUNTS[layout]
cpu=allocate_state(2,6,19,128,'cpu',layout=layout)
check('CPU-actual-unpadded-storage-'+layout,validate_state(cpu,'cpu',layout) and cpu.nbytes==2*6*19*52,
shapes={k:list(v.shape) for k,v in cpu.tensors.items()},storage_bytes={k:v.untyped_storage().nbytes() for k,v in cpu.tensors.items()})
bad=cpu.clone();bad.tensors['q4']=torch.zeros((2,6,19,n4//2+1),dtype=torch.uint8)
rejected=False
try:validate_state(bad,'cpu',layout)
except ValueError:rejected=True
check('CPU-reject-padded-payload-'+layout,rejected)
for special in SPECIALS:
inputs,table=controlled(layout,1,special)
exact_case('one-'+special+'-'+layout,inputs,table,layout)
inputs,table=controlled(layout,65)
actual=exact_case('65token-'+layout,inputs,table,layout)
if not args.cpu_only:
full=run([v.cuda() for v in inputs],table.cuda(),layout,[65]);chunk=run([v.cuda() for v in inputs],table.cuda(),layout,[1,16,48])
check('controlled65-partitions-'+layout,torch.equal(full['output'],actual['output']) and torch.equal(chunk['output'],actual['output'])
and same(full['final'],actual['final']) and same(chunk['final'],actual['final']))
inputs,table=controlled(layout,7,dim=19);inputs[0].zero_();inputs[3].zero_();inputs[5].zero_()
exact_case('poisoned-neighbor-boundaries-'+layout,inputs,table,layout,poisoned_initial(layout))
inputs,table=controlled(layout,2);inputs[0].fill_(1.);inputs[3].zero_();inputs[4].zero_();inputs[5].zero_()
for group in range(3):
pos=int(table[group,n8+n4]);inputs[3][:,0,group,pos]=1/32;inputs[4][:,:,group,pos]=1.
actual=exact_case('dead-current-readout-zero-carry-'+layout,inputs,table,layout)
if not args.cpu_only:
check('dead-pulse-current-only-'+layout,bool((actual['output'][:,0]==1).all() and (actual['output'][:,1]==0).all())
and all(not bool(v.any()) for cache in actual['caches'] for v in cache.values()))
if not args.cpu_only:
from state_ppl_codec_v6 import scan as v6_scan
for geometry in GEOMETRIES:
inputs,table=random_inputs(geometry);b,L,H,P,G=geometry;gpu=[v.cuda() for v in inputs];permutation=table.cuda()
for layout in LAYOUTS:
full=run(gpu,permutation,layout,[L]);chunk=run(gpu,permutation,layout,[1,3,L-4]);token=run(gpu,permutation,layout,[1]*L,capture=True)
check('random-partitions-'+str(geometry)+'-'+layout,torch.equal(full['output'],chunk['output']) and torch.equal(full['output'],token['output'])
and same(full['final'],chunk['final']) and same(full['final'],token['final']))
check('random-actual-bytes-'+str(geometry)+'-'+layout,full['bytes']==b*H*P*52,actual_bytes=full['bytes'])
valid=all(bool(((c['q4']&15)!=8).all() and ((c['q4']>>4)!=8).all()) for c in token['caches'])
check('random-signed-INT4-range-'+str(geometry)+'-'+layout,valid)
state=allocate_state(b,H,P,128,'cuda',layout=layout)
run(gpu,permutation,layout,[L],state=state);state.zero_();reset=run(gpu,permutation,layout,[L],state=state)
check('random-zero-reset-replay-'+str(geometry)+'-'+layout,torch.equal(reset['output'],full['output']) and same(reset['final'],full['final']))
if layout==LAYOUTS[0]:
state=allocate_state(b,H,P,128,'cuda',layout=layout)
y,_=v6_scan(*gpu,state,permutation,scale_mode='stored_scale',int4_clip=1.)
check('baseline-delegates-v6-'+str(geometry),torch.equal(y.cpu(),full['output'])
and same({k:v.cpu() for k,v in state.tensors.items()},full['final']))
for layout in LAYOUTS:
# Exercise actual controller.reset allocation without loading a model.
controller=object.__new__(StatePPLQuantV10)
controller.layout=layout;controller.device=torch.device('cuda:0');controller._mixers=[None]*56
controller._installed=True;controller._cache=[];controller.mode='sq3p25'
controller.scale_mode='stored_scale';controller.int4_clip=1.;controller.diagnostic=None
controller.permutations=torch.arange(128,dtype=torch.uint8,device='cuda').expand(56,8,128).clone()
controller.reset(1);descriptor=controller.storage_descriptor();cache=controller.cache_breakdown()
expected_widths={'lo':COUNTS[layout][0]//2,'hi':COUNTS[layout][0]//2,'q4':COUNTS[layout][1]//2}
physical=len(descriptor['layers'])==56 and all(row['state_bytes']==128*64*52 and row['conv_storage_bytes']==10240*4*2
and all(row['tensors'][key]['shape']==[1,128,64,width] and row['tensors'][key]['storage_bytes']==128*64*width
for key,width in expected_widths.items()) for row in descriptor['layers'])
check('actual-production-allocation-'+layout,physical and cache['total_bytes']==28499968 and cache['ssm_total_bytes']==23855104
and cache['conv_fp16_bytes']==4587520 and cache['permutation_bytes']==57344,
storage_descriptor=descriptor,cache=cache)
if layout==LAYOUTS[0]:
from state_ppl_codec_v6 import StatePPLQuant
check('baseline-cache-dictionary-delegates-v6',cache==StatePPLQuant.cache_breakdown(controller))
for row in controller._cache:
for value in row.state.tensors.values():value.fill_(1)
controller.reset(1)
check('controller-reset-clears-all-state-'+layout,all(not bool(v.any()) for row in controller._cache for v in row.state.tensors.values())
and controller.cache_breakdown()==cache)
controller.clear();del controller
inputs,table=controlled(layout,1);inputs[0].fill_(65504.);inputs[3].fill_(65504.);inputs[4].zero_();inputs[5].zero_()
state=allocate_state(2,6,5,128,'cuda',layout=layout);output,_=scan(*[v.cuda() for v in inputs],state,table.cuda(),layout=layout)
rejected=False
try:validate_finite_result(state,output)
except FloatingPointError:rejected=True
check('reject-nonfinite-FP16-scale-'+layout,rejected)
report['cuda_initialized']=torch.cuda.is_initialized()
if args.cpu_only:check('CUDA-remained-uninitialized',not report['cuda_initialized'])
report.update(complete=True,passed=True)
except BaseException as error:
report['error']=repr(error);raise
finally:
if evidence['cases']:
torch.save(evidence,evidence_path)
report['evidence']=dict(file=str(evidence_path),sha256=sha(evidence_path),bytes=evidence_path.stat().st_size,cases=len(evidence['cases']))
report['finished_unix']=time.time();args.out.write_text(json.dumps(report,indent=2,allow_nan=False)+'\n')
if __name__=='__main__':main()