zetavg
update
c9cf2f1 unverified
from typing import Union
import gradio as gr
import fire
import os
import yaml
from llama_lora.config import Config, process_config
from llama_lora.globals import initialize_global
from llama_lora.utils.data import init_data_dir
from llama_lora.models import prepare_base_model
from llama_lora.ui.main_page import (
main_page, get_page_title
)
from llama_lora.ui.css_styles import get_css_styles
def main(
base_model: Union[str, None] = None,
data_dir: Union[str, None] = None,
base_model_choices: Union[str, None] = None,
trust_remote_code: Union[bool, None] = None,
server_name: str = "127.0.0.1",
share: bool = False,
skip_loading_base_model: bool = False,
auth: Union[str, None] = None,
load_8bit: Union[bool, None] = None,
ui_show_sys_info: Union[bool, None] = None,
ui_dev_mode: Union[bool, None] = None,
wandb_api_key: Union[str, None] = None,
wandb_project: Union[str, None] = None,
hf_access_token: Union[str, None] = None,
timezone: Union[str, None] = None,
config: Union[str, None] = None,
):
'''
Start the LLaMA-LoRA Tuner UI.
:param base_model: (required) The name of the default base model to use.
:param data_dir: (required) The path to the directory to store data.
:param base_model_choices: Base model selections to display on the UI, seperated by ",". For example: 'decapoda-research/llama-7b-hf,nomic-ai/gpt4all-j'.
:param server_name: Allows to listen on all interfaces by providing '0.0.0.0'.
:param share: Create a public Gradio URL.
:param wandb_api_key: The API key for Weights & Biases. Setting either this or `wandb_project` will enable Weights & Biases.
:param wandb_project: The default project name for Weights & Biases. Setting either this or `wandb_api_key` will enable Weights & Biases.
:param hf_access_token: Provide an access token to load private models form Hugging Face Hub. An access token can be created at https://huggingface.co/settings/tokens.
'''
config_from_file = read_yaml_config(config_path=config)
if config_from_file:
for key, value in config_from_file.items():
if key == "server_name":
server_name = value
continue
if not hasattr(Config, key):
available_keys = [k for k in vars(
Config) if not k.startswith('__')]
raise ValueError(
f"Invalid config key '{key}' in config.yaml. Available keys: {', '.join(available_keys)}")
setattr(Config, key, value)
if base_model is not None:
Config.default_base_model_name = base_model
if base_model_choices is not None:
Config.base_model_choices = base_model_choices
if trust_remote_code is not None:
Config.trust_remote_code = trust_remote_code
if data_dir is not None:
Config.data_dir = data_dir
if load_8bit is not None:
Config.load_8bit = load_8bit
if auth is not None:
try:
[Config.auth_username, Config.auth_password] = auth.split(':')
except ValueError:
raise ValueError("--auth must be in the format <username>:<password>, e.g.: --auth='username:password'")
if hf_access_token is not None:
Config.hf_access_token = hf_access_token
if wandb_api_key is not None:
Config.wandb_api_key = wandb_api_key
if wandb_project is not None:
Config.default_wandb_project = wandb_project
if timezone is not None:
Config.timezone = timezone
if ui_dev_mode is not None:
Config.ui_dev_mode = ui_dev_mode
if ui_show_sys_info is not None:
Config.ui_show_sys_info = ui_show_sys_info
process_config()
initialize_global()
assert (
Config.default_base_model_name
), "Please specify a --base_model, e.g. --base_model='decapoda-research/llama-7b-hf'"
assert (
Config.data_dir
), "Please specify a --data_dir, e.g. --data_dir='./data'"
init_data_dir()
if (not skip_loading_base_model) and (not Config.ui_dev_mode):
prepare_base_model(Config.default_base_model_name)
with gr.Blocks(title=get_page_title(), css=get_css_styles()) as demo:
main_page()
demo.queue(concurrency_count=1).launch(
server_name=server_name,
share=share,
auth=((Config.auth_username, Config.auth_password)
if Config.auth_username and Config.auth_password else None)
)
def read_yaml_config(config_path: Union[str, None] = None):
if not config_path:
app_dir = os.path.dirname(os.path.abspath(__file__))
config_path = os.path.join(app_dir, 'config-ui-demo.yaml')
if not os.path.exists(config_path):
return None
print(f"Loading config from {config_path}...")
with open(config_path, 'r') as yaml_file:
config = yaml.safe_load(yaml_file)
return config
if __name__ == "__main__":
fire.Fire(main)
elif __name__ == "app": # running in gradio reload mode (`gradio`)
try:
main()
except AssertionError as e:
message = str(e)
message += "\nNote that command line args are not supported while running in gradio reload mode, config.yaml must be used."
raise AssertionError(message) from e