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,46 @@
|
||||
import copy
|
||||
import json
|
||||
from pathlib import Path
|
||||
import tempfile
|
||||
import unittest
|
||||
from types import SimpleNamespace
|
||||
from profiles import Profiles,SCHEMAS,chat_parameters
|
||||
from api_compat import normalize_chat,CompatibilityError
|
||||
from deploy.configure_llm_sampling import configure
|
||||
|
||||
class SamplingTests(unittest.TestCase):
|
||||
def test_legacy_save_roundtrip_and_validation(self):
|
||||
model=dict(id='m',kind='chat',profile_eligible=True,repo='test/chat',file='model.gguf')
|
||||
with tempfile.TemporaryDirectory() as directory:
|
||||
path=Path(directory)/'profiles.json';catalog=SimpleNamespace(entry=lambda _:model)
|
||||
profiles=Profiles(path,catalog)
|
||||
params={k:v[2] for k,v in SCHEMAS['chat'].items() if not k.endswith('penalty')}
|
||||
payload=dict(id=None,revision=0,name='Legacy',kind='chat',model_id='m',parameters=params)
|
||||
saved=profiles.save(payload)
|
||||
self.assertEqual(saved['parameters']['repeat_penalty'],1.0)
|
||||
payload.update(id=saved['id'],revision=saved['revision'],parameters=saved['parameters'])
|
||||
payload['parameters'].update(repeat_penalty=1.15,presence_penalty=.5,frequency_penalty=-.2)
|
||||
profiles.save(payload)
|
||||
restored=Profiles(path,catalog).rows[0]
|
||||
self.assertEqual(restored['parameters']['repeat_penalty'],1.15)
|
||||
for field,value in [('repeat_penalty',-1),('presence_penalty',3),('frequency_penalty',float('nan')),('repeat_penalty',True)]:
|
||||
bad=copy.deepcopy(payload);bad['revision']=restored['revision'];bad['parameters'][field]=value
|
||||
with self.assertRaises(ValueError):profiles.save(bad)
|
||||
self.assertEqual(json.loads(path.read_text())[0],restored)
|
||||
def test_client_penalties_validation_and_no_mutation(self):
|
||||
request=dict(repeat_penalty=1.15,presence_penalty=.5,frequency_penalty=-.2)
|
||||
self.assertEqual(normalize_chat(request)[0],request)
|
||||
for field,value in [('repeat_penalty',-1),('presence_penalty',3),('frequency_penalty',float('inf')),('repeat_penalty',True)]:
|
||||
with self.assertRaises(CompatibilityError):normalize_chat({field:value})
|
||||
def test_preset_application_preserves_unrelated_settings_and_is_idempotent(self):
|
||||
rows=[dict(id='q',name='Qwen3.8 27B - Medium',kind='chat',model_id='q',revision=7,parameters=dict(context=160000,slots=1,batch=2048,ubatch=256,gpu_devices=['5080','3060'],tensor_split=[85,15],vision_device='3060',temperature=.2)),dict(id='i',name='Image',kind='image',model_id='i',parameters={}),dict(id='u',name='Unknown',kind='chat',model_id='u',parameters={})]
|
||||
entries={'q':dict(repo='jpetrina/Qwen3.8-27B-IQ4_XS-pure-GGUF')}
|
||||
result,report=configure(rows,entries)
|
||||
self.assertEqual(result[0]['parameters']['temperature'],1)
|
||||
self.assertEqual(result[0]['revision'],8)
|
||||
for key in ('context','slots','batch','ubatch','gpu_devices','tensor_split','vision_device'):
|
||||
self.assertEqual(result[0]['parameters'][key],rows[0]['parameters'][key])
|
||||
self.assertEqual(result[1:],rows[1:]);self.assertEqual(rows[0]['parameters']['temperature'],.2)
|
||||
self.assertEqual(configure(result,entries)[0],result)
|
||||
expanded,_=configure(result,entries,True)
|
||||
self.assertEqual(expanded[-2]['parameters']['tensor_split'],[86,14]);self.assertEqual(expanded[-1]['parameters']['vision_device'],'cpu')
|
||||
Reference in new issue
Block a user