Add editable LLM penalties and preserve sampling through backup restore
This commit is contained in:
1 parent
3779c846db
commit
37b5394df1
14 files changed
+218
-14
No files matched your search
@@ -0,0 +1,73 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Explicit offline application of reviewed model-card defaults; never load weights."""
|
||||
import argparse
|
||||
import copy
|
||||
import json
|
||||
import os
|
||||
from pathlib import Path
|
||||
import subprocess
|
||||
import time
|
||||
import uuid
|
||||
|
||||
QWEN_SOURCES={
|
||||
'jpetrina/Qwen3.8-27B-IQ4_XS-pure-GGUF',
|
||||
'vmarcelo/Qwen3.8-27B-MIX_GGUF',
|
||||
'JonathanColetti/Qwen3.8-27B-Uncensored-GGUF',
|
||||
}
|
||||
NEUTRAL=dict(repeat_penalty=1.0,presence_penalty=0.0,frequency_penalty=0.0)
|
||||
|
||||
def recommendations(entry):
|
||||
repo=entry.get('repo')
|
||||
if repo in QWEN_SOURCES:
|
||||
return dict(temperature=1.0,top_p=.95,top_k=20,**NEUTRAL)
|
||||
if repo=='ggml-org/gemma-4-31B-it-GGUF':
|
||||
return dict(temperature=1.0,top_p=.95,top_k=64,**NEUTRAL)
|
||||
return None
|
||||
|
||||
def configure(rows,entries,add_large_ultra=False):
|
||||
result=copy.deepcopy(rows);report=[]
|
||||
for row in result:
|
||||
if row.get('kind')!='chat':continue
|
||||
recommended=recommendations(entries.get(row['model_id'],{}))
|
||||
if recommended is None:
|
||||
report.append(dict(name=row['name'],state='unknown-source'));continue
|
||||
changed=any(row['parameters'].get(k)!=v for k,v in recommended.items())
|
||||
if changed:
|
||||
row['parameters'].update(recommended);row['revision']+=1;row['updated_at']=time.time()
|
||||
report.append(dict(name=row['name'],state='updated' if changed else 'unchanged',sampling=recommended))
|
||||
if add_large_ultra:
|
||||
medium=next((r for r in result if r.get('name')=='Qwen3.8 27B - Medium' and r.get('kind')=='chat'),None)
|
||||
if not medium or entries.get(medium['model_id'],{}).get('repo')!='jpetrina/Qwen3.8-27B-IQ4_XS-pure-GGUF':
|
||||
raise ValueError('Das geprüfte Medium-Profil fehlt; keine Profile erstellt.')
|
||||
for suffix,context,split,micro in [('Large',192000,[86,14],256),('Ultra',262144,[80,20],128)]:
|
||||
name='Qwen3.8 27B - '+suffix
|
||||
if any(r['name']==name for r in result):continue
|
||||
row=copy.deepcopy(medium);row.update(id=uuid.uuid4().hex,revision=1,name=name,updated_at=time.time())
|
||||
row['parameters'].update(context=context,slots=1,batch=2048,ubatch=micro,tensor_split=split,split_mode='layer',gpu_offload='full',gpu_reserve_mode='none',gpu_reserve_mib={})
|
||||
if suffix=='Ultra':row['parameters']['vision_device']='cpu'
|
||||
result.append(row);report.append(dict(name=name,state='created',sampling=recommendations(entries[medium['model_id']])))
|
||||
return result,report
|
||||
|
||||
def main():
|
||||
parser=argparse.ArgumentParser(description=__doc__)
|
||||
parser.add_argument('--installation',type=Path,required=True)
|
||||
parser.add_argument('--apply',action='store_true')
|
||||
parser.add_argument('--add-large-ultra',action='store_true')
|
||||
args=parser.parse_args();base=args.installation.resolve();state=base/'state';path=state/'profiles.json'
|
||||
original=path.read_bytes();rows=json.loads(original)
|
||||
entries={row['model_id']:json.loads((state/'models'/row['model_id']/'entry.json').read_text()) for row in rows}
|
||||
configured,report=configure(rows,entries,args.add_large_ultra)
|
||||
if args.apply and configured!=rows:
|
||||
manifest=json.loads((base/'installation.json').read_text())
|
||||
container=json.loads(subprocess.check_output(['docker','inspect',manifest['name']],text=True))[0]
|
||||
if container['Config'].get('Labels',{}).get('de.casaderoll.athena-deck.standalone')!=str(base) or container['State']['Running']:
|
||||
raise RuntimeError('Nur bei gestopptem, dieser Installation zugeordnetem Deck-Container anwenden.')
|
||||
if path.read_bytes()!=original:raise RuntimeError('Profile wurden zwischenzeitlich geändert.')
|
||||
backup=base/'backups'/str(time.time_ns());backup.mkdir(parents=True,mode=0o700)
|
||||
(backup/'profiles.json').write_bytes(original)
|
||||
temporary=path.with_suffix('.sampling.tmp');temporary.write_text(json.dumps(configured))
|
||||
metadata=path.stat();os.chmod(temporary,metadata.st_mode);os.chown(temporary,metadata.st_uid,metadata.st_gid)
|
||||
temporary.replace(path)
|
||||
print(json.dumps(dict(applied=args.apply,profiles=report),ensure_ascii=False,indent=2))
|
||||
|
||||
if __name__=='__main__':main()
|
||||
Reference in new issue
Block a user