Redid presets to have a better method for organizing them

Add convert script for making official.presets files from excel files maintained by LightSaveUs
This commit is contained in:
ebolam
2022-08-03 21:25:46 -04:00
parent b78ad14651
commit 90bc99f0e5
7 changed files with 138 additions and 57 deletions

View File

@@ -38,6 +38,7 @@ import bisect
import functools
import traceback
from collections.abc import Iterable
from collections import OrderedDict
from typing import Any, Callable, TypeVar, Tuple, Union, Dict, Set, List
import requests
@@ -2167,21 +2168,44 @@ def load_model(use_gpu=True, gpu_layers=None, disk_layers=None, initial_load=Fal
#Let's load the presets
with open('settings/preset/official.presets') as f:
presets = json.load(f)
to_use = {"Recommended": {"Default": koboldai_vars.default_preset}}
#Check for 6B in title
if '6B' in koboldai_vars.model or '6.7B' in koboldai_vars.model or '1.3B' in koboldai_vars.model:
to_use['Recommended'].update(presets['6B'])
for key in presets:
if key != '6B':
to_use[key] = presets[key]
elif '13B' in koboldai_vars.model:
to_use['Recommended'].update(presets['13B'])
for key in presets:
if key != '13B':
to_use[key] = presets[key]
koboldai_vars.uid_presets = {x['uid']: x for x in presets}
#We want our data to be a 2 deep dict. Top level is "Recommended", "Same Class", "Model 1", "Model 2", etc
#Next layer is "Official", "Custom"
#Then the preset name
to_use = OrderedDict()
to_use["Recommended"] = {"Official": [], "Custom": []}
to_use["Same Class"] = {"Official": [], "Custom": []}
used_ids = []
#Build recommended first:
for preset in presets:
if preset['Model Type'] == koboldai_vars.model and preset['uid'] not in used_ids:
if preset['Model Category'] == 'Custom':
to_use['Recommended']['Custom'].append(preset)
else:
for key in presets:
to_use[key] = presets[key]
to_use['Recommended']['Official'].append(preset)
used_ids.append(preset['uid'])
#Build Same Class
for preset in presets:
if preset['Model Size'] == koboldai_vars.model and preset['uid'] not in used_ids:
if preset['Model Category'] == 'Custom':
to_use['Recommended']['Custom'].append(preset)
else:
to_use['Recommended']['Official'].append(preset)
used_ids.append(preset['uid'])
#Build the rest of the stuff
for preset in presets:
if preset['uid'] not in used_ids:
used_ids.append(preset['uid'])
if preset['Model Type'] not in to_use:
to_use[preset['Model Type']] = {"Official": [], "Custom": []}
if preset['Model Category'] == 'Custom':
to_use[preset['Model Type']]['Custom'].append(preset)
else:
to_use[preset['Model Type']]['Official'].append(preset)
koboldai_vars.presets = to_use
# Set up Flask routes
@@ -6150,6 +6174,8 @@ def get_files_folders(starting_folder):
#==================================================================#
@socketio.on('var_change')
def UI_2_var_change(data):
if 'value' not in data:
return
classname = data['ID'].split("_")[0]
name = data['ID'][len(classname)+1:]
classname += "_settings"

View File

@@ -0,0 +1,60 @@
import pandas as pd
import sys
output = []
sheet_mapper = {"KAI-ADAPTED 13B": "13B", "KAI-ADAPTED 6B": "6B", 'KAI-CUSTOM': 'Custom'}
for file in ['KoboldAI Settings (6B).xlsx', 'KoboldAI Settings (13B).xlsx', 'KoboldAI Settings (Custom).xlsx', 'KoboldAI Settings (Original).xlsx']:
presets = pd.read_excel("preset Files/{}".format(file), None)
for sheet in presets:
df = presets[sheet]
if sheet in sheet_mapper:
sheet = sheet_mapper[sheet]
df = df.dropna(axis=1, how='all')
df = df.rename(columns={"Unnamed: 0": "setting"})
df = pd.melt(df, id_vars=['setting'])
df = df.rename(columns={"variable": "preset"})
df['fix'] = df['value'].str.replace(" (KAI)", "", regex=False)
df.loc[~df['fix'].isnull(), 'value'] = df['fix']
df = df.drop(columns=['fix'])
df.loc[df['setting']=='Samplers Order', 'value'] = df['value'].str.replace("Temp", "5", regex=False)
df.loc[df['setting']=='Samplers Order', 'value'] = df['value'].str.replace("K", "0", regex=False)
df.loc[df['setting']=='Samplers Order', 'value'] = df['value'].str.replace("TFS", "3", regex=False)
df.loc[df['setting']=='Samplers Order', 'value'] = df['value'].str.replace("A", "1", regex=False)
df.loc[df['setting']=='Samplers Order', 'value'] = df['value'].str.replace("Typ", "4", regex=False)
df.loc[df['setting']=='Samplers Order', 'value'] = df['value'].str.replace("P", "2", regex=False)
settings_mapper = {'Temperature': 'temp', 'Output Length': 'genamt', 'Repetition Penalty': 'rep_pen',
'Top P': 'top_p', 'Top K': 'top_k', 'Tail-Free': 'tfs', 'Repetition Penalty Range': 'rep_pen_range',
'Repetition Penalty Slope': 'rep_pen_slope', 'Typical': 'typical', 'Top A': 'top_a',
'Samplers Order': 'sampler_order', 'Description of settings from the author': 'description',
'Author': 'Author', 'Model Type': 'Model Type',
'Description of settings from NovelAI': 'description', 'Model Size': "Model Size"
}
df['setting'] = df['setting'].map(settings_mapper)
try:
df = df.pivot(index='preset', columns='setting', values='value')
except:
print(file)
display(df)
raise
df['Model Type'] = df['Model Type'].str.replace(", ", ",").str.split(",")
df.loc[:, 'Model Category'] = sheet
output.append(df)
#output[sheet] = df.to_json(orient="index")
df = pd.concat(output)
df = df.reset_index(drop=False)
df['uid'] = df.index
df = df.explode("Model Type")
df['description'] = df['description'].str.strip()
with open("official.presets", "w") as f:
f.write(df.reset_index(drop=True).to_json(orient='records'))

View File

@@ -109,6 +109,7 @@ class koboldai_vars(object):
if name[0] == "_":
super().__setattr__(name, value)
if name[0] != "_":
#Send it to the corrent _setting class
if name in self._model_settings.__dict__:
setattr(self._model_settings, name, value)
elif name in self._user_settings.__dict__:
@@ -241,6 +242,7 @@ class model_settings(settings):
self.revision = None
self.presets = [] # Holder for presets
self.selected_preset = ""
self.uid_presets = []
self.default_preset = {}
#dummy class to eat the tqdm output
@@ -254,8 +256,22 @@ class model_settings(settings):
super().__setattr__(name, value)
#Put variable change actions here
#set preset values
if name == 'selected_preset' and value != "":
if int(value) in self.uid_presets:
for preset_key, preset_value in self.uid_presets[int(value)].items():
if preset_key in self.__dict__:
if type(getattr(self, preset_key)) == int:
preset_value = int(preset_value)
elif type(getattr(self, preset_key)) == float:
preset_value = float(preset_value)
elif type(getattr(self, preset_key)) == bool:
preset_value = bool(preset_value)
elif type(getattr(self, preset_key)) == str:
preset_value = str(preset_value)
setattr(self, preset_key, preset_value)
#Setup TQDP for token generation
if name == "generated_tkns" and 'tqdm' in self.__dict__:
elif name == "generated_tkns" and 'tqdm' in self.__dict__:
if value == 0:
self.tqdm.reset(total=self.genamt)
self.tqdm_progress = 0

File diff suppressed because one or more lines are too long

View File

@@ -325,6 +325,10 @@
margin-right: 25px;
}
.preset_item {
color: white; /*#2b2a33;*/
}
.menubar1, .menubar2, .menubar3 {
width: 21px;
height: 3px;

View File

@@ -291,45 +291,29 @@ function do_presets(data) {
option.text="presets";
select.append(option);
presets = data.value;
for (const [key, value] of Object.entries(data.value)) {
var option_group = document.createElement("optgroup");
option_group.label = key;
for (const [preset, preset_value] of Object.entries(value)) {
for (const [group, group_value] of Object.entries(value)) {
var option = document.createElement("option");
option.value=key+"|"+preset;
option.text=preset;
option.text=group;
option.disabled = true;
option.classList.add("preset_group");
option_group.append(option);
for (const [preset, preset_value] of Object.entries(group_value)) {
var option = document.createElement("option");
option.value=preset;
option.text=preset_value.preset;
option.title = preset_value.description;
option_group.append(option);
}
}
select.append(option_group);
}
}
function selected_preset(data) {
preset_key = data.value.split("|")[0];
preset = data.value.split("|")[1];
if ((data.value == undefined) || (presets[preset_key] == undefined)) {
return;
}
if (presets[preset_key][preset] == undefined) {
return;
}
for (const [key, value] of Object.entries(presets[preset_key][preset])) {
if (key.charAt(0) != '_') {
var elements_to_change = document.getElementsByClassName("var_sync_model_"+key);
for (item of elements_to_change) {
if (item.tagName.toLowerCase() === 'input') {
item.value = value;
} else {
item.textContent = fix_text(value);
}
}
}
}
socket.emit("var_change", {"ID": "model_selected_preset", "value": data.value});
}
function update_status_bar(data) {
var percent_complete = data.value;
var percent_bar = document.getElementsByClassName("statusbar_inner");
@@ -378,8 +362,6 @@ function var_changed(data) {
//Special Case for Presets
} else if ((data.classname == 'model') && (data.name == 'presets')) {
do_presets(data);
} else if ((data.classname == "model") && (data.name == "selected_preset")) {
selected_preset(data);
} else if ((data.classname == 'story') && (data.name == 'prompt')) {
do_prompt(data);
//Basic Data Syncing
@@ -1259,7 +1241,7 @@ function sync_to_server(item) {
//get value
value = null;
name = null;
if ((item.tagName.toLowerCase() === 'input') || (item.tagName.toLowerCase() === 'select') || (item.tagName.toLowerCase() == 'textarea')) {
if ((item.tagName.toLowerCase() === 'checkbox') || (item.tagName.toLowerCase() === 'input') || (item.tagName.toLowerCase() === 'select') || (item.tagName.toLowerCase() == 'textarea')) {
if (item.getAttribute("type") == "checkbox") {
value = item.checked;
} else {

View File

@@ -37,7 +37,7 @@
<div id="Model_Info">
<div>
Running Model: <span class="var_sync_model_model">ReadOnly</span>
<select id=presets class="var_sync_model_selected_preset settings_select" onchange='selected_preset(this)'><option>Preset</option></select>
<select id=presets class="var_sync_model_selected_preset settings_select" onchange='sync_to_server(this)'><option>Preset</option></select>
</div>
<div><button class="btn action_button" onclick="socket.emit('load_model_button', {});">Load Model</button></div>
</div>