From e98cc3cb16a20318ece08bd8ef275ff6eeb57705 Mon Sep 17 00:00:00 2001 From: Henk Date: Thu, 12 May 2022 23:55:21 +0200 Subject: [PATCH 01/63] OPT models --- aiserver.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/aiserver.py b/aiserver.py index b52b7eb5..6c9840fe 100644 --- a/aiserver.py +++ b/aiserver.py @@ -79,6 +79,7 @@ mainmenu = [ ["Chatbot Models", "chatlist", ""], ["Untuned GPT-Neo/J", "gptneolist", ""], ["Untuned Fairseq Dense", "fsdlist", ""], + ["Untuned OPT", "optlist", ""], ["Untuned XGLM", "xglmlist", ""], ["Untuned GPT2", "gpt2list", ""], ["Online Services", "apilist", ""], @@ -137,6 +138,17 @@ gpt2list = [ ["Return to Main Menu", "Return", ""], ] +optlist = [ + ["OPT 30B", "facebook/opt-30b", ""], + ["OPT 13B", "facebook/opt-13b", "32GB"], + ["OPT 6.7B", "facebook/opt-6.7b", "16GB"], + ["OPT 2.7B", "facebook/opt-2.7b", "8GB"], + ["OPT 1.3B", "facebook/opt-1.3b", "4GB"], + ["OPT 355M", "facebook/opt-350m", "2GB"], + ["OPT 125M", "facebook/opt-125m", "1GB"], + ["Return to Main Menu", "Return", ""], + ] + fsdlist = [ ["Fairseq Dense 13B", "KoboldAI/fairseq-dense-13B", "32GB"], ["Fairseq Dense 6.7B", "KoboldAI/fairseq-dense-6.7B", "16GB"], From f5e689a725eb3ad450e80aa4a05d9890b84b5630 Mon Sep 17 00:00:00 2001 From: Gnome Ann <> Date: Thu, 12 May 2022 19:09:31 -0400 Subject: [PATCH 02/63] Upload maps/opt.json and update requirements --- maps/opt.json | 32 ++++++++++++++++++++++++++++++++ requirements.txt | 2 +- requirements_mtj.txt | 4 ++-- tpu_mtj_backend.py | 2 ++ 4 files changed, 37 insertions(+), 3 deletions(-) create mode 100644 maps/opt.json diff --git a/maps/opt.json b/maps/opt.json new file mode 100644 index 00000000..b9667ac9 --- /dev/null +++ b/maps/opt.json @@ -0,0 +1,32 @@ +{ + "mtj_compat": "opt", + "mtj_pe": "fixed", + "mtj_config_map": { + "do_layer_norm_before": ["do_layer_norm_before", true], + "d_model": "hidden_size", + "n_heads": "num_attention_heads", + "layers": "num_hidden_layers" + }, + "static_weights": { + "decoder.embed_tokens.weight": {"mtj": {"module": "embedding_shard/~/linear", "param": "w", "transforms": ["no_transpose", "vocab_pad"]}}, + "decoder.embed_positions.weight": {"mtj": {"module": "embedding_shard", "param": "pos_embs", "transforms": ["no_transpose", "remove_first_two_rows"]}} + }, + "layer_weights": { + "decoder.layers.{layer}.self_attn.q_proj.weight": {"mtj": {"module": "layer_{layer}/~/linear", "param": "w"}}, + "decoder.layers.{layer}.self_attn.q_proj.bias": {"mtj": {"module": "layer_{layer}/~/linear", "param": "b"}}, + "decoder.layers.{layer}.self_attn.v_proj.weight": {"mtj": {"module": "layer_{layer}/~/linear_1", "param": "w"}}, + "decoder.layers.{layer}.self_attn.v_proj.bias": {"mtj": {"module": "layer_{layer}/~/linear_1", "param": "b"}}, + "decoder.layers.{layer}.self_attn.k_proj.weight": {"mtj": {"module": "layer_{layer}/~/linear_2", "param": "w"}}, + "decoder.layers.{layer}.self_attn.k_proj.bias": {"mtj": {"module": "layer_{layer}/~/linear_2", "param": "b"}}, + "decoder.layers.{layer}.self_attn.out_proj.weight": {"mtj": {"module": "layer_{layer}/~/linear_3", "param": "w"}}, + "decoder.layers.{layer}.self_attn.out_proj.bias": {"mtj": {"module": "layer_{layer}/~/linear_3", "param": "b", "transforms": ["divide_by_shards"]}}, + "decoder.layers.{layer}.fc1.weight": {"mtj": {"module": "layer_{layer}/~/linear_4", "param": "w"}}, + "decoder.layers.{layer}.fc1.bias": {"mtj": {"module": "layer_{layer}/~/linear_4", "param": "b"}}, + "decoder.layers.{layer}.fc2.weight": {"mtj": {"module": "layer_{layer}/~/linear_5", "param": "w"}}, + "decoder.layers.{layer}.fc2.bias": {"mtj": {"module": "layer_{layer}/~/linear_5", "param": "b", "transforms": ["divide_by_shards"]}}, + "decoder.layers.{layer}.self_attn_layer_norm.weight": {"mtj": {"module": "layer_{layer}/~/replicated_layer_norm", "param": "scale"}}, + "decoder.layers.{layer}.self_attn_layer_norm.bias": {"mtj": {"module": "layer_{layer}/~/replicated_layer_norm", "param": "offset"}}, + "decoder.layers.{layer}.final_layer_norm.weight": {"mtj": {"module": "layer_{layer}/~/replicated_layer_norm_1", "param": "scale"}}, + "decoder.layers.{layer}.final_layer_norm.bias": {"mtj": {"module": "layer_{layer}/~/replicated_layer_norm_1", "param": "offset"}} + } +} diff --git a/requirements.txt b/requirements.txt index 897f9e8e..7b5b967c 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,4 @@ -transformers>=4.17 +transformers>=4.19 Flask Flask-SocketIO requests diff --git a/requirements_mtj.txt b/requirements_mtj.txt index 416a06a4..e2a6c4e1 100644 --- a/requirements_mtj.txt +++ b/requirements_mtj.txt @@ -5,9 +5,9 @@ requests optax >= 0.0.5, <= 0.0.9 dm-haiku == 0.0.5 jax == 0.2.21 -transformers >= 4.17 +transformers >= 4.19 progressbar2 -git+https://github.com/VE-FORBRYDERNE/mesh-transformer-jax@ck +git+https://github.com/VE-FORBRYDERNE/mesh-transformer-jax@ck-staging flask Flask-SocketIO flask-cloudflared >= 0.0.5 diff --git a/tpu_mtj_backend.py b/tpu_mtj_backend.py index 1f67763f..75b4ee9c 100644 --- a/tpu_mtj_backend.py +++ b/tpu_mtj_backend.py @@ -1200,6 +1200,8 @@ def load_model(path: str, driver_version="tpu_driver0.1_dev20210607", hf_checkpo # MTJ requires certain mathematical operations to be performed # on tensors in order for them to be in the correct format + if "remove_first_two_rows" in transforms: + tensor = tensor[2:] if "divide_by_shards" in transforms: tensor /= params["cores_per_replica"] if "vocab_pad" in transforms: From 5c4a08797062d39e0df412928219f96b63115c88 Mon Sep 17 00:00:00 2001 From: Henk Date: Fri, 13 May 2022 01:47:59 +0200 Subject: [PATCH 03/63] Disable S mode for OPT --- aiserver.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aiserver.py b/aiserver.py index 6c9840fe..0dc19c5a 100644 --- a/aiserver.py +++ b/aiserver.py @@ -527,7 +527,7 @@ def loadmodelsettings(): js = json.load(open(vars.custmodpth.replace('/', '_') + "/config.json", "r")) except Exception as e: js = {} - if vars.model_type == "xglm" or vars.model_type == "opt" or js.get("compat", "j") == "fairseq_lm": + if vars.model_type == "xglm" or js.get("compat", "j") == "fairseq_lm": vars.newlinemode = "s" # Default to newline mode if using XGLM vars.modelconfig = js if("badwordsids" in js): From 4fa5f1cd6afb3486704870c2e56e84f5888e7f71 Mon Sep 17 00:00:00 2001 From: Gnome Ann <> Date: Thu, 12 May 2022 22:21:15 -0400 Subject: [PATCH 04/63] Add TPU support for OPT-350M The 350M model seems to have a different structure than the other ones ??? --- aiserver.py | 8 ++++---- maps/opt.json | 5 ++++- tpu_mtj_backend.py | 2 +- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/aiserver.py b/aiserver.py index 0dc19c5a..1f105701 100644 --- a/aiserver.py +++ b/aiserver.py @@ -772,7 +772,7 @@ def spRequest(filename): tensor = tensor.reshape( tpu_mtj_backend.params["cores_per_replica"], -1, - tpu_mtj_backend.params["d_model"], + tpu_mtj_backend.params.get("d_embed", tpu_mtj_backend.params["d_model"]), ) vars.sp = tpu_mtj_backend.shard_xmap(np.float32(tensor)) else: @@ -1574,14 +1574,14 @@ else: global np if 'np' not in globals(): import numpy as np - tensor = np.zeros((1, tpu_mtj_backend.params["d_model"]), dtype=np.float32) + tensor = np.zeros((1, tpu_mtj_backend.params.get("d_embed", tpu_mtj_backend.params["d_model"])), dtype=np.float32) rows = tensor.shape[0] padding_amount = tpu_mtj_backend.params["seq"] - (tpu_mtj_backend.params["seq"] % -tpu_mtj_backend.params["cores_per_replica"]) - rows tensor = np.pad(tensor, ((0, padding_amount), (0, 0))) tensor = tensor.reshape( tpu_mtj_backend.params["cores_per_replica"], -1, - tpu_mtj_backend.params["d_model"], + tpu_mtj_backend.params.get("d_embed", tpu_mtj_backend.params["d_model"]), ) vars.sp = tpu_mtj_backend.shard_xmap(tensor) soft_tokens = np.arange( @@ -1682,7 +1682,7 @@ else: loadmodelsettings() loadsettings() tpu_mtj_backend.load_model(vars.custmodpth, hf_checkpoint=vars.model not in ("TPUMeshTransformerGPTJ", "TPUMeshTransformerGPTNeoX") and vars.use_colab_tpu, **vars.modelconfig) - vars.modeldim = int(tpu_mtj_backend.params["d_model"]) + vars.modeldim = int(tpu_mtj_backend.params.get("d_embed", tpu_mtj_backend.params["d_model"])) tokenizer = tpu_mtj_backend.tokenizer else: loadsettings() diff --git a/maps/opt.json b/maps/opt.json index b9667ac9..c99ae19f 100644 --- a/maps/opt.json +++ b/maps/opt.json @@ -3,13 +3,16 @@ "mtj_pe": "fixed", "mtj_config_map": { "do_layer_norm_before": ["do_layer_norm_before", true], + "d_embed": "word_embed_proj_dim", "d_model": "hidden_size", "n_heads": "num_attention_heads", "layers": "num_hidden_layers" }, "static_weights": { "decoder.embed_tokens.weight": {"mtj": {"module": "embedding_shard/~/linear", "param": "w", "transforms": ["no_transpose", "vocab_pad"]}}, - "decoder.embed_positions.weight": {"mtj": {"module": "embedding_shard", "param": "pos_embs", "transforms": ["no_transpose", "remove_first_two_rows"]}} + "decoder.project_in.weight": {"mtj": {"module": "embedding_shard", "param": "project_in"}}, + "decoder.embed_positions.weight": {"mtj": {"module": "embedding_shard", "param": "pos_embs", "transforms": ["no_transpose", "remove_first_two_rows"]}}, + "decoder.project_out.weight": {"mtj": {"module": "projection_shard", "param": "project_out"}} }, "layer_weights": { "decoder.layers.{layer}.self_attn.q_proj.weight": {"mtj": {"module": "layer_{layer}/~/linear", "param": "w"}}, diff --git a/tpu_mtj_backend.py b/tpu_mtj_backend.py index 75b4ee9c..b956648b 100644 --- a/tpu_mtj_backend.py +++ b/tpu_mtj_backend.py @@ -1054,7 +1054,7 @@ def load_model(path: str, driver_version="tpu_driver0.1_dev20210607", hf_checkpo # by the number of TPU cores, and fall back to one core if an even # number of TPU cores is not possible. for c in (8, 6, 4, 2, 1): - if 0 == params["n_heads"] % c == params["d_model"] % c: + if 0 == params["n_heads"] % c == params.get("d_embed", params["d_model"]) % c: params["cores_per_replica"] = c break From b1d8797a54d4e22b6d43062930ed63765586bdc5 Mon Sep 17 00:00:00 2001 From: Gnome Ann <> Date: Thu, 12 May 2022 23:51:40 -0400 Subject: [PATCH 05/63] Allow TPU Colab to load sharded HF models --- aiserver.py | 20 +++++++++++++++++++- requirements_mtj.txt | 2 +- tpu_mtj_backend.py | 12 ++++++++++-- utils.py | 14 +++++++++++++- 4 files changed, 43 insertions(+), 5 deletions(-) diff --git a/aiserver.py b/aiserver.py index 1f105701..6c9401e2 100644 --- a/aiserver.py +++ b/aiserver.py @@ -1127,13 +1127,21 @@ if(not vars.use_colab_tpu and vars.model not in ["InferKit", "Colab", "OAI", "Go from transformers import __version__ as transformers_version from transformers import PreTrainedModel + from transformers import modeling_utils old_from_pretrained = PreTrainedModel.from_pretrained.__func__ @classmethod def new_from_pretrained(cls, pretrained_model_name_or_path, *model_args, **kwargs): + utils.num_shards = None + utils.current_shard = 0 if not args.no_aria2: utils.aria2_hook(pretrained_model_name_or_path, **kwargs) return old_from_pretrained(cls, pretrained_model_name_or_path, *model_args, **kwargs) PreTrainedModel.from_pretrained = new_from_pretrained + old_get_checkpoint_shard_files = modeling_utils.get_checkpoint_shard_files + def new_get_checkpoint_shard_files(pretrained_model_name_or_path, index_filename, *args, **kwargs): + utils.num_shards = utils.get_num_shards(index_filename) + return old_get_checkpoint_shard_files(pretrained_model_name_or_path, index_filename, *args, **kwargs) + modeling_utils.get_checkpoint_shard_files = new_get_checkpoint_shard_files # Lazy loader import torch_lazy_loader @@ -1170,7 +1178,9 @@ if(not vars.use_colab_tpu and vars.model not in ["InferKit", "Colab", "OAI", "Go last_storage_key = None f = None current_offset = 0 - for key in tqdm(sorted(device_map.keys(), key=lambda k: (model_dict[k].key, model_dict[k].seek_offset)), desc="Loading model tensors"): + if utils.num_shards is not None: + utils.current_shard += 1 + for key in tqdm(sorted(device_map.keys(), key=lambda k: (model_dict[k].key, model_dict[k].seek_offset)), desc="Loading model tensors" + (f" (shard {utils.current_shard}/{utils.num_shards})" if utils.num_shards is not None else "")): storage_key = model_dict[key].key if storage_key != last_storage_key or model_dict[key].seek_offset < current_offset: last_storage_key = storage_key @@ -1560,13 +1570,21 @@ if(not vars.use_colab_tpu and vars.model not in ["InferKit", "Colab", "OAI", "Go tokenizer = GPT2TokenizerFast.from_pretrained("gpt2", revision=vars.revision, cache_dir="cache") else: from transformers import PreTrainedModel + from transformers import modeling_utils old_from_pretrained = PreTrainedModel.from_pretrained.__func__ @classmethod def new_from_pretrained(cls, pretrained_model_name_or_path, *model_args, **kwargs): + utils.num_shards = None + utils.current_shard = 0 if not args.no_aria2: utils.aria2_hook(pretrained_model_name_or_path, **kwargs) return old_from_pretrained(cls, pretrained_model_name_or_path, *model_args, **kwargs) PreTrainedModel.from_pretrained = new_from_pretrained + old_get_checkpoint_shard_files = modeling_utils.get_checkpoint_shard_files + def new_get_checkpoint_shard_files(pretrained_model_name_or_path, index_filename, *args, **kwargs): + utils.num_shards = utils.get_num_shards(index_filename) + return old_get_checkpoint_shard_files(pretrained_model_name_or_path, index_filename, *args, **kwargs) + modeling_utils.get_checkpoint_shard_files = new_get_checkpoint_shard_files def tpumtjgetsofttokens(): soft_tokens = None diff --git a/requirements_mtj.txt b/requirements_mtj.txt index e2a6c4e1..0f723a49 100644 --- a/requirements_mtj.txt +++ b/requirements_mtj.txt @@ -7,7 +7,7 @@ dm-haiku == 0.0.5 jax == 0.2.21 transformers >= 4.19 progressbar2 -git+https://github.com/VE-FORBRYDERNE/mesh-transformer-jax@ck-staging +git+https://github.com/VE-FORBRYDERNE/mesh-transformer-jax@ck flask Flask-SocketIO flask-cloudflared >= 0.0.5 diff --git a/tpu_mtj_backend.py b/tpu_mtj_backend.py index b956648b..2fa149d7 100644 --- a/tpu_mtj_backend.py +++ b/tpu_mtj_backend.py @@ -27,6 +27,8 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ''' +import utils + import multiprocessing from typing import Any, Callable, Dict, List, Optional, Tuple, TypeVar import progressbar @@ -1163,8 +1165,11 @@ def load_model(path: str, driver_version="tpu_driver0.1_dev20210607", hf_checkpo last_storage_key = None f = None current_offset = 0 - print("\n\n\nThis model has ", f"{hk.data_structures.tree_size(network.state['params']):,d}".replace(",", " "), " parameters.\n") - for key in tqdm(sorted(model_dict.keys(), key=lambda k: (model_dict[k].key, model_dict[k].seek_offset)), desc="Loading model tensors"): + if utils.current_shard == 0: + print("\n\n\nThis model has ", f"{hk.data_structures.tree_size(network.state['params']):,d}".replace(",", " "), " parameters.\n") + if utils.num_shards is not None: + utils.current_shard += 1 + for key in tqdm(sorted(model_dict.keys(), key=lambda k: (model_dict[k].key, model_dict[k].seek_offset)), desc="Loading model tensors" + (f" (shard {utils.current_shard}/{utils.num_shards})" if utils.num_shards is not None else "")): # Some model weights are used by transformers but not by MTJ. # We have to materialize these weights anyways because @@ -1225,6 +1230,9 @@ def load_model(path: str, driver_version="tpu_driver0.1_dev20210607", hf_checkpo np.empty(params["cores_per_replica"]), ) + if utils.num_shards is not None and utils.current_shard < utils.num_shards: + return + # Check for tensors that MTJ needs that were not provided in the # HF model for mk, mv in network.state["params"].items(): diff --git a/utils.py b/utils.py index c6eb85ec..0fdfa125 100644 --- a/utils.py +++ b/utils.py @@ -6,8 +6,11 @@ import subprocess import tempfile import requests import os +from typing import Optional vars = None +num_shards: Optional[int] = None +current_shard = 0 #==================================================================# # Decorator to prevent a function's actions from being run until @@ -133,7 +136,7 @@ def decodenewlines(txt): return txt #==================================================================# -# Downloads sharded huggingface checkpoints using aria2c if possible +# Downloads huggingface checkpoints using aria2c if possible #==================================================================# def aria2_hook(pretrained_model_name_or_path: str, force_download=False, cache_dir=None, proxies=None, resume_download=False, local_files_only=False, use_auth_token=None, user_agent=None, revision=None, mirror=None, **kwargs): import transformers @@ -225,3 +228,12 @@ def aria2_hook(pretrained_model_name_or_path: str, force_download=False, cache_d os.rename(os.path.join(_cache_dir, "kai-tempfile." + n), os.path.join(_cache_dir, n)) with open(os.path.join(_cache_dir, n + ".json"), "w") as f: json.dump({"url": u, "etag": t}, f) + +#==================================================================# +# Given the path to a pytorch_model.bin.index.json, returns how many +# shards there are in the model +#==================================================================# +def get_num_shards(filename): + with open(filename) as f: + map_data = json.load(f) + return len(set(map_data["weight_map"].values())) From defbb53b689fa448b4848eb257046934145c1d9b Mon Sep 17 00:00:00 2001 From: Gnome Ann <> Date: Fri, 13 May 2022 01:03:38 -0400 Subject: [PATCH 06/63] OPT breakmodel --- aiserver.py | 49 ++++++++++---- breakmodel.py | 182 ++++++++++++++++++++++++++++++++++++++++++++++++-- utils.py | 6 ++ 3 files changed, 220 insertions(+), 17 deletions(-) diff --git a/aiserver.py b/aiserver.py index 6c9401e2..f988e6ba 100644 --- a/aiserver.py +++ b/aiserver.py @@ -274,7 +274,7 @@ class vars: recentrngm = None # If a new random game was recently generated without Submitting after, this is the memory used (as a string), otherwise this is None useprompt = False # Whether to send the full prompt with every submit action breakmodel = False # For GPU users, whether to use both system RAM and VRAM to conserve VRAM while offering speedup compared to CPU-only - bmsupported = False # Whether the breakmodel option is supported (GPT-Neo/GPT-J/XGLM only, currently) + bmsupported = False # Whether the breakmodel option is supported (GPT-Neo/GPT-J/XGLM/OPT only, currently) nobreakmodel = False # Something specifically requested Breakmodel to be disabled (For example a models config) smandelete = False # Whether stories can be deleted from inside the browser smanrename = False # Whether stories can be renamed from inside the browser @@ -391,7 +391,7 @@ def device_list(n_layers, primary=None, selected=None): def device_config(config): global breakmodel, generator import breakmodel - n_layers = config.num_layers if hasattr(config, "num_layers") else config.n_layer + n_layers = utils.num_layers(config) if(args.breakmodel_gpulayers is not None): try: breakmodel.gpu_blocks = list(map(int, args.breakmodel_gpulayers.split(','))) @@ -464,7 +464,7 @@ def device_config(config): # If all layers are on the same device, use the old GPU generation mode while(len(breakmodel.gpu_blocks) and breakmodel.gpu_blocks[-1] == 0): breakmodel.gpu_blocks.pop() - if(len(breakmodel.gpu_blocks) and breakmodel.gpu_blocks[-1] in (-1, config.num_layers if hasattr(config, "num_layers") else config.n_layer)): + if(len(breakmodel.gpu_blocks) and breakmodel.gpu_blocks[-1] in (-1, utils.num_layers(config))): vars.breakmodel = False vars.usegpu = True vars.gpu_device = len(breakmodel.gpu_blocks)-1 @@ -496,22 +496,33 @@ def move_model_to_devices(model): model.lm_head.to(breakmodel.primary_device) if(hasattr(model.transformer, 'wpe')): model.transformer.wpe.to(breakmodel.primary_device) - else: + elif(not hasattr(model.model, "decoder")): model.model.embed_tokens.to(breakmodel.primary_device) model.model.layer_norm.to(breakmodel.primary_device) model.lm_head.to(breakmodel.primary_device) model.model.embed_positions.to(breakmodel.primary_device) + else: + model.model.decoder.embed_tokens.to(breakmodel.primary_device) + if(model.model.decoder.project_in is not None): + model.model.decoder.project_in.to(breakmodel.primary_device) + if(model.model.decoder.project_out is not None): + model.model.decoder.project_out.to(breakmodel.primary_device) + model.model.decoder.embed_positions.to(breakmodel.primary_device) gc.collect() GPTNeoModel.forward = breakmodel.new_forward_neo if("GPTJModel" in globals()): GPTJModel.forward = breakmodel.new_forward_neo # type: ignore if("XGLMModel" in globals()): XGLMModel.forward = breakmodel.new_forward_xglm # type: ignore + if("OPTDecoder" in globals()): + OPTDecoder.forward = breakmodel.new_forward_opt # type: ignore generator = model.generate if(hasattr(model, "transformer")): breakmodel.move_hidden_layers(model.transformer) - else: + elif(not hasattr(model.model, "decoder")): breakmodel.move_hidden_layers(model.model, model.model.layers) + else: + breakmodel.move_hidden_layers(model.model.decoder, model.model.decoder.layers) #==================================================================# # Allow the models to override some settings @@ -911,7 +922,7 @@ if(not vars.use_colab_tpu and vars.model not in ["InferKit", "Colab", "OAI", "Go loadsettings() print("{0}Looking for GPU support...{1}".format(colors.PURPLE, colors.END), end="") vars.hascuda = torch.cuda.is_available() - vars.bmsupported = vars.model_type in ("gpt_neo", "gptj", "xglm") and not vars.nobreakmodel + vars.bmsupported = vars.model_type in ("gpt_neo", "gptj", "xglm", "opt") and not vars.nobreakmodel if(args.breakmodel is not None and args.breakmodel): print("WARNING: --breakmodel is no longer supported. Breakmodel mode is now automatically enabled when --breakmodel_gpulayers is used (see --help for details).", file=sys.stderr) if(args.breakmodel_layers is not None): @@ -1123,6 +1134,10 @@ if(not vars.use_colab_tpu and vars.model not in ["InferKit", "Colab", "OAI", "Go globals()[m] = getattr(__import__("transformers"), m) except: pass + try: + from transformers.models.opt.modeling_opt import OPTDecoder + except: + pass import transformers.generation_utils from transformers import __version__ as transformers_version @@ -1253,8 +1268,10 @@ if(not vars.use_colab_tpu and vars.model not in ["InferKit", "Colab", "OAI", "Go input_ids.clamp_(max=self.config.vocab_size-1) if(hasattr(self, "transformer")): inputs_embeds = self.transformer.wte(input_ids) - else: + elif(not hasattr(model.model, "decoder")): inputs_embeds = self.model.embed_tokens(input_ids) + else: + inputs_embeds = self.model.decoder.embed_tokens(input_ids) if(vars.sp is not None): vars.sp = vars.sp.to(inputs_embeds.dtype).to(inputs_embeds.device) inputs_embeds = torch.where( @@ -1262,14 +1279,14 @@ if(not vars.use_colab_tpu and vars.model not in ["InferKit", "Colab", "OAI", "Go vars.sp[shifted_input_ids.clamp(min=0)], inputs_embeds, ) - if(not hasattr(self, "transformer")): + if(hasattr(self.model, "embed_scale")): inputs_embeds *= self.model.embed_scale kwargs['inputs_embeds'] = inputs_embeds return old_forward(self, *args, **kwargs) cls.forward = new_causallm_forward for cls in (GPT2LMHeadModel, GPTNeoForCausalLM): patch_causallm(cls) - for c in ("GPTJForCausalLM", "XGLMForCausalLM"): + for c in ("GPTJForCausalLM", "XGLMForCausalLM", "OPTForCausalLM"): try: patch_causallm(getattr(__import__("transformers"), c)) except: @@ -1430,12 +1447,18 @@ if(not vars.use_colab_tpu and vars.model not in ["InferKit", "Colab", "OAI", "Go def get_hidden_size_from_model(model): try: - return int(model.transformer.hidden_size) + return int(model.model.decoder.project_in.in_features) except: try: - return int(model.transformer.embed_dim) + return int(model.model.decoder.embed_tokens.out_features) except: - return int(model.lm_head.in_features) + try: + return int(model.transformer.hidden_size) + except: + try: + return int(model.transformer.embed_dim) + except: + return int(model.lm_head.in_features) def maybe_low_cpu_mem_usage() -> Dict[str, Any]: if(packaging.version.parse(transformers_version) < packaging.version.parse("4.11.0")): @@ -1490,7 +1513,7 @@ if(not vars.use_colab_tpu and vars.model not in ["InferKit", "Colab", "OAI", "Go import shutil shutil.move(vars.model.replace('/', '_'), "models/{}".format(vars.model.replace('/', '_'))) print("\n", flush=True) - with maybe_use_float16(), torch_lazy_loader.use_lazy_torch_load(enable=vars.lazy_load, callback=get_lazy_load_callback(model_config.num_layers if hasattr(model_config, "num_layers") else model_config.n_layer) if vars.lazy_load else None, dematerialized_modules=True): + with maybe_use_float16(), torch_lazy_loader.use_lazy_torch_load(enable=vars.lazy_load, callback=get_lazy_load_callback(utils.num_layers(model_config)) if vars.lazy_load else None, dematerialized_modules=True): if(vars.lazy_load): # torch_lazy_loader.py and low_cpu_mem_usage can't be used at the same time lowmem = {} if(os.path.isdir(vars.custmodpth)): diff --git a/breakmodel.py b/breakmodel.py index 9818e6d9..262d39bd 100644 --- a/breakmodel.py +++ b/breakmodel.py @@ -633,11 +633,11 @@ def new_forward_xglm( layer_outputs = decoder_layer( hidden_states.to(device) if breakmodel and hidden_states is not None else hidden_states, attention_mask=attention_mask.to(device) if breakmodel and attention_mask is not None else attention_mask, - encoder_hidden_states=encoder_hidden_states.to(device) if encoder_hidden_states is not None else None, - encoder_attention_mask=encoder_attention_mask.to(device) if encoder_attention_mask is not None else None, - layer_head_mask=((head_mask[idx].to(device) if head_mask[idx] is not None else None) if head_mask is not None else None), + encoder_hidden_states=encoder_hidden_states.to(device) if breakmodel and encoder_hidden_states is not None else encoder_hidden_states, + encoder_attention_mask=encoder_attention_mask.to(device) if breakmodel and encoder_attention_mask is not None else encoder_attention_mask, + layer_head_mask=((head_mask[idx].to(device) if breakmodel and head_mask[idx] is not None else head_mask[idx]) if head_mask is not None else None), cross_attn_layer_head_mask=( - (cross_attn_head_mask[idx].to(device) if cross_attn_head_mask[idx] is not None else None) if cross_attn_head_mask is not None else None + (cross_attn_head_mask[idx].to(device) if breakmodel and cross_attn_head_mask[idx] is not None else cross_attn_head_mask[idx]) if cross_attn_head_mask is not None else None ), past_key_value=tuple(v.to(device) for v in past_key_value if v is not None) if breakmodel and past_key_value is not None and i >= ram_blocks and len(past_key_value) and past_key_value[0].device.index != device else past_key_value, output_attentions=output_attentions, @@ -686,3 +686,177 @@ def new_forward_xglm( attentions=all_self_attns, cross_attentions=all_cross_attentions, ) + + +def new_forward_opt( + self, + input_ids=None, + attention_mask=None, + head_mask=None, + past_key_values=None, + inputs_embeds=None, + use_cache=None, + output_attentions=None, + output_hidden_states=None, + return_dict=None, +): + assert len(gpu_blocks) <= torch.cuda.device_count() + assert sum(gpu_blocks) <= len(self.layers) + ram_blocks = len(self.layers) - sum(gpu_blocks) + cumulative_gpu_blocks = tuple(itertools.accumulate(gpu_blocks)) + + + output_attentions = output_attentions if output_attentions is not None else self.config.output_attentions + output_hidden_states = ( + output_hidden_states if output_hidden_states is not None else self.config.output_hidden_states + ) + use_cache = use_cache if use_cache is not None else self.config.use_cache + + return_dict = return_dict if return_dict is not None else self.config.use_return_dict + + # retrieve input_ids and inputs_embeds + if input_ids is not None and inputs_embeds is not None: + raise ValueError("You cannot specify both decoder_input_ids and decoder_inputs_embeds at the same time") + elif input_ids is not None: + input_shape = input_ids.size() + input_ids = input_ids.view(-1, input_shape[-1]) + elif inputs_embeds is not None: + input_shape = inputs_embeds.size()[:-1] + else: + raise ValueError("You have to specify either decoder_input_ids or decoder_inputs_embeds") + + past_key_values_length = past_key_values[0][0].shape[2] if past_key_values is not None else 0 + + if inputs_embeds is None: + if breakmodel: + input_ids = input_ids.to(primary_device) + inputs_embeds = self.embed_tokens(input_ids) + + # embed positions + if breakmodel: + inputs_embeds = inputs_embeds.to(primary_device) + if attention_mask is None: + attention_mask = torch.ones(inputs_embeds.shape[:2], dtype=torch.bool, device=inputs_embeds.device) + + positions = self.embed_positions(attention_mask)[:, past_key_values_length:, :] + if breakmodel: + positions = positions.to(primary_device) + + attention_mask = self._prepare_decoder_attention_mask( + attention_mask, input_shape, inputs_embeds, past_key_values_length + ) + + if self.project_in is not None: + inputs_embeds = self.project_in(inputs_embeds) + + hidden_states = inputs_embeds + positions + + hidden_states = nn.functional.dropout(hidden_states, p=self.dropout, training=self.training) + + # decoder layers + all_hidden_states = () if output_hidden_states else None + all_self_attns = () if output_attentions else None + next_decoder_cache = () if use_cache else None + + if breakmodel and ram_blocks: + copystream = torch.cuda.Stream(device=primary_device, priority=-1) + + # check if head_mask has a correct number of layers specified if desired + for attn_mask, mask_name in zip([head_mask], ["head_mask"]): + if attn_mask is not None: + if attn_mask.size()[0] != (len(self.layers)): + raise ValueError( + f"The `{mask_name}` should be specified for {len(self.layers)} layers, but it is for" + f" {head_mask.size()[0]}." + ) + + for idx, decoder_layer in enumerate(self.layers): + i = idx + if breakmodel: + if i in range(ram_blocks): + index1 = (i+1)%ram_blocks + for param1,param2 in zip(self.layers[index1].parameters(),self.layers[(i-1)%ram_blocks].parameters()): + param1.data = param2.data + for param1,param2 in zip(self.layers[index1].parameters(),self.extrastorage[index1].parameters()): + with torch.cuda.stream(copystream): + torch.cuda.comm.broadcast(param2.data,out = [param1.data]) + + # add LayerDrop (see https://arxiv.org/abs/1909.11556 for description) + if output_hidden_states: + all_hidden_states += (hidden_states,) + dropout_probability = random.uniform(0, 1) + if self.training and (dropout_probability < self.layerdrop): + continue + + past_key_value = past_key_values[idx] if past_key_values is not None else None + + if self.gradient_checkpointing and self.training: + + if use_cache: + logger.warning( + "`use_cache=True` is incompatible with gradient checkpointing. Setting `use_cache=False`..." + ) + use_cache = False + + def create_custom_forward(module): + def custom_forward(*inputs): + # None for past_key_value + return module(*inputs, output_attentions, None) + + return custom_forward + + layer_outputs = torch.utils.checkpoint.checkpoint( + create_custom_forward(decoder_layer), + hidden_states, + attention_mask, + head_mask[idx] if head_mask is not None else None, + None, + ) + else: + if breakmodel: + device = primary_device if i < ram_blocks else bisect.bisect_right(cumulative_gpu_blocks, i - ram_blocks) + layer_outputs = decoder_layer( + hidden_states, + attention_mask=attention_mask.to(device) if breakmodel and attention_mask is not None else attention_mask, + layer_head_mask=((head_mask[idx].to(device) if breakmodel and head_mask[idx] is not None else head_mask[idx]) if head_mask is not None else None), + past_key_value=tuple(v.to(device) for v in past_key_value if v is not None) if breakmodel and past_key_value is not None and i >= ram_blocks and len(past_key_value) and past_key_value[0].device.index != device else past_key_value, + output_attentions=output_attentions, + use_cache=use_cache, + ) + + hidden_states = layer_outputs[0] + + if use_cache: + next_decoder_cache += (layer_outputs[2 if output_attentions else 1],) + + if output_attentions: + all_self_attns += (layer_outputs[1],) + + if breakmodel: + if i in range(ram_blocks): + torch.cuda.synchronize() + torch.cuda.empty_cache() + + if breakmodel: + if ram_blocks: + del copystream + torch.cuda.empty_cache() + hidden_states = hidden_states.to(primary_device) + if self.project_out is not None: + hidden_states = self.project_out(hidden_states) + if breakmodel: + hidden_states = hidden_states.to(primary_device) + + # add hidden states from the last decoder layer + if output_hidden_states: + all_hidden_states += (hidden_states,) + + next_cache = next_decoder_cache if use_cache else None + if not return_dict: + return tuple(v for v in [hidden_states, next_cache, all_hidden_states, all_self_attns] if v is not None) + return BaseModelOutputWithPast( + last_hidden_state=hidden_states, + past_key_values=next_cache, + hidden_states=all_hidden_states, + attentions=all_self_attns, + ) diff --git a/utils.py b/utils.py index 0fdfa125..ea3cab94 100644 --- a/utils.py +++ b/utils.py @@ -135,6 +135,12 @@ def decodenewlines(txt): return txt.replace("", '\n') return txt +#==================================================================# +# Returns number of layers given an HF model config +#==================================================================# +def num_layers(config): + return config.num_layers if hasattr(config, "num_layers") else config.n_layer if hasattr(config, "n_layer") else config.num_hidden_layers + #==================================================================# # Downloads huggingface checkpoints using aria2c if possible #==================================================================# From 29bb3f569b550dbac4dfaa999c641115ecafec64 Mon Sep 17 00:00:00 2001 From: Gnome Ann <> Date: Fri, 13 May 2022 01:37:17 -0400 Subject: [PATCH 07/63] Fix a bug in OPTForCausalLM where self.lm_head is the wrong size --- aiserver.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/aiserver.py b/aiserver.py index f988e6ba..102b24f5 100644 --- a/aiserver.py +++ b/aiserver.py @@ -1293,6 +1293,25 @@ if(not vars.use_colab_tpu and vars.model not in ["InferKit", "Colab", "OAI", "Go pass + # Fix a bug in OPTForCausalLM where self.lm_head is the wrong size + if(transformers_version == "4.19.0"): + try: + from transformers import OPTForCausalLM, OPTModel + except ImportError: + pass + else: + # This is the same as the original __init__ but with + # config.hidden_size + # replaced with + # config.word_embed_proj_dim + def new_init(self, config): + super(OPTForCausalLM, self).__init__(config) + self.model = OPTModel(config) + self.lm_head = torch.nn.Linear(config.word_embed_proj_dim, config.vocab_size, bias=False) + self.post_init() + OPTForCausalLM.__init__ = new_init + + # Patch transformers to use our custom logit warpers from transformers import LogitsProcessorList, LogitsWarper, LogitsProcessor, TopKLogitsWarper, TopPLogitsWarper, TemperatureLogitsWarper, RepetitionPenaltyLogitsProcessor from warpers import AdvancedRepetitionPenaltyLogitsProcessor, TailFreeLogitsWarper, TypicalLogitsWarper From 55079f672a0002513c0c61caf7d2fb5f35289f1d Mon Sep 17 00:00:00 2001 From: Gnome Ann <> Date: Fri, 13 May 2022 01:51:55 -0400 Subject: [PATCH 08/63] Fix typo in soft prompt patching code --- aiserver.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/aiserver.py b/aiserver.py index 102b24f5..150c8b68 100644 --- a/aiserver.py +++ b/aiserver.py @@ -1268,7 +1268,7 @@ if(not vars.use_colab_tpu and vars.model not in ["InferKit", "Colab", "OAI", "Go input_ids.clamp_(max=self.config.vocab_size-1) if(hasattr(self, "transformer")): inputs_embeds = self.transformer.wte(input_ids) - elif(not hasattr(model.model, "decoder")): + elif(not hasattr(self.model, "decoder")): inputs_embeds = self.model.embed_tokens(input_ids) else: inputs_embeds = self.model.decoder.embed_tokens(input_ids) @@ -1279,7 +1279,7 @@ if(not vars.use_colab_tpu and vars.model not in ["InferKit", "Colab", "OAI", "Go vars.sp[shifted_input_ids.clamp(min=0)], inputs_embeds, ) - if(hasattr(self.model, "embed_scale")): + if(hasattr(self, "model") and hasattr(self.model, "embed_scale")): inputs_embeds *= self.model.embed_scale kwargs['inputs_embeds'] = inputs_embeds return old_forward(self, *args, **kwargs) From 8376f12e2135bc8ae64c3bb395d39aac67114b81 Mon Sep 17 00:00:00 2001 From: Henk Date: Fri, 13 May 2022 10:44:12 +0200 Subject: [PATCH 09/63] Add NS mode OPT supports newlines, but it also needs some of the behavior we use in S mode. NS mode is a more limited version of S mode that still handles the token, but instead of replacing it with a new line we replace it empty and newlines are not converted. In future if your Fairseq style model has newline support use NS mode, while if it needs artifically inserted newlines use S mode. This also means that people finetuning fairseq models to include newlines might benefit from testing their models on ns mode. --- aiserver.py | 6 ++++-- utils.py | 2 ++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/aiserver.py b/aiserver.py index 0dc19c5a..ed6f4d9f 100644 --- a/aiserver.py +++ b/aiserver.py @@ -144,7 +144,7 @@ optlist = [ ["OPT 6.7B", "facebook/opt-6.7b", "16GB"], ["OPT 2.7B", "facebook/opt-2.7b", "8GB"], ["OPT 1.3B", "facebook/opt-1.3b", "4GB"], - ["OPT 355M", "facebook/opt-350m", "2GB"], + ["OPT 350M", "facebook/opt-350m", "2GB"], ["OPT 125M", "facebook/opt-125m", "1GB"], ["Return to Main Menu", "Return", ""], ] @@ -529,6 +529,8 @@ def loadmodelsettings(): js = {} if vars.model_type == "xglm" or js.get("compat", "j") == "fairseq_lm": vars.newlinemode = "s" # Default to newline mode if using XGLM + if vars.model_type == "opt": + vars.newlinemode = "ns" # Default to newline mode if using XGLM vars.modelconfig = js if("badwordsids" in js): vars.badwordsids = js["badwordsids"] @@ -1345,7 +1347,7 @@ if(not vars.use_colab_tpu and vars.model not in ["InferKit", "Colab", "OAI", "Go kwargs["logits_warper"] = new_get_logits_warper( beams=1, ) - if(vars.newlinemode == "s"): + if(vars.newlinemode == "s") or (vars.newlinemode == "ns"): kwargs["eos_token_id"] = -1 kwargs.setdefault("pad_token_id", 2) return new_sample.old_sample(self, *args, **kwargs) diff --git a/utils.py b/utils.py index c6eb85ec..52cc7c6f 100644 --- a/utils.py +++ b/utils.py @@ -130,6 +130,8 @@ def encodenewlines(txt): def decodenewlines(txt): if(vars.newlinemode == "s"): return txt.replace("", '\n') + if(vars.newlinemode == "ns"): + return txt.replace("", '') return txt #==================================================================# From d5fa782483aa2948c1b58a188e5226b32d804527 Mon Sep 17 00:00:00 2001 From: Henk Date: Fri, 13 May 2022 10:53:19 +0200 Subject: [PATCH 10/63] NS Mode (comment fix) --- aiserver.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aiserver.py b/aiserver.py index ed6f4d9f..3c96e80b 100644 --- a/aiserver.py +++ b/aiserver.py @@ -530,7 +530,7 @@ def loadmodelsettings(): if vars.model_type == "xglm" or js.get("compat", "j") == "fairseq_lm": vars.newlinemode = "s" # Default to newline mode if using XGLM if vars.model_type == "opt": - vars.newlinemode = "ns" # Default to newline mode if using XGLM + vars.newlinemode = "ns" # Handle but don't convert newlines if using Fairseq models that have newlines trained in them vars.modelconfig = js if("badwordsids" in js): vars.badwordsids = js["badwordsids"] From 1200173386a0f5fb9eb06d30f3b3a7ab5ab1538c Mon Sep 17 00:00:00 2001 From: Gnome Ann <> Date: Fri, 13 May 2022 10:45:28 -0400 Subject: [PATCH 11/63] Custom badwords for OPT Generated using: ``` import transformers tokenizer = transformers.AutoTokenizer.from_pretrained("facebook/opt-350m", fast=False) badwordsids_opt = [[v] for k, v in tokenizer.vocab.items() if any(c in k for c in "<>[]")] ``` --- aiserver.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/aiserver.py b/aiserver.py index 150c8b68..bbe5ec9a 100644 --- a/aiserver.py +++ b/aiserver.py @@ -240,6 +240,7 @@ class vars: # badwords = [] # Array of str/chr values that should be removed from output badwordsids = [[13460], [6880], [50256], [42496], [4613], [17414], [22039], [16410], [27], [29], [38430], [37922], [15913], [24618], [28725], [58], [47175], [36937], [26700], [12878], [16471], [37981], [5218], [29795], [13412], [45160], [3693], [49778], [4211], [20598], [36475], [33409], [44167], [32406], [29847], [29342], [42669], [685], [25787], [7359], [3784], [5320], [33994], [33490], [34516], [43734], [17635], [24293], [9959], [23785], [21737], [28401], [18161], [26358], [32509], [1279], [38155], [18189], [26894], [6927], [14610], [23834], [11037], [14631], [26933], [46904], [22330], [25915], [47934], [38214], [1875], [14692], [41832], [13163], [25970], [29565], [44926], [19841], [37250], [49029], [9609], [44438], [16791], [17816], [30109], [41888], [47527], [42924], [23984], [49074], [33717], [31161], [49082], [30138], [31175], [12240], [14804], [7131], [26076], [33250], [3556], [38381], [36338], [32756], [46581], [17912], [49146]] # Tokenized array of badwords used to prevent AI artifacting badwordsids_neox = [[0], [1], [44162], [9502], [12520], [31841], [36320], [49824], [34417], [6038], [34494], [24815], [26635], [24345], [3455], [28905], [44270], [17278], [32666], [46880], [7086], [43189], [37322], [17778], [20879], [49821], [3138], [14490], [4681], [21391], [26786], [43134], [9336], [683], [48074], [41256], [19181], [29650], [28532], [36487], [45114], [46275], [16445], [15104], [11337], [1168], [5647], [29], [27482], [44965], [43782], [31011], [42944], [47389], [6334], [17548], [38329], [32044], [35487], [2239], [34761], [7444], [1084], [12399], [18990], [17636], [39083], [1184], [35830], [28365], [16731], [43467], [47744], [1138], [16079], [40116], [45564], [18297], [42368], [5456], [18022], [42696], [34476], [23505], [23741], [39334], [37944], [45382], [38709], [33440], [26077], [43600], [34418], [36033], [6660], [48167], [48471], [15775], [19884], [41533], [1008], [31053], [36692], [46576], [20095], [20629], [31759], [46410], [41000], [13488], [30952], [39258], [16160], [27655], [22367], [42767], [43736], [49694], [13811], [12004], [46768], [6257], [37471], [5264], [44153], [33805], [20977], [21083], [25416], [14277], [31096], [42041], [18331], [33376], [22372], [46294], [28379], [38475], [1656], [5204], [27075], [50001], [16616], [11396], [7748], [48744], [35402], [28120], [41512], [4207], [43144], [14767], [15640], [16595], [41305], [44479], [38958], [18474], [22734], [30522], [46267], [60], [13976], [31830], [48701], [39822], [9014], [21966], [31422], [28052], [34607], [2479], [3851], [32214], [44082], [45507], [3001], [34368], [34758], [13380], [38363], [4299], [46802], [30996], [12630], [49236], [7082], [8795], [5218], [44740], [9686], [9983], [45301], [27114], [40125], [1570], [26997], [544], [5290], [49193], [23781], [14193], [40000], [2947], [43781], [9102], [48064], [42274], [18772], [49384], [9884], [45635], [43521], [31258], [32056], [47686], [21760], [13143], [10148], [26119], [44308], [31379], [36399], [23983], [46694], [36134], [8562], [12977], [35117], [28591], [49021], [47093], [28653], [29013], [46468], [8605], [7254], [25896], [5032], [8168], [36893], [38270], [20499], [27501], [34419], [29547], [28571], [36586], [20871], [30537], [26842], [21375], [31148], [27618], [33094], [3291], [31789], [28391], [870], [9793], [41361], [47916], [27468], [43856], [8850], [35237], [15707], [47552], [2730], [41449], [45488], [3073], [49806], [21938], [24430], [22747], [20924], [46145], [20481], [20197], [8239], [28231], [17987], [42804], [47269], [29972], [49884], [21382], [46295], [36676], [34616], [3921], [26991], [27720], [46265], [654], [9855], [40354], [5291], [34904], [44342], [2470], [14598], [880], [19282], [2498], [24237], [21431], [16369], [8994], [44524], [45662], [13663], [37077], [1447], [37786], [30863], [42854], [1019], [20322], [4398], [12159], [44072], [48664], [31547], [18736], [9259], [31], [16354], [21810], [4357], [37982], [5064], [2033], [32871], [47446], [62], [22158], [37387], [8743], [47007], [17981], [11049], [4622], [37916], [36786], [35138], [29925], [14157], [18095], [27829], [1181], [22226], [5709], [4725], [30189], [37014], [1254], [11380], [42989], [696], [24576], [39487], [30119], [1092], [8088], [2194], [9899], [14412], [21828], [3725], [13544], [5180], [44679], [34398], [3891], [28739], [14219], [37594], [49550], [11326], [6904], [17266], [5749], [10174], [23405], [9955], [38271], [41018], [13011], [48392], [36784], [24254], [21687], [23734], [5413], [41447], [45472], [10122], [17555], [15830], [47384], [12084], [31350], [47940], [11661], [27988], [45443], [905], [49651], [16614], [34993], [6781], [30803], [35869], [8001], [41604], [28118], [46462], [46762], [16262], [17281], [5774], [10943], [5013], [18257], [6750], [4713], [3951], [11899], [38791], [16943], [37596], [9318], [18413], [40473], [13208], [16375]] + badwordsids_opt = [[44717], [46613], [48513], [49923], [50185], [48755], [8488], [43303], [49659], [48601], [49817], [45405], [48742], [49925], [47720], [11227], [48937], [48784], [50017], [42248], [49310], [48082], [49895], [50025], [49092], [49007], [8061], [44226], [0], [742], [28578], [15698], [49784], [46679], [39365], [49281], [49609], [48081], [48906], [46161], [48554], [49670], [48677], [49721], [49632], [48610], [48462], [47457], [10975], [46077], [28696], [48709], [43839], [49798], [49154], [48203], [49625], [48395], [50155], [47161], [49095], [48833], [49420], [49666], [48443], [22176], [49242], [48651], [49138], [49750], [40389], [48021], [21838], [49070], [45333], [40862], [1], [49915], [33525], [49858], [50254], [44403], [48992], [48872], [46117], [49853], [47567], [50206], [41552], [50068], [48999], [49703], [49940], [49329], [47620], [49868], [49962], [2], [44082], [50236], [31274], [50260], [47052], [42645], [49177], [17523], [48691], [49900], [49069], [49358], [48794], [47529], [46479], [48457], [646], [49910], [48077], [48935], [46386], [48902], [49151], [48759], [49803], [45587], [48392], [47789], [48654], [49836], [49230], [48188], [50264], [46844], [44690], [48505], [50161], [27779], [49995], [41833], [50154], [49097], [48520], [50018], [8174], [50084], [49366], [49526], [50193], [7479], [49982], [3]] deletewi = None # Temporary storage for UID to delete wirmvwhtsp = False # Whether to remove leading whitespace from WI entries widepth = 3 # How many historical actions to scan for WI hits @@ -917,6 +918,9 @@ if(vars.model not in ["InferKit", "Colab", "OAI", "GooseAI" , "ReadOnly", "TPUMe print("WARNING: No model type detected, assuming Neo (If this is a GPT2 model use the other menu option or --model GPT2Custom)") vars.model_type = "gpt_neo" + if(vars.model_type == "opt"): + vars.badwordsids = vars.badwordsids_opt + if(not vars.use_colab_tpu and vars.model not in ["InferKit", "Colab", "OAI", "GooseAI" , "ReadOnly", "TPUMeshTransformerGPTJ", "TPUMeshTransformerGPTNeoX"]): loadmodelsettings() loadsettings() @@ -1730,7 +1734,7 @@ else: if vars.model in ("TPUMeshTransformerGPTJ", "TPUMeshTransformerGPTNeoX") and (not vars.custmodpth or not os.path.isdir(vars.custmodpth)): raise FileNotFoundError(f"The specified model path {repr(vars.custmodpth)} is not the path to a valid folder") import tpu_mtj_backend - if(vars.model == "TPUMeshTransformerGPTNeoX"): + if(vars.model == "TPUMeshTransformerGPTNeoX" or vars.model_type == "opt"): tpu_mtj_backend.pad_token_id = 1 tpu_mtj_backend.vars = vars tpu_mtj_backend.warper_callback = tpumtjgenerate_warper_callback From a051bf4397fb1e44d0ad9d5597442ea16b369d71 Mon Sep 17 00:00:00 2001 From: Gnome Ann <> Date: Fri, 13 May 2022 10:45:57 -0400 Subject: [PATCH 12/63] OPT breakmodel bug fix --- breakmodel.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/breakmodel.py b/breakmodel.py index 262d39bd..eb49e669 100644 --- a/breakmodel.py +++ b/breakmodel.py @@ -816,7 +816,7 @@ def new_forward_opt( if breakmodel: device = primary_device if i < ram_blocks else bisect.bisect_right(cumulative_gpu_blocks, i - ram_blocks) layer_outputs = decoder_layer( - hidden_states, + hidden_states.to(device) if breakmodel and hidden_states is not None else hidden_states, attention_mask=attention_mask.to(device) if breakmodel and attention_mask is not None else attention_mask, layer_head_mask=((head_mask[idx].to(device) if breakmodel and head_mask[idx] is not None else head_mask[idx]) if head_mask is not None else None), past_key_value=tuple(v.to(device) for v in past_key_value if v is not None) if breakmodel and past_key_value is not None and i >= ram_blocks and len(past_key_value) and past_key_value[0].device.index != device else past_key_value, From 91d367244651fc10b54fe71682a4d55a36668f62 Mon Sep 17 00:00:00 2001 From: Gnome Ann <> Date: Fri, 13 May 2022 17:00:10 -0400 Subject: [PATCH 13/63] Proper progress bar for aria2 downloads --- aiserver.py | 6 ++++++ utils.py | 55 +++++++++++++++++++++++++++++++++++++++++++---------- 2 files changed, 51 insertions(+), 10 deletions(-) diff --git a/aiserver.py b/aiserver.py index a289409c..74adef38 100644 --- a/aiserver.py +++ b/aiserver.py @@ -16,6 +16,9 @@ os.environ['EVENTLET_THREADPOOL_SIZE'] = '1' os.environ['TOKENIZERS_PARALLELISM'] = 'false' from eventlet import tpool +import logging +logging.getLogger("urllib3").setLevel(logging.ERROR) + from os import path, getcwd import time import re @@ -808,6 +811,7 @@ parser.add_argument("--ngrok", action='store_true', help="Optimizes KoboldAI for parser.add_argument("--localtunnel", action='store_true', help="Optimizes KoboldAI for Remote Play using Localtunnel") parser.add_argument("--host", action='store_true', help="Optimizes KoboldAI for Remote Play without using a proxy service") parser.add_argument("--port", type=int, help="Specify the port on which the application will be joinable") +parser.add_argument("--aria2_port", type=int, help="Specify the port on which aria2's RPC interface will be open if aria2 is installed (defaults to 6799)") parser.add_argument("--model", help="Specify the Model Type to skip the Menu") parser.add_argument("--path", help="Specify the Path for local models (For model NeoCustom or GPT2Custom)") parser.add_argument("--revision", help="Specify the model revision for huggingface models (can be a git branch/tag name or a git commit hash)") @@ -867,6 +871,8 @@ if args.cpu: vars.smandelete = vars.host == args.override_delete vars.smanrename = vars.host == args.override_rename +vars.aria2_port = args.aria2_port or 6799 + # Select a model to run if args.model: print("Welcome to KoboldAI!\nYou have selected the following Model:", vars.model) diff --git a/utils.py b/utils.py index be064855..9565eaa4 100644 --- a/utils.py +++ b/utils.py @@ -5,6 +5,9 @@ import json import subprocess import tempfile import requests +import requests.adapters +import time +from tqdm.auto import tqdm import os from typing import Optional @@ -202,6 +205,7 @@ def aria2_hook(pretrained_model_name_or_path: str, force_download=False, cache_d if not urls: return etags = [h.get("X-Linked-Etag") or h.get("ETag") for u in urls for h in [requests.head(u, headers=headers, allow_redirects=False, proxies=proxies, timeout=10).headers]] + headers = [requests.head(u, headers=headers, allow_redirects=True, proxies=proxies, timeout=10).headers for u in urls] filenames = [transformers.file_utils.url_to_filename(u, t) for u, t in zip(urls, etags)] for n in filenames: path = os.path.join(_cache_dir, "kai-tempfile." + n + ".aria2") @@ -217,18 +221,49 @@ def aria2_hook(pretrained_model_name_or_path: str, force_download=False, cache_d path = os.path.join(_cache_dir, n) if os.path.exists(path): os.remove(path) + total_length = sum(int(h["Content-Length"]) for h in headers) + lengths = {} aria2_config = "\n".join(f"{u}\n out=kai-tempfile.{n}" for u, n in zip(urls, filenames)).encode() - with tempfile.NamedTemporaryFile("w+b", delete=False) as f: - f.write(aria2_config) - f.flush() - p = subprocess.Popen(["aria2c", "-x", "10", "-s", "10", "-j", "10", "--disable-ipv6", "--file-allocation=trunc", "--allow-overwrite", "--auto-file-renaming", "false", "-d", _cache_dir, "-i", f.name, "-U", transformers.file_utils.http_user_agent(user_agent)] + (["-c"] if not force_download else []) + ([f"--header='Authorization: Bearer {token}'"] if use_auth_token else []), stdout=subprocess.PIPE, stderr=subprocess.STDOUT) - for line in p.stdout: - print(line.decode(), end="", flush=True) - path = f.name + s = requests.Session() + s.mount("http://", requests.adapters.HTTPAdapter(max_retries=requests.adapters.Retry(total=120, backoff_factor=1))) + bar = None + secret = os.urandom(17).hex() try: - os.remove(path) - except OSError: - pass + with tempfile.NamedTemporaryFile("w+b", delete=False) as f: + f.write(aria2_config) + f.flush() + p = subprocess.Popen(["aria2c", "-x", "10", "-s", "10", "-j", "10", "--enable-rpc=true", f"--rpc-secret={secret}", "--rpc-listen-port", str(vars.aria2_port), "--disable-ipv6", "--file-allocation=trunc", "--allow-overwrite", "--auto-file-renaming=false", "-d", _cache_dir, "-i", f.name, "-U", transformers.file_utils.http_user_agent(user_agent)] + (["-c"] if not force_download else []) + ([f"--header='Authorization: Bearer {token}'"] if use_auth_token else []), stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) + while p.poll() is None: + r = s.post(f"http://localhost:{vars.aria2_port}/jsonrpc", json={"jsonrpc": "2.0", "id": "kai", "method": "aria2.tellActive", "params": [f"token:{secret}"]}).json()["result"] + if not r: + s.close() + if bar is not None: + bar.n = bar.total + bar.close() + p.terminate() + break + if bar is None: + bar = tqdm(total=total_length, desc=f"[aria2] Downloading model", unit="B", unit_scale=True, unit_divisor=1000) + visited = set() + for x in r: + filename = x["files"][0]["path"] + lengths[filename] = (int(x["completedLength"]), int(x["totalLength"])) + visited.add(filename) + for k, v in lengths.items(): + if k not in visited: + lengths[k] = (v[1], v[1]) + bar.n = sum(v[0] for v in lengths.values()) + bar.update() + time.sleep(0.1) + path = f.name + except Exception as e: + p.terminate() + raise e + finally: + try: + os.remove(path) + except OSError: + pass code = p.wait() if code: raise OSError(f"aria2 exited with exit code {code}") From f9f1a5f3a90b27eefabf750c19afe934a0ae01a7 Mon Sep 17 00:00:00 2001 From: Gnome Ann <> Date: Fri, 13 May 2022 17:37:45 -0400 Subject: [PATCH 14/63] Make sure tqdm progress bars display properly in Colab --- aiserver.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/aiserver.py b/aiserver.py index 74adef38..23c8f5e1 100644 --- a/aiserver.py +++ b/aiserver.py @@ -57,6 +57,16 @@ if lupa.LUA_VERSION[:2] != (5, 4): print(f"Please install lupa==1.10. You have lupa {lupa.__version__}.", file=sys.stderr) +# Make sure tqdm progress bars display properly in Colab +from tqdm.auto import tqdm +old_init = tqdm.__init__ +def new_init(self, *args, **kwargs): + old_init(self, *args, **kwargs) + if(self.ncols == 0 and kwargs.get("ncols") != 0): + self.ncols = 99 +tqdm.__init__ = new_init + + #==================================================================# # Variables & Storage #==================================================================# From 0c5ca5261e33461f132ae012a670aeb08510c548 Mon Sep 17 00:00:00 2001 From: Gnome Ann <> Date: Fri, 13 May 2022 23:32:16 -0400 Subject: [PATCH 15/63] Loading a sharded model will now display only one progress bar --- aiserver.py | 29 ++++++++++++++++++++++++++++- tpu_mtj_backend.py | 24 +++++++++++++++++++++++- utils.py | 16 ++++++++++++++++ 3 files changed, 67 insertions(+), 2 deletions(-) diff --git a/aiserver.py b/aiserver.py index 23c8f5e1..f3e1c4ed 100644 --- a/aiserver.py +++ b/aiserver.py @@ -1170,6 +1170,10 @@ if(not vars.use_colab_tpu and vars.model not in ["InferKit", "Colab", "OAI", "Go def new_from_pretrained(cls, pretrained_model_name_or_path, *model_args, **kwargs): utils.num_shards = None utils.current_shard = 0 + utils.from_pretrained_model_name = pretrained_model_name_or_path + utils.from_pretrained_index_filename = None + utils.from_pretrained_kwargs = kwargs + utils.bar = None if not args.no_aria2: utils.aria2_hook(pretrained_model_name_or_path, **kwargs) return old_from_pretrained(cls, pretrained_model_name_or_path, *model_args, **kwargs) @@ -1177,6 +1181,7 @@ if(not vars.use_colab_tpu and vars.model not in ["InferKit", "Colab", "OAI", "Go old_get_checkpoint_shard_files = modeling_utils.get_checkpoint_shard_files def new_get_checkpoint_shard_files(pretrained_model_name_or_path, index_filename, *args, **kwargs): utils.num_shards = utils.get_num_shards(index_filename) + utils.from_pretrained_index_filename = index_filename return old_get_checkpoint_shard_files(pretrained_model_name_or_path, index_filename, *args, **kwargs) modeling_utils.get_checkpoint_shard_files = new_get_checkpoint_shard_files @@ -1196,6 +1201,10 @@ if(not vars.use_colab_tpu and vars.model not in ["InferKit", "Colab", "OAI", "Go ram_blocks = gpu_blocks = cumulative_gpu_blocks = None def lazy_load_callback(model_dict, f, **_): + if lazy_load_callback.nested: + return + lazy_load_callback.nested = True + device_map = {} for _key, spec in lazy_load_spec.get("layer_weights", {}).items(): @@ -1210,6 +1219,13 @@ if(not vars.use_colab_tpu and vars.model not in ["InferKit", "Colab", "OAI", "Go if isinstance(value, torch_lazy_loader.LazyTensor) and key not in device_map: device_map[key] = vars.gpu_device if vars.hascuda and vars.usegpu else "cpu" + if utils.num_shards is None or utils.current_shard == 0: + if utils.num_shards is not None: + num_tensors = len(utils.get_sharded_checkpoint_num_tensors(utils.from_pretrained_model_name, utils.from_pretrained_index_filename, **utils.from_pretrained_kwargs)) + else: + num_tensors = len(device_map) + utils.bar = tqdm(total=num_tensors, desc="Loading model tensors") + with zipfile.ZipFile(f, "r") as z: try: last_storage_key = None @@ -1217,7 +1233,7 @@ if(not vars.use_colab_tpu and vars.model not in ["InferKit", "Colab", "OAI", "Go current_offset = 0 if utils.num_shards is not None: utils.current_shard += 1 - for key in tqdm(sorted(device_map.keys(), key=lambda k: (model_dict[k].key, model_dict[k].seek_offset)), desc="Loading model tensors" + (f" (shard {utils.current_shard}/{utils.num_shards})" if utils.num_shards is not None else "")): + for key in sorted(device_map.keys(), key=lambda k: (model_dict[k].key, model_dict[k].seek_offset)): storage_key = model_dict[key].key if storage_key != last_storage_key or model_dict[key].seek_offset < current_offset: last_storage_key = storage_key @@ -1241,10 +1257,16 @@ if(not vars.use_colab_tpu and vars.model not in ["InferKit", "Colab", "OAI", "Go model_dict[key] = model_dict[key].to(device) #print("OK", flush=True) current_offset += nbytes + utils.bar.update(1) finally: + if utils.num_shards is None or utils.current_shard >= utils.num_shards: + utils.bar.close() + utils.bar = None + lazy_load_callback.nested = False if isinstance(f, zipfile.ZipExtFile): f.close() + lazy_load_callback.nested = False return lazy_load_callback lazy_load_config_path = os.path.join("maps", vars.model_type + ".json") @@ -1640,6 +1662,10 @@ else: def new_from_pretrained(cls, pretrained_model_name_or_path, *model_args, **kwargs): utils.num_shards = None utils.current_shard = 0 + utils.from_pretrained_model_name = pretrained_model_name_or_path + utils.from_pretrained_index_filename = None + utils.from_pretrained_kwargs = kwargs + utils.bar = None if not args.no_aria2: utils.aria2_hook(pretrained_model_name_or_path, **kwargs) return old_from_pretrained(cls, pretrained_model_name_or_path, *model_args, **kwargs) @@ -1647,6 +1673,7 @@ else: old_get_checkpoint_shard_files = modeling_utils.get_checkpoint_shard_files def new_get_checkpoint_shard_files(pretrained_model_name_or_path, index_filename, *args, **kwargs): utils.num_shards = utils.get_num_shards(index_filename) + utils.from_pretrained_index_filename = index_filename return old_get_checkpoint_shard_files(pretrained_model_name_or_path, index_filename, *args, **kwargs) modeling_utils.get_checkpoint_shard_files = new_get_checkpoint_shard_files diff --git a/tpu_mtj_backend.py b/tpu_mtj_backend.py index 2fa149d7..3d7bf735 100644 --- a/tpu_mtj_backend.py +++ b/tpu_mtj_backend.py @@ -1160,6 +1160,9 @@ def load_model(path: str, driver_version="tpu_driver0.1_dev20210607", hf_checkpo import functools def callback(model_dict, f, **_): + if callback.nested: + return + callback.nested = True with zipfile.ZipFile(f, "r") as z: try: last_storage_key = None @@ -1167,9 +1170,17 @@ def load_model(path: str, driver_version="tpu_driver0.1_dev20210607", hf_checkpo current_offset = 0 if utils.current_shard == 0: print("\n\n\nThis model has ", f"{hk.data_structures.tree_size(network.state['params']):,d}".replace(",", " "), " parameters.\n") + + if utils.num_shards is None or utils.current_shard == 0: + if utils.num_shards is not None: + num_tensors = len(utils.get_sharded_checkpoint_num_tensors(utils.from_pretrained_model_name, utils.from_pretrained_index_filename, **utils.from_pretrained_kwargs)) + else: + num_tensors = len(model_dict) + utils.bar = tqdm(total=num_tensors, desc="Loading model tensors") + if utils.num_shards is not None: utils.current_shard += 1 - for key in tqdm(sorted(model_dict.keys(), key=lambda k: (model_dict[k].key, model_dict[k].seek_offset)), desc="Loading model tensors" + (f" (shard {utils.current_shard}/{utils.num_shards})" if utils.num_shards is not None else "")): + for key in sorted(model_dict.keys(), key=lambda k: (model_dict[k].key, model_dict[k].seek_offset)): # Some model weights are used by transformers but not by MTJ. # We have to materialize these weights anyways because @@ -1178,6 +1189,7 @@ def load_model(path: str, driver_version="tpu_driver0.1_dev20210607", hf_checkpo # tensors, which don't take up any actual CPU or TPU memory. if key not in model_spec: model_dict[key] = torch.empty(model_dict[key].shape, dtype=model_dict[key].dtype, device="meta") + utils.bar.update(1) continue storage_key = model_dict[key].key @@ -1230,6 +1242,8 @@ def load_model(path: str, driver_version="tpu_driver0.1_dev20210607", hf_checkpo np.empty(params["cores_per_replica"]), ) + utils.bar.update(1) + if utils.num_shards is not None and utils.current_shard < utils.num_shards: return @@ -1250,9 +1264,17 @@ def load_model(path: str, driver_version="tpu_driver0.1_dev20210607", hf_checkpo error = f"{mk} {pk} could not be found in the model checkpoint" print("\n\nERROR: " + error, file=sys.stderr) raise RuntimeError(error) + except: + import traceback + traceback.print_exc() finally: + if utils.num_shards is None or utils.current_shard >= utils.num_shards: + utils.bar.close() + utils.bar = None + callback.nested = False if isinstance(f, zipfile.ZipExtFile): f.close() + callback.nested = False if os.path.isdir(vars.model.replace('/', '_')): import shutil diff --git a/utils.py b/utils.py index 9565eaa4..0e4299de 100644 --- a/utils.py +++ b/utils.py @@ -9,11 +9,16 @@ import requests.adapters import time from tqdm.auto import tqdm import os +import itertools from typing import Optional vars = None num_shards: Optional[int] = None current_shard = 0 +from_pretrained_model_name = "" +from_pretrained_index_filename: Optional[str] = None +from_pretrained_kwargs = {} +bar = None #==================================================================# # Decorator to prevent a function's actions from being run until @@ -280,3 +285,14 @@ def get_num_shards(filename): with open(filename) as f: map_data = json.load(f) return len(set(map_data["weight_map"].values())) + +#==================================================================# +# Given the name/path of a sharded model and the path to a +# pytorch_model.bin.index.json, returns a list of weight names in the +# sharded model. Requires lazy loader to be enabled to work properl +#==================================================================# +def get_sharded_checkpoint_num_tensors(pretrained_model_name_or_path, filename, cache_dir=None, force_download=False, proxies=None, resume_download=False, local_files_only=False, use_auth_token=None, user_agent=None, revision=None, mirror=None, **kwargs): + import transformers.modeling_utils + import torch + shard_paths, _ = transformers.modeling_utils.get_checkpoint_shard_files(pretrained_model_name_or_path, filename, cache_dir=cache_dir, force_download=force_download, proxies=proxies, resume_download=resume_download, local_files_only=local_files_only, use_auth_token=use_auth_token, user_agent=user_agent, revision=revision, mirror=mirror) + return list(itertools.chain(*(torch.load(p, map_location="cpu").keys() for p in shard_paths))) From 1476e76cfcdc2244bd46efa8c34f43d63c88e6b6 Mon Sep 17 00:00:00 2001 From: Gnome Ann <> Date: Sat, 14 May 2022 00:45:43 -0400 Subject: [PATCH 16/63] Copy fp16 model files instead of resaving them --- aiserver.py | 41 +++++++++++++++++++++++++++++++++++++++-- 1 file changed, 39 insertions(+), 2 deletions(-) diff --git a/aiserver.py b/aiserver.py index f3e1c4ed..e8845272 100644 --- a/aiserver.py +++ b/aiserver.py @@ -254,6 +254,7 @@ class vars: badwordsids = [[13460], [6880], [50256], [42496], [4613], [17414], [22039], [16410], [27], [29], [38430], [37922], [15913], [24618], [28725], [58], [47175], [36937], [26700], [12878], [16471], [37981], [5218], [29795], [13412], [45160], [3693], [49778], [4211], [20598], [36475], [33409], [44167], [32406], [29847], [29342], [42669], [685], [25787], [7359], [3784], [5320], [33994], [33490], [34516], [43734], [17635], [24293], [9959], [23785], [21737], [28401], [18161], [26358], [32509], [1279], [38155], [18189], [26894], [6927], [14610], [23834], [11037], [14631], [26933], [46904], [22330], [25915], [47934], [38214], [1875], [14692], [41832], [13163], [25970], [29565], [44926], [19841], [37250], [49029], [9609], [44438], [16791], [17816], [30109], [41888], [47527], [42924], [23984], [49074], [33717], [31161], [49082], [30138], [31175], [12240], [14804], [7131], [26076], [33250], [3556], [38381], [36338], [32756], [46581], [17912], [49146]] # Tokenized array of badwords used to prevent AI artifacting badwordsids_neox = [[0], [1], [44162], [9502], [12520], [31841], [36320], [49824], [34417], [6038], [34494], [24815], [26635], [24345], [3455], [28905], [44270], [17278], [32666], [46880], [7086], [43189], [37322], [17778], [20879], [49821], [3138], [14490], [4681], [21391], [26786], [43134], [9336], [683], [48074], [41256], [19181], [29650], [28532], [36487], [45114], [46275], [16445], [15104], [11337], [1168], [5647], [29], [27482], [44965], [43782], [31011], [42944], [47389], [6334], [17548], [38329], [32044], [35487], [2239], [34761], [7444], [1084], [12399], [18990], [17636], [39083], [1184], [35830], [28365], [16731], [43467], [47744], [1138], [16079], [40116], [45564], [18297], [42368], [5456], [18022], [42696], [34476], [23505], [23741], [39334], [37944], [45382], [38709], [33440], [26077], [43600], [34418], [36033], [6660], [48167], [48471], [15775], [19884], [41533], [1008], [31053], [36692], [46576], [20095], [20629], [31759], [46410], [41000], [13488], [30952], [39258], [16160], [27655], [22367], [42767], [43736], [49694], [13811], [12004], [46768], [6257], [37471], [5264], [44153], [33805], [20977], [21083], [25416], [14277], [31096], [42041], [18331], [33376], [22372], [46294], [28379], [38475], [1656], [5204], [27075], [50001], [16616], [11396], [7748], [48744], [35402], [28120], [41512], [4207], [43144], [14767], [15640], [16595], [41305], [44479], [38958], [18474], [22734], [30522], [46267], [60], [13976], [31830], [48701], [39822], [9014], [21966], [31422], [28052], [34607], [2479], [3851], [32214], [44082], [45507], [3001], [34368], [34758], [13380], [38363], [4299], [46802], [30996], [12630], [49236], [7082], [8795], [5218], [44740], [9686], [9983], [45301], [27114], [40125], [1570], [26997], [544], [5290], [49193], [23781], [14193], [40000], [2947], [43781], [9102], [48064], [42274], [18772], [49384], [9884], [45635], [43521], [31258], [32056], [47686], [21760], [13143], [10148], [26119], [44308], [31379], [36399], [23983], [46694], [36134], [8562], [12977], [35117], [28591], [49021], [47093], [28653], [29013], [46468], [8605], [7254], [25896], [5032], [8168], [36893], [38270], [20499], [27501], [34419], [29547], [28571], [36586], [20871], [30537], [26842], [21375], [31148], [27618], [33094], [3291], [31789], [28391], [870], [9793], [41361], [47916], [27468], [43856], [8850], [35237], [15707], [47552], [2730], [41449], [45488], [3073], [49806], [21938], [24430], [22747], [20924], [46145], [20481], [20197], [8239], [28231], [17987], [42804], [47269], [29972], [49884], [21382], [46295], [36676], [34616], [3921], [26991], [27720], [46265], [654], [9855], [40354], [5291], [34904], [44342], [2470], [14598], [880], [19282], [2498], [24237], [21431], [16369], [8994], [44524], [45662], [13663], [37077], [1447], [37786], [30863], [42854], [1019], [20322], [4398], [12159], [44072], [48664], [31547], [18736], [9259], [31], [16354], [21810], [4357], [37982], [5064], [2033], [32871], [47446], [62], [22158], [37387], [8743], [47007], [17981], [11049], [4622], [37916], [36786], [35138], [29925], [14157], [18095], [27829], [1181], [22226], [5709], [4725], [30189], [37014], [1254], [11380], [42989], [696], [24576], [39487], [30119], [1092], [8088], [2194], [9899], [14412], [21828], [3725], [13544], [5180], [44679], [34398], [3891], [28739], [14219], [37594], [49550], [11326], [6904], [17266], [5749], [10174], [23405], [9955], [38271], [41018], [13011], [48392], [36784], [24254], [21687], [23734], [5413], [41447], [45472], [10122], [17555], [15830], [47384], [12084], [31350], [47940], [11661], [27988], [45443], [905], [49651], [16614], [34993], [6781], [30803], [35869], [8001], [41604], [28118], [46462], [46762], [16262], [17281], [5774], [10943], [5013], [18257], [6750], [4713], [3951], [11899], [38791], [16943], [37596], [9318], [18413], [40473], [13208], [16375]] badwordsids_opt = [[44717], [46613], [48513], [49923], [50185], [48755], [8488], [43303], [49659], [48601], [49817], [45405], [48742], [49925], [47720], [11227], [48937], [48784], [50017], [42248], [49310], [48082], [49895], [50025], [49092], [49007], [8061], [44226], [0], [742], [28578], [15698], [49784], [46679], [39365], [49281], [49609], [48081], [48906], [46161], [48554], [49670], [48677], [49721], [49632], [48610], [48462], [47457], [10975], [46077], [28696], [48709], [43839], [49798], [49154], [48203], [49625], [48395], [50155], [47161], [49095], [48833], [49420], [49666], [48443], [22176], [49242], [48651], [49138], [49750], [40389], [48021], [21838], [49070], [45333], [40862], [1], [49915], [33525], [49858], [50254], [44403], [48992], [48872], [46117], [49853], [47567], [50206], [41552], [50068], [48999], [49703], [49940], [49329], [47620], [49868], [49962], [2], [44082], [50236], [31274], [50260], [47052], [42645], [49177], [17523], [48691], [49900], [49069], [49358], [48794], [47529], [46479], [48457], [646], [49910], [48077], [48935], [46386], [48902], [49151], [48759], [49803], [45587], [48392], [47789], [48654], [49836], [49230], [48188], [50264], [46844], [44690], [48505], [50161], [27779], [49995], [41833], [50154], [49097], [48520], [50018], [8174], [50084], [49366], [49526], [50193], [7479], [49982], [3]] + fp32_model = False # Whether or not the most recently loaded HF model was in fp32 format deletewi = None # Temporary storage for UID to delete wirmvwhtsp = False # Whether to remove leading whitespace from WI entries widepth = 3 # How many historical actions to scan for WI hits @@ -1168,6 +1169,7 @@ if(not vars.use_colab_tpu and vars.model not in ["InferKit", "Colab", "OAI", "Go old_from_pretrained = PreTrainedModel.from_pretrained.__func__ @classmethod def new_from_pretrained(cls, pretrained_model_name_or_path, *model_args, **kwargs): + vars.fp32_model = False utils.num_shards = None utils.current_shard = 0 utils.from_pretrained_model_name = pretrained_model_name_or_path @@ -1224,6 +1226,7 @@ if(not vars.use_colab_tpu and vars.model not in ["InferKit", "Colab", "OAI", "Go num_tensors = len(utils.get_sharded_checkpoint_num_tensors(utils.from_pretrained_model_name, utils.from_pretrained_index_filename, **utils.from_pretrained_kwargs)) else: num_tensors = len(device_map) + print(flush=True) utils.bar = tqdm(total=num_tensors, desc="Loading model tensors") with zipfile.ZipFile(f, "r") as z: @@ -1250,6 +1253,8 @@ if(not vars.use_colab_tpu and vars.model not in ["InferKit", "Colab", "OAI", "Go nbytes = size if dtype is torch.bool else size * ((torch.finfo if dtype.is_floating_point else torch.iinfo)(dtype).bits >> 3) #print(f"Transferring <{key}> to {'(CPU)' if device == 'cpu' else '[device ' + str(device) + ']'} ... ", end="", flush=True) model_dict[key] = model_dict[key].materialize(f, map_location="cpu") + if model_dict[key].dtype is torch.float32: + vars.fp32_model = True if convert_to_float16 and vars.hascuda and (vars.breakmodel or vars.usegpu) and model_dict[key].dtype is torch.float32: model_dict[key] = model_dict[key].to(torch.float16) if not vars.usegpu and not vars.breakmodel and model_dict[key].dtype is torch.float16: @@ -1604,6 +1609,16 @@ if(not vars.use_colab_tpu and vars.model not in ["InferKit", "Colab", "OAI", "Go except Exception as e: model = GPTNeoForCausalLM.from_pretrained("models/{}".format(vars.model.replace('/', '_')), revision=vars.revision, cache_dir="cache", **lowmem) else: + old_rebuild_tensor = torch._utils._rebuild_tensor + def new_rebuild_tensor(storage, storage_offset, shape, stride): + dtype = storage.storage_type.dtype + if(not isinstance(dtype, torch.dtype)): + dtype = storage.storage_type(0).dtype + if(dtype is torch.float32 and len(shape) >= 2): + vars.fp32_model = True + return old_rebuild_tensor(storage, storage_offset, shape, stride) + torch._utils._rebuild_tensor = new_rebuild_tensor + try: tokenizer = AutoTokenizer.from_pretrained(vars.model, revision=vars.revision, cache_dir="cache") except Exception as e: @@ -1616,11 +1631,32 @@ if(not vars.use_colab_tpu and vars.model not in ["InferKit", "Colab", "OAI", "Go except Exception as e: model = GPTNeoForCausalLM.from_pretrained(vars.model, revision=vars.revision, cache_dir="cache", **lowmem) + torch._utils._rebuild_tensor = old_rebuild_tensor + if not args.colab or args.savemodel: import shutil - model = model.half() - model.save_pretrained("models/{}".format(vars.model.replace('/', '_')), max_shard_size="500MiB") tokenizer.save_pretrained("models/{}".format(vars.model.replace('/', '_'))) + if(vars.fp32_model): # Use save_pretrained to convert fp32 models to fp16 + model = model.half() + model.save_pretrained("models/{}".format(vars.model.replace('/', '_')), max_shard_size="500MiB") + else: # For fp16 models, we can just copy the model files directly + import transformers.configuration_utils + import transformers.modeling_utils + import transformers.file_utils + # Save the config.json + shutil.move(transformers.file_utils.get_from_cache(transformers.file_utils.hf_bucket_url(vars.model, transformers.configuration_utils.CONFIG_NAME, revision=vars.revision), cache_dir="cache", local_files_only=True), os.path.join("models/{}".format(vars.model.replace('/', '_')), transformers.configuration_utils.CONFIG_NAME)) + if(utils.num_shards is None): + # Save the pytorch_model.bin of an unsharded model + shutil.move(transformers.file_utils.get_from_cache(transformers.file_utils.hf_bucket_url(vars.model, transformers.modeling_utils.WEIGHTS_NAME, revision=vars.revision), cache_dir="cache", local_files_only=True), os.path.join("models/{}".format(vars.model.replace('/', '_')), transformers.modeling_utils.WEIGHTS_NAME)) + else: + with open(utils.from_pretrained_index_filename) as f: + map_data = json.load(f) + filenames = set(map_data["weight_map"].values()) + # Save the pytorch_model.bin.index.json of a sharded model + shutil.move(utils.from_pretrained_index_filename, os.path.join("models/{}".format(vars.model.replace('/', '_')), transformers.modeling_utils.WEIGHTS_INDEX_NAME)) + # Then save the pytorch_model-#####-of-#####.bin files + for filename in filenames: + shutil.move(transformers.file_utils.get_from_cache(transformers.file_utils.hf_bucket_url(vars.model, filename, revision=vars.revision), cache_dir="cache", local_files_only=True), os.path.join("models/{}".format(vars.model.replace('/', '_')), filename)) shutil.rmtree("cache/") if(vars.hascuda): @@ -1660,6 +1696,7 @@ else: old_from_pretrained = PreTrainedModel.from_pretrained.__func__ @classmethod def new_from_pretrained(cls, pretrained_model_name_or_path, *model_args, **kwargs): + vars.fp32_model = False utils.num_shards = None utils.current_shard = 0 utils.from_pretrained_model_name = pretrained_model_name_or_path From 9eaa76c72b31ab356a22da863525cd8c9f8e6036 Mon Sep 17 00:00:00 2001 From: henk717 Date: Sat, 14 May 2022 07:55:47 +0200 Subject: [PATCH 17/63] Add OPT 13B to the models --- colab/TPU.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/colab/TPU.ipynb b/colab/TPU.ipynb index 0ff1fcc1..bb87a339 100644 --- a/colab/TPU.ipynb +++ b/colab/TPU.ipynb @@ -65,7 +65,7 @@ "#@markdown You can find a description of the models below along with instructions on how to start KoboldAI.\n", "\n", "#@title <-- Click this to start KoboldAI\n", - "Model = \"Janeway 13B\" #@param [\"Janeway 13B\", \"Shinen 13B\", \"Skein 6B\", \"Janeway 6B\", \"Adventure 6B\", \"Shinen 6B\", \"Lit 6B\", \"Convo 6B\", \"C1 6B\", \"NeoX 20B\", \"KoboldAI/fairseq-dense-13B\", \"EleutherAI/gpt-j-6B\"] {allow-input: true}\n", + "Model = \"Janeway 13B\" #@param [\"Janeway 13B\", \"Shinen 13B\", \"Skein 6B\", \"Janeway 6B\", \"Adventure 6B\", \"Shinen 6B\", \"Lit 6B\", \"Convo 6B\", \"C1 6B\", \"NeoX 20B\", \"facebook/opt-13b\", \"KoboldAI/fairseq-dense-13B\", \"EleutherAI/gpt-j-6B\"] {allow-input: true}\n", "Version = \"United\" #@param [\"Official\", \"United\"] {allow-input: true}\n", "Provider = \"Localtunnel\" #@param [\"Localtunnel\", \"Cloudflare\"]\n", "\n", From 6e82f205b4892ea60f0472646b86cea7a7599bf9 Mon Sep 17 00:00:00 2001 From: Gnome Ann <> Date: Sat, 14 May 2022 11:44:28 -0400 Subject: [PATCH 18/63] Aria2 bug fix for Windows users --- utils.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/utils.py b/utils.py index 0e4299de..bc085412 100644 --- a/utils.py +++ b/utils.py @@ -232,6 +232,7 @@ def aria2_hook(pretrained_model_name_or_path: str, force_download=False, cache_d s = requests.Session() s.mount("http://", requests.adapters.HTTPAdapter(max_retries=requests.adapters.Retry(total=120, backoff_factor=1))) bar = None + done = False secret = os.urandom(17).hex() try: with tempfile.NamedTemporaryFile("w+b", delete=False) as f: @@ -246,6 +247,7 @@ def aria2_hook(pretrained_model_name_or_path: str, force_download=False, cache_d bar.n = bar.total bar.close() p.terminate() + done = True break if bar is None: bar = tqdm(total=total_length, desc=f"[aria2] Downloading model", unit="B", unit_scale=True, unit_divisor=1000) @@ -270,7 +272,7 @@ def aria2_hook(pretrained_model_name_or_path: str, force_download=False, cache_d except OSError: pass code = p.wait() - if code: + if not done and code: raise OSError(f"aria2 exited with exit code {code}") for u, t, n in zip(urls, etags, filenames): os.rename(os.path.join(_cache_dir, "kai-tempfile." + n), os.path.join(_cache_dir, n)) From d5ab3ef5b1de11a337e7fecfd3ca2fed2d7e11c0 Mon Sep 17 00:00:00 2001 From: Gnome Ann <> Date: Sat, 14 May 2022 11:49:04 -0400 Subject: [PATCH 19/63] Fix `no attribute get_checkpoint_shard_files` --- aiserver.py | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/aiserver.py b/aiserver.py index e8845272..1f43c32c 100644 --- a/aiserver.py +++ b/aiserver.py @@ -1180,12 +1180,13 @@ if(not vars.use_colab_tpu and vars.model not in ["InferKit", "Colab", "OAI", "Go utils.aria2_hook(pretrained_model_name_or_path, **kwargs) return old_from_pretrained(cls, pretrained_model_name_or_path, *model_args, **kwargs) PreTrainedModel.from_pretrained = new_from_pretrained - old_get_checkpoint_shard_files = modeling_utils.get_checkpoint_shard_files - def new_get_checkpoint_shard_files(pretrained_model_name_or_path, index_filename, *args, **kwargs): - utils.num_shards = utils.get_num_shards(index_filename) - utils.from_pretrained_index_filename = index_filename - return old_get_checkpoint_shard_files(pretrained_model_name_or_path, index_filename, *args, **kwargs) - modeling_utils.get_checkpoint_shard_files = new_get_checkpoint_shard_files + if(hasattr(modeling_utils, "get_checkpoint_shard_files")): + old_get_checkpoint_shard_files = modeling_utils.get_checkpoint_shard_files + def new_get_checkpoint_shard_files(pretrained_model_name_or_path, index_filename, *args, **kwargs): + utils.num_shards = utils.get_num_shards(index_filename) + utils.from_pretrained_index_filename = index_filename + return old_get_checkpoint_shard_files(pretrained_model_name_or_path, index_filename, *args, **kwargs) + modeling_utils.get_checkpoint_shard_files = new_get_checkpoint_shard_files # Lazy loader import torch_lazy_loader @@ -1707,12 +1708,13 @@ else: utils.aria2_hook(pretrained_model_name_or_path, **kwargs) return old_from_pretrained(cls, pretrained_model_name_or_path, *model_args, **kwargs) PreTrainedModel.from_pretrained = new_from_pretrained - old_get_checkpoint_shard_files = modeling_utils.get_checkpoint_shard_files - def new_get_checkpoint_shard_files(pretrained_model_name_or_path, index_filename, *args, **kwargs): - utils.num_shards = utils.get_num_shards(index_filename) - utils.from_pretrained_index_filename = index_filename - return old_get_checkpoint_shard_files(pretrained_model_name_or_path, index_filename, *args, **kwargs) - modeling_utils.get_checkpoint_shard_files = new_get_checkpoint_shard_files + if(hasattr(modeling_utils, "get_checkpoint_shard_files")): + old_get_checkpoint_shard_files = modeling_utils.get_checkpoint_shard_files + def new_get_checkpoint_shard_files(pretrained_model_name_or_path, index_filename, *args, **kwargs): + utils.num_shards = utils.get_num_shards(index_filename) + utils.from_pretrained_index_filename = index_filename + return old_get_checkpoint_shard_files(pretrained_model_name_or_path, index_filename, *args, **kwargs) + modeling_utils.get_checkpoint_shard_files = new_get_checkpoint_shard_files def tpumtjgetsofttokens(): soft_tokens = None From d4e8f567897a99789039cff3b1773decedcf0570 Mon Sep 17 00:00:00 2001 From: Gnome Ann <> Date: Sat, 14 May 2022 12:00:44 -0400 Subject: [PATCH 20/63] Remove debugging code from tpu_mtj_backend.py --- tpu_mtj_backend.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/tpu_mtj_backend.py b/tpu_mtj_backend.py index 3d7bf735..41746d37 100644 --- a/tpu_mtj_backend.py +++ b/tpu_mtj_backend.py @@ -1264,9 +1264,6 @@ def load_model(path: str, driver_version="tpu_driver0.1_dev20210607", hf_checkpo error = f"{mk} {pk} could not be found in the model checkpoint" print("\n\nERROR: " + error, file=sys.stderr) raise RuntimeError(error) - except: - import traceback - traceback.print_exc() finally: if utils.num_shards is None or utils.current_shard >= utils.num_shards: utils.bar.close() From f0df3de61017bed718f45702b30c0d6408fcd699 Mon Sep 17 00:00:00 2001 From: Julius ter Pelkwijk <1099127+mrseeker@users.noreply.github.com> Date: Mon, 16 May 2022 09:50:45 +0200 Subject: [PATCH 21/63] Adding Nerys model 2.7B --- aiserver.py | 1 + 1 file changed, 1 insertion(+) diff --git a/aiserver.py b/aiserver.py index 1f43c32c..79ca0937 100644 --- a/aiserver.py +++ b/aiserver.py @@ -114,6 +114,7 @@ novellist= [ ["Janeway Neo 6B", "KoboldAI/GPT-J-6B-Janeway", "16GB"], ["Janeway Neo 2.7B", "KoboldAI/GPT-Neo-2.7B-Janeway", "8GB"], ["Janeway FSD 2.7B", "KoboldAI/fairseq-dense-2.7B-Janeway", "8GB"], + ["Nerys FSD 2.7B", "KoboldAI/fairseq-dense-2.7B-Nerys", "8GB"], ["Horni-LN 2.7B", "KoboldAI/GPT-Neo-2.7B-Horni-LN", "8GB"], ["Picard 2.7B (Older Janeway)", "KoboldAI/GPT-Neo-2.7B-Picard", "8GB"], ["Return to Main Menu", "Return", ""], From 6ae7b48b69cc8b7d8704d4d223b2f46e7ce0c930 Mon Sep 17 00:00:00 2001 From: Julius ter Pelkwijk <1099127+mrseeker@users.noreply.github.com> Date: Wed, 18 May 2022 13:50:57 +0200 Subject: [PATCH 22/63] Adding Nerys model 13B --- aiserver.py | 1 + 1 file changed, 1 insertion(+) diff --git a/aiserver.py b/aiserver.py index 79ca0937..b9b9267b 100644 --- a/aiserver.py +++ b/aiserver.py @@ -110,6 +110,7 @@ adventurelist= [ novellist= [ ["Janeway FSD 13B", "KoboldAI/fairseq-dense-13B-Janeway", "32GB"], + ["Nerys FSD 13B", "KoboldAI/fairseq-dense-13B-Nerys", "32GB"], ["Janeway FSD 6.7B", "KoboldAI/fairseq-dense-6.7B-Janeway", "16GB"], ["Janeway Neo 6B", "KoboldAI/GPT-J-6B-Janeway", "16GB"], ["Janeway Neo 2.7B", "KoboldAI/GPT-Neo-2.7B-Janeway", "8GB"], From c692987e40cdc128c0138ab04f7f7b2ca6549409 Mon Sep 17 00:00:00 2001 From: Gnome Ann <> Date: Fri, 20 May 2022 14:54:49 -0400 Subject: [PATCH 23/63] Fix an error that occurs when loading GPT-2 models I forgot that this new_rebuild_tensor function's first argument's type is different when loading GPT-2 models. --- aiserver.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/aiserver.py b/aiserver.py index b9b9267b..b1fce2cb 100644 --- a/aiserver.py +++ b/aiserver.py @@ -1613,10 +1613,13 @@ if(not vars.use_colab_tpu and vars.model not in ["InferKit", "Colab", "OAI", "Go model = GPTNeoForCausalLM.from_pretrained("models/{}".format(vars.model.replace('/', '_')), revision=vars.revision, cache_dir="cache", **lowmem) else: old_rebuild_tensor = torch._utils._rebuild_tensor - def new_rebuild_tensor(storage, storage_offset, shape, stride): - dtype = storage.storage_type.dtype - if(not isinstance(dtype, torch.dtype)): - dtype = storage.storage_type(0).dtype + def new_rebuild_tensor(storage: Union[torch_lazy_loader.LazyTensor, torch.Storage], storage_offset, shape, stride): + if(not isinstance(storage, torch_lazy_loader.LazyTensor)): + dtype = storage.dtype + else: + dtype = storage.storage_type.dtype + if(not isinstance(dtype, torch.dtype)): + dtype = storage.storage_type(0).dtype if(dtype is torch.float32 and len(shape) >= 2): vars.fp32_model = True return old_rebuild_tensor(storage, storage_offset, shape, stride) From f47db6d1556cdc156038744f98c89eed4295a88c Mon Sep 17 00:00:00 2001 From: henk717 Date: Fri, 27 May 2022 00:12:35 +0200 Subject: [PATCH 24/63] Nerys 13B --- colab/TPU.ipynb | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/colab/TPU.ipynb b/colab/TPU.ipynb index bb87a339..bf9a430c 100644 --- a/colab/TPU.ipynb +++ b/colab/TPU.ipynb @@ -65,7 +65,7 @@ "#@markdown You can find a description of the models below along with instructions on how to start KoboldAI.\n", "\n", "#@title <-- Click this to start KoboldAI\n", - "Model = \"Janeway 13B\" #@param [\"Janeway 13B\", \"Shinen 13B\", \"Skein 6B\", \"Janeway 6B\", \"Adventure 6B\", \"Shinen 6B\", \"Lit 6B\", \"Convo 6B\", \"C1 6B\", \"NeoX 20B\", \"facebook/opt-13b\", \"KoboldAI/fairseq-dense-13B\", \"EleutherAI/gpt-j-6B\"] {allow-input: true}\n", + "Model = \"Nerys 13B\" #@param [\"Nerys 13B\", \"Janeway 13B\", \"Shinen 13B\", \"Skein 6B\", \"Janeway 6B\", \"Adventure 6B\", \"Shinen 6B\", \"Lit 6B\", \"Convo 6B\", \"C1 6B\", \"NeoX 20B\", \"facebook/opt-13b\", \"KoboldAI/fairseq-dense-13B\", \"EleutherAI/gpt-j-6B\"] {allow-input: true}\n", "Version = \"United\" #@param [\"Official\", \"United\"] {allow-input: true}\n", "Provider = \"Localtunnel\" #@param [\"Localtunnel\", \"Cloudflare\"]\n", "\n", @@ -84,6 +84,10 @@ " Model = \"KoboldAI/fairseq-dense-13B-Janeway\"\n", " path = \"\"\n", " download = \"\"\n", + "elif Model == \"Nerys 13B\":\n", + " Model = \"KoboldAI/fairseq-dense-13B-Nerys\"\n", + " path = \"\"\n", + " download = \"\"\n", "elif Model == \"Shinen 13B\":\n", " Model = \"KoboldAI/fairseq-dense-13B-Shinen\"\n", " path = \"\"\n", From b30370bf4b1959abb28b0ab79e84725b9c651e85 Mon Sep 17 00:00:00 2001 From: Henk Date: Fri, 27 May 2022 01:23:48 +0200 Subject: [PATCH 25/63] 2048 maxtoken default Almost everyone prefers 2048 max tokens because of the superior coherency. It should only be lower due to ram limits, but the menu already shows the optimal ram for 2048. Negatively effected users can turn it down themselves, for everyone else especially on rented machines or colab 2048 is a better default. --- aiserver.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aiserver.py b/aiserver.py index b1fce2cb..1fa91e19 100644 --- a/aiserver.py +++ b/aiserver.py @@ -199,7 +199,7 @@ class vars: model_type = "" # Model Type (Automatically taken from the model config) noai = False # Runs the script without starting up the transformers pipeline aibusy = False # Stops submissions while the AI is working - max_length = 1024 # Maximum number of tokens to submit per action + max_length = 2048 # Maximum number of tokens to submit per action ikmax = 3000 # Maximum number of characters to submit to InferKit genamt = 80 # Amount of text for each action to generate ikgen = 200 # Number of characters for InferKit to generate From 6e0510e1f51e4dc6fecdb836a7893532470afb69 Mon Sep 17 00:00:00 2001 From: henk717 Date: Fri, 27 May 2022 01:35:15 +0200 Subject: [PATCH 26/63] Replaced Jax models with HF models where possible --- colab/TPU.ipynb | 40 ++++++++++++---------------------------- 1 file changed, 12 insertions(+), 28 deletions(-) diff --git a/colab/TPU.ipynb b/colab/TPU.ipynb index bf9a430c..d0e4df20 100644 --- a/colab/TPU.ipynb +++ b/colab/TPU.ipynb @@ -101,41 +101,25 @@ " Drive = \"Unextracted (Less Space)\"\n", " ![[ -f /content/drive/MyDrive/KoboldAI/settings/gpt-neox-20b-jax.settings ]] || echo -e \"{\\n \\\"apikey\\\": \\\"\\\",\\n \\\"andepth\\\": 3,\\n \\\"temp\\\": 0.5,\\n \\\"top_p\\\": 0.9,\\n \\\"top_k\\\": 0,\\n \\\"tfs\\\": 1.0,\\n \\\"rep_pen\\\": 1.03,\\n \\\"genamt\\\": 80,\\n \\\"max_length\\\": 2048,\\n \\\"ikgen\\\": 200,\\n \\\"formatoptns\\\": {\\n \\\"frmttriminc\\\": true,\\n \\\"frmtrmblln\\\": false,\\n \\\"frmtrmspch\\\": false,\\n \\\"frmtadsnsp\\\": false\\n },\\n \\\"numseqs\\\": 1,\\n \\\"widepth\\\": 3,\\n \\\"useprompt\\\": true,\\n \\\"adventure\\\": false\\n}\" > /content/drive/MyDrive/KoboldAI/settings/gpt-neox-20b-jax.settings\n", "elif Model == \"Skein 6B\":\n", - " Model = \"TPUMeshTransformerGPTJ\"\n", - " path = \" -p gpt-j-6b-skein-jax\"\n", - " location = \"colab\"\n", - " download = \" -a https://storage.henk.tech/KoboldAI/skein-jax.txt\"\n", - " extract = \"\"\n", - " Drive = \"Unextracted (Less Space)\"\n", - " ![[ -f /content/drive/MyDrive/KoboldAI/settings/gpt-j-6b-skein-jax.settings ]] || echo -e \"{\\n \\\"apikey\\\": \\\"\\\",\\n \\\"andepth\\\": 3,\\n \\\"temp\\\": 0.5,\\n \\\"top_p\\\": 0.9,\\n \\\"top_k\\\": 0,\\n \\\"tfs\\\": 1.0,\\n \\\"rep_pen\\\": 1.1,\\n \\\"genamt\\\": 80,\\n \\\"max_length\\\": 2048,\\n \\\"ikgen\\\": 200,\\n \\\"formatoptns\\\": {\\n \\\"frmttriminc\\\": true,\\n \\\"frmtrmblln\\\": false,\\n \\\"frmtrmspch\\\": false,\\n \\\"frmtadsnsp\\\": false\\n },\\n \\\"numseqs\\\": 1,\\n \\\"widepth\\\": 3,\\n \\\"useprompt\\\": true,\\n \\\"adventure\\\": false\\n}\" > /content/drive/MyDrive/KoboldAI/settings/gpt-j-6b-skein-jax.settings\n", + " Model = \"KoboldAI/GPT-J-6B-Skein\"\n", + " path = \"\"\n", + " download = \"\"\n", "elif Model == \"Janeway 6B\":\n", - " Model = \"TPUMeshTransformerGPTJ\"\n", - " path = \" -p gpt-j-6b-janeway-jax\"\n", - " location = \"colab\"\n", - " download = \" -a https://storage.henk.tech/KoboldAI/janeway-jax.txt\"\n", - " extract = \"\"\n", - " Drive = \"Unextracted (Less Space)\"\n", - " ![[ -f /content/drive/MyDrive/KoboldAI/settings/gpt-j-6b-janeway-jax.settings ]] || echo -e \"{\\n \\\"apikey\\\": \\\"\\\",\\n \\\"andepth\\\": 3,\\n \\\"temp\\\": 0.5,\\n \\\"top_p\\\": 0.9,\\n \\\"top_k\\\": 0,\\n \\\"tfs\\\": 1.0,\\n \\\"rep_pen\\\": 1.1,\\n \\\"rep_pen_slope\\\": 0.7,\\n \\\"rep_pen_range\\\": 1024.0,\\n \\\"genamt\\\": 80,\\n \\\"max_length\\\": 2048,\\n \\\"ikgen\\\": 200,\\n \\\"formatoptns\\\": {\\n \\\"frmttriminc\\\": true,\\n \\\"frmtrmblln\\\": false,\\n \\\"frmtrmspch\\\": false,\\n \\\"frmtadsnsp\\\": false,\\n \\\"singleline\\\": false\\n },\\n \\\"numseqs\\\": 1,\\n \\\"widepth\\\": 3,\\n \\\"useprompt\\\": true,\\n \\\"adventure\\\": false,\\n \\\"chatmode\\\": false,\\n \\\"chatname\\\": \\\"You\\\",\\n \\\"dynamicscan\\\": false,\\n \\\"nopromptgen\\\": false,\\n \\\"rngpersist\\\": false,\\n \\\"nogenmod\\\": false,\\n \\\"autosave\\\": false,\\n \\\"welcome\\\": false,\\n \\\"newlinemode\\\": \\\"n\\\",\\n \\\"antemplate\\\": \\\"[Genre: <|>]\\\",\\n \\\"userscripts\\\": [],\\n \\\"corescript\\\": \\\"default.lua\\\",\\n \\\"softprompt\\\": \\\"\\\"\\n}\" > /content/drive/MyDrive/KoboldAI/settings/gpt-j-6b-janeway-jax.settings\n", + " Model = \"KoboldAI/GPT-J-6B-Janeway\"\n", + " path = \"\"\n", + " download = \"\"\n", "elif Model == \"Adventure 6B\":\n", - " Model = \"TPUMeshTransformerGPTJ\"\n", - " path = \" -p gpt-j-6b-adventure-jax\"\n", - " location = \"colab\"\n", - " download = \" -a https://api.wandb.ai/files/ve-forbryderne/adventure/carol-data/models/gpt-j-6b-adventure-jax/aria2.txt\"\n", - " extract = \"\"\n", - " Drive = \"Unextracted (Less Space)\"\n", - " ![[ -f /content/drive/MyDrive/KoboldAI/settings/gpt-j-6b-adventure-jax.settings ]] || echo -e \"{\\n \\\"apikey\\\": \\\"\\\",\\n \\\"andepth\\\": 3,\\n \\\"temp\\\": 0.5,\\n \\\"top_p\\\": 0.9,\\n \\\"top_k\\\": 0,\\n \\\"tfs\\\": 1.0,\\n \\\"rep_pen\\\": 1.1,\\n \\\"genamt\\\": 80,\\n \\\"max_length\\\": 2048,\\n \\\"ikgen\\\": 200,\\n \\\"formatoptns\\\": {\\n \\\"frmttriminc\\\": true,\\n \\\"frmtrmblln\\\": false,\\n \\\"frmtrmspch\\\": false,\\n \\\"frmtadsnsp\\\": false\\n },\\n \\\"numseqs\\\": 1,\\n \\\"widepth\\\": 3,\\n \\\"useprompt\\\": true,\\n \\\"adventure\\\": true\\n}\" > /content/drive/MyDrive/KoboldAI/settings/gpt-j-6b-adventure-jax.settings\n", + " Model = \"KoboldAI/GPT-J-6B-Adventure\"\n", + " path = \"\"\n", + " download = \"\"\n", "elif Model == \"Lit 6B\":\n", " Model = \"hakurei/lit-6B\"\n", " path = \"\"\n", " download = \"\"\n", "elif Model == \"Shinen 6B\":\n", - " Model = \"TPUMeshTransformerGPTJ\"\n", - " path = \" -p gpt-j-6b-shinen-jax\"\n", - " location = \"colab\"\n", - " download = \" -a https://storage.henk.tech/KoboldAI/shinen-jax.txt\"\n", - " extract = \"\"\n", - " Drive = \"Unextracted (Less Space)\"\n", - " ![[ -f /content/drive/MyDrive/KoboldAI/settings/gpt-j-6b-shinen-jax.settings ]] || echo -e \"{\\n \\\"apikey\\\": \\\"\\\",\\n \\\"andepth\\\": 3,\\n \\\"temp\\\": 0.5,\\n \\\"top_p\\\": 0.9,\\n \\\"top_k\\\": 0,\\n \\\"tfs\\\": 1.0,\\n \\\"rep_pen\\\": 1.1,\\n \\\"rep_pen_slope\\\": 0.7,\\n \\\"rep_pen_range\\\": 1024.0,\\n \\\"genamt\\\": 80,\\n \\\"max_length\\\": 2048,\\n \\\"ikgen\\\": 200,\\n \\\"formatoptns\\\": {\\n \\\"frmttriminc\\\": true,\\n \\\"frmtrmblln\\\": false,\\n \\\"frmtrmspch\\\": false,\\n \\\"frmtadsnsp\\\": false,\\n \\\"singleline\\\": false\\n },\\n \\\"numseqs\\\": 1,\\n \\\"widepth\\\": 3,\\n \\\"useprompt\\\": true,\\n \\\"adventure\\\": false,\\n \\\"chatmode\\\": false,\\n \\\"chatname\\\": \\\"You\\\",\\n \\\"dynamicscan\\\": false,\\n \\\"nopromptgen\\\": false,\\n \\\"rngpersist\\\": false,\\n \\\"nogenmod\\\": false,\\n \\\"autosave\\\": false,\\n \\\"welcome\\\": false,\\n \\\"newlinemode\\\": \\\"n\\\",\\n \\\"antemplate\\\": \\\"[Genre: <|>]\\\",\\n \\\"userscripts\\\": [],\\n \\\"corescript\\\": \\\"default.lua\\\",\\n \\\"softprompt\\\": \\\"\\\"\\n}\" > /content/drive/MyDrive/KoboldAI/settings/gpt-j-6b-shinen-jax.settings\n", + " Model = \"KoboldAI/GPT-J-6B-Shinen\"\n", + " path = \"\"\n", + " download = \"\"\n", "elif Model == \"Convo 6B\":\n", " Model = \"hitomi-team/convo-6B\"\n", " path = \"\"\n", From 4b65ce9c76aaabafb3f89095b7e2bba43d836217 Mon Sep 17 00:00:00 2001 From: Henk Date: Sat, 28 May 2022 19:39:05 +0200 Subject: [PATCH 27/63] 1.18 version bump --- aiserver.py | 8 +++++--- koboldai.ico | Bin 0 -> 143311 bytes templates/index.html | 4 ++-- 3 files changed, 7 insertions(+), 5 deletions(-) create mode 100644 koboldai.ico diff --git a/aiserver.py b/aiserver.py index 1fa91e19..0c1c5b95 100644 --- a/aiserver.py +++ b/aiserver.py @@ -1,7 +1,7 @@ #!/usr/bin/python3 #==================================================================# # KoboldAI -# Version: 1.17.0 +# Version: 1.18.0 # By: KoboldAIDev and the KoboldAI Community #==================================================================# @@ -100,8 +100,10 @@ mainmenu = [ ] adventurelist= [ + ["Nerys FSD 13B (Hybrid)", "KoboldAI/fairseq-dense-13B-Nerys", "32GB"], ["Skein 6B", "KoboldAI/GPT-J-6B-Skein", "16GB"], ["Adventure 6B", "KoboldAI/GPT-J-6B-Adventure", "16GB"], + ["Nerys FSD 2.7B (Hybrid)", "KoboldAI/fairseq-dense-2.7B-Nerys", "8GB"], ["Adventure 2.7B", "KoboldAI/GPT-Neo-2.7B-AID", "8GB"], ["Adventure 1.3B", "KoboldAI/GPT-Neo-1.3B-Adventure", "6GB"], ["Adventure 125M (Mia)", "Merry/AID-Neo-125M", "2GB"], @@ -109,13 +111,13 @@ adventurelist= [ ] novellist= [ + ["Nerys FSD 13B (Hybrid)", "KoboldAI/fairseq-dense-13B-Nerys", "32GB"], ["Janeway FSD 13B", "KoboldAI/fairseq-dense-13B-Janeway", "32GB"], - ["Nerys FSD 13B", "KoboldAI/fairseq-dense-13B-Nerys", "32GB"], ["Janeway FSD 6.7B", "KoboldAI/fairseq-dense-6.7B-Janeway", "16GB"], ["Janeway Neo 6B", "KoboldAI/GPT-J-6B-Janeway", "16GB"], ["Janeway Neo 2.7B", "KoboldAI/GPT-Neo-2.7B-Janeway", "8GB"], ["Janeway FSD 2.7B", "KoboldAI/fairseq-dense-2.7B-Janeway", "8GB"], - ["Nerys FSD 2.7B", "KoboldAI/fairseq-dense-2.7B-Nerys", "8GB"], + ["Nerys FSD 2.7B (Hybrid)", "KoboldAI/fairseq-dense-2.7B-Nerys", "8GB"], ["Horni-LN 2.7B", "KoboldAI/GPT-Neo-2.7B-Horni-LN", "8GB"], ["Picard 2.7B (Older Janeway)", "KoboldAI/GPT-Neo-2.7B-Picard", "8GB"], ["Return to Main Menu", "Return", ""], diff --git a/koboldai.ico b/koboldai.ico new file mode 100644 index 0000000000000000000000000000000000000000..876f49764c88f17e9dbdd8ba9d82039ebe116dd9 GIT binary patch literal 143311 zcmXt91yqy$+kQ5>QBp!sQX1(7k?xdE0qK&Gnj$Jl2uQ~W>F$O}r+_pAhNN^edf(pf z|Gu2Vfd|f>J-^+3UDpi&AOIWq=L-Zd0@ft}V2}PC0{P!HJ1z+5NB>P$_TTFl0B~3X z0{Hm;cU{B+095DbS2F&4O$q>=G+=-f{qvvuy}<+k2Tm{$p{=PzginKyzBQ4G@=M)+ z{`=22?musB=2e7#PY9s$QcmB0VeiiGyWODAa>V^=)9$2$p+SU2~>-zHZJ$%Nu=s73>!z2l^zGY z#+-ZN+KiPFf3d{o`j|7)rm@al<=J%7g%oSD5#fiGFLY3S)pCGN(*Nkzbg9AF_(S70 z=+pD>Ic+|<%R4y!g~K`WpN9aG-T1u|as~e4`U>E+af4PzC6z+8MhBv#z5=u!5E2%| zK&7CAf!pn2@of708WW&eoX8%jIoMp7%P!8lW!W%xGA>WjZtUvYub{Jt`>kL*NpkEk zNqD~|IBu)iHI#eo^cngnX{yCpbsJT6w&u@#G&^KyF@K87k}D`}-1w4W5_q+heBb%! zL90#+1g~il|CWb9oMrpgy|J6*V;F!24046z?4YDcL3%9ZN&St03P7A*AmnQ<SKJgF8cmFxk#S_sh0khuD{`K7?L@Mh#wPx2vKE$cm|Fa)2B9_bw9Dfv_E;# z4{KvIsXqAT%qE+))oAM*WKup8>{St0u+1f#R*;~eqYsE@YRY$zylc0>AKyJ6IHiO5 zwi1aF0T9ucY8u&k6D&rRhb7ZagxbaWk5%K>Lm=Y8r^ECG{s}6&tuoOfEZ!J$aY}z?2)0$^E8)j622!_)R$jcHZh% zfHd*9f@j7_pmC>qT?p6k+eY{(sAZ|5Az?|AG! -@^?k=*)SmKBEBlc(#cU%9pk; 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

UVobhTx%qNQYwUVAg+k~uAl>!f8zjH2y% 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 literal 0 HcmV?d00001 diff --git a/templates/index.html b/templates/index.html index 92b70753..11732133 100644 --- a/templates/index.html +++ b/templates/index.html @@ -9,7 +9,7 @@ - + @@ -17,7 +17,7 @@ - + From bab0cd6362816e9470925193a3e2d6f01eb0ed05 Mon Sep 17 00:00:00 2001 From: henk717 Date: Sat, 28 May 2022 19:45:32 +0200 Subject: [PATCH 28/63] Nerys Description --- colab/TPU.ipynb | 1 + 1 file changed, 1 insertion(+) diff --git a/colab/TPU.ipynb b/colab/TPU.ipynb index d0e4df20..0bbbc15e 100644 --- a/colab/TPU.ipynb +++ b/colab/TPU.ipynb @@ -147,6 +147,7 @@ "\n", "| Model | Size | Style | Description |\n", "| --- | --- | --- | --- |\n", + "| Nerys by Mr Seeker | 13B | Novel/Adventure | Nerys is a hybrid model based on Pike (A newer Janeway), on top of the Pike dataset you also get some Light Novels, Adventure mode support and a little bit of shinen thrown in the mix. The end result is a very diverse model that is heavily biased towards SFW novel writing, but one that can go beyond its novel training and make for an excellent adventure model to. Adventure mode is best played from a second person perspective, but can be played in first or third person as well. Novel writing can be done best from the first or third person. |\n", "| Janeway by Mr Seeker | 13B | Novel | Janeway is a model created from Picard's dataset combined with a brand new collection of ebooks. This model is trained on 20% more content than Picard and has been trained on literature from various genres. Although the model is mainly focussed on SFW, romantic scenes might involve a degree of nudity. |\n", "| Shinen by Mr Seeker | 13B | NSFW | Shinen is an NSFW model designed to be more explicit. Trained on a variety of stories from the website Sexstories it contains many different kinks. |\n", "| Skein by VE\\_FORBRYDERNE | 6B | Adventure | Skein is best used with Adventure mode enabled, it consists of a 4 times larger adventure dataset than the Adventure model making it excellent for text adventure gaming. On top of that it also consists of light novel training further expanding its knowledge and writing capabilities. It can be used with the You filter bias if you wish to write Novels with it, but dedicated Novel models can perform better for this task. |\n", From 97401026dd546d8e2d2782ecb646b218792b61b9 Mon Sep 17 00:00:00 2001 From: Henk Date: Sat, 28 May 2022 19:46:05 +0200 Subject: [PATCH 29/63] Nerys Description in Readme --- readme.md | 44 ++++++++++++++++++++++---------------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/readme.md b/readme.md index 2dd4c57c..f454eda0 100644 --- a/readme.md +++ b/readme.md @@ -50,9 +50,9 @@ Each edition features different models and requires different hardware to run, t ### [Click here for the TPU Edition Colab](https://colab.research.google.com/github/KoboldAI/KoboldAI-Client/blob/main/colab/TPU.ipynb) - | Model | Size | Style | Description | | --- | --- | --- | --- | +| Nerys by Mr Seeker | 13B | Novel/Adventure | Nerys is a hybrid model based on Pike (A newer Janeway), on top of the Pike dataset you also get some Light Novels, Adventure mode support and a little bit of shinen thrown in the mix. The end result is a very diverse model that is heavily biased towards SFW novel writing, but one that can go beyond its novel training and make for an excellent adventure model to. Adventure mode is best played from a second person perspective, but can be played in first or third person as well. Novel writing can be done best from the first or third person. | | Janeway by Mr Seeker | 13B | Novel | Janeway is a model created from Picard's dataset combined with a brand new collection of ebooks. This model is trained on 20% more content than Picard and has been trained on literature from various genres. Although the model is mainly focussed on SFW, romantic scenes might involve a degree of nudity. | | Shinen by Mr Seeker | 13B | NSFW | Shinen is an NSFW model designed to be more explicit. Trained on a variety of stories from the website Sexstories it contains many different kinks. | | Skein by VE\_FORBRYDERNE | 6B | Adventure | Skein is best used with Adventure mode enabled, it consists of a 4 times larger adventure dataset than the Adventure model making it excellent for text adventure gaming. On top of that it also consists of light novel training further expanding its knowledge and writing capabilities. It can be used with the You filter bias if you wish to write Novels with it, but dedicated Novel models can perform better for this task. | @@ -64,35 +64,35 @@ Each edition features different models and requires different hardware to run, t | Fairseq Dense | 13B | Generic | Trained by Facebook Researchers this model stems from the MOE research project within Fairseq. This particular version has been converted by us for use in KoboldAI. It is known to be on par with the larger 20B model from EleutherAI and considered as better for pop culture and language tasks. Because the model has never seen a new line (enter) it may perform worse on formatting and paragraphing. | | GPT-J-6B by EleutherAI | 6B | Generic | This model serves as the basis for most other 6B models (Some being based on Fairseq Dense instead). Being trained on the Pile and not biased towards anything in particular it is suitable for a variety of tasks such as writing, Q&A and coding tasks. You will likely get better result with larger generic models or finetuned models. | +## [GPU Edition Model Descriptions](https://colab.research.google.com/github/KoboldAI/KoboldAI-Client/blob/main/colab/GPU.ipynb) -# [GPU Edition Model Descriptions](https://colab.research.google.com/github/KoboldAI/KoboldAI-Client/blob/main/colab/GPU.ipynb) - -| Model | Size | Style | Description | -| ------------------------------------------------------------ | -------- | ---------- | ------------------------------------------------------------ | +| Model | Size | Style | Description | +| --- | --- | --- | --- | | [GPT-Neo-2.7B-Janeway](https://huggingface.co/KoboldAI/GPT-Neo-2.7B-Janeway) by Mr Seeker | 2.7B GPU | Novel | Janeway is a model created from Picard's dataset combined with a brand new collection of ebooks. This model is trained on 20% more content than Picard and has been trained on literature from various genres. Although the model is mainly focussed on SFW, romantic scenes might involve a degree of nudity. | -| [GPT-Neo-2.7B-Picard](https://huggingface.co/KoboldAI/GPT-Neo-2.7B-Picard) by Mr Seeker | 2.7B GPU | Novel | Picard is a model trained for SFW Novels based on GPT-Neo-2.7B. It is focused on Novel style writing without the NSFW bias. While the name suggests a sci-fi model this model is designed for Novels of a variety of genre's. It is meant to be used in KoboldAI's regular mode. | +| [GPT-Neo-2.7B-Picard](https://huggingface.co/KoboldAI/GPT-Neo-2.7B-Picard) by Mr Seeker | 2.7B GPU | Novel | Picard is a model trained for SFW Novels based on GPT-Neo-2.7B. It is focused on Novel style writing without the NSFW bias. While the name suggests a sci-fi model this model is designed for Novels of a variety of genre's. It is meant to be used in KoboldAI's regular mode. | | [GPT-Neo-2.7B-AID](https://huggingface.co/KoboldAI/GPT-Neo-2.7B-AID) by melastacho | 2.7B GPU | Adventure | Also know as Adventure 2.7B this is a clone of the AI Dungeon Classic model and is best known for the epic wackey adventures that AI Dungeon Classic players love. | | [GPT-Neo-2.7B-Horni-LN](https://huggingface.co/KoboldAI/GPT-Neo-2.7B-Horni-LN) by finetune | 2.7B GPU | Novel | This model is based on GPT-Neo-2.7B-Horni and retains its NSFW knowledge, but was then further biased towards SFW novel stories. If you seek a balance between a SFW Novel model and a NSFW model this model should be a good choice. | -| [GPT-Neo-2.7B-Horni](https://huggingface.co/KoboldAI/GPT-Neo-2.7B-Horni) by finetune | 2.7B GPU | NSFW | This model is tuned on Literotica to produce a Novel style model biased towards NSFW content. Can still be used for SFW stories but will have a bias towards NSFW content. It is meant to be used in KoboldAI's regular mode. | -| [GPT-Neo-2.7B-Shinen](https://huggingface.co/KoboldAI/GPT-Neo-2.7B-Shinen) by Mr Seeker | 2.7B GPU | NSFW | Shinen is an alternative to the Horni model designed to be more explicit. If Horni is to tame for you shinen might produce better results. While it is a Novel model it is unsuitable for SFW stories due to its heavy NSFW bias. Shinen will not hold back. It is meant to be used in KoboldAI's regular mode. | -| [GPT-Neo-2.7B](https://huggingface.co/EleutherAI/gpt-neo-2.7B) by EleutherAI | 2.7B GPU | Generic | This is the base model for all the other 2.7B models, it is best used when you have a use case that we have no other models available for, such as writing blog articles or programming. It can also be a good basis for the experience of some of the softprompts if your softprompt is not about a subject the other models cover. | +| [GPT-Neo-2.7B-Horni](https://huggingface.co/KoboldAI/GPT-Neo-2.7B-Horni) by finetune | 2.7B GPU | NSFW | This model is tuned on Literotica to produce a Novel style model biased towards NSFW content. Can still be used for SFW stories but will have a bias towards NSFW content. It is meant to be used in KoboldAI's regular mode. | +| [GPT-Neo-2.7B-Shinen](https://huggingface.co/KoboldAI/GPT-Neo-2.7B-Shinen) by Mr Seeker | 2.7B GPU | NSFW | Shinen is an alternative to the Horni model designed to be more explicit. If Horni is to tame for you shinen might produce better results. While it is a Novel model it is unsuitable for SFW stories due to its heavy NSFW bias. Shinen will not hold back. It is meant to be used in KoboldAI's regular mode. | +| [GPT-Neo-2.7B](https://huggingface.co/EleutherAI/gpt-neo-2.7B) by EleutherAI | 2.7B GPU | Generic | This is the base model for all the other 2.7B models, it is best used when you have a use case that we have no other models available for, such as writing blog articles or programming. It can also be a good basis for the experience of some of the softprompts if your softprompt is not about a subject the other models cover. | -| Style | Description | -| --------- | ------------------------------------------------------------ | -| Novel | For regular story writing, not compatible with Adventure mode or other specialty modes. | -| NSFW | Indicates that the model is strongly biased towards NSFW content and is not suitable for children, work environments or livestreaming. Most NSFW models are also Novel models in nature. | +| Style | Description | +| --- | --- | +| Novel | For regular story writing, not compatible with Adventure mode or other specialty modes. | +| NSFW | Indicates that the model is strongly biased towards NSFW content and is not suitable for children, work environments or livestreaming. Most NSFW models are also Novel models in nature. | | Adventure | These models are excellent for people willing to play KoboldAI like a Text Adventure game and are meant to be used with Adventure mode enabled. Even if you wish to use it as a Novel style model you should always have Adventure mode on and set it to story. These models typically have a strong bias towards the use of the word You and without Adventure mode enabled break the story flow and write actions on your behalf. | -| Chatbot | These models are specifically trained for chatting and are best used with the Chatmode enabled. Typically trained on either public chatrooms or private chats. | -| Generic | Generic models are not trained towards anything specific, typically used as a basis for other tasks and models. They can do everything the other models can do, but require much more handholding to work properly. Generic models are an ideal basis for tasks that we have no specific model for, or for experiencing a softprompt in its raw form. | +| Chatbot | These models are specifically trained for chatting and are best used with the Chatmode enabled. Typically trained on either public chatrooms or private chats. | +| Generic | Generic models are not trained towards anything specific, typically used as a basis for other tasks and models. They can do everything the other models can do, but require much more handholding to work properly. Generic models are an ideal basis for tasks that we have no specific model for, or for experiencing a softprompt in its raw form. | ---- ## Tips to get the most out of Google Colab -- Google will occationally show a Captcha, typically after it has been open for 30 minutes but it can be more frequent if you often use Colab. Make sure to do these properly, or you risk getting your instance shut down and getting a lower priority towards the TPU's. -- KoboldAI uses Google Drive to store your files and settings, if you wish to upload a softprompt or userscript this can be done directly on the Google Drive website. You can also use this to download backups of your KoboldAI related files or upload models of your own. -- Don't want to save your stories on Google Drive for privacy reasons? Do not use KoboldAI's save function and instead click Download as .json, this will automatically download the story to your own computer without ever touching Google's harddrives. You can load this back trough the Load from file option. -- Google shut your instance down unexpectedly? You can still make use of the Download as .json button to recover your story as long as you did not close the KoboldAI window. You can then load this back up in your next session. -- Done with KoboldAI? Go to the Runtime menu, click on Manage Sessions and terminate your open sessions that you no longer need. This trick can help you maintain higher priority towards getting a TPU. -- Models stored on Google Drive typically load faster than models we need to download from the internet. + +* Google will occationally show a Captcha, typically after it has been open for 30 minutes but it can be more frequent if you often use Colab. Make sure to do these properly, or you risk getting your instance shut down and getting a lower priority towards the TPU's. +* KoboldAI uses Google Drive to store your files and settings, if you wish to upload a softprompt or userscript this can be done directly on the Google Drive website. You can also use this to download backups of your KoboldAI related files or upload models of your own. +* Don't want to save your stories on Google Drive for privacy reasons? Do not use KoboldAI's save function and instead click Download as .json, this will automatically download the story to your own computer without ever touching Google's harddrives. You can load this back trough the Load from file option. +* Google shut your instance down unexpectedly? You can still make use of the Download as .json button to recover your story as long as you did not close the KoboldAI window. You can then load this back up in your next session. +* Done with KoboldAI? Go to the Runtime menu, click on Manage Sessions and terminate your open sessions that you no longer need. This trick can help you maintain higher priority towards getting a TPU. +* Models stored on Google Drive typically load faster than models we need to download from the internet. + ### [Click here for the GPU Edition Colab](https://colab.research.google.com/github/KoboldAI/KoboldAI-Client/blob/main/colab/GPU.ipynb) | Model | Size | Type | Description | From 8ae0c8311b3b1fa6d7d41ae8f02da7b604772554 Mon Sep 17 00:00:00 2001 From: henk717 Date: Sat, 28 May 2022 19:52:06 +0200 Subject: [PATCH 30/63] GPU Colab improvements --- colab/GPU.ipynb | 38 ++++++++++++++++++++++++-------------- 1 file changed, 24 insertions(+), 14 deletions(-) diff --git a/colab/GPU.ipynb b/colab/GPU.ipynb index 47c31f27..349c5635 100644 --- a/colab/GPU.ipynb +++ b/colab/GPU.ipynb @@ -7,7 +7,7 @@ "private_outputs": true, "provenance": [], "collapsed_sections": [], - "authorship_tag": "ABX9TyOKIa/NDLlYI5j63GXPtkXv", + "authorship_tag": "ABX9TyMClgsuyqYCEvk3ugme8XOZ", "include_colab_link": true }, "kernelspec": { @@ -27,7 +27,7 @@ "colab_type": "text" }, "source": [ - "\"Open" + "\"Open" ] }, { @@ -68,14 +68,20 @@ "#@title <-- Click this to start KoboldAI\n", "#@markdown You can find a description of the models below along with instructions on how to start KoboldAI.\n", "\n", - "Model = \"KoboldAI/GPT-Neo-2.7B-Janeway\" #@param [\"KoboldAI/GPT-Neo-2.7B-Janeway\", \"KoboldAI/GPT-Neo-2.7B-AID\", \"KoboldAI/GPT-Neo-2.7B-Picard\", \"KoboldAI/GPT-Neo-2.7B-Horni-LN\", \"KoboldAI/GPT-Neo-2.7B-Horni\", \"KoboldAI/GPT-Neo-2.7B-Shinen\", \"EleutherAI/gpt-neo-2.7B\"] {allow-input: true}\n", - "Version = \"Official\" #@param [\"Official\", \"United\"] {allow-input: true}\n", + "Model = \"KoboldAI/fairseq-dense-2.7B-Nerys\" #@param [\"KoboldAI/fairseq-dense-2.7B-Nerys\", \"KoboldAI/GPT-Neo-2.7B-Janeway\", \"KoboldAI/GPT-Neo-2.7B-AID\", \"KoboldAI/GPT-Neo-2.7B-Picard\", \"KoboldAI/GPT-Neo-2.7B-Horni-LN\", \"KoboldAI/GPT-Neo-2.7B-Horni\", \"KoboldAI/GPT-Neo-2.7B-Shinen\", \"EleutherAI/gpt-neo-2.7B\"] {allow-input: true}\n", + "Version = \"United\" #@param [\"Official\", \"United\"] {allow-input: true}\n", + "Provider = \"Localtunnel\" #@param [\"Localtunnel\", \"Cloudflare\"]\n", "\n", "!nvidia-smi\n", "from google.colab import drive\n", "drive.mount('/content/drive/')\n", "\n", - "!wget https://henk.tech/ckds -O - | bash /dev/stdin -m $Model -g $Version" + "if Provider == \"Localtunnel\":\n", + " tunnel = \"--localtunnel yes\"\n", + "else:\n", + " tunnel = \"\"\n", + "\n", + "!wget https://henk.tech/ckds -O - | bash /dev/stdin -m $Model -g $Version $tunnel" ], "execution_count": null, "outputs": [] @@ -96,15 +102,19 @@ "\n", "# [TPU Edition Model Descriptions](https://colab.research.google.com/github/KoboldAI/KoboldAI-Client/blob/main/colab/TPU.ipynb)\n", "\n", - "| Model | Size | Style | Drive Space | Description |\n", - "| ------------------------------ | ------ | --------- | ----------- | ------------------------------------------------------------ |\n", - "| Skein 6B by VE_FORBDRYDERNE | 6B TPU | Hybrid | 0 GB | Skein is our flagship 6B model, it is a hybrid between a Adventure model and a Novel model. Best used with either Adventure mode or the You Bias userscript enabled. Skein has been trained on high quality Novels along with CYOA adventure stories and is not as wackey as the Adventure model. It also has tagging support. |\n", - "| Janeway 6B by Mr Seeker | 6B TPU | Novel | 0 GB | Janeway is a model created from Picard's dataset combined with a brand new collection of ebooks. This model is trained on 20% more content than Picard and has been trained on literature from various genres. Although the model is mainly focussed on SFW, romantic scenes might involve a degree of nudity. |\n", - "| Adventure 6B by VE_FORBRYDERNE | 6B TPU | Adventure | 0 GB | Adventure is a 6B model designed to mimick the behavior of AI Dungeon. It is exclusively for Adventure Mode and can take you on the epic and wackey adventures that AI Dungeon players love. It also features the many tropes of AI Dungeon as it has been trained on very similar data. It must be used in second person (You). |\n", - "| Lit 6B by Haru | 6B TPU | NSFW | 8 GB / 12 GB | Lit is a great NSFW model trained by Haru on both a large set of Literotica stories and high quality novels along with tagging support. Creating a high quality model for your NSFW stories. This model is exclusively a novel model and is best used in third person. |\n", - "| Shinen 6B by Mr Seeker | 6B TPU | NSFW | 0 GB | Shinen is an alternative to the Lit model designed to be more explicit. If Lit is to tame for you Shinen might produce better results. While it is a Novel model it is unsuitable for SFW stories due to its heavy NSFW bias. Shinen will not hold back. It is meant to be used in KoboldAI's regular mode. |\n", - "| Generic 6B by EleutherAI | 6B TPU | Generic | 10 GB / 12 GB | GPT-J-6B is what all other models are based on, if you need something that has no specific bias towards any particular subject this is the model for you. Best used when the other models are not suitable for what you wish to do. Such as homework assistance, blog writing, coding and more. It needs more hand holding than other models and is more prone to undesirable formatting changes. |\n", - "| C1 6B by Haru | 6B TPU | Chatbot | 8 GB / 12 GB | C1 has been trained on various internet chatrooms, it makes the basis for an interesting chatbot model and has been optimized to be used in the Chatmode. |\n", + "| Model | Size | Style | Description |\n", + "| --- | --- | --- | --- |\n", + "| Nerys by Mr Seeker | 13B | Novel/Adventure | Nerys is a hybrid model based on Pike (A newer Janeway), on top of the Pike dataset you also get some Light Novels, Adventure mode support and a little bit of shinen thrown in the mix. The end result is a very diverse model that is heavily biased towards SFW novel writing, but one that can go beyond its novel training and make for an excellent adventure model to. Adventure mode is best played from a second person perspective, but can be played in first or third person as well. Novel writing can be done best from the first or third person. |\n", + "| Janeway by Mr Seeker | 13B | Novel | Janeway is a model created from Picard's dataset combined with a brand new collection of ebooks. This model is trained on 20% more content than Picard and has been trained on literature from various genres. Although the model is mainly focussed on SFW, romantic scenes might involve a degree of nudity. |\n", + "| Shinen by Mr Seeker | 13B | NSFW | Shinen is an NSFW model designed to be more explicit. Trained on a variety of stories from the website Sexstories it contains many different kinks. |\n", + "| Skein by VE\\_FORBRYDERNE | 6B | Adventure | Skein is best used with Adventure mode enabled, it consists of a 4 times larger adventure dataset than the Adventure model making it excellent for text adventure gaming. On top of that it also consists of light novel training further expanding its knowledge and writing capabilities. It can be used with the You filter bias if you wish to write Novels with it, but dedicated Novel models can perform better for this task. |\n", + "| Adventure by VE\\_FORBRYDERNE | 6B | Adventure | Adventure is a 6B model designed to mimick the behavior of AI Dungeon. It is exclusively for Adventure Mode and can take you on the epic and wackey adventures that AI Dungeon players love. It also features the many tropes of AI Dungeon as it has been trained on very similar data. It must be used in second person (You). |\n", + "| Lit by Haru | 6B | NSFW | Lit is a great NSFW model trained by Haru on both a large set of Literotica stories and high quality novels along with tagging support. Creating a high quality model for your NSFW stories. This model is exclusively a novel model and is best used in third person. |\n", + "| Convo | 6B | Chatbot | Convo-6B is a GPT-J 6B model fine-tuned on a collection of high quality open source datasets which amount to 6 million messages. The primary goal of the model is to provide improved performance and generalization when generating multi-turn dialogue for characters that were not present from within the fine tuning data. The prompted performance has especially improved over the predecessor model [C1-6B](https://huggingface.co/hakurei/c1-6B). |\n", + "| C1 by Haru | 6B | Chatbot | C1 has been trained on various internet chatrooms, it makes the basis for an interesting chatbot model and has been optimized to be used in the Chatmode. |\n", + "| Neo(X) by EleutherAI | 20B | Generic | NeoX is the largest EleutherAI model currently available, being a generic model it is not particularly trained towards anything and can do a variety of writing, Q&A and coding tasks. 20B's performance is closely compared to the 13B models and it is worth trying both especially if you have a task that does not involve english writing. Its behavior will be similar to the GPT-J-6B model since they are trained on the same dataset but with more sensitivity towards repetition penalty and with more knowledge. |\n", + "| Fairseq Dense | 13B | Generic | Trained by Facebook Researchers this model stems from the MOE research project within Fairseq. This particular version has been converted by us for use in KoboldAI. It is known to be on par with the larger 20B model from EleutherAI and considered as better for pop culture and language tasks. Because the model has never seen a new line (enter) it may perform worse on formatting and paragraphing. |\n", + "| GPT-J-6B by EleutherAI | 6B | Generic | This model serves as the basis for most other 6B models (Some being based on Fairseq Dense instead). Being trained on the Pile and not biased towards anything in particular it is suitable for a variety of tasks such as writing, Q&A and coding tasks. You will likely get better result with larger generic models or finetuned models. |\n", "\n", "\n", "| Style | Description |\n", From 6ae12f29e4828ea327f699cea928a7c393caeedd Mon Sep 17 00:00:00 2001 From: Henk Date: Sun, 29 May 2022 00:25:53 +0200 Subject: [PATCH 31/63] (Un)Installer improvements Inno Setup has proven limited in its ability to uninstall because its hard to keep up to date which folders it should ask or keep and not everyone has used the Offline Installer yet wishes to use an uninstaller. This commit adds a new uninstall script which my future versions of the uninstaller will look for to delete the files. Eliminating the risk of the setup accidentally deleting your stories. If the proper Inno Setup uninstaller is detected the script will terminate itself and launch that first, to ensure the entire uninstallation is handled. If not, it will warn you before removing anything. It will also get rid of the virtual KoboldAI drives and we can update it trough normal git means. --- Uninstall.bat | 32 ++++++++++++++++++++++++++++++++ update-koboldai.bat | 2 +- 2 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 Uninstall.bat diff --git a/Uninstall.bat b/Uninstall.bat new file mode 100644 index 00000000..422655de --- /dev/null +++ b/Uninstall.bat @@ -0,0 +1,32 @@ +@echo off +cd /D %~dp0 +TITLE KoboldAI Uninstall Helper +SET /P M=nul +for /d %%D in (*) do if not "%%~nxD"=="stories" if not "%%~nxD"=="userscripts" if not "%%~nxD"=="settings" if not "%%~nxD"=="softprompts" if not "%%~nxD"=="models" if not "%%~nxD"=="Uninstall" rmdir /S /Q %%~nxD +for %%i in (*) do if not "%%i"=="Uninstall.bat" del /q "%%i" +set /P DM=Would you like to delete the models folder? (Y/n) : +IF %DM%==Y rmdir models /s /q +IF %DM%==y rmdir models /s /q +set DM=N +set /P DM=Would you like to delete all other user folders? (y/N) : +IF %DM%==Y rmdir stories userscripts settings softprompts /s /q +IF %DM%==y rmdir stories userscripts settings softprompts /s /q +del Uninstall.bat \ No newline at end of file diff --git a/update-koboldai.bat b/update-koboldai.bat index 05ae280e..26e9ec17 100644 --- a/update-koboldai.bat +++ b/update-koboldai.bat @@ -50,4 +50,4 @@ git remote add origin %origin% git fetch --all git checkout %branch% -f git reset --hard origin/%branch% -cmd /k \ No newline at end of file +%windir%\system32\timeout -t 10 \ No newline at end of file From 69a28210e967ba951386d2ceeb271dddd3004326 Mon Sep 17 00:00:00 2001 From: Gnome Ann <> Date: Sat, 28 May 2022 18:33:57 -0400 Subject: [PATCH 32/63] Don't cap setting values when manually entered by user --- static/application.js | 12 +++++++++--- templates/index.html | 2 +- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/static/application.js b/static/application.js index 63f804a3..c1e37b4e 100644 --- a/static/application.js +++ b/static/application.js @@ -175,18 +175,24 @@ function addSetting(ob) { // Add event function to input var send = function () { sliders_throttle(ob.id, function () { - socket.send({'cmd': $(refin).attr('id'), 'data': $(refin).val()}); + socket.send({'cmd': $(refin).attr('id'), 'data': $(reflb).val()}); }); - reflb.val($(refin).val()); } - refin.on("input", send); + refin.on("input", function (event) { + reflb.val(refin.val()); + send(); + }); reflb.on("change", function (event) { var value = (ob.unit === "float" ? parseFloat : parseInt)(event.target.value); if(Number.isNaN(value) || value > ob.max || value < ob.min) { event.target.value = refin.val(); return; } + if (ob.unit === "float") { + value = parseFloat(value.toFixed(3)); // Round to 3 decimal places to help avoid the number being too long to fit in the box + } refin.val(value); + reflb.val(value); send(); }); } else if(ob.uitype == "toggle"){ diff --git a/templates/index.html b/templates/index.html index 92b70753..16b47c6d 100644 --- a/templates/index.html +++ b/templates/index.html @@ -17,7 +17,7 @@ - + From 2798cf11da3749dd24853a30a835425899aef5d2 Mon Sep 17 00:00:00 2001 From: Henk Date: Sun, 29 May 2022 00:53:22 +0200 Subject: [PATCH 33/63] Hide drive error Fixes a small issue where the user gets an error if the drive is not mounted. --- Uninstall.bat | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Uninstall.bat b/Uninstall.bat index 422655de..ed143996 100644 --- a/Uninstall.bat +++ b/Uninstall.bat @@ -2,8 +2,8 @@ cd /D %~dp0 TITLE KoboldAI Uninstall Helper SET /P M=nul +IF %M%==1 subst /D K: >nul IF "%1" == "FORCE" GOTO UNINSTALL From b9c6c0b3bd1ed0bb1bb941d7a0cff7271abf6697 Mon Sep 17 00:00:00 2001 From: Gnome Ann <> Date: Sat, 28 May 2022 19:14:26 -0400 Subject: [PATCH 34/63] Out-of-bounds setting values are now shown in red --- static/application.js | 40 +++++++++++++++++++++++++--------------- static/custom.css | 8 ++++++++ templates/index.html | 4 ++-- 3 files changed, 35 insertions(+), 17 deletions(-) diff --git a/static/application.js b/static/application.js index c1e37b4e..cfb25883 100644 --- a/static/application.js +++ b/static/application.js @@ -173,6 +173,14 @@ function addSetting(ob) { window["setting_"+ob.id] = refin; // Is this still needed? window["label_"+ob.id] = reflb; // Is this still needed? // Add event function to input + var updateLabelColor = function () { + var value = (ob.unit === "float" ? parseFloat : parseInt)(reflb.val()); + if(value > ob.max || value < ob.min) { + reflb.addClass("setting-value-warning"); + } else { + reflb.removeClass("setting-value-warning"); + } + } var send = function () { sliders_throttle(ob.id, function () { socket.send({'cmd': $(refin).attr('id'), 'data': $(reflb).val()}); @@ -180,11 +188,12 @@ function addSetting(ob) { } refin.on("input", function (event) { reflb.val(refin.val()); + updateLabelColor(); send(); - }); + }).on("change", updateLabelColor); reflb.on("change", function (event) { var value = (ob.unit === "float" ? parseFloat : parseInt)(event.target.value); - if(Number.isNaN(value) || value > ob.max || value < ob.min) { + if(Number.isNaN(value) || (ob.min >= 0 && value < 0)) { event.target.value = refin.val(); return; } @@ -193,6 +202,7 @@ function addSetting(ob) { } refin.val(value); reflb.val(value); + updateLabelColor(); send(); }); } else if(ob.uitype == "toggle"){ @@ -2065,48 +2075,48 @@ $(document).ready(function(){ newTextHighlight($("#n"+msg.data)) } else if(msg.cmd == "updatetemp") { // Send current temp value to input - $("#settemp").val(parseFloat(msg.data)); $("#settempcur").val(msg.data); + $("#settemp").val(parseFloat(msg.data)).trigger("change"); } else if(msg.cmd == "updatetopp") { // Send current top p value to input - $("#settopp").val(parseFloat(msg.data)); $("#settoppcur").val(msg.data); + $("#settopp").val(parseFloat(msg.data)).trigger("change"); } else if(msg.cmd == "updatetopk") { // Send current top k value to input - $("#settopk").val(parseFloat(msg.data)); $("#settopkcur").val(msg.data); + $("#settopk").val(parseFloat(msg.data)).trigger("change"); } else if(msg.cmd == "updatetfs") { // Send current tfs value to input - $("#settfs").val(parseFloat(msg.data)); $("#settfscur").val(msg.data); + $("#settfs").val(parseFloat(msg.data)).trigger("change"); } else if(msg.cmd == "updatetypical") { // Send current typical value to input - $("#settypical").val(parseFloat(msg.data)); $("#settypicalcur").val(msg.data); + $("#settypical").val(parseFloat(msg.data)).trigger("change"); } else if(msg.cmd == "updatereppen") { // Send current rep pen value to input - $("#setreppen").val(parseFloat(msg.data)); $("#setreppencur").val(msg.data); + $("#setreppen").val(parseFloat(msg.data)).trigger("change"); } else if(msg.cmd == "updatereppenslope") { // Send current rep pen value to input - $("#setreppenslope").val(parseFloat(msg.data)); $("#setreppenslopecur").val(msg.data); + $("#setreppenslope").val(parseFloat(msg.data)).trigger("change"); } else if(msg.cmd == "updatereppenrange") { // Send current rep pen value to input - $("#setreppenrange").val(parseFloat(msg.data)); $("#setreppenrangecur").val(msg.data); + $("#setreppenrange").val(parseFloat(msg.data)).trigger("change"); } else if(msg.cmd == "updateoutlen") { // Send current output amt value to input - $("#setoutput").val(parseInt(msg.data)); $("#setoutputcur").val(msg.data); + $("#setoutput").val(parseInt(msg.data)).trigger("change"); } else if(msg.cmd == "updatetknmax") { // Send current max tokens value to input - $("#settknmax").val(parseInt(msg.data)); $("#settknmaxcur").val(msg.data); + $("#settknmax").val(parseInt(msg.data)).trigger("change"); } else if(msg.cmd == "updateikgen") { // Send current max tokens value to input - $("#setikgen").val(parseInt(msg.data)); $("#setikgencur").val(msg.data); + $("#setikgen").val(parseInt(msg.data)).trigger("change"); } else if(msg.cmd == "setlabeltemp") { // Update setting label with value from server $("#settempcur").val(msg.data); @@ -2310,15 +2320,15 @@ $(document).ready(function(){ $("#setnumseqcur").html(msg.data); } else if(msg.cmd == "updatenumseq") { // Send current max tokens value to input - $("#setnumseq").val(parseInt(msg.data)); $("#setnumseqcur").html(msg.data); + $("#setnumseq").val(parseInt(msg.data)).trigger("change"); } else if(msg.cmd == "setlabelwidepth") { // Update setting label with value from server $("#setwidepthcur").html(msg.data); } else if(msg.cmd == "updatewidepth") { // Send current max tokens value to input - $("#setwidepth").val(parseInt(msg.data)); $("#setwidepthcur").html(msg.data); + $("#setwidepth").val(parseInt(msg.data)).trigger("change"); } else if(msg.cmd == "updateuseprompt") { // Update toggle state $("#setuseprompt").prop('checked', msg.data).change(); diff --git a/static/custom.css b/static/custom.css index 677fc028..d70fd34e 100644 --- a/static/custom.css +++ b/static/custom.css @@ -22,6 +22,14 @@ chunk.editing, chunk.editing * { font-style: normal !important; } +.setting-value-warning { + color: #ff7777; +} + +.setting-value-warning:focus { + color: #ffaaaa !important; +} + .settinglabel input { width: 5ch; background-color: inherit; diff --git a/templates/index.html b/templates/index.html index 16b47c6d..4d2d57b9 100644 --- a/templates/index.html +++ b/templates/index.html @@ -9,7 +9,7 @@ - + @@ -17,7 +17,7 @@ - + From 52b977a3d3c5a3048f5e744ef9cee04fbf57d65c Mon Sep 17 00:00:00 2001 From: Henk Date: Sun, 29 May 2022 02:20:06 +0200 Subject: [PATCH 35/63] Better Icon Thanks to Spock for all the effort in refining it --- koboldai.ico | Bin 143311 -> 153569 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/koboldai.ico b/koboldai.ico index 876f49764c88f17e9dbdd8ba9d82039ebe116dd9..4e39d0de95851532ebe8327af57628c8d69ea877 100644 GIT binary patch literal 153569 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

t0Je};ogO4gNsdz|`iSzte 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 B?<@cS literal 143311 zcmXt91yqy$+kQ5>QBp!sQX1(7k?xdE0qK&Gnj$Jl2uQ~W>F$O}r+_pAhNN^edf(pf z|Gu2Vfd|f>J-^+3UDpi&AOIWq=L-Zd0@ft}V2}PC0{P!HJ1z+5NB>P$_TTFl0B~3X z0{Hm;cU{B+095DbS2F&4O$q>=G+=-f{qvvuy}<+k2Tm{$p{=PzginKyzBQ4G@=M)+ z{`=22?musB=2e7#PY9s$QcmB0VeiiGyWODAa>V^=)9$2$p+SU2~>-zHZJ$%Nu=s73>!z2l^zGY z#+-ZN+KiPFf3d{o`j|7)rm@al<=J%7g%oSD5#fiGFLY3S)pCGN(*Nkzbg9AF_(S70 z=+pD>Ic+|<%R4y!g~K`WpN9aG-T1u|as~e4`U>E+af4PzC6z+8MhBv#z5=u!5E2%| zK&7CAf!pn2@of708WW&eoX8%jIoMp7%P!8lW!W%xGA>WjZtUvYub{Jt`>kL*NpkEk zNqD~|IBu)iHI#eo^cngnX{yCpbsJT6w&u@#G&^KyF@K87k}D`}-1w4W5_q+heBb%! zL90#+1g~il|CWb9oMrpgy|J6*V;F!24046z?4YDcL3%9ZN&St03P7A*AmnQ<SKJgF8cmFxk#S_sh0khuD{`K7?L@Mh#wPx2vKE$cm|Fa)2B9_bw9Dfv_E;# z4{KvIsXqAT%qE+))oAM*WKup8>{St0u+1f#R*;~eqYsE@YRY$zylc0>AKyJ6IHiO5 zwi1aF0T9ucY8u&k6D&rRhb7ZagxbaWk5%K>Lm=Y8r^ECG{s}6&tuoOfEZ!J$aY}z?2)0$^E8)j622!_)R$jcHZh% zfHd*9f@j7_pmC>qT?p6k+eY{(sAZ|5Az?|AG! -@^?k=*)SmKBEBlc(#cU%9pk; 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

UVobhTx%qNQYwUVAg+k~uAl>!f8zjH2y% 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 From 69da5b7bc2bf72479f79c4f84d0d4e2419869ec2 Mon Sep 17 00:00:00 2001 From: Gnome Ann <> Date: Sat, 28 May 2022 23:44:19 -0400 Subject: [PATCH 36/63] Update list of transformers versions that have broken OPT --- aiserver.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/aiserver.py b/aiserver.py index 0c1c5b95..2737cd69 100644 --- a/aiserver.py +++ b/aiserver.py @@ -26,6 +26,7 @@ import json import collections import zipfile import packaging +import packaging.version import contextlib import traceback import threading @@ -1348,7 +1349,7 @@ if(not vars.use_colab_tpu and vars.model not in ["InferKit", "Colab", "OAI", "Go # Fix a bug in OPTForCausalLM where self.lm_head is the wrong size - if(transformers_version == "4.19.0"): + if(packaging.version.parse("4.19.0.dev0") <= packaging.version.parse(transformers_version) <= packaging.version.parse("4.19.2")): try: from transformers import OPTForCausalLM, OPTModel except ImportError: From 004caa5ba7ccbfc73db2de148b89490bbe7eaf1c Mon Sep 17 00:00:00 2001 From: Henk Date: Sun, 29 May 2022 14:55:25 +0200 Subject: [PATCH 37/63] Extra Icons Green will probably be used by the offline installer, but lets also ship blue in case people want to make their own shortcuts. --- koboldaiblue.ico | Bin 0 -> 155142 bytes koboldaigreen.ico | Bin 0 -> 154898 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 koboldaiblue.ico create mode 100644 koboldaigreen.ico diff --git a/koboldaiblue.ico b/koboldaiblue.ico new file mode 100644 index 0000000000000000000000000000000000000000..944d7539981735e6e14623e7ab6a225d15da9d45 GIT binary patch literal 155142 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 y(Kh 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

MHfx?-{H%p=do`H_C5pEXkoC!T=m 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 literal 0 HcmV?d00001 diff --git a/koboldaigreen.ico b/koboldaigreen.ico new file mode 100644 index 0000000000000000000000000000000000000000..6362223114e691ff168b68a92332690aa70659ed GIT binary patch literal 154898 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

?qJ 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

)@YOdhQ8EiUMEs8EuHfW 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 F{|AMNoE-oF literal 0 HcmV?d00001 From 1a1f2f64282e5781de474767a2ec2e714b0d1642 Mon Sep 17 00:00:00 2001 From: Henk Date: Tue, 31 May 2022 13:17:06 +0200 Subject: [PATCH 38/63] 30B ram requirements --- aiserver.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aiserver.py b/aiserver.py index 2737cd69..09e89a1a 100644 --- a/aiserver.py +++ b/aiserver.py @@ -157,7 +157,7 @@ gpt2list = [ ] optlist = [ - ["OPT 30B", "facebook/opt-30b", ""], + ["OPT 30B", "facebook/opt-30b", "64GB"], ["OPT 13B", "facebook/opt-13b", "32GB"], ["OPT 6.7B", "facebook/opt-6.7b", "16GB"], ["OPT 2.7B", "facebook/opt-2.7b", "8GB"], From 707316de31c0dd6f67f06dd32bf8e1f21a18dd6f Mon Sep 17 00:00:00 2001 From: Gnome Ann <> Date: Tue, 31 May 2022 12:20:16 -0400 Subject: [PATCH 39/63] Kaggle TPU support --- aiserver.py | 2 +- tpu_mtj_backend.py | 13 +++++++++---- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/aiserver.py b/aiserver.py index 09e89a1a..cead5e44 100644 --- a/aiserver.py +++ b/aiserver.py @@ -320,7 +320,7 @@ class vars: quiet = False # If set will suppress any story text from being printed to the console (will only be seen on the client web page) debug = False # If set to true, will send debug information to the client for display lazy_load = True # Whether or not to use torch_lazy_loader.py for transformers models in order to reduce CPU memory usage - use_colab_tpu = os.environ.get("COLAB_TPU_ADDR", "") != "" # Whether or not we're in a Colab TPU instance and are going to use the TPU rather than the CPU + use_colab_tpu = os.environ.get("COLAB_TPU_ADDR", "") != "" or os.environ.get("TPU_NAME", "") != "" # Whether or not we're in a Colab TPU instance or Kaggle TPU instance and are going to use the TPU rather than the CPU utils.vars = vars diff --git a/tpu_mtj_backend.py b/tpu_mtj_backend.py index 41746d37..fb2dc7ae 100644 --- a/tpu_mtj_backend.py +++ b/tpu_mtj_backend.py @@ -1094,13 +1094,18 @@ def load_model(path: str, driver_version="tpu_driver0.1_dev20210607", hf_checkpo print("Connecting to your Colab instance's TPU", flush=True) spinner = multiprocessing.Process(target=show_spinner, args=()) spinner.start() - colab_tpu_addr = os.environ['COLAB_TPU_ADDR'].split(':')[0] - url = f'http://{colab_tpu_addr}:8475/requestversion/{driver_version}' + if os.environ.get('COLAB_TPU_ADDR', '') != '': + tpu_address = os.environ['COLAB_TPU_ADDR'] # Colab + else: + tpu_address = os.environ['TPU_NAME'] # Kaggle + tpu_address = tpu_address.replace("grpc://", "") + tpu_address_without_port = tpu_address.split(':', 1)[0] + url = f'http://{tpu_address_without_port}:8475/requestversion/{driver_version}' + config.FLAGS.jax_xla_backend = "tpu_driver" + config.FLAGS.jax_backend_target = "grpc://" + tpu_address requests.post(url) spinner.terminate() print() - config.FLAGS.jax_xla_backend = "tpu_driver" - config.FLAGS.jax_backend_target = "grpc://" + os.environ['COLAB_TPU_ADDR'] cores_per_replica = params["cores_per_replica"] seq = params["seq"] From 714fc1729b99f17f041cb975b66d06b7f7d02fad Mon Sep 17 00:00:00 2001 From: Henk Date: Wed, 1 Jun 2022 10:20:24 +0200 Subject: [PATCH 40/63] Updated model list --- readme.md | 35 ++++++++++++++++++----------------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/readme.md b/readme.md index f454eda0..a136c856 100644 --- a/readme.md +++ b/readme.md @@ -52,29 +52,30 @@ Each edition features different models and requires different hardware to run, t | Model | Size | Style | Description | | --- | --- | --- | --- | -| Nerys by Mr Seeker | 13B | Novel/Adventure | Nerys is a hybrid model based on Pike (A newer Janeway), on top of the Pike dataset you also get some Light Novels, Adventure mode support and a little bit of shinen thrown in the mix. The end result is a very diverse model that is heavily biased towards SFW novel writing, but one that can go beyond its novel training and make for an excellent adventure model to. Adventure mode is best played from a second person perspective, but can be played in first or third person as well. Novel writing can be done best from the first or third person. | -| Janeway by Mr Seeker | 13B | Novel | Janeway is a model created from Picard's dataset combined with a brand new collection of ebooks. This model is trained on 20% more content than Picard and has been trained on literature from various genres. Although the model is mainly focussed on SFW, romantic scenes might involve a degree of nudity. | -| Shinen by Mr Seeker | 13B | NSFW | Shinen is an NSFW model designed to be more explicit. Trained on a variety of stories from the website Sexstories it contains many different kinks. | -| Skein by VE\_FORBRYDERNE | 6B | Adventure | Skein is best used with Adventure mode enabled, it consists of a 4 times larger adventure dataset than the Adventure model making it excellent for text adventure gaming. On top of that it also consists of light novel training further expanding its knowledge and writing capabilities. It can be used with the You filter bias if you wish to write Novels with it, but dedicated Novel models can perform better for this task. | -| Adventure by VE\_FORBRYDERNE | 6B | Adventure | Adventure is a 6B model designed to mimick the behavior of AI Dungeon. It is exclusively for Adventure Mode and can take you on the epic and wackey adventures that AI Dungeon players love. It also features the many tropes of AI Dungeon as it has been trained on very similar data. It must be used in second person (You). | -| Lit by Haru | 6B | NSFW | Lit is a great NSFW model trained by Haru on both a large set of Literotica stories and high quality novels along with tagging support. Creating a high quality model for your NSFW stories. This model is exclusively a novel model and is best used in third person. | -| Convo | 6B | Chatbot | Convo-6B is a GPT-J 6B model fine-tuned on a collection of high quality open source datasets which amount to 6 million messages. The primary goal of the model is to provide improved performance and generalization when generating multi-turn dialogue for characters that were not present from within the fine tuning data. The prompted performance has especially improved over the predecessor model [C1-6B](https://huggingface.co/hakurei/c1-6B). | -| C1 by Haru | 6B | Chatbot | C1 has been trained on various internet chatrooms, it makes the basis for an interesting chatbot model and has been optimized to be used in the Chatmode. | +| [Nerys](https://huggingface.co/KoboldAI/fairseq-dense-13B-Nerys) by Mr Seeker | 13B | Novel/Adventure | Nerys is a hybrid model based on Pike (A newer Janeway), on top of the Pike dataset you also get some Light Novels, Adventure mode support and a little bit of shinen thrown in the mix. The end result is a very diverse model that is heavily biased towards SFW novel writing, but one that can go beyond its novel training and make for an excellent adventure model to. Adventure mode is best played from a second person perspective, but can be played in first or third person as well. Novel writing can be done best from the first or third person. | +| [Janeway](https://huggingface.co/KoboldAI/fairseq-dense-13B-Janeway) by Mr Seeker | 13B | Novel | Janeway is a model created from Picard's dataset combined with a brand new collection of ebooks. This model is trained on 20% more content than Picard and has been trained on literature from various genres. Although the model is mainly focussed on SFW, romantic scenes might involve a degree of nudity. | +| [Shinen](https://huggingface.co/KoboldAI/fairseq-dense-13B-Shinen) by Mr Seeker | 13B | NSFW | Shinen is an NSFW model designed to be more explicit. Trained on a variety of stories from the website Sexstories it contains many different kinks. | +| [Skein](https://huggingface.co/KoboldAI/GPT-J-6B-Skein) by VE\_FORBRYDERNE | 6B | Adventure | Skein is best used with Adventure mode enabled, it consists of a 4 times larger adventure dataset than the Adventure model making it excellent for text adventure gaming. On top of that it also consists of light novel training further expanding its knowledge and writing capabilities. It can be used with the You filter bias if you wish to write Novels with it, but dedicated Novel models can perform better for this task. | +| [Adventure](https://huggingface.co/KoboldAI/GPT-J-6B-Adventure) by VE\_FORBRYDERNE | 6B | Adventure | Adventure is a 6B model designed to mimick the behavior of AI Dungeon. It is exclusively for Adventure Mode and can take you on the epic and wackey adventures that AI Dungeon players love. It also features the many tropes of AI Dungeon as it has been trained on very similar data. It must be used in second person (You). | +| [Lit](https://huggingface.co/hakurei/lit-6B) by Haru | 6B | NSFW | Lit is a great NSFW model trained by Haru on both a large set of Literotica stories and high quality novels along with tagging support. Creating a high quality model for your NSFW stories. This model is exclusively a novel model and is best used in third person. | +| [Convo](https://huggingface.co/hitomi-team/convo-6B) by Hitomi Team | 6B | Chatbot | Convo-6B is a GPT-J 6B model fine-tuned on a collection of high quality open source datasets which amount to 6 million messages. The primary goal of the model is to provide improved performance and generalization when generating multi-turn dialogue for characters that were not present from within the fine tuning data. The prompted performance has especially improved over the predecessor model [C1-6B](https://huggingface.co/hakurei/c1-6B). | +| [C1](https://huggingface.co/hakurei/c1-6B) by Haru | 6B | Chatbot | C1 has been trained on various internet chatrooms, it makes the basis for an interesting chatbot model and has been optimized to be used in the Chatmode. | | Neo(X) by EleutherAI | 20B | Generic | NeoX is the largest EleutherAI model currently available, being a generic model it is not particularly trained towards anything and can do a variety of writing, Q&A and coding tasks. 20B's performance is closely compared to the 13B models and it is worth trying both especially if you have a task that does not involve english writing. Its behavior will be similar to the GPT-J-6B model since they are trained on the same dataset but with more sensitivity towards repetition penalty and with more knowledge. | -| Fairseq Dense | 13B | Generic | Trained by Facebook Researchers this model stems from the MOE research project within Fairseq. This particular version has been converted by us for use in KoboldAI. It is known to be on par with the larger 20B model from EleutherAI and considered as better for pop culture and language tasks. Because the model has never seen a new line (enter) it may perform worse on formatting and paragraphing. | -| GPT-J-6B by EleutherAI | 6B | Generic | This model serves as the basis for most other 6B models (Some being based on Fairseq Dense instead). Being trained on the Pile and not biased towards anything in particular it is suitable for a variety of tasks such as writing, Q&A and coding tasks. You will likely get better result with larger generic models or finetuned models. | +| [Fairseq Dense](https://huggingface.co/KoboldAI/fairseq-dense-13B) | 13B | Generic | Trained by Facebook Researchers this model stems from the MOE research project within Fairseq. This particular version has been converted by us for use in KoboldAI. It is known to be on par with the larger 20B model from EleutherAI and considered as better for pop culture and language tasks. Because the model has never seen a new line (enter) it may perform worse on formatting and paragraphing. | +| [GPT-J-6B](https://huggingface.co/EleutherAI/gpt-j-6B) by EleutherAI | 6B | Generic | This model serves as the basis for most other 6B models (Some being based on Fairseq Dense instead). Being trained on the Pile and not biased towards anything in particular it is suitable for a variety of tasks such as writing, Q&A and coding tasks. You will likely get better result with larger generic models or finetuned models. | ## [GPU Edition Model Descriptions](https://colab.research.google.com/github/KoboldAI/KoboldAI-Client/blob/main/colab/GPU.ipynb) | Model | Size | Style | Description | | --- | --- | --- | --- | -| [GPT-Neo-2.7B-Janeway](https://huggingface.co/KoboldAI/GPT-Neo-2.7B-Janeway) by Mr Seeker | 2.7B GPU | Novel | Janeway is a model created from Picard's dataset combined with a brand new collection of ebooks. This model is trained on 20% more content than Picard and has been trained on literature from various genres. Although the model is mainly focussed on SFW, romantic scenes might involve a degree of nudity. | -| [GPT-Neo-2.7B-Picard](https://huggingface.co/KoboldAI/GPT-Neo-2.7B-Picard) by Mr Seeker | 2.7B GPU | Novel | Picard is a model trained for SFW Novels based on GPT-Neo-2.7B. It is focused on Novel style writing without the NSFW bias. While the name suggests a sci-fi model this model is designed for Novels of a variety of genre's. It is meant to be used in KoboldAI's regular mode. | -| [GPT-Neo-2.7B-AID](https://huggingface.co/KoboldAI/GPT-Neo-2.7B-AID) by melastacho | 2.7B GPU | Adventure | Also know as Adventure 2.7B this is a clone of the AI Dungeon Classic model and is best known for the epic wackey adventures that AI Dungeon Classic players love. | -| [GPT-Neo-2.7B-Horni-LN](https://huggingface.co/KoboldAI/GPT-Neo-2.7B-Horni-LN) by finetune | 2.7B GPU | Novel | This model is based on GPT-Neo-2.7B-Horni and retains its NSFW knowledge, but was then further biased towards SFW novel stories. If you seek a balance between a SFW Novel model and a NSFW model this model should be a good choice. | -| [GPT-Neo-2.7B-Horni](https://huggingface.co/KoboldAI/GPT-Neo-2.7B-Horni) by finetune | 2.7B GPU | NSFW | This model is tuned on Literotica to produce a Novel style model biased towards NSFW content. Can still be used for SFW stories but will have a bias towards NSFW content. It is meant to be used in KoboldAI's regular mode. | -| [GPT-Neo-2.7B-Shinen](https://huggingface.co/KoboldAI/GPT-Neo-2.7B-Shinen) by Mr Seeker | 2.7B GPU | NSFW | Shinen is an alternative to the Horni model designed to be more explicit. If Horni is to tame for you shinen might produce better results. While it is a Novel model it is unsuitable for SFW stories due to its heavy NSFW bias. Shinen will not hold back. It is meant to be used in KoboldAI's regular mode. | -| [GPT-Neo-2.7B](https://huggingface.co/EleutherAI/gpt-neo-2.7B) by EleutherAI | 2.7B GPU | Generic | This is the base model for all the other 2.7B models, it is best used when you have a use case that we have no other models available for, such as writing blog articles or programming. It can also be a good basis for the experience of some of the softprompts if your softprompt is not about a subject the other models cover. | +| [Fairseq-Dense-2.7B-Nerys](https://huggingface.co/KoboldAI/fairseq-dense-2.7B-Nerys) by Mr Seeker | 2.7B | Novel/Adventure | Nerys is a hybrid model based on Pike (A newer Janeway), on top of the Pike dataset you also get some Light Novels, Adventure mode support and a little bit of shinen thrown in the mix. The end result is a very diverse model that is heavily biased towards SFW novel writing, but one that can go beyond its novel training and make for an excellent adventure model to. Adventure mode is best played from a second person perspective, but can be played in first or third person as well. Novel writing can be done best from the first or third person. | +| [GPT-Neo-2.7B-Janeway](https://huggingface.co/KoboldAI/GPT-Neo-2.7B-Janeway) by Mr Seeker | 2.7B | Novel | Janeway is a model created from Picard's dataset combined with a brand new collection of ebooks. This model is trained on 20% more content than Picard and has been trained on literature from various genres. Although the model is mainly focussed on SFW, romantic scenes might involve a degree of nudity. | +| [GPT-Neo-2.7B-Picard](https://huggingface.co/KoboldAI/GPT-Neo-2.7B-Picard) by Mr Seeker | 2.7B | Novel | Picard is a model trained for SFW Novels based on GPT-Neo-2.7B. It is focused on Novel style writing without the NSFW bias. While the name suggests a sci-fi model this model is designed for Novels of a variety of genre's. It is meant to be used in KoboldAI's regular mode. | +| [GPT-Neo-2.7B-AID](https://huggingface.co/KoboldAI/GPT-Neo-2.7B-AID) by melastacho | 2.7B | Adventure | Also know as Adventure 2.7B this is a clone of the AI Dungeon Classic model and is best known for the epic wackey adventures that AI Dungeon Classic players love. | +| [GPT-Neo-2.7B-Horni-LN](https://huggingface.co/KoboldAI/GPT-Neo-2.7B-Horni-LN) by finetune | 2.7B | Novel | This model is based on GPT-Neo-2.7B-Horni and retains its NSFW knowledge, but was then further biased towards SFW novel stories. If you seek a balance between a SFW Novel model and a NSFW model this model should be a good choice. | +| [GPT-Neo-2.7B-Horni](https://huggingface.co/KoboldAI/GPT-Neo-2.7B-Horni) by finetune | 2.7B | NSFW | This model is tuned on Literotica to produce a Novel style model biased towards NSFW content. Can still be used for SFW stories but will have a bias towards NSFW content. It is meant to be used in KoboldAI's regular mode. | +| [GPT-Neo-2.7B-Shinen](https://huggingface.co/KoboldAI/GPT-Neo-2.7B-Shinen) by Mr Seeker | 2.7B | NSFW | Shinen is an alternative to the Horni model designed to be more explicit. If Horni is to tame for you shinen might produce better results. While it is a Novel model it is unsuitable for SFW stories due to its heavy NSFW bias. Shinen will not hold back. It is meant to be used in KoboldAI's regular mode. | +| [GPT-Neo-2.7B](https://huggingface.co/EleutherAI/gpt-neo-2.7B) by EleutherAI | 2.7B | Generic | This is the base model for all the other 2.7B models, it is best used when you have a use case that we have no other models available for, such as writing blog articles or programming. It can also be a good basis for the experience of some of the softprompts if your softprompt is not about a subject the other models cover. | | Style | Description | | --- | --- | From e5dcf91a086b356da800229edb9017af38864ebd Mon Sep 17 00:00:00 2001 From: Henk Date: Wed, 1 Jun 2022 10:34:16 +0200 Subject: [PATCH 41/63] Defaults Support This adds support for loading settings from the defaults folder, settings are loaded in the following order and overwritten if needed by the higher number. 1. The model config file. 2. The defaults folder. 3. The users defined settings file. With this support we can begin to ship better defaults for models we do not manage. Our community tuners have been most helpful at adding good defaults to their configuration files, but for other models such as the base models this gives us the flexibility to define better settings for each model without messing with a users desired settings if they already exist. --- .gitignore | 3 + aiserver.py | 160 ++++++++++++++++++++++++++++------------------------ 2 files changed, 88 insertions(+), 75 deletions(-) diff --git a/.gitignore b/.gitignore index 9b79234b..5b024bd8 100644 --- a/.gitignore +++ b/.gitignore @@ -31,3 +31,6 @@ Uninstall # Ignore compiled Python files. *.pyc + +# Don't ignore defaults +!defaults/* \ No newline at end of file diff --git a/aiserver.py b/aiserver.py index cead5e44..4e33332b 100644 --- a/aiserver.py +++ b/aiserver.py @@ -660,88 +660,98 @@ def settingschanged(): #==================================================================# # Read settings from client file JSON and send to vars #==================================================================# + def loadsettings(): + if(path.exists("defaults/" + getmodelname().replace('/', '_') + ".settings")): + # Read file contents into JSON object + file = open("defaults/" + getmodelname().replace('/', '_') + ".settings", "r") + js = json.load(file) + + processsettings(js) + file.close() if(path.exists("settings/" + getmodelname().replace('/', '_') + ".settings")): # Read file contents into JSON object file = open("settings/" + getmodelname().replace('/', '_') + ".settings", "r") js = json.load(file) - # Copy file contents to vars - if("apikey" in js): - vars.apikey = js["apikey"] - if("andepth" in js): - vars.andepth = js["andepth"] - if("temp" in js): - vars.temp = js["temp"] - if("top_p" in js): - vars.top_p = js["top_p"] - if("top_k" in js): - vars.top_k = js["top_k"] - if("tfs" in js): - vars.tfs = js["tfs"] - if("typical" in js): - vars.typical = js["typical"] - if("rep_pen" in js): - vars.rep_pen = js["rep_pen"] - if("rep_pen_slope" in js): - vars.rep_pen_slope = js["rep_pen_slope"] - if("rep_pen_range" in js): - vars.rep_pen_range = js["rep_pen_range"] - if("genamt" in js): - vars.genamt = js["genamt"] - if("max_length" in js): - vars.max_length = js["max_length"] - if("ikgen" in js): - vars.ikgen = js["ikgen"] - if("formatoptns" in js): - vars.formatoptns = js["formatoptns"] - if("numseqs" in js): - vars.numseqs = js["numseqs"] - if("widepth" in js): - vars.widepth = js["widepth"] - if("useprompt" in js): - vars.useprompt = js["useprompt"] - if("adventure" in js): - vars.adventure = js["adventure"] - if("chatmode" in js): - vars.chatmode = js["chatmode"] - if("chatname" in js): - vars.chatname = js["chatname"] - if("dynamicscan" in js): - vars.dynamicscan = js["dynamicscan"] - if("nopromptgen" in js): - vars.nopromptgen = js["nopromptgen"] - if("rngpersist" in js): - vars.rngpersist = js["rngpersist"] - if("nogenmod" in js): - vars.nogenmod = js["nogenmod"] - if("autosave" in js): - vars.autosave = js["autosave"] - if("newlinemode" in js): - vars.newlinemode = js["newlinemode"] - if("welcome" in js): - vars.welcome = js["welcome"] - - if("antemplate" in js): - vars.setauthornotetemplate = js["antemplate"] - if(not vars.gamestarted): - vars.authornotetemplate = vars.setauthornotetemplate - - if("userscripts" in js): - vars.userscripts = [] - for userscript in js["userscripts"]: - if type(userscript) is not str: - continue - userscript = userscript.strip() - if len(userscript) != 0 and all(q not in userscript for q in ("..", ":")) and all(userscript[0] not in q for q in ("/", "\\")) and os.path.exists(fileops.uspath(userscript)): - vars.userscripts.append(userscript) - - if("corescript" in js and type(js["corescript"]) is str and all(q not in js["corescript"] for q in ("..", ":")) and all(js["corescript"][0] not in q for q in ("/", "\\"))): - vars.corescript = js["corescript"] - else: - vars.corescript = "default.lua" - + processsettings(js) file.close() + +def processsettings(js): +# Copy file contents to vars + if("apikey" in js): + vars.apikey = js["apikey"] + if("andepth" in js): + vars.andepth = js["andepth"] + if("temp" in js): + vars.temp = js["temp"] + if("top_p" in js): + vars.top_p = js["top_p"] + if("top_k" in js): + vars.top_k = js["top_k"] + if("tfs" in js): + vars.tfs = js["tfs"] + if("typical" in js): + vars.typical = js["typical"] + if("rep_pen" in js): + vars.rep_pen = js["rep_pen"] + if("rep_pen_slope" in js): + vars.rep_pen_slope = js["rep_pen_slope"] + if("rep_pen_range" in js): + vars.rep_pen_range = js["rep_pen_range"] + if("genamt" in js): + vars.genamt = js["genamt"] + if("max_length" in js): + vars.max_length = js["max_length"] + if("ikgen" in js): + vars.ikgen = js["ikgen"] + if("formatoptns" in js): + vars.formatoptns = js["formatoptns"] + if("numseqs" in js): + vars.numseqs = js["numseqs"] + if("widepth" in js): + vars.widepth = js["widepth"] + if("useprompt" in js): + vars.useprompt = js["useprompt"] + if("adventure" in js): + vars.adventure = js["adventure"] + if("chatmode" in js): + vars.chatmode = js["chatmode"] + if("chatname" in js): + vars.chatname = js["chatname"] + if("dynamicscan" in js): + vars.dynamicscan = js["dynamicscan"] + if("nopromptgen" in js): + vars.nopromptgen = js["nopromptgen"] + if("rngpersist" in js): + vars.rngpersist = js["rngpersist"] + if("nogenmod" in js): + vars.nogenmod = js["nogenmod"] + if("autosave" in js): + vars.autosave = js["autosave"] + if("newlinemode" in js): + vars.newlinemode = js["newlinemode"] + if("welcome" in js): + vars.welcome = js["welcome"] + + if("antemplate" in js): + vars.setauthornotetemplate = js["antemplate"] + if(not vars.gamestarted): + vars.authornotetemplate = vars.setauthornotetemplate + + if("userscripts" in js): + vars.userscripts = [] + for userscript in js["userscripts"]: + if type(userscript) is not str: + continue + userscript = userscript.strip() + if len(userscript) != 0 and all(q not in userscript for q in ("..", ":")) and all(userscript[0] not in q for q in ("/", "\\")) and os.path.exists(fileops.uspath(userscript)): + vars.userscripts.append(userscript) + + if("corescript" in js and type(js["corescript"]) is str and all(q not in js["corescript"] for q in ("..", ":")) and all(js["corescript"][0] not in q for q in ("/", "\\"))): + vars.corescript = js["corescript"] + else: + vars.corescript = "default.lua" #==================================================================# # Load a soft prompt from a file From 18cf8e620e84ebe2460c19838c37d09a29144f7b Mon Sep 17 00:00:00 2001 From: henk717 Date: Wed, 1 Jun 2022 19:51:59 +0200 Subject: [PATCH 42/63] Model Descriptions (TPU) --- colab/TPU.ipynb | 51 +++++++++++++++++++++++++------------------------ 1 file changed, 26 insertions(+), 25 deletions(-) diff --git a/colab/TPU.ipynb b/colab/TPU.ipynb index 0bbbc15e..ee7f9fd3 100644 --- a/colab/TPU.ipynb +++ b/colab/TPU.ipynb @@ -147,38 +147,39 @@ "\n", "| Model | Size | Style | Description |\n", "| --- | --- | --- | --- |\n", - "| Nerys by Mr Seeker | 13B | Novel/Adventure | Nerys is a hybrid model based on Pike (A newer Janeway), on top of the Pike dataset you also get some Light Novels, Adventure mode support and a little bit of shinen thrown in the mix. The end result is a very diverse model that is heavily biased towards SFW novel writing, but one that can go beyond its novel training and make for an excellent adventure model to. Adventure mode is best played from a second person perspective, but can be played in first or third person as well. Novel writing can be done best from the first or third person. |\n", - "| Janeway by Mr Seeker | 13B | Novel | Janeway is a model created from Picard's dataset combined with a brand new collection of ebooks. This model is trained on 20% more content than Picard and has been trained on literature from various genres. Although the model is mainly focussed on SFW, romantic scenes might involve a degree of nudity. |\n", - "| Shinen by Mr Seeker | 13B | NSFW | Shinen is an NSFW model designed to be more explicit. Trained on a variety of stories from the website Sexstories it contains many different kinks. |\n", - "| Skein by VE\\_FORBRYDERNE | 6B | Adventure | Skein is best used with Adventure mode enabled, it consists of a 4 times larger adventure dataset than the Adventure model making it excellent for text adventure gaming. On top of that it also consists of light novel training further expanding its knowledge and writing capabilities. It can be used with the You filter bias if you wish to write Novels with it, but dedicated Novel models can perform better for this task. |\n", - "| Adventure by VE\\_FORBRYDERNE | 6B | Adventure | Adventure is a 6B model designed to mimick the behavior of AI Dungeon. It is exclusively for Adventure Mode and can take you on the epic and wackey adventures that AI Dungeon players love. It also features the many tropes of AI Dungeon as it has been trained on very similar data. It must be used in second person (You). |\n", - "| Lit by Haru | 6B | NSFW | Lit is a great NSFW model trained by Haru on both a large set of Literotica stories and high quality novels along with tagging support. Creating a high quality model for your NSFW stories. This model is exclusively a novel model and is best used in third person. |\n", - "| Convo | 6B | Chatbot | Convo-6B is a GPT-J 6B model fine-tuned on a collection of high quality open source datasets which amount to 6 million messages. The primary goal of the model is to provide improved performance and generalization when generating multi-turn dialogue for characters that were not present from within the fine tuning data. The prompted performance has especially improved over the predecessor model [C1-6B](https://huggingface.co/hakurei/c1-6B). |\n", - "| C1 by Haru | 6B | Chatbot | C1 has been trained on various internet chatrooms, it makes the basis for an interesting chatbot model and has been optimized to be used in the Chatmode. |\n", + "| [Nerys](https://huggingface.co/KoboldAI/fairseq-dense-13B-Nerys) by Mr Seeker | 13B | Novel/Adventure | Nerys is a hybrid model based on Pike (A newer Janeway), on top of the Pike dataset you also get some Light Novels, Adventure mode support and a little bit of shinen thrown in the mix. The end result is a very diverse model that is heavily biased towards SFW novel writing, but one that can go beyond its novel training and make for an excellent adventure model to. Adventure mode is best played from a second person perspective, but can be played in first or third person as well. Novel writing can be done best from the first or third person. |\n", + "| [Janeway](https://huggingface.co/KoboldAI/fairseq-dense-13B-Janeway) by Mr Seeker | 13B | Novel | Janeway is a model created from Picard's dataset combined with a brand new collection of ebooks. This model is trained on 20% more content than Picard and has been trained on literature from various genres. Although the model is mainly focussed on SFW, romantic scenes might involve a degree of nudity. |\n", + "| [Shinen](https://huggingface.co/KoboldAI/fairseq-dense-13B-Shinen) by Mr Seeker | 13B | NSFW | Shinen is an NSFW model designed to be more explicit. Trained on a variety of stories from the website Sexstories it contains many different kinks. |\n", + "| [Skein](https://huggingface.co/KoboldAI/GPT-J-6B-Skein) by VE\\_FORBRYDERNE | 6B | Adventure | Skein is best used with Adventure mode enabled, it consists of a 4 times larger adventure dataset than the Adventure model making it excellent for text adventure gaming. On top of that it also consists of light novel training further expanding its knowledge and writing capabilities. It can be used with the You filter bias if you wish to write Novels with it, but dedicated Novel models can perform better for this task. |\n", + "| [Adventure](https://huggingface.co/KoboldAI/GPT-J-6B-Adventure) by VE\\_FORBRYDERNE | 6B | Adventure | Adventure is a 6B model designed to mimick the behavior of AI Dungeon. It is exclusively for Adventure Mode and can take you on the epic and wackey adventures that AI Dungeon players love. It also features the many tropes of AI Dungeon as it has been trained on very similar data. It must be used in second person (You). |\n", + "| [Lit](https://huggingface.co/hakurei/lit-6B) by Haru | 6B | NSFW | Lit is a great NSFW model trained by Haru on both a large set of Literotica stories and high quality novels along with tagging support. Creating a high quality model for your NSFW stories. This model is exclusively a novel model and is best used in third person. |\n", + "| [Convo](https://huggingface.co/hitomi-team/convo-6B) by Hitomi Team | 6B | Chatbot | Convo-6B is a GPT-J 6B model fine-tuned on a collection of high quality open source datasets which amount to 6 million messages. The primary goal of the model is to provide improved performance and generalization when generating multi-turn dialogue for characters that were not present from within the fine tuning data. The prompted performance has especially improved over the predecessor model [C1-6B](https://huggingface.co/hakurei/c1-6B). |\n", + "| [C1](https://huggingface.co/hakurei/c1-6B) by Haru | 6B | Chatbot | C1 has been trained on various internet chatrooms, it makes the basis for an interesting chatbot model and has been optimized to be used in the Chatmode. |\n", "| Neo(X) by EleutherAI | 20B | Generic | NeoX is the largest EleutherAI model currently available, being a generic model it is not particularly trained towards anything and can do a variety of writing, Q&A and coding tasks. 20B's performance is closely compared to the 13B models and it is worth trying both especially if you have a task that does not involve english writing. Its behavior will be similar to the GPT-J-6B model since they are trained on the same dataset but with more sensitivity towards repetition penalty and with more knowledge. |\n", - "| Fairseq Dense | 13B | Generic | Trained by Facebook Researchers this model stems from the MOE research project within Fairseq. This particular version has been converted by us for use in KoboldAI. It is known to be on par with the larger 20B model from EleutherAI and considered as better for pop culture and language tasks. Because the model has never seen a new line (enter) it may perform worse on formatting and paragraphing. |\n", - "| GPT-J-6B by EleutherAI | 6B | Generic | This model serves as the basis for most other 6B models (Some being based on Fairseq Dense instead). Being trained on the Pile and not biased towards anything in particular it is suitable for a variety of tasks such as writing, Q&A and coding tasks. You will likely get better result with larger generic models or finetuned models. |\n", + "| [Fairseq Dense](https://huggingface.co/KoboldAI/fairseq-dense-13B) | 13B | Generic | Trained by Facebook Researchers this model stems from the MOE research project within Fairseq. This particular version has been converted by us for use in KoboldAI. It is known to be on par with the larger 20B model from EleutherAI and considered as better for pop culture and language tasks. Because the model has never seen a new line (enter) it may perform worse on formatting and paragraphing. |\n", + "| [GPT-J-6B](https://huggingface.co/EleutherAI/gpt-j-6B) by EleutherAI | 6B | Generic | This model serves as the basis for most other 6B models (Some being based on Fairseq Dense instead). Being trained on the Pile and not biased towards anything in particular it is suitable for a variety of tasks such as writing, Q&A and coding tasks. You will likely get better result with larger generic models or finetuned models. |\n", "\n", "\n", "# [GPU Edition Model Descriptions](https://colab.research.google.com/github/KoboldAI/KoboldAI-Client/blob/main/colab/GPU.ipynb)\n", "\n", - "| Model | Size | Style | Description |\n", - "| ------------------------------------------------------------ | -------- | ---------- | ------------------------------------------------------------ |\n", - "| [GPT-Neo-2.7B-Janeway](https://huggingface.co/KoboldAI/GPT-Neo-2.7B-Janeway) by Mr Seeker | 2.7B GPU | Novel | Janeway is a model created from Picard's dataset combined with a brand new collection of ebooks. This model is trained on 20% more content than Picard and has been trained on literature from various genres. Although the model is mainly focussed on SFW, romantic scenes might involve a degree of nudity. |\n", - "| [GPT-Neo-2.7B-Picard](https://huggingface.co/KoboldAI/GPT-Neo-2.7B-Picard) by Mr Seeker | 2.7B GPU | Novel | Picard is a model trained for SFW Novels based on GPT-Neo-2.7B. It is focused on Novel style writing without the NSFW bias. While the name suggests a sci-fi model this model is designed for Novels of a variety of genre's. It is meant to be used in KoboldAI's regular mode. |\n", - "| [GPT-Neo-2.7B-AID](https://huggingface.co/KoboldAI/GPT-Neo-2.7B-AID) by melastacho | 2.7B GPU | Adventure | Also know as Adventure 2.7B this is a clone of the AI Dungeon Classic model and is best known for the epic wackey adventures that AI Dungeon Classic players love. |\n", - "| [GPT-Neo-2.7B-Horni-LN](https://huggingface.co/KoboldAI/GPT-Neo-2.7B-Horni-LN) by finetune | 2.7B GPU | Novel | This model is based on GPT-Neo-2.7B-Horni and retains its NSFW knowledge, but was then further biased towards SFW novel stories. If you seek a balance between a SFW Novel model and a NSFW model this model should be a good choice. |\n", - "| [GPT-Neo-2.7B-Horni](https://huggingface.co/KoboldAI/GPT-Neo-2.7B-Horni) by finetune | 2.7B GPU | NSFW | This model is tuned on Literotica to produce a Novel style model biased towards NSFW content. Can still be used for SFW stories but will have a bias towards NSFW content. It is meant to be used in KoboldAI's regular mode. |\n", - "| [GPT-Neo-2.7B-Shinen](https://huggingface.co/KoboldAI/GPT-Neo-2.7B-Shinen) by Mr Seeker | 2.7B GPU | NSFW | Shinen is an alternative to the Horni model designed to be more explicit. If Horni is to tame for you shinen might produce better results. While it is a Novel model it is unsuitable for SFW stories due to its heavy NSFW bias. Shinen will not hold back. It is meant to be used in KoboldAI's regular mode. |\n", - "| [GPT-Neo-2.7B](https://huggingface.co/EleutherAI/gpt-neo-2.7B) by EleutherAI | 2.7B GPU | Generic | This is the base model for all the other 2.7B models, it is best used when you have a use case that we have no other models available for, such as writing blog articles or programming. It can also be a good basis for the experience of some of the softprompts if your softprompt is not about a subject the other models cover. |\n", + "| Model | Size | Style | Description |\n", + "| --- | --- | --- | --- |\n", + "| [Fairseq-Dense-2.7B-Nerys](https://huggingface.co/KoboldAI/fairseq-dense-2.7B-Nerys) by Mr Seeker | 2.7B | Novel/Adventure | Nerys is a hybrid model based on Pike (A newer Janeway), on top of the Pike dataset you also get some Light Novels, Adventure mode support and a little bit of shinen thrown in the mix. The end result is a very diverse model that is heavily biased towards SFW novel writing, but one that can go beyond its novel training and make for an excellent adventure model to. Adventure mode is best played from a second person perspective, but can be played in first or third person as well. Novel writing can be done best from the first or third person. |\n", + "| [GPT-Neo-2.7B-Janeway](https://huggingface.co/KoboldAI/GPT-Neo-2.7B-Janeway) by Mr Seeker | 2.7B | Novel | Janeway is a model created from Picard's dataset combined with a brand new collection of ebooks. This model is trained on 20% more content than Picard and has been trained on literature from various genres. Although the model is mainly focussed on SFW, romantic scenes might involve a degree of nudity. |\n", + "| [GPT-Neo-2.7B-Picard](https://huggingface.co/KoboldAI/GPT-Neo-2.7B-Picard) by Mr Seeker | 2.7B | Novel | Picard is a model trained for SFW Novels based on GPT-Neo-2.7B. It is focused on Novel style writing without the NSFW bias. While the name suggests a sci-fi model this model is designed for Novels of a variety of genre's. It is meant to be used in KoboldAI's regular mode. |\n", + "| [GPT-Neo-2.7B-AID](https://huggingface.co/KoboldAI/GPT-Neo-2.7B-AID) by melastacho | 2.7B | Adventure | Also know as Adventure 2.7B this is a clone of the AI Dungeon Classic model and is best known for the epic wackey adventures that AI Dungeon Classic players love. |\n", + "| [GPT-Neo-2.7B-Horni-LN](https://huggingface.co/KoboldAI/GPT-Neo-2.7B-Horni-LN) by finetune | 2.7B | Novel | This model is based on GPT-Neo-2.7B-Horni and retains its NSFW knowledge, but was then further biased towards SFW novel stories. If you seek a balance between a SFW Novel model and a NSFW model this model should be a good choice. |\n", + "| [GPT-Neo-2.7B-Horni](https://huggingface.co/KoboldAI/GPT-Neo-2.7B-Horni) by finetune | 2.7B | NSFW | This model is tuned on Literotica to produce a Novel style model biased towards NSFW content. Can still be used for SFW stories but will have a bias towards NSFW content. It is meant to be used in KoboldAI's regular mode. |\n", + "| [GPT-Neo-2.7B-Shinen](https://huggingface.co/KoboldAI/GPT-Neo-2.7B-Shinen) by Mr Seeker | 2.7B | NSFW | Shinen is an alternative to the Horni model designed to be more explicit. If Horni is to tame for you shinen might produce better results. While it is a Novel model it is unsuitable for SFW stories due to its heavy NSFW bias. Shinen will not hold back. It is meant to be used in KoboldAI's regular mode. |\n", + "| [GPT-Neo-2.7B](https://huggingface.co/EleutherAI/gpt-neo-2.7B) by EleutherAI | 2.7B | Generic | This is the base model for all the other 2.7B models, it is best used when you have a use case that we have no other models available for, such as writing blog articles or programming. It can also be a good basis for the experience of some of the softprompts if your softprompt is not about a subject the other models cover. |\n", "\n", - "| Style | Description |\n", - "| --------- | ------------------------------------------------------------ |\n", - "| Novel | For regular story writing, not compatible with Adventure mode or other specialty modes. |\n", - "| NSFW | Indicates that the model is strongly biased towards NSFW content and is not suitable for children, work environments or livestreaming. Most NSFW models are also Novel models in nature. |\n", + "| Style | Description |\n", + "| --- | --- |\n", + "| Novel | For regular story writing, not compatible with Adventure mode or other specialty modes. |\n", + "| NSFW | Indicates that the model is strongly biased towards NSFW content and is not suitable for children, work environments or livestreaming. Most NSFW models are also Novel models in nature. |\n", "| Adventure | These models are excellent for people willing to play KoboldAI like a Text Adventure game and are meant to be used with Adventure mode enabled. Even if you wish to use it as a Novel style model you should always have Adventure mode on and set it to story. These models typically have a strong bias towards the use of the word You and without Adventure mode enabled break the story flow and write actions on your behalf. |\n", - "| Chatbot | These models are specifically trained for chatting and are best used with the Chatmode enabled. Typically trained on either public chatrooms or private chats. |\n", - "| Generic | Generic models are not trained towards anything specific, typically used as a basis for other tasks and models. They can do everything the other models can do, but require much more handholding to work properly. Generic models are an ideal basis for tasks that we have no specific model for, or for experiencing a softprompt in its raw form. |\n", + "| Chatbot | These models are specifically trained for chatting and are best used with the Chatmode enabled. Typically trained on either public chatrooms or private chats. |\n", + "| Generic | Generic models are not trained towards anything specific, typically used as a basis for other tasks and models. They can do everything the other models can do, but require much more handholding to work properly. Generic models are an ideal basis for tasks that we have no specific model for, or for experiencing a softprompt in its raw form. |\n", "\n", "---\n", "## Tips to get the most out of Google Colab\n", From dd84a22fa9a25e4b12f185380d401aa968a0d692 Mon Sep 17 00:00:00 2001 From: henk717 Date: Wed, 1 Jun 2022 19:53:31 +0200 Subject: [PATCH 43/63] Model Descriptions (GPU) --- colab/GPU.ipynb | 42 +++++++++++++++++++++--------------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/colab/GPU.ipynb b/colab/GPU.ipynb index 349c5635..d70e1fea 100644 --- a/colab/GPU.ipynb +++ b/colab/GPU.ipynb @@ -7,7 +7,7 @@ "private_outputs": true, "provenance": [], "collapsed_sections": [], - "authorship_tag": "ABX9TyMClgsuyqYCEvk3ugme8XOZ", + "authorship_tag": "ABX9TyN3BT4aQmdwrT2ibYyYjjMw", "include_colab_link": true }, "kernelspec": { @@ -90,31 +90,32 @@ "cell_type": "markdown", "source": [ "# GPU Edition Model Descriptions\n", - "| Model | Size | Style | Description |\n", - "| ------------------------------------------------------------ | -------- | ---------- | ------------------------------------------------------------ |\n", - "| [GPT-Neo-2.7B-Janeway](https://huggingface.co/KoboldAI/GPT-Neo-2.7B-Janeway) by Mr Seeker | 2.7B GPU | Novel | Janeway is a model created from Picard's dataset combined with a brand new collection of ebooks. This model is trained on 20% more content than Picard and has been trained on literature from various genres. Although the model is mainly focussed on SFW, romantic scenes might involve a degree of nudity. |\n", - "| [GPT-Neo-2.7B-Picard](https://huggingface.co/KoboldAI/GPT-Neo-2.7B-Picard) by Mr Seeker | 2.7B GPU | Novel | Picard is a model trained for SFW Novels based on GPT-Neo-2.7B. It is focused on Novel style writing without the NSFW bias. While the name suggests a sci-fi model this model is designed for Novels of a variety of genre's. It is meant to be used in KoboldAI's regular mode. |\n", - "| [GPT-Neo-2.7B-AID](https://huggingface.co/KoboldAI/GPT-Neo-2.7B-AID) by melastacho | 2.7B GPU | Adventure | Also know as Adventure 2.7B this is a clone of the AI Dungeon Classic model and is best known for the epic wackey adventures that AI Dungeon Classic players love. |\n", - "| [GPT-Neo-2.7B-Horni-LN](https://huggingface.co/KoboldAI/GPT-Neo-2.7B-Horni-LN) by finetune | 2.7B GPU | Novel | This model is based on GPT-Neo-2.7B-Horni and retains its NSFW knowledge, but was then further biased towards SFW novel stories. If you seek a balance between a SFW Novel model and a NSFW model this model should be a good choice. |\n", - "| [GPT-Neo-2.7B-Horni](https://huggingface.co/KoboldAI/GPT-Neo-2.7B-Horni) by finetune | 2.7B GPU | NSFW | This model is tuned on Literotica to produce a Novel style model biased towards NSFW content. Can still be used for SFW stories but will have a bias towards NSFW content. It is meant to be used in KoboldAI's regular mode. |\n", - "| [GPT-Neo-2.7B-Shinen](https://huggingface.co/KoboldAI/GPT-Neo-2.7B-Shinen) by Mr Seeker | 2.7B GPU | NSFW | Shinen is an alternative to the Horni model designed to be more explicit. If Horni is to tame for you shinen might produce better results. While it is a Novel model it is unsuitable for SFW stories due to its heavy NSFW bias. Shinen will not hold back. It is meant to be used in KoboldAI's regular mode. |\n", - "| [GPT-Neo-2.7B](https://huggingface.co/EleutherAI/gpt-neo-2.7B) by EleutherAI | 2.7B GPU | Generic | This is the base model for all the other 2.7B models, it is best used when you have a use case that we have no other models available for, such as writing blog articles or programming. It can also be a good basis for the experience of some of the softprompts if your softprompt is not about a subject the other models cover. |\n", + "| Model | Size | Style | Description |\n", + "| --- | --- | --- | --- |\n", + "| [Fairseq-Dense-2.7B-Nerys](https://huggingface.co/KoboldAI/fairseq-dense-2.7B-Nerys) by Mr Seeker | 2.7B | Novel/Adventure | Nerys is a hybrid model based on Pike (A newer Janeway), on top of the Pike dataset you also get some Light Novels, Adventure mode support and a little bit of shinen thrown in the mix. The end result is a very diverse model that is heavily biased towards SFW novel writing, but one that can go beyond its novel training and make for an excellent adventure model to. Adventure mode is best played from a second person perspective, but can be played in first or third person as well. Novel writing can be done best from the first or third person. |\n", + "| [GPT-Neo-2.7B-Janeway](https://huggingface.co/KoboldAI/GPT-Neo-2.7B-Janeway) by Mr Seeker | 2.7B | Novel | Janeway is a model created from Picard's dataset combined with a brand new collection of ebooks. This model is trained on 20% more content than Picard and has been trained on literature from various genres. Although the model is mainly focussed on SFW, romantic scenes might involve a degree of nudity. |\n", + "| [GPT-Neo-2.7B-Picard](https://huggingface.co/KoboldAI/GPT-Neo-2.7B-Picard) by Mr Seeker | 2.7B | Novel | Picard is a model trained for SFW Novels based on GPT-Neo-2.7B. It is focused on Novel style writing without the NSFW bias. While the name suggests a sci-fi model this model is designed for Novels of a variety of genre's. It is meant to be used in KoboldAI's regular mode. |\n", + "| [GPT-Neo-2.7B-AID](https://huggingface.co/KoboldAI/GPT-Neo-2.7B-AID) by melastacho | 2.7B | Adventure | Also know as Adventure 2.7B this is a clone of the AI Dungeon Classic model and is best known for the epic wackey adventures that AI Dungeon Classic players love. |\n", + "| [GPT-Neo-2.7B-Horni-LN](https://huggingface.co/KoboldAI/GPT-Neo-2.7B-Horni-LN) by finetune | 2.7B | Novel | This model is based on GPT-Neo-2.7B-Horni and retains its NSFW knowledge, but was then further biased towards SFW novel stories. If you seek a balance between a SFW Novel model and a NSFW model this model should be a good choice. |\n", + "| [GPT-Neo-2.7B-Horni](https://huggingface.co/KoboldAI/GPT-Neo-2.7B-Horni) by finetune | 2.7B | NSFW | This model is tuned on Literotica to produce a Novel style model biased towards NSFW content. Can still be used for SFW stories but will have a bias towards NSFW content. It is meant to be used in KoboldAI's regular mode. |\n", + "| [GPT-Neo-2.7B-Shinen](https://huggingface.co/KoboldAI/GPT-Neo-2.7B-Shinen) by Mr Seeker | 2.7B | NSFW | Shinen is an alternative to the Horni model designed to be more explicit. If Horni is to tame for you shinen might produce better results. While it is a Novel model it is unsuitable for SFW stories due to its heavy NSFW bias. Shinen will not hold back. It is meant to be used in KoboldAI's regular mode. |\n", + "| [GPT-Neo-2.7B](https://huggingface.co/EleutherAI/gpt-neo-2.7B) by EleutherAI | 2.7B | Generic | This is the base model for all the other 2.7B models, it is best used when you have a use case that we have no other models available for, such as writing blog articles or programming. It can also be a good basis for the experience of some of the softprompts if your softprompt is not about a subject the other models cover. |\n", "\n", "# [TPU Edition Model Descriptions](https://colab.research.google.com/github/KoboldAI/KoboldAI-Client/blob/main/colab/TPU.ipynb)\n", "\n", "| Model | Size | Style | Description |\n", "| --- | --- | --- | --- |\n", - "| Nerys by Mr Seeker | 13B | Novel/Adventure | Nerys is a hybrid model based on Pike (A newer Janeway), on top of the Pike dataset you also get some Light Novels, Adventure mode support and a little bit of shinen thrown in the mix. The end result is a very diverse model that is heavily biased towards SFW novel writing, but one that can go beyond its novel training and make for an excellent adventure model to. Adventure mode is best played from a second person perspective, but can be played in first or third person as well. Novel writing can be done best from the first or third person. |\n", - "| Janeway by Mr Seeker | 13B | Novel | Janeway is a model created from Picard's dataset combined with a brand new collection of ebooks. This model is trained on 20% more content than Picard and has been trained on literature from various genres. Although the model is mainly focussed on SFW, romantic scenes might involve a degree of nudity. |\n", - "| Shinen by Mr Seeker | 13B | NSFW | Shinen is an NSFW model designed to be more explicit. Trained on a variety of stories from the website Sexstories it contains many different kinks. |\n", - "| Skein by VE\\_FORBRYDERNE | 6B | Adventure | Skein is best used with Adventure mode enabled, it consists of a 4 times larger adventure dataset than the Adventure model making it excellent for text adventure gaming. On top of that it also consists of light novel training further expanding its knowledge and writing capabilities. It can be used with the You filter bias if you wish to write Novels with it, but dedicated Novel models can perform better for this task. |\n", - "| Adventure by VE\\_FORBRYDERNE | 6B | Adventure | Adventure is a 6B model designed to mimick the behavior of AI Dungeon. It is exclusively for Adventure Mode and can take you on the epic and wackey adventures that AI Dungeon players love. It also features the many tropes of AI Dungeon as it has been trained on very similar data. It must be used in second person (You). |\n", - "| Lit by Haru | 6B | NSFW | Lit is a great NSFW model trained by Haru on both a large set of Literotica stories and high quality novels along with tagging support. Creating a high quality model for your NSFW stories. This model is exclusively a novel model and is best used in third person. |\n", - "| Convo | 6B | Chatbot | Convo-6B is a GPT-J 6B model fine-tuned on a collection of high quality open source datasets which amount to 6 million messages. The primary goal of the model is to provide improved performance and generalization when generating multi-turn dialogue for characters that were not present from within the fine tuning data. The prompted performance has especially improved over the predecessor model [C1-6B](https://huggingface.co/hakurei/c1-6B). |\n", - "| C1 by Haru | 6B | Chatbot | C1 has been trained on various internet chatrooms, it makes the basis for an interesting chatbot model and has been optimized to be used in the Chatmode. |\n", + "| [Nerys](https://huggingface.co/KoboldAI/fairseq-dense-13B-Nerys) by Mr Seeker | 13B | Novel/Adventure | Nerys is a hybrid model based on Pike (A newer Janeway), on top of the Pike dataset you also get some Light Novels, Adventure mode support and a little bit of shinen thrown in the mix. The end result is a very diverse model that is heavily biased towards SFW novel writing, but one that can go beyond its novel training and make for an excellent adventure model to. Adventure mode is best played from a second person perspective, but can be played in first or third person as well. Novel writing can be done best from the first or third person. |\n", + "| [Janeway](https://huggingface.co/KoboldAI/fairseq-dense-13B-Janeway) by Mr Seeker | 13B | Novel | Janeway is a model created from Picard's dataset combined with a brand new collection of ebooks. This model is trained on 20% more content than Picard and has been trained on literature from various genres. Although the model is mainly focussed on SFW, romantic scenes might involve a degree of nudity. |\n", + "| [Shinen](https://huggingface.co/KoboldAI/fairseq-dense-13B-Shinen) by Mr Seeker | 13B | NSFW | Shinen is an NSFW model designed to be more explicit. Trained on a variety of stories from the website Sexstories it contains many different kinks. |\n", + "| [Skein](https://huggingface.co/KoboldAI/GPT-J-6B-Skein) by VE\\_FORBRYDERNE | 6B | Adventure | Skein is best used with Adventure mode enabled, it consists of a 4 times larger adventure dataset than the Adventure model making it excellent for text adventure gaming. On top of that it also consists of light novel training further expanding its knowledge and writing capabilities. It can be used with the You filter bias if you wish to write Novels with it, but dedicated Novel models can perform better for this task. |\n", + "| [Adventure](https://huggingface.co/KoboldAI/GPT-J-6B-Adventure) by VE\\_FORBRYDERNE | 6B | Adventure | Adventure is a 6B model designed to mimick the behavior of AI Dungeon. It is exclusively for Adventure Mode and can take you on the epic and wackey adventures that AI Dungeon players love. It also features the many tropes of AI Dungeon as it has been trained on very similar data. It must be used in second person (You). |\n", + "| [Lit](https://huggingface.co/hakurei/lit-6B) by Haru | 6B | NSFW | Lit is a great NSFW model trained by Haru on both a large set of Literotica stories and high quality novels along with tagging support. Creating a high quality model for your NSFW stories. This model is exclusively a novel model and is best used in third person. |\n", + "| [Convo](https://huggingface.co/hitomi-team/convo-6B) by Hitomi Team | 6B | Chatbot | Convo-6B is a GPT-J 6B model fine-tuned on a collection of high quality open source datasets which amount to 6 million messages. The primary goal of the model is to provide improved performance and generalization when generating multi-turn dialogue for characters that were not present from within the fine tuning data. The prompted performance has especially improved over the predecessor model [C1-6B](https://huggingface.co/hakurei/c1-6B). |\n", + "| [C1](https://huggingface.co/hakurei/c1-6B) by Haru | 6B | Chatbot | C1 has been trained on various internet chatrooms, it makes the basis for an interesting chatbot model and has been optimized to be used in the Chatmode. |\n", "| Neo(X) by EleutherAI | 20B | Generic | NeoX is the largest EleutherAI model currently available, being a generic model it is not particularly trained towards anything and can do a variety of writing, Q&A and coding tasks. 20B's performance is closely compared to the 13B models and it is worth trying both especially if you have a task that does not involve english writing. Its behavior will be similar to the GPT-J-6B model since they are trained on the same dataset but with more sensitivity towards repetition penalty and with more knowledge. |\n", - "| Fairseq Dense | 13B | Generic | Trained by Facebook Researchers this model stems from the MOE research project within Fairseq. This particular version has been converted by us for use in KoboldAI. It is known to be on par with the larger 20B model from EleutherAI and considered as better for pop culture and language tasks. Because the model has never seen a new line (enter) it may perform worse on formatting and paragraphing. |\n", - "| GPT-J-6B by EleutherAI | 6B | Generic | This model serves as the basis for most other 6B models (Some being based on Fairseq Dense instead). Being trained on the Pile and not biased towards anything in particular it is suitable for a variety of tasks such as writing, Q&A and coding tasks. You will likely get better result with larger generic models or finetuned models. |\n", + "| [Fairseq Dense](https://huggingface.co/KoboldAI/fairseq-dense-13B) | 13B | Generic | Trained by Facebook Researchers this model stems from the MOE research project within Fairseq. This particular version has been converted by us for use in KoboldAI. It is known to be on par with the larger 20B model from EleutherAI and considered as better for pop culture and language tasks. Because the model has never seen a new line (enter) it may perform worse on formatting and paragraphing. |\n", + "| [GPT-J-6B](https://huggingface.co/EleutherAI/gpt-j-6B) by EleutherAI | 6B | Generic | This model serves as the basis for most other 6B models (Some being based on Fairseq Dense instead). Being trained on the Pile and not biased towards anything in particular it is suitable for a variety of tasks such as writing, Q&A and coding tasks. You will likely get better result with larger generic models or finetuned models. |\n", "\n", "\n", "| Style | Description |\n", @@ -123,7 +124,6 @@ "| NSFW | Indicates that the model is strongly biased towards NSFW content and is not suitable for children, work environments or livestreaming. Most NSFW models are also Novel models in nature. |\n", "| Adventure | These models are excellent for people willing to play KoboldAI like a Text Adventure game and are meant to be used with Adventure mode enabled. Even if you wish to use it as a Novel style model you should always have Adventure mode on and set it to story. These models typically have a strong bias towards the use of the word You and without Adventure mode enabled break the story flow and write actions on your behalf. |\n", "| Chatbot | These models are specifically trained for chatting and are best used with the Chatmode enabled. Typically trained on either public chatrooms or private chats. |\n", - "| Hybrid | Hybrid models are a blend between different styles, for example they are trained on both Novel stories and Adventure stories. These models are great variety models that you can use for multiple different playstyles and modes, but depending on your usage you may need to enable Adventure Mode or the You bias (in userscripts). |\n", "| Generic | Generic models are not trained towards anything specific, typically used as a basis for other tasks and models. They can do everything the other models can do, but require much more handholding to work properly. Generic models are an ideal basis for tasks that we have no specific model for, or for experiencing a softprompt in its raw form. |\n", "\n", "# How to start KoboldAI in 7 simple steps\n", From 1c12d8455400a3a37d34632878ab1ff8107e86d4 Mon Sep 17 00:00:00 2001 From: henk717 Date: Sat, 4 Jun 2022 13:11:54 +0200 Subject: [PATCH 44/63] Official as Default (GPU) --- colab/GPU.ipynb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/colab/GPU.ipynb b/colab/GPU.ipynb index d70e1fea..0e86c4a5 100644 --- a/colab/GPU.ipynb +++ b/colab/GPU.ipynb @@ -7,7 +7,7 @@ "private_outputs": true, "provenance": [], "collapsed_sections": [], - "authorship_tag": "ABX9TyN3BT4aQmdwrT2ibYyYjjMw", + "authorship_tag": "ABX9TyPbwW79K9/RkYH9i9rkYFyj", "include_colab_link": true }, "kernelspec": { @@ -27,7 +27,7 @@ "colab_type": "text" }, "source": [ - "\"Open" + "\"Open" ] }, { @@ -69,7 +69,7 @@ "#@markdown You can find a description of the models below along with instructions on how to start KoboldAI.\n", "\n", "Model = \"KoboldAI/fairseq-dense-2.7B-Nerys\" #@param [\"KoboldAI/fairseq-dense-2.7B-Nerys\", \"KoboldAI/GPT-Neo-2.7B-Janeway\", \"KoboldAI/GPT-Neo-2.7B-AID\", \"KoboldAI/GPT-Neo-2.7B-Picard\", \"KoboldAI/GPT-Neo-2.7B-Horni-LN\", \"KoboldAI/GPT-Neo-2.7B-Horni\", \"KoboldAI/GPT-Neo-2.7B-Shinen\", \"EleutherAI/gpt-neo-2.7B\"] {allow-input: true}\n", - "Version = \"United\" #@param [\"Official\", \"United\"] {allow-input: true}\n", + "Version = \"Official\" #@param [\"Official\", \"United\"] {allow-input: true}\n", "Provider = \"Localtunnel\" #@param [\"Localtunnel\", \"Cloudflare\"]\n", "\n", "!nvidia-smi\n", From 10d9ae88f34ef3c437fe09de4bb88417dbac3ff3 Mon Sep 17 00:00:00 2001 From: henk717 Date: Sat, 4 Jun 2022 13:41:09 +0200 Subject: [PATCH 45/63] Official as Default (TPU) --- colab/TPU.ipynb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/colab/TPU.ipynb b/colab/TPU.ipynb index ee7f9fd3..a7ba10e8 100644 --- a/colab/TPU.ipynb +++ b/colab/TPU.ipynb @@ -7,7 +7,7 @@ "colab_type": "text" }, "source": [ - "\"Open" + "\"Open" ] }, { @@ -66,7 +66,7 @@ "\n", "#@title <-- Click this to start KoboldAI\n", "Model = \"Nerys 13B\" #@param [\"Nerys 13B\", \"Janeway 13B\", \"Shinen 13B\", \"Skein 6B\", \"Janeway 6B\", \"Adventure 6B\", \"Shinen 6B\", \"Lit 6B\", \"Convo 6B\", \"C1 6B\", \"NeoX 20B\", \"facebook/opt-13b\", \"KoboldAI/fairseq-dense-13B\", \"EleutherAI/gpt-j-6B\"] {allow-input: true}\n", - "Version = \"United\" #@param [\"Official\", \"United\"] {allow-input: true}\n", + "Version = \"Official\" #@param [\"Official\", \"United\"] {allow-input: true}\n", "Provider = \"Localtunnel\" #@param [\"Localtunnel\", \"Cloudflare\"]\n", "\n", "import os\n", From ce4a78544941eb99a12e95b9b4e535cb216f28b4 Mon Sep 17 00:00:00 2001 From: Gnome Ann <> Date: Sun, 5 Jun 2022 21:06:09 -0400 Subject: [PATCH 46/63] Allow clicking on userscripts to enable/disable them (mobile friendly) --- static/application.js | 27 +++++++++++++++++++++++---- templates/index.html | 2 +- 2 files changed, 24 insertions(+), 5 deletions(-) diff --git a/static/application.js b/static/application.js index cfb25883..3b50281c 100644 --- a/static/application.js +++ b/static/application.js @@ -106,6 +106,9 @@ var using_webkit_patch = true; var shift_down = false; var do_clear_ent = false; +// Whether or not an entry in the Userscripts menu is being dragged +var us_dragging = false; + // Display vars var allowtoggle = false; var formatcount = 0; @@ -2412,9 +2415,25 @@ $(document).ready(function(){ }, 2); }); + var us_click_handler = function(ev) { + setTimeout(function() { + if (us_dragging) { + return; + } + var target = $(ev.target).closest(".uslistitem")[0]; + if ($.contains(document.getElementById("uslistunloaded"), target)) { + document.getElementById("uslistloaded").appendChild(target); + } else { + document.getElementById("uslistunloaded").appendChild(target); + } + }, 10); + } + // Make the userscripts menu sortable var us_sortable_settings = { placeholder: "ussortable-placeholder", + start: function() { us_dragging = true; }, + stop: function() { us_dragging = false; }, delay: 2, cursor: "move", tolerance: "pointer", @@ -2423,12 +2442,12 @@ $(document).ready(function(){ scrollSensitivity: 64, scrollSpeed: 10, } - $(usunloaded).sortable($.extend({ + usunloaded.sortable($.extend({ connectWith: "#uslistloaded", - }, us_sortable_settings)); - $(usloaded).sortable($.extend({ + }, us_sortable_settings)).on("click", ".uslistitem", us_click_handler); + usloaded.sortable($.extend({ connectWith: "#uslistunloaded", - }, us_sortable_settings)); + }, us_sortable_settings)).on("click", ".uslistitem", us_click_handler); // Bind actions to UI buttons button_send.on("click", function(ev) { diff --git a/templates/index.html b/templates/index.html index 07bcdcc5..a3214ffa 100644 --- a/templates/index.html +++ b/templates/index.html @@ -17,7 +17,7 @@ - + From fe619d4677b67eecb1a706c12c242f10074434b4 Mon Sep 17 00:00:00 2001 From: Gnome Ann <> Date: Thu, 9 Jun 2022 17:42:46 -0400 Subject: [PATCH 47/63] Update list of versions with broken OPT again They released another version of transformers that still doesn't have the OPT patch so I decided it would be safer to just mark all 4.19 transformers versions as needing the OPT patch. --- aiserver.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aiserver.py b/aiserver.py index 4e33332b..fefab9b8 100644 --- a/aiserver.py +++ b/aiserver.py @@ -1359,7 +1359,7 @@ if(not vars.use_colab_tpu and vars.model not in ["InferKit", "Colab", "OAI", "Go # Fix a bug in OPTForCausalLM where self.lm_head is the wrong size - if(packaging.version.parse("4.19.0.dev0") <= packaging.version.parse(transformers_version) <= packaging.version.parse("4.19.2")): + if(packaging.version.parse("4.19.0.dev0") <= packaging.version.parse(transformers_version) < packaging.version.parse("4.20.0")): try: from transformers import OPTForCausalLM, OPTModel except ImportError: From fdb2a7fa4ce87a586aae1590ded4630a1a03e48d Mon Sep 17 00:00:00 2001 From: Gnome Ann <> Date: Fri, 10 Jun 2022 22:28:20 -0400 Subject: [PATCH 48/63] Top-A sampling --- aiserver.py | 23 ++++++++++++++++++++++- bridge.lua | 2 ++ gensettings.py | 11 +++++++++++ static/application.js | 7 +++++++ templates/index.html | 2 +- tpu_mtj_backend.py | 42 ++++++++++++++++++++++++++++++++++++------ warpers.py | 29 +++++++++++++++++++++++++++++ 7 files changed, 108 insertions(+), 8 deletions(-) diff --git a/aiserver.py b/aiserver.py index fefab9b8..f14bbd77 100644 --- a/aiserver.py +++ b/aiserver.py @@ -212,6 +212,7 @@ class vars: temp = 0.5 # Default generator temperature top_p = 0.9 # Default generator top_p top_k = 0 # Default generator top_k + top_a = 0.0 # Default generator top-a tfs = 1.0 # Default generator tfs (tail-free sampling) typical = 1.0 # Default generator typical sampling threshold numseqs = 1 # Number of sequences to ask the generator to create @@ -577,6 +578,8 @@ def loadmodelsettings(): vars.tfs = js["tfs"] if("typical" in js): vars.typical = js["typical"] + if("top_a" in js): + vars.top_a = js["top_a"] if("rep_pen" in js): vars.rep_pen = js["rep_pen"] if("rep_pen_slope" in js): @@ -613,6 +616,7 @@ def savesettings(): js["top_k"] = vars.top_k js["tfs"] = vars.tfs js["typical"] = vars.typical + js["top_a"] = vars.top_a js["rep_pen"] = vars.rep_pen js["rep_pen_slope"] = vars.rep_pen_slope js["rep_pen_range"] = vars.rep_pen_range @@ -693,6 +697,8 @@ def processsettings(js): vars.tfs = js["tfs"] if("typical" in js): vars.typical = js["typical"] + if("top_a" in js): + vars.top_a = js["top_a"] if("rep_pen" in js): vars.rep_pen = js["rep_pen"] if("rep_pen_slope" in js): @@ -1379,7 +1385,7 @@ if(not vars.use_colab_tpu and vars.model not in ["InferKit", "Colab", "OAI", "Go # Patch transformers to use our custom logit warpers from transformers import LogitsProcessorList, LogitsWarper, LogitsProcessor, TopKLogitsWarper, TopPLogitsWarper, TemperatureLogitsWarper, RepetitionPenaltyLogitsProcessor - from warpers import AdvancedRepetitionPenaltyLogitsProcessor, TailFreeLogitsWarper, TypicalLogitsWarper + from warpers import AdvancedRepetitionPenaltyLogitsProcessor, TailFreeLogitsWarper, TypicalLogitsWarper, TopALogitsWarper def dynamic_processor_wrap(cls, field_name, var_name, cond=None): old_call = cls.__call__ @@ -1399,6 +1405,7 @@ if(not vars.use_colab_tpu and vars.model not in ["InferKit", "Colab", "OAI", "Go cls.__call__ = new_call dynamic_processor_wrap(AdvancedRepetitionPenaltyLogitsProcessor, ("penalty", "penalty_slope", "penalty_range"), ("rep_pen", "rep_pen_slope", "rep_pen_range"), cond=lambda x: x[0] != 1.0) dynamic_processor_wrap(TopKLogitsWarper, "top_k", "top_k", cond=lambda x: x > 0) + dynamic_processor_wrap(TopALogitsWarper, "top_a", "top_a", cond=lambda x: x > 0.0) dynamic_processor_wrap(TopPLogitsWarper, "top_p", "top_p", cond=lambda x: x < 1.0) dynamic_processor_wrap(TailFreeLogitsWarper, "tfs", "tfs", cond=lambda x: x < 1.0) dynamic_processor_wrap(TypicalLogitsWarper, "typical", "typical", cond=lambda x: x < 1.0) @@ -1445,6 +1452,7 @@ if(not vars.use_colab_tpu and vars.model not in ["InferKit", "Colab", "OAI", "Go def new_get_logits_warper(beams: int = 1,) -> LogitsProcessorList: warper_list = LogitsProcessorList() warper_list.append(TopKLogitsWarper(top_k=1, min_tokens_to_keep=1 + (beams > 1))) + warper_list.append(TopALogitsWarper(top_a=0.5, min_tokens_to_keep=1 + (beams > 1))) warper_list.append(TopPLogitsWarper(top_p=0.5, min_tokens_to_keep=1 + (beams > 1))) warper_list.append(TailFreeLogitsWarper(tfs=0.5, min_tokens_to_keep=1 + (beams > 1))) warper_list.append(TypicalLogitsWarper(typical=0.5, min_tokens_to_keep=1 + (beams > 1))) @@ -1814,6 +1822,7 @@ else: "top_k": int(vars.top_k), "tfs": float(vars.tfs), "typical": float(vars.typical), + "top_a": float(vars.top_a), "repetition_penalty": float(vars.rep_pen), "rpslope": float(vars.rep_pen_slope), "rprange": int(vars.rep_pen_range), @@ -2176,6 +2185,7 @@ def lua_has_setting(setting): "settopk", "settfs", "settypical", + "settopa", "setreppen", "setreppenslope", "setreppenrange", @@ -2195,6 +2205,7 @@ def lua_has_setting(setting): "top_k", "tfs", "typical", + "topa", "reppen", "reppenslope", "reppenrange", @@ -2229,6 +2240,7 @@ def lua_get_setting(setting): if(setting in ("settopk", "topk", "top_k")): return vars.top_k if(setting in ("settfs", "tfs")): return vars.tfs if(setting in ("settypical", "typical")): return vars.typical + if(setting in ("settopa", "topa")): return vars.top_a if(setting in ("setreppen", "reppen")): return vars.rep_pen if(setting in ("setreppenslope", "reppenslope")): return vars.rep_pen_slope if(setting in ("setreppenrange", "reppenrange")): return vars.rep_pen_range @@ -2264,6 +2276,7 @@ def lua_set_setting(setting, v): if(setting in ("settopk", "topk")): vars.top_k = v if(setting in ("settfs", "tfs")): vars.tfs = v if(setting in ("settypical", "typical")): vars.typical = v + if(setting in ("settopa", "topa")): vars.top_a = v if(setting in ("setreppen", "reppen")): vars.rep_pen = v if(setting in ("setreppenslope", "reppenslope")): vars.rep_pen_slope = v if(setting in ("setreppenrange", "reppenrange")): vars.rep_pen_range = v @@ -2688,6 +2701,11 @@ def get_message(msg): emit('from_server', {'cmd': 'setlabeltypical', 'data': msg['data']}, broadcast=True) settingschanged() refresh_settings() + elif(msg['cmd'] == 'settopa'): + vars.top_a = float(msg['data']) + emit('from_server', {'cmd': 'setlabeltopa', 'data': msg['data']}, broadcast=True) + settingschanged() + refresh_settings() elif(msg['cmd'] == 'setreppen'): vars.rep_pen = float(msg['data']) emit('from_server', {'cmd': 'setlabelreppen', 'data': msg['data']}, broadcast=True) @@ -3748,6 +3766,7 @@ def sendtocolab(txt, min, max): 'top_k': vars.top_k, 'tfs': vars.tfs, 'typical': vars.typical, + 'topa': vars.top_a, 'numseqs': vars.numseqs, 'retfultxt': False } @@ -3885,6 +3904,7 @@ def tpumtjgenerate(txt, minimum, maximum, found_entries=None): top_k=vars.top_k, tfs=vars.tfs, typical=vars.typical, + top_a=vars.top_a, numseqs=vars.numseqs, repetition_penalty=vars.rep_pen, rpslope=vars.rep_pen_slope, @@ -4071,6 +4091,7 @@ def refresh_settings(): emit('from_server', {'cmd': 'updatetopk', 'data': vars.top_k}, broadcast=True) emit('from_server', {'cmd': 'updatetfs', 'data': vars.tfs}, broadcast=True) emit('from_server', {'cmd': 'updatetypical', 'data': vars.typical}, broadcast=True) + emit('from_server', {'cmd': 'updatetopa', 'data': vars.top_a}, broadcast=True) emit('from_server', {'cmd': 'updatereppen', 'data': vars.rep_pen}, broadcast=True) emit('from_server', {'cmd': 'updatereppenslope', 'data': vars.rep_pen_slope}, broadcast=True) emit('from_server', {'cmd': 'updatereppenrange', 'data': vars.rep_pen_range}, broadcast=True) diff --git a/bridge.lua b/bridge.lua index ed0941c6..fc6c8823 100644 --- a/bridge.lua +++ b/bridge.lua @@ -867,6 +867,7 @@ return function(_python, _bridged) ---@field settopk integer ---@field settfs number ---@field settypical number + ---@field settopa number ---@field setreppen number ---@field setreppenslope number ---@field setreppenrange number @@ -884,6 +885,7 @@ return function(_python, _bridged) ---@field top_k integer ---@field tfs number ---@field typical number + ---@field topa number ---@field reppen number ---@field reppenslope number ---@field reppenrange number diff --git a/gensettings.py b/gensettings.py index e8d4e566..b3007c91 100644 --- a/gensettings.py +++ b/gensettings.py @@ -64,6 +64,17 @@ gensettingstf = [ "step": 0.05, "default": 1.0, "tooltip": "Alternative sampling method described in the paper \"Typical Decoding for Natural Language Generation\" (10.48550/ARXIV.2202.00666). The paper suggests 0.2 as a good value for this setting. Set this setting to 1 to disable its effect." + }, + { + "uitype": "slider", + "unit": "float", + "label": "Top a Sampling", + "id": "settopa", + "min": 0.0, + "max": 1.0, + "step": 0.01, + "default": 0.0, + "tooltip": "Alternative sampling method that reduces the randomness of the AI whenever the probability of one token is much higher than all the others. Higher values have a stronger effect. Set this setting to 0 to disable its effect." }, { "uitype": "slider", diff --git a/static/application.js b/static/application.js index 3b50281c..55487f76 100644 --- a/static/application.js +++ b/static/application.js @@ -2096,6 +2096,10 @@ $(document).ready(function(){ // Send current typical value to input $("#settypicalcur").val(msg.data); $("#settypical").val(parseFloat(msg.data)).trigger("change"); + } else if(msg.cmd == "updatetopa") { + // Send current top a value to input + $("#settopacur").val(msg.data); + $("#settopa").val(parseFloat(msg.data)).trigger("change"); } else if(msg.cmd == "updatereppen") { // Send current rep pen value to input $("#setreppencur").val(msg.data); @@ -2135,6 +2139,9 @@ $(document).ready(function(){ } else if(msg.cmd == "setlabeltypical") { // Update setting label with value from server $("#settypicalcur").val(msg.data); + } else if(msg.cmd == "setlabeltypical") { + // Update setting label with value from server + $("#settopa").val(msg.data); } else if(msg.cmd == "setlabelreppen") { // Update setting label with value from server $("#setreppencur").val(msg.data); diff --git a/templates/index.html b/templates/index.html index a3214ffa..690535f7 100644 --- a/templates/index.html +++ b/templates/index.html @@ -17,7 +17,7 @@ - + diff --git a/tpu_mtj_backend.py b/tpu_mtj_backend.py index fb2dc7ae..f66ad53c 100644 --- a/tpu_mtj_backend.py +++ b/tpu_mtj_backend.py @@ -70,6 +70,7 @@ def settings_callback() -> dict: "top_k": 0, "tfs": 1.0, "typical": 1.0, + "top_a": 0.0, "repetition_penalty": 1.0, "rpslope": 0.0, "rprange": 0, @@ -158,10 +159,10 @@ def apply_repetition_penalty_dynamic(logits, tokens, repetition_penalty, generat logits[tokens] = penalty_logits return logits -def kobold_sample_dynamic(key, logits, top_p=0.9, temp=0.5, top_k=0, tfs=1.0, typical=1.0): +def kobold_sample_dynamic(key, logits, top_p=0.9, temp=0.5, top_k=0, tfs=1.0, typical=1.0, top_a=0.0): ''' - This gets called by generate_loop_fn to apply a series of 5 filters - to the logits (top-k, then top-p, then TFS, then typical, then temperature) + This gets called by generate_loop_fn to apply a series of 6 filters + to the logits (top-k, then top-a, then top-p, then TFS, then typical, then temperature) before picking one token using the modified logits ''' # Top-k (keep only the k tokens with the highest logits and remove @@ -182,6 +183,20 @@ def kobold_sample_dynamic(key, logits, top_p=0.9, temp=0.5, top_k=0, tfs=1.0, ty return np.where(indices_to_remove, -np.inf, logits) if top_k > 0: logits = top_k_filter(logits) + # Top-a (remove all tokens that have softmax probability less than + # a*m^2 where m is the maximum softmax probability) + def top_a_filter(logits): + # Replace every element in the logits array + # with e (Euler's number) to the power of that element, and divide + # each element of the new array by the sum of the elements in the + # new array + probabilities = np.array(jax.nn.softmax(logits), copy=True) + # Find the largest probability + probs_max = probabilities.max() + # Remove tokens + return np.where(probabilities < probs_max * probs_max * top_a, -np.inf, logits) + if top_a > 0.0: + logits = top_a_filter(logits) # Top-p (after sorting the remaining tokens again in descending order of # logit, remove the ones that have cumulative softmax probability # greater than p) @@ -332,10 +347,10 @@ def apply_repetition_penalty_static(logits, tokens, repetition_penalty, generate # positions in the logits array return logits.at[tokens].set(penalty_logits) -def kobold_sample_static(key, logits, top_p=0.9, temp=0.5, top_k=0, tfs=1.0, typical=1.0): +def kobold_sample_static(key, logits, top_p=0.9, temp=0.5, top_k=0, tfs=1.0, typical=1.0, top_a=0.0): ''' - This gets called by generate_loop_fn to apply a series of 5 filters - to the logits (top-k, then top-p, then TFS, then typical, then temperature) + This gets called by generate_loop_fn to apply a series of 6 filters + to the logits (top-k, then top-a, then top-p, then TFS, then typical, then temperature) before picking one token using the modified logits ''' # Top-k (keep only the k tokens with the highest logits and remove @@ -355,6 +370,19 @@ def kobold_sample_static(key, logits, top_p=0.9, temp=0.5, top_k=0, tfs=1.0, typ ) return jnp.where(indices_to_remove, -jnp.inf, logits) logits = jax.lax.cond(top_k > 0, top_k_filter, lambda x: x, logits) + # Top-a (remove all tokens that have softmax probability less than + # a*m^2 where m is the maximum softmax probability) + def top_a_filter(logits): + # Replace every element in the logits array + # with e (Euler's number) to the power of that element, and divide + # each element of the new array by the sum of the elements in the + # new array + probabilities = jax.nn.softmax(logits) + # Find the largest probability + probs_max = probabilities.max() + # Remove tokens + return jnp.where(probabilities < probs_max * probs_max * top_a, -jnp.inf, logits) + logits = jax.lax.cond(top_a > 0.0, top_a_filter, lambda x: x, logits) # Top-p (after sorting the remaining tokens again in descending order of # logit, remove the ones that have cumulative softmax probability # greater than p) @@ -806,6 +834,7 @@ def infer_static( top_k=0, tfs=1.0, typical=1.0, + top_a=0.0, repetition_penalty=1.0, rpslope=0.0, rprange=0, @@ -829,6 +858,7 @@ def infer_static( "top_p": top_p * np.ones(total_batch), "tfs": tfs * np.ones(total_batch), "typical": typical * np.ones(total_batch), + "top_a": top_a * np.ones(total_batch), "repetition_penalty": repetition_penalty * np.ones(total_batch), "rpslope": rpslope * np.ones(total_batch), "rprange": np.full(total_batch, rprange, dtype=np.uint32), diff --git a/warpers.py b/warpers.py index 7c4f854b..9c1f88eb 100644 --- a/warpers.py +++ b/warpers.py @@ -148,3 +148,32 @@ class TypicalLogitsWarper(LogitsWarper): indices_to_remove = sorted_indices_to_remove.scatter(1, sorted_indices, sorted_indices_to_remove) scores = scores.masked_fill(indices_to_remove, self.filter_value) return scores + + +class TopALogitsWarper(LogitsWarper): + def __init__(self, top_a: float, filter_value: float = -float("Inf"), min_tokens_to_keep: int = 1): + top_a = float(top_a) + if top_a < 0 or top_a > 1.0: + raise ValueError(f"`top_a` has to be a float >= 0 and <= 1, but is {top_a}") + self.top_a = top_a + self.filter_value = filter_value + self.min_tokens_to_keep = min_tokens_to_keep + + def __call__(self, input_ids: torch.LongTensor, scores: torch.FloatTensor) -> torch.FloatTensor: + if self.filter_value >= 1.0: + return scores + + sorted_logits, sorted_indices = torch.sort(scores, descending=True) + probs = sorted_logits.softmax(dim=-1) + + # Remove tokens with probability less than top_a*(max(probs))^2 (token with 0 are kept) + probs_max = probs[..., 0, None] + sorted_indices_to_remove = probs >= probs_max * probs_max * self.top_a + + if self.min_tokens_to_keep > 1: + # Keep at least min_tokens_to_keep + sorted_indices_to_remove[..., : self.min_tokens_to_keep] = 0 + + indices_to_remove = sorted_indices_to_remove.scatter(1, sorted_indices, sorted_indices_to_remove) + scores = scores.masked_fill(indices_to_remove, self.filter_value) + return scores From 42b7a327b2440a3a48a969059beb06293a26e239 Mon Sep 17 00:00:00 2001 From: Gnome Ann <> Date: Fri, 10 Jun 2022 22:34:14 -0400 Subject: [PATCH 49/63] Fix an unfortunate typo in top-a warper --- warpers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/warpers.py b/warpers.py index 9c1f88eb..fb683f50 100644 --- a/warpers.py +++ b/warpers.py @@ -168,7 +168,7 @@ class TopALogitsWarper(LogitsWarper): # Remove tokens with probability less than top_a*(max(probs))^2 (token with 0 are kept) probs_max = probs[..., 0, None] - sorted_indices_to_remove = probs >= probs_max * probs_max * self.top_a + sorted_indices_to_remove = probs < probs_max * probs_max * self.top_a if self.min_tokens_to_keep > 1: # Keep at least min_tokens_to_keep From 5c81374a48822cdaeb742d9aa007a152db30260d Mon Sep 17 00:00:00 2001 From: Henk Date: Sat, 11 Jun 2022 22:04:37 +0200 Subject: [PATCH 50/63] Top A for GooseAi --- aiserver.py | 1 + 1 file changed, 1 insertion(+) diff --git a/aiserver.py b/aiserver.py index f14bbd77..b51fe538 100644 --- a/aiserver.py +++ b/aiserver.py @@ -4668,6 +4668,7 @@ def oairequest(txt, min, max): 'prompt': txt, 'max_tokens': vars.genamt, 'temperature': vars.temp, + 'top_a': vars.top_a, 'top_p': vars.top_p, 'top_k': vars.top_k, 'tfs': vars.tfs, From 66c0dda485d9be7df300e7e791d5b625f0c825e3 Mon Sep 17 00:00:00 2001 From: Henk Date: Sat, 11 Jun 2022 22:54:51 +0200 Subject: [PATCH 51/63] Hide (Broken) Chatbot Models Removing this option because they are currently unavailable. People who still have them can load them trough the load from file option. Once they have been retrained and reuploaded I will add the menu back. --- aiserver.py | 1 - 1 file changed, 1 deletion(-) diff --git a/aiserver.py b/aiserver.py index b51fe538..6267aec2 100644 --- a/aiserver.py +++ b/aiserver.py @@ -90,7 +90,6 @@ mainmenu = [ ["Adventure Models", "adventurelist", ""], ["Novel Models", "novellist", ""], ["NSFW Models", "nsfwlist", ""], - ["Chatbot Models", "chatlist", ""], ["Untuned GPT-Neo/J", "gptneolist", ""], ["Untuned Fairseq Dense", "fsdlist", ""], ["Untuned OPT", "optlist", ""], From 2d3db7b4ba388f566aaec88a0e76678fe4fade8d Mon Sep 17 00:00:00 2001 From: Gnome Ann <> Date: Mon, 13 Jun 2022 19:12:23 -0400 Subject: [PATCH 52/63] Implement support for sampler order in the backend code --- aiserver.py | 27 +++++++++++++++++++-------- tpu_mtj_backend.py | 46 +++++++++++++++++++++++++++------------------- utils.py | 2 ++ 3 files changed, 48 insertions(+), 27 deletions(-) diff --git a/aiserver.py b/aiserver.py index 6267aec2..0bed5ad8 100644 --- a/aiserver.py +++ b/aiserver.py @@ -306,6 +306,7 @@ class vars: acregex_ui = re.compile(r'^ *(>.*)$', re.MULTILINE) # Pattern for matching actions in the HTML-escaped story so we can apply colouring, etc (make sure to encase part to format in parentheses) comregex_ai = re.compile(r'(?:\n<\|(?:.|\n)*?\|>(?=\n|$))|(?:<\|(?:.|\n)*?\|>\n?)') # Pattern for matching comments to remove them before sending them to the AI comregex_ui = re.compile(r'(<\|(?:.|\n)*?\|>)') # Pattern for matching comments in the editor + sampler_order = utils.default_sampler_order.copy() chatmode = False chatname = "You" adventure = False @@ -1448,15 +1449,23 @@ if(not vars.use_colab_tpu and vars.model not in ["InferKit", "Colab", "OAI", "Go new_get_logits_processor.old_get_logits_processor = transformers.generation_utils.GenerationMixin._get_logits_processor transformers.generation_utils.GenerationMixin._get_logits_processor = new_get_logits_processor + class KoboldLogitsWarperList(LogitsProcessorList): + def __init__(self, beams: int = 1, **kwargs): + self.__warper_list: List[LogitsWarper] = [] + self.__warper_list.append(TopKLogitsWarper(top_k=1, min_tokens_to_keep=1 + (beams > 1))) + self.__warper_list.append(TopALogitsWarper(top_a=0.5, min_tokens_to_keep=1 + (beams > 1))) + self.__warper_list.append(TopPLogitsWarper(top_p=0.5, min_tokens_to_keep=1 + (beams > 1))) + self.__warper_list.append(TailFreeLogitsWarper(tfs=0.5, min_tokens_to_keep=1 + (beams > 1))) + self.__warper_list.append(TypicalLogitsWarper(typical=0.5, min_tokens_to_keep=1 + (beams > 1))) + self.__warper_list.append(TemperatureLogitsWarper(temperature=0.5)) + + def __call__(self, input_ids: torch.LongTensor, scores: torch.FloatTensor, *args, **kwargs): + for k in vars.sampler_order: + scores = self.__warper_list[k](input_ids, scores, *args, **kwargs) + return scores + def new_get_logits_warper(beams: int = 1,) -> LogitsProcessorList: - warper_list = LogitsProcessorList() - warper_list.append(TopKLogitsWarper(top_k=1, min_tokens_to_keep=1 + (beams > 1))) - warper_list.append(TopALogitsWarper(top_a=0.5, min_tokens_to_keep=1 + (beams > 1))) - warper_list.append(TopPLogitsWarper(top_p=0.5, min_tokens_to_keep=1 + (beams > 1))) - warper_list.append(TailFreeLogitsWarper(tfs=0.5, min_tokens_to_keep=1 + (beams > 1))) - warper_list.append(TypicalLogitsWarper(typical=0.5, min_tokens_to_keep=1 + (beams > 1))) - warper_list.append(TemperatureLogitsWarper(temperature=0.5)) - return warper_list + return KoboldLogitsWarperList(beams=beams) def new_sample(self, *args, **kwargs): assert kwargs.pop("logits_warper", None) is not None @@ -1816,6 +1825,7 @@ else: def tpumtjgenerate_settings_callback() -> dict: return { + "sampler_order": vars.sampler_order, "top_p": float(vars.top_p), "temp": float(vars.temp), "top_k": int(vars.top_k), @@ -3910,6 +3920,7 @@ def tpumtjgenerate(txt, minimum, maximum, found_entries=None): rprange=vars.rep_pen_range, soft_embeddings=vars.sp, soft_tokens=soft_tokens, + sampler_order=vars.sampler_order, ) past = genout for i in range(vars.numseqs): diff --git a/tpu_mtj_backend.py b/tpu_mtj_backend.py index f66ad53c..67e006d6 100644 --- a/tpu_mtj_backend.py +++ b/tpu_mtj_backend.py @@ -65,6 +65,7 @@ def stopping_callback(generated, n_generated, excluded_world_info) -> Tuple[List def settings_callback() -> dict: return { + "sampler_order": utils.default_sampler_order.copy(), "top_p": 0.9, "temp": 0.5, "top_k": 0, @@ -159,7 +160,7 @@ def apply_repetition_penalty_dynamic(logits, tokens, repetition_penalty, generat logits[tokens] = penalty_logits return logits -def kobold_sample_dynamic(key, logits, top_p=0.9, temp=0.5, top_k=0, tfs=1.0, typical=1.0, top_a=0.0): +def kobold_sample_dynamic(key, logits, sampler_order: Optional[np.ndarray] = None, top_p=0.9, temp=0.5, top_k=0, tfs=1.0, typical=1.0, top_a=0.0): ''' This gets called by generate_loop_fn to apply a series of 6 filters to the logits (top-k, then top-a, then top-p, then TFS, then typical, then temperature) @@ -181,8 +182,6 @@ def kobold_sample_dynamic(key, logits, top_p=0.9, temp=0.5, top_k=0, tfs=1.0, ty sorted_indices_to_remove, ) return np.where(indices_to_remove, -np.inf, logits) - if top_k > 0: - logits = top_k_filter(logits) # Top-a (remove all tokens that have softmax probability less than # a*m^2 where m is the maximum softmax probability) def top_a_filter(logits): @@ -195,8 +194,6 @@ def kobold_sample_dynamic(key, logits, top_p=0.9, temp=0.5, top_k=0, tfs=1.0, ty probs_max = probabilities.max() # Remove tokens return np.where(probabilities < probs_max * probs_max * top_a, -np.inf, logits) - if top_a > 0.0: - logits = top_a_filter(logits) # Top-p (after sorting the remaining tokens again in descending order of # logit, remove the ones that have cumulative softmax probability # greater than p) @@ -222,8 +219,6 @@ def kobold_sample_dynamic(key, logits, top_p=0.9, temp=0.5, top_k=0, tfs=1.0, ty sorted_indices_to_remove, ) return np.where(indices_to_remove, -np.inf, logits) - if top_p < 1.0: - logits = top_p_filter(logits) # Tail free sampling (basically top-p a second time on remaining tokens # except it's the "cumulative normalized absolute second finite # differences of the softmax probabilities" instead of just the @@ -262,8 +257,6 @@ def kobold_sample_dynamic(key, logits, top_p=0.9, temp=0.5, top_k=0, tfs=1.0, ty sorted_indices_to_remove, ) return np.where(indices_to_remove, -np.inf, logits) - if tfs < 1.0: - logits = tail_free_filter(logits) # Typical sampling (https://arxiv.org/pdf/2202.00666.pdf) def typical_filter(logits): # Compute softmax probabilities and the natural logarithms of them @@ -293,10 +286,16 @@ def kobold_sample_dynamic(key, logits, top_p=0.9, temp=0.5, top_k=0, tfs=1.0, ty sorted_indices_to_remove, ) return np.where(indices_to_remove, -jnp.inf, logits) - if typical < 1.0: - logits = typical_filter(logits) # Temperature (just divide the logits by the temperature) - logits /= temp + def temp_filter(logits): + return logits / temp + for k in sampler_order: + if k == 0 and top_k > 0: logits = top_k_filter(logits) + if k == 1 and top_a > 0.0: logits = top_a_filter(logits) + if k == 2 and top_p < 1.0: logits = top_p_filter(logits) + if k == 3 and tfs < 1.0: logits = tail_free_filter(logits) + if k == 4 and typical < 1.0: logits = typical_filter(logits) + if k == 5 and temp != 1.0: logits = temp_filter(logits) # Finally, pick one token using the softmax thingy again (it gives # an array whose elements sum to 1 so it can be used nicely as a # probability distribution) @@ -347,7 +346,7 @@ def apply_repetition_penalty_static(logits, tokens, repetition_penalty, generate # positions in the logits array return logits.at[tokens].set(penalty_logits) -def kobold_sample_static(key, logits, top_p=0.9, temp=0.5, top_k=0, tfs=1.0, typical=1.0, top_a=0.0): +def kobold_sample_static(key, logits, sampler_order: Optional[np.ndarray] = None, top_p=0.9, temp=0.5, top_k=0, tfs=1.0, typical=1.0, top_a=0.0): ''' This gets called by generate_loop_fn to apply a series of 6 filters to the logits (top-k, then top-a, then top-p, then TFS, then typical, then temperature) @@ -369,7 +368,6 @@ def kobold_sample_static(key, logits, top_p=0.9, temp=0.5, top_k=0, tfs=1.0, typ sorted_indices_to_remove, ) return jnp.where(indices_to_remove, -jnp.inf, logits) - logits = jax.lax.cond(top_k > 0, top_k_filter, lambda x: x, logits) # Top-a (remove all tokens that have softmax probability less than # a*m^2 where m is the maximum softmax probability) def top_a_filter(logits): @@ -382,7 +380,6 @@ def kobold_sample_static(key, logits, top_p=0.9, temp=0.5, top_k=0, tfs=1.0, typ probs_max = probabilities.max() # Remove tokens return jnp.where(probabilities < probs_max * probs_max * top_a, -jnp.inf, logits) - logits = jax.lax.cond(top_a > 0.0, top_a_filter, lambda x: x, logits) # Top-p (after sorting the remaining tokens again in descending order of # logit, remove the ones that have cumulative softmax probability # greater than p) @@ -408,7 +405,6 @@ def kobold_sample_static(key, logits, top_p=0.9, temp=0.5, top_k=0, tfs=1.0, typ sorted_indices_to_remove, ) return jnp.where(indices_to_remove, -jnp.inf, logits) - logits = jax.lax.cond(top_p < 1.0, top_p_filter, lambda x: x, logits) # Tail free sampling (basically top-p a second time on remaining tokens # except it's the "cumulative normalized absolute second finite # differences of the softmax probabilities" instead of just the @@ -447,7 +443,6 @@ def kobold_sample_static(key, logits, top_p=0.9, temp=0.5, top_k=0, tfs=1.0, typ sorted_indices_to_remove, ) return jnp.where(indices_to_remove, -jnp.inf, logits) - logits = jax.lax.cond(tfs < 1.0, tail_free_filter, lambda x: x, logits) # Typical sampling (https://arxiv.org/pdf/2202.00666.pdf) def typical_filter(logits): # Compute softmax probabilities and the natural logarithms of them @@ -476,11 +471,16 @@ def kobold_sample_static(key, logits, top_p=0.9, temp=0.5, top_k=0, tfs=1.0, typ sorted_indices_to_remove, ) return jnp.where(indices_to_remove, -jnp.inf, logits) - logits = jax.lax.cond(typical < 1.0, typical_filter, lambda x: x, logits) # Temperature (just divide the logits by the temperature) def temp_filter(logits): return logits / temp - logits = jax.lax.cond(True, temp_filter, lambda x: x, logits) + for k in sampler_order: + logits = jax.lax.cond(jnp.logical_and(k == 0, top_k > 0), top_k_filter, lambda x: x, logits) + logits = jax.lax.cond(jnp.logical_and(k == 1, top_a > 0.0), top_a_filter, lambda x: x, logits) + logits = jax.lax.cond(jnp.logical_and(k == 2, top_p < 1.0), top_p_filter, lambda x: x, logits) + logits = jax.lax.cond(jnp.logical_and(k == 3, tfs < 1.0), tail_free_filter, lambda x: x, logits) + logits = jax.lax.cond(jnp.logical_and(k == 4, typical < 1.0), typical_filter, lambda x: x, logits) + logits = jax.lax.cond(jnp.logical_and(k == 5, temp != 1.0), temp_filter, lambda x: x, logits) # Finally, pick one token using the softmax thingy again (it gives # an array whose elements sum to 1 so it can be used nicely as a # probability distribution) @@ -842,8 +842,12 @@ def infer_static( gen_len=80, soft_embeddings: Optional[np.array] = None, soft_tokens: Optional[np.array] = None, + sampler_order: Optional[List[int]] = None, ) -> List[np.array]: maps.thread_resources.env = thread_resources_env + if sampler_order is None: + sampler_order = utils.default_sampler_order.copy() + sampler_order = np.uint32(sampler_order) total_batch = 1 tokens = context if(soft_tokens is not None): @@ -854,6 +858,7 @@ def infer_static( batched_tokens = np.array([padded_tokens] * total_batch) samples = [] batched_generator_params = { + "sampler_order": np.repeat(sampler_order[np.newaxis], total_batch, axis=0), "temp": temp * np.ones(total_batch), "top_p": top_p * np.ones(total_batch), "tfs": tfs * np.ones(total_batch), @@ -1015,6 +1020,9 @@ def read_neox_checkpoint(state, path, config, checkpoint_shards=2): def load_model(path: str, driver_version="tpu_driver0.1_dev20210607", hf_checkpoint=False, **kwargs) -> None: global thread_resources_env, seq, tokenizer, network, params + if not hasattr(vars, "sampler_order") or not vars.sampler_order: + vars.sampler_order = utils.default_sampler_order.copy() + default_params = { "compat": "j", "layers": 28, diff --git a/utils.py b/utils.py index bc085412..96606269 100644 --- a/utils.py +++ b/utils.py @@ -20,6 +20,8 @@ from_pretrained_index_filename: Optional[str] = None from_pretrained_kwargs = {} bar = None +default_sampler_order = [0, 1, 2, 3, 4, 5] + #==================================================================# # Decorator to prevent a function's actions from being run until # at least x seconds have passed without the function being called From 4c7d6f42d99d557130511f5d185249b34f9db5a1 Mon Sep 17 00:00:00 2001 From: Gnome Ann <> Date: Mon, 13 Jun 2022 19:14:38 -0400 Subject: [PATCH 53/63] Add `sampler_order` to settings file --- aiserver.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/aiserver.py b/aiserver.py index 0bed5ad8..abaffa77 100644 --- a/aiserver.py +++ b/aiserver.py @@ -568,6 +568,8 @@ def loadmodelsettings(): vars.badwordsids = js["badwordsids"] if("nobreakmodel" in js): vars.nobreakmodel = js["nobreakmodel"] + if("sampler_order" in js): + vars.sampler_order = js["sampler_order"] if("temp" in js): vars.temp = js["temp"] if("top_p" in js): @@ -611,6 +613,7 @@ def savesettings(): js = {} js["apikey"] = vars.apikey js["andepth"] = vars.andepth + js["sampler_order"] = vars.sampler_order js["temp"] = vars.temp js["top_p"] = vars.top_p js["top_k"] = vars.top_k @@ -687,6 +690,8 @@ def processsettings(js): vars.apikey = js["apikey"] if("andepth" in js): vars.andepth = js["andepth"] + if("sampler_order" in js): + vars.sampler_order = js["sampler_order"] if("temp" in js): vars.temp = js["temp"] if("top_p" in js): From 6231106f95221bdfa3ed452fdca0bb14b22aa453 Mon Sep 17 00:00:00 2001 From: Gnome Ann <> Date: Mon, 13 Jun 2022 20:18:09 -0400 Subject: [PATCH 54/63] Add Samplers menu --- aiserver.py | 12 ++++++ static/application.js | 90 ++++++++++++++++++++++++++++++++++++++++++- static/custom.css | 28 ++++++++++++-- templates/index.html | 20 +++++++++- 4 files changed, 143 insertions(+), 7 deletions(-) diff --git a/aiserver.py b/aiserver.py index abaffa77..06c65fc0 100644 --- a/aiserver.py +++ b/aiserver.py @@ -2873,6 +2873,8 @@ def get_message(msg): elif(msg['cmd'] == 'uslistrequest'): unloaded, loaded = getuslist() emit('from_server', {'cmd': 'buildus', 'data': {"unloaded": unloaded, "loaded": loaded}}) + elif(msg['cmd'] == 'samplerlistrequest'): + emit('from_server', {'cmd': 'buildsamplers', 'data': vars.sampler_order}) elif(msg['cmd'] == 'usloaded'): vars.userscripts = [] for userscript in msg['data']: @@ -2886,6 +2888,16 @@ def get_message(msg): load_lua_scripts() unloaded, loaded = getuslist() sendUSStatItems() + elif(msg['cmd'] == 'samplers'): + sampler_order = msg["data"] + if(not isinstance(sampler_order, list)): + raise ValueError(f"Sampler order must be a list, but got a {type(sampler_order)}") + if(len(sampler_order) != len(vars.sampler_order)): + raise ValueError(f"Sampler order must be a list of length {len(vars.sampler_order)}, but got a list of length {len(sampler_order)}") + if(not all(isinstance(e, int) for e in sampler_order)): + raise ValueError(f"Sampler order must be a list of ints, but got a list with at least one non-int element") + vars.sampler_order = sampler_order + settingschanged() elif(msg['cmd'] == 'loadselect'): vars.loadselect = msg["data"] elif(msg['cmd'] == 'spselect'): diff --git a/static/application.js b/static/application.js index 55487f76..3cddea87 100644 --- a/static/application.js +++ b/static/application.js @@ -20,6 +20,7 @@ var button_settings; var button_format; var button_softprompt; var button_userscripts; +var button_samplers; var button_mode; var button_mode_label; var button_send; @@ -109,6 +110,9 @@ var do_clear_ent = false; // Whether or not an entry in the Userscripts menu is being dragged var us_dragging = false; +// Whether or not an entry in the Samplers menu is being dragged +var samplers_dragging = false; + // Display vars var allowtoggle = false; var formatcount = 0; @@ -976,6 +980,16 @@ function hideUSPopup() { spcontent.html(""); } +function showSamplersPopup() { + samplerspopup.removeClass("hidden"); + samplerspopup.addClass("flex"); +} + +function hideSamplersPopup() { + samplerspopup.removeClass("flex"); + samplerspopup.addClass("hidden"); +} + function buildLoadList(ar) { disableButtons([load_accept]); loadcontent.html(""); @@ -1109,6 +1123,29 @@ function buildUSList(unloaded, loaded) { } } +function buildSamplerList(samplers) { + samplerslist.html(""); + showSamplersPopup(); + var i; + var samplers_lookup_table = [ + "Top-k Sampling", + "Top-a Sampling", + "Top-p Sampling", + "Tail-free Sampling", + "Typical Sampling", + "Temperature", + ] + for(i=0; i\ +

\ +
\ +
"+samplers_lookup_table[samplers[i]]+"
\ +
\ +
\ + "); + } +} + function highlightLoadLine(ref) { $("#loadlistcontent > div > div.popuplistselected").removeClass("popuplistselected"); ref.addClass("popuplistselected"); @@ -1838,6 +1875,7 @@ $(document).ready(function(){ button_format = $('#btn_format'); button_softprompt = $("#btn_softprompt"); button_userscripts= $("#btn_userscripts"); + button_samplers = $("#btn_samplers"); button_mode = $('#btnmode') button_mode_label = $('#btnmode_label') button_send = $('#btnsend'); @@ -1886,6 +1924,10 @@ $(document).ready(function(){ usloaded = $("#uslistloaded"); us_accept = $("#btn_usaccept"); us_close = $("#btn_usclose"); + samplerspopup = $("#samplerscontainer"); + samplerslist = $("#samplerslist"); + samplers_accept = $("#btn_samplersaccept"); + samplers_close = $("#btn_samplersclose"); nspopup = $("#newgamecontainer"); ns_accept = $("#btn_nsaccept"); ns_close = $("#btn_nsclose"); @@ -1908,7 +1950,7 @@ $(document).ready(function(){ modelname = msg.modelname; } refreshTitle(); - connect_status.html("Connected to KoboldAI Process!"); + connect_status.html("Connected to KoboldAI!"); connect_status.removeClass("color_orange"); connect_status.addClass("color_green"); // Reset Menus @@ -2310,6 +2352,8 @@ $(document).ready(function(){ buildSPList(msg.data); } else if(msg.cmd == "buildus") { buildUSList(msg.data.unloaded, msg.data.loaded); + } else if(msg.cmd == "buildsamplers") { + buildSamplerList(msg.data); } else if(msg.cmd == "askforoverwrite") { // Show overwrite warning show([$(".saveasoverwrite")]); @@ -2436,6 +2480,20 @@ $(document).ready(function(){ }, 10); } + var samplers_click_handler = function(ev) { + setTimeout(function() { + if (samplers_dragging) { + return; + } + var target = $(ev.target).closest(".samplerslistitem"); + var next = target.parent().next().find(".samplerslistitem"); + if (!next.length) { + return; + } + next.parent().after(target.parent()); + }, 10); + } + // Make the userscripts menu sortable var us_sortable_settings = { placeholder: "ussortable-placeholder", @@ -2456,6 +2514,22 @@ $(document).ready(function(){ connectWith: "#uslistunloaded", }, us_sortable_settings)).on("click", ".uslistitem", us_click_handler); + // Make the samplers menu sortable + var samplers_sortable_settings = { + placeholder: "samplerssortable-placeholder", + start: function() { samplers_dragging = true; }, + stop: function() { samplers_dragging = false; }, + delay: 2, + cursor: "move", + tolerance: "pointer", + opacity: 0.21, + revert: 173, + scrollSensitivity: 64, + scrollSpeed: 10, + } + samplerslist.sortable($.extend({ + }, samplers_sortable_settings)).on("click", ".samplerslistitem", samplers_click_handler); + // Bind actions to UI buttons button_send.on("click", function(ev) { dosubmit(); @@ -2590,6 +2664,10 @@ $(document).ready(function(){ button_userscripts.on("click", function(ev) { socket.send({'cmd': 'uslistrequest', 'data': ''}); }); + + button_samplers.on("click", function(ev) { + socket.send({'cmd': 'samplerlistrequest', 'data': ''}); + }); load_close.on("click", function(ev) { hideLoadPopup(); @@ -2623,6 +2701,16 @@ $(document).ready(function(){ socket.send({'cmd': 'usload', 'data': ''}); hideUSPopup(); }); + + samplers_close.on("click", function(ev) { + hideSamplersPopup(); + }); + + samplers_accept.on("click", function(ev) { + hideMessage(); + socket.send({'cmd': 'samplers', 'data': samplerslist.find(".samplerslistitem").map(function() { return parseInt($(this).attr("sid")); }).toArray()}); + hideSamplersPopup(); + }); button_newgame.on("click", function(ev) { if(connected) { diff --git a/static/custom.css b/static/custom.css index d70fd34e..640cb8db 100644 --- a/static/custom.css +++ b/static/custom.css @@ -457,6 +457,26 @@ body.connected #popupfooter, #popupfooter.always-available { overflow-wrap: anywhere; } +#samplerspopup { + width: 300px; + background-color: #262626; + margin-top: 100px; +} + +@media (max-width: 768px) { + #samplerspopup { + width: 100%; + background-color: #262626; + margin-top: 100px; + } +} + +#samplerslist { + height: 300px; + overflow-y: scroll; + overflow-wrap: anywhere; +} + #nspopup { width: 350px; background-color: #262626; @@ -750,7 +770,7 @@ body.connected .dropdown-item:hover, .dropdown-item.always-available:hover { background-color: #3bf723; } -.ussortable-placeholder { +.ussortable-placeholder, .samplerssortable-placeholder { height: 4px; background-color: #3bf723; } @@ -1340,7 +1360,7 @@ body.connected .popupfooter, .popupfooter.always-available { background-color: #688f1f; } -.uslistitem { +.uslistitem, .samplerslistitem { padding: 12px 10px 12px 10px; display: flex; flex-grow: 1; @@ -1352,11 +1372,11 @@ body.connected .popupfooter, .popupfooter.always-available { transition: background-color 0.25s ease-in; } -.uslistitemsub { +.uslistitemsub, .samplerslistitemsub { color: #ba9; } -.uslistitem:hover { +.uslistitem:hover, .samplerslistitem:hover { cursor: move; background-color: #688f1f; } diff --git a/templates/index.html b/templates/index.html index 690535f7..7ec9f66c 100644 --- a/templates/index.html +++ b/templates/index.html @@ -9,7 +9,7 @@ - + @@ -17,7 +17,7 @@ - + @@ -71,6 +71,9 @@ + @@ -299,6 +302,19 @@ +