Implement default settings customization using a json file

This commit is contained in:
oobabooga 2023-01-15 15:23:41 -03:00
parent cf0cdae9c6
commit 88d67427e1
3 changed files with 72 additions and 32 deletions

View File

@ -120,18 +120,21 @@ Then browse to
Optionally, you can use the following command-line flags: Optionally, you can use the following command-line flags:
``` ```
-h, --help show this help message and exit -h, --help show this help message and exit
--model MODEL Name of the model to load by default. --model MODEL Name of the model to load by default.
--notebook Launch the webui in notebook mode, where the output is written to the same text --settings-file SETTINGS_FILE
box as the input. Load default interface settings from this json file. See settings-
--chat Launch the webui in chat mode. template.json for an example.
--cai-chat Launch the webui in chat mode with a style similar to Character.AI's. If the --notebook Launch the webui in notebook mode, where the output is written to the same
file profile.png exists in the same folder as server.py, this image will be used text box as the input.
as the bot's profile picture. --chat Launch the webui in chat mode.
--cpu Use the CPU to generate text. --cai-chat Launch the webui in chat mode with a style similar to Character.AI's. If
--auto-devices Automatically split the model across the available GPU(s) and CPU. the file profile.png exists in the same folder as server.py, this image
--load-in-8bit Load the model with 8-bit precision. will be used as the bot's profile picture.
--no-listen Make the webui unreachable from your local network. --cpu Use the CPU to generate text.
--auto-devices Automatically split the model across the available GPU(s) and CPU.
--load-in-8bit Load the model with 8-bit precision.
--no-listen Make the webui unreachable from your local network.
``` ```
## Presets ## Presets

View File

@ -4,6 +4,7 @@ import glob
from sys import exit from sys import exit
import torch import torch
import argparse import argparse
import json
from pathlib import Path from pathlib import Path
import gradio as gr import gradio as gr
import transformers import transformers
@ -12,8 +13,11 @@ from transformers import AutoTokenizer, AutoModelForCausalLM
import warnings import warnings
transformers.logging.set_verbosity_error()
parser = argparse.ArgumentParser() parser = argparse.ArgumentParser()
parser.add_argument('--model', type=str, help='Name of the model to load by default.') parser.add_argument('--model', type=str, help='Name of the model to load by default.')
parser.add_argument('--settings-file', type=str, help='Load default interface settings from this json file. See settings-template.json for an example.')
parser.add_argument('--notebook', action='store_true', help='Launch the webui in notebook mode, where the output is written to the same text box as the input.') parser.add_argument('--notebook', action='store_true', help='Launch the webui in notebook mode, where the output is written to the same text box as the input.')
parser.add_argument('--chat', action='store_true', help='Launch the webui in chat mode.') parser.add_argument('--chat', action='store_true', help='Launch the webui in chat mode.')
parser.add_argument('--cai-chat', action='store_true', help='Launch the webui in chat mode with a style similar to Character.AI\'s. If the file profile.png exists in the same folder as server.py, this image will be used as the bot\'s profile picture.') parser.add_argument('--cai-chat', action='store_true', help='Launch the webui in chat mode with a style similar to Character.AI\'s. If the file profile.png exists in the same folder as server.py, this image will be used as the bot\'s profile picture.')
@ -29,7 +33,28 @@ available_models = [item for item in available_models if not item.endswith('.txt
available_models = sorted(available_models, key=str.lower) available_models = sorted(available_models, key=str.lower)
available_presets = sorted(set(map(lambda x : str(x.name).split('.')[0], list(Path('presets').glob('*.txt'))))) available_presets = sorted(set(map(lambda x : str(x.name).split('.')[0], list(Path('presets').glob('*.txt')))))
transformers.logging.set_verbosity_error() settings = {
'max_new_tokens': 200,
'max_new_tokens_min': 1,
'max_new_tokens_max': 2000,
'preset': 'NovelAI-Sphinx Moth',
'name1': 'Person 1',
'name2': 'Person 2',
'name1_pygmalion': 'You',
'name2_pygmalion': 'Kawaii',
'context': 'This is a conversation between two people.',
'context_pygmalion': 'This is a conversation between two people.\n<START>',
'prompt': 'Common sense questions and answers\n\nQuestion: \nFactual answer:',
'prompt_gpt4chan': '-----\n--- 865467536\nInput text\n--- 865467537\n',
'stop_at_newline': True,
}
if args.settings_file is not None and Path(args.settings_file).exists():
with open(Path(args.settings_file), 'r') as f:
new_settings = json.load(f)
for i in new_settings:
if i in settings:
settings[i] = new_settings[i]
def load_model(model_name): def load_model(model_name):
print(f"Loading {model_name}...") print(f"Loading {model_name}...")
@ -160,14 +185,11 @@ model, tokenizer = load_model(model_name)
# UI settings # UI settings
if model_name.lower().startswith('gpt4chan'): if model_name.lower().startswith('gpt4chan'):
default_text = "-----\n--- 865467536\nInput text\n--- 865467537\n" default_text = settings['prompt_gpt4chan']
else: else:
default_text = "Common sense questions and answers\n\nQuestion: \nFactual answer:" default_text = settings['prompt']
description = f"""
# Text generation lab description = f"\n\n# Text generation lab\nGenerate text using Large Language Models.\n"
Generate text using Large Language Models.
"""
css=".my-4 {margin-top: 0} .py-6 {padding-top: 2.5rem}" css=".my-4 {margin-top: 0} .py-6 {padding-top: 2.5rem}"
if args.notebook: if args.notebook:
@ -181,12 +203,12 @@ if args.notebook:
html = gr.HTML() html = gr.HTML()
btn = gr.Button("Generate") btn = gr.Button("Generate")
length_slider = gr.Slider(minimum=1, maximum=2000, step=1, label='max_new_tokens', value=200) length_slider = gr.Slider(minimum=settings['max_new_tokens_min'], maximum=settings['max_new_tokens_max'], step=1, label='max_new_tokens', value=settings['max_new_tokens'])
with gr.Row(): with gr.Row():
with gr.Column(): with gr.Column():
model_menu = gr.Dropdown(choices=available_models, value=model_name, label='Model') model_menu = gr.Dropdown(choices=available_models, value=model_name, label='Model')
with gr.Column(): with gr.Column():
preset_menu = gr.Dropdown(choices=available_presets, value="NovelAI-Sphinx Moth", label='Settings preset') preset_menu = gr.Dropdown(choices=available_presets, value=settings['preset'], label='Settings preset')
btn.click(generate_reply, [textbox, length_slider, preset_menu, model_menu], [textbox, markdown, html], show_progress=True, api_name="textgen") btn.click(generate_reply, [textbox, length_slider, preset_menu, model_menu], [textbox, markdown, html], show_progress=True, api_name="textgen")
textbox.submit(generate_reply, [textbox, length_slider, preset_menu, model_menu], [textbox, markdown, html], show_progress=True) textbox.submit(generate_reply, [textbox, length_slider, preset_menu, model_menu], [textbox, markdown, html], show_progress=True)
@ -243,30 +265,30 @@ elif args.chat or args.cai_chat:
return generate_chat_html([], "", "") return generate_chat_html([], "", "")
if 'pygmalion' in model_name.lower(): if 'pygmalion' in model_name.lower():
context_str = "This is a conversation between two people.\n<START>" context_str = settings['context_pygmalion']
name1_str = "You" name1_str = settings['name1_pygmalion']
name2_str = "Kawaii" name2_str = settings['name2_pygmalion']
else: else:
context_str = "This is a conversation between two people." context_str = settings['context']
name1_str = "Person 1" name1_str = settings['name1']
name2_str = "Person 2" name2_str = settings['name2']
with gr.Blocks(css=css+".h-\[40vh\] {height: 50vh}", analytics_enabled=False) as interface: with gr.Blocks(css=css+".h-\[40vh\] {height: 50vh}", analytics_enabled=False) as interface:
gr.Markdown(description) gr.Markdown(description)
with gr.Row(): with gr.Row():
with gr.Column(): with gr.Column():
length_slider = gr.Slider(minimum=1, maximum=2000, step=1, label='max_new_tokens', value=200) length_slider = gr.Slider(minimum=settings['max_new_tokens_min'], maximum=settings['max_new_tokens_max'], step=1, label='max_new_tokens', value=settings['max_new_tokens'])
with gr.Row(): with gr.Row():
with gr.Column(): with gr.Column():
model_menu = gr.Dropdown(choices=available_models, value=model_name, label='Model') model_menu = gr.Dropdown(choices=available_models, value=model_name, label='Model')
with gr.Column(): with gr.Column():
preset_menu = gr.Dropdown(choices=available_presets, value="NovelAI-Sphinx Moth", label='Settings preset') preset_menu = gr.Dropdown(choices=available_presets, value=settings['preset'], label='Settings preset')
name1 = gr.Textbox(value=name1_str, lines=1, label='Your name') name1 = gr.Textbox(value=name1_str, lines=1, label='Your name')
name2 = gr.Textbox(value=name2_str, lines=1, label='Bot\'s name') name2 = gr.Textbox(value=name2_str, lines=1, label='Bot\'s name')
context = gr.Textbox(value=context_str, lines=2, label='Context') context = gr.Textbox(value=context_str, lines=2, label='Context')
with gr.Row(): with gr.Row():
check = gr.Checkbox(value=True, label='Stop generating at new line character?') check = gr.Checkbox(value=settings['stop_at_newline'], label='Stop generating at new line character?')
with gr.Column(): with gr.Column():
if args.cai_chat: if args.cai_chat:
@ -305,8 +327,8 @@ else:
with gr.Row(): with gr.Row():
with gr.Column(): with gr.Column():
textbox = gr.Textbox(value=default_text, lines=15, label='Input') textbox = gr.Textbox(value=default_text, lines=15, label='Input')
length_slider = gr.Slider(minimum=1, maximum=2000, step=1, label='max_new_tokens', value=200) length_slider = gr.Slider(minimum=settings['max_new_tokens_min'], maximum=settings['max_new_tokens_max'], step=1, label='max_new_tokens', value=settings['max_new_tokens'])
preset_menu = gr.Dropdown(choices=available_presets, value="NovelAI-Sphinx Moth", label='Settings preset') preset_menu = gr.Dropdown(choices=available_presets, value=settings['preset'], label='Settings preset')
model_menu = gr.Dropdown(choices=available_models, value=model_name, label='Model') model_menu = gr.Dropdown(choices=available_models, value=model_name, label='Model')
btn = gr.Button("Generate") btn = gr.Button("Generate")
cont = gr.Button("Continue") cont = gr.Button("Continue")

15
settings-template.json Normal file
View File

@ -0,0 +1,15 @@
{
"max_new_tokens": 200,
"max_new_tokens_min": 1,
"max_new_tokens_max": 2000,
"preset": "NovelAI-Sphinx Moth",
"name1": "Person 1",
"name2": "Person 2",
"name1_pygmalion": "You",
"name2_pygmalion": "Kawaii",
"context": "This is a conversation between two people.\n<START>",
"context_pygmalion": "This is a conversation between two people.",
"prompt": "Common sense questions and answers\n\nQuestion: \nFactual answer:",
"prompt_gpt4chan": "-----\n--- 865467536\nInput text\n--- 865467537\n",
"stop_at_newline": true
}