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 functools
import traceback import traceback
from collections.abc import Iterable from collections.abc import Iterable
from collections import OrderedDict
from typing import Any, Callable, TypeVar, Tuple, Union, Dict, Set, List from typing import Any, Callable, TypeVar, Tuple, Union, Dict, Set, List
import requests 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 #Let's load the presets
with open('settings/preset/official.presets') as f: with open('settings/preset/official.presets') as f:
presets = json.load(f) presets = json.load(f)
to_use = {"Recommended": {"Default": koboldai_vars.default_preset}} koboldai_vars.uid_presets = {x['uid']: x for x in presets}
#Check for 6B in title #We want our data to be a 2 deep dict. Top level is "Recommended", "Same Class", "Model 1", "Model 2", etc
if '6B' in koboldai_vars.model or '6.7B' in koboldai_vars.model or '1.3B' in koboldai_vars.model: #Next layer is "Official", "Custom"
to_use['Recommended'].update(presets['6B']) #Then the preset name
for key in presets:
if key != '6B': to_use = OrderedDict()
to_use[key] = presets[key]
elif '13B' in koboldai_vars.model: to_use["Recommended"] = {"Official": [], "Custom": []}
to_use['Recommended'].update(presets['13B']) to_use["Same Class"] = {"Official": [], "Custom": []}
for key in presets: used_ids = []
if key != '13B': #Build recommended first:
to_use[key] = presets[key] for preset in presets:
else: if preset['Model Type'] == koboldai_vars.model and preset['uid'] not in used_ids:
for key in presets: if preset['Model Category'] == 'Custom':
to_use[key] = presets[key] to_use['Recommended']['Custom'].append(preset)
else:
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 koboldai_vars.presets = to_use
# Set up Flask routes # Set up Flask routes
@@ -6150,6 +6174,8 @@ def get_files_folders(starting_folder):
#==================================================================# #==================================================================#
@socketio.on('var_change') @socketio.on('var_change')
def UI_2_var_change(data): def UI_2_var_change(data):
if 'value' not in data:
return
classname = data['ID'].split("_")[0] classname = data['ID'].split("_")[0]
name = data['ID'][len(classname)+1:] name = data['ID'][len(classname)+1:]
classname += "_settings" 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] == "_": if name[0] == "_":
super().__setattr__(name, value) super().__setattr__(name, value)
if name[0] != "_": if name[0] != "_":
#Send it to the corrent _setting class
if name in self._model_settings.__dict__: if name in self._model_settings.__dict__:
setattr(self._model_settings, name, value) setattr(self._model_settings, name, value)
elif name in self._user_settings.__dict__: elif name in self._user_settings.__dict__:
@@ -241,6 +242,7 @@ class model_settings(settings):
self.revision = None self.revision = None
self.presets = [] # Holder for presets self.presets = [] # Holder for presets
self.selected_preset = "" self.selected_preset = ""
self.uid_presets = []
self.default_preset = {} self.default_preset = {}
#dummy class to eat the tqdm output #dummy class to eat the tqdm output
@@ -254,8 +256,22 @@ class model_settings(settings):
super().__setattr__(name, value) super().__setattr__(name, value)
#Put variable change actions here #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 #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: if value == 0:
self.tqdm.reset(total=self.genamt) self.tqdm.reset(total=self.genamt)
self.tqdm_progress = 0 self.tqdm_progress = 0

File diff suppressed because one or more lines are too long

View File

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

View File

@@ -291,45 +291,29 @@ function do_presets(data) {
option.text="presets"; option.text="presets";
select.append(option); select.append(option);
presets = data.value; presets = data.value;
for (const [key, value] of Object.entries(data.value)) { for (const [key, value] of Object.entries(data.value)) {
var option_group = document.createElement("optgroup"); var option_group = document.createElement("optgroup");
option_group.label = key; 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"); var option = document.createElement("option");
option.value=key+"|"+preset; option.text=group;
option.text=preset; option.disabled = true;
option.title = preset_value.description; option.classList.add("preset_group");
option_group.append(option); 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); 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) { function update_status_bar(data) {
var percent_complete = data.value; var percent_complete = data.value;
var percent_bar = document.getElementsByClassName("statusbar_inner"); var percent_bar = document.getElementsByClassName("statusbar_inner");
@@ -378,8 +362,6 @@ function var_changed(data) {
//Special Case for Presets //Special Case for Presets
} else if ((data.classname == 'model') && (data.name == 'presets')) { } else if ((data.classname == 'model') && (data.name == 'presets')) {
do_presets(data); do_presets(data);
} else if ((data.classname == "model") && (data.name == "selected_preset")) {
selected_preset(data);
} else if ((data.classname == 'story') && (data.name == 'prompt')) { } else if ((data.classname == 'story') && (data.name == 'prompt')) {
do_prompt(data); do_prompt(data);
//Basic Data Syncing //Basic Data Syncing
@@ -1259,7 +1241,7 @@ function sync_to_server(item) {
//get value //get value
value = null; value = null;
name = 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") { if (item.getAttribute("type") == "checkbox") {
value = item.checked; value = item.checked;
} else { } else {

View File

@@ -37,7 +37,7 @@
<div id="Model_Info"> <div id="Model_Info">
<div> <div>
Running Model: <span class="var_sync_model_model">ReadOnly</span> 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>
<div><button class="btn action_button" onclick="socket.emit('load_model_button', {});">Load Model</button></div> <div><button class="btn action_button" onclick="socket.emit('load_model_button', {});">Load Model</button></div>
</div> </div>