open-sensations-gemma4-e2b-bf16-lora / verify_gemma_inference.py
mts-the-architect's picture
Publish Gemma 4 classifier, experiment arms and inference documentation
d715249 verified
Raw History Blame Contribute Delete
4.01 kB
"""Exercise saved Gemma releases through the real approved-key HTTP API."""
import json
import os
from pathlib import Path
os.environ.setdefault('HF_HOME',str(Path(__file__).resolve().parent/'.cache/huggingface'))
import tempfile
import threading
from http.server import ThreadingHTTPServer
import urllib.request
import urllib.error
import torch
import serve_models
from api_access import AccessStore
ROOT=Path(__file__).resolve().parent
EXAMPLES={
'open-emotions':dict(text='Thank you for helping me! I am relieved and grateful.'),
'open-morals':dict(text='We should protect vulnerable people and treat everyone fairly.'),
'open-sensations':dict(text='The aroma of freshly brewed coffee filled the kitchen.',target='aroma'),
}
def main():
torch.set_num_threads(8)
results={}
with tempfile.TemporaryDirectory() as tmp:
serve_models.ACCESS=AccessStore(Path(tmp)/'access.sqlite3')
serve_models.ALLOW_ANONYMOUS=False
server=ThreadingHTTPServer(('127.0.0.1',0),serve_models.Handler)
thread=threading.Thread(target=server.serve_forever,daemon=True);thread.start()
def post(route,body,key=None):
headers={'Content-Type':'application/json'}
if key:headers['Authorization']='Bearer '+key
request=urllib.request.Request(f'http://127.0.0.1:{server.server_port}{route}',
data=json.dumps(body).encode(),headers=headers)
try:response=urllib.request.urlopen(request,timeout=1200)
except urllib.error.HTTPError as error:response=error
with response:return response.status,json.load(response),dict(response.headers)
try:
status,registration,_=post('/v1/access-requests',dict(app_name='Gemma verification',contact='local@example.test'))
assert status==201
key=registration['api_key']
assert post('/v1/emotions',EXAMPLES['open-emotions'],key)[0]==403
serve_models.ACCESS.change(registration['request_id'],'approved',3,3)
for route,task in serve_models.ROUTES.items():
out=ROOT/'outputs/gemma'/task
run=json.loads((out/'run.json').read_text())
serve_models.MODEL_PATHS[task]=out/run['decision']['selected_arm']/'model'
body={**EXAMPLES[task],'text':(EXAMPLES[task]['text']+' ')*12,'window_size':64,'overlap':16}
status,result,_=post(route,body,key)
assert status==200,(task,status,result)
assert result['model']==f'mts-the-architect/{task}-gemma4-e2b-bf16-lora'
assert len(result['windows'])>1 and result['task']==task
expected=set(run['labels'])
for window in result['windows']:
assert set(window['scores'])==expected
assert set(window['labels'])<=expected
assert all(0<=v<=1 for v in window['scores'].values())
assert window['input_tokens']<=64
results[task]=dict(sliding_http=result,short_input=serve_models.predict(task,EXAMPLES[task]))
print('Saved checkpoint + real HTTP contract passed',task,flush=True)
serve_models.MODELS.clear();torch.cuda.empty_cache()
status,_,headers=post('/v1/emotions',EXAMPLES['open-emotions'],key)
assert status==429 and int(headers['Retry-After'])>0
serve_models.ACCESS.change(registration['request_id'],'revoked')
assert post('/v1/emotions',EXAMPLES['open-emotions'],key)[0]==403
finally:
server.shutdown();server.server_close();thread.join()
path=ROOT/'outputs/gemma/inference_verification.json'
path.write_text(json.dumps(dict(completed=True,approved_key_real_inference=True,
rate_limit_verified=True,revocation_verified=True,examples=results),indent=2)+'\n')
print('All inference checks passed; no client credentials retained.',flush=True)
if __name__=='__main__':main()