import datetime import json import logging import os import subprocess import threading import gradio as gr import modules.ui import requests from modules import shared from modules.ui_common import create_refresh_button from modules.ui_components import FormRow from modules.ui_components import ToolButton import utils from aws_extension import sagemaker_ui from aws_extension.auth_service.simple_cloud_auth import cloud_auth_manager from aws_extension.cloud_api_manager.api import api, client_api_version from aws_extension.cloud_api_manager.api_manager import api_manager from aws_extension.cloud_dataset_manager.dataset_manager import get_sorted_cloud_dataset from aws_extension.sagemaker_ui import checkpoint_type from aws_extension.sagemaker_ui_utils import create_refresh_button_by_user from utils import get_variable_from_json, save_variable_to_json, has_config, is_gcr logger = logging.getLogger(__name__) logger.setLevel(utils.LOGGING_LEVEL) endpoint_type_choices = ["Async", "Real-time"] if is_gcr(): inference_choices = ["ml.g4dn.2xlarge", "ml.g4dn.4xlarge", "ml.g4dn.8xlarge", "ml.g4dn.12xlarge"] inference_choices_default = "ml.g4dn.2xlarge" else: inference_choices = ["ml.g4dn.2xlarge", "ml.g4dn.4xlarge", "ml.g4dn.8xlarge", "ml.g4dn.12xlarge", "ml.g5.2xlarge", "ml.g5.4xlarge", "ml.g5.8xlarge", "ml.g5.12xlarge", "ml.g5.24xlarge"] inference_choices_default = "ml.g5.2xlarge" user_table_size = 10 all_resources = [ 'user', 'sagemaker_endpoint', 'role', 'train', 'checkpoint', 'inference', ] all_actions = [ 'all', # 'create', # 'list' # 'delete' ] all_permissions = [] for resource in all_resources: for action in all_actions: all_permissions.append(f'{resource}:{action}') def run_command(): subprocess.run(["sleep", "5"]) subprocess.run(["sudo", "systemctl", "restart", "sd-webui.service"]) def restart_sd_webui_service(): thread = threading.Thread(target=run_command) thread.start() return "Restarting the service after 5 seconds..." def on_ui_tabs(): with gr.Blocks() as sagemaker_interface: invisible_user_name_for_ui = gr.Textbox(type='text', visible=False, interactive=False, container=False, show_label=False, elem_id='invisible_user_name_for_ui') with gr.Tab(label='API and User Settings'): with gr.Row(): with gr.Column(variant="panel", scale=1): config_form, disclaimer, whoami_label = api_setting_tab() with gr.Column(variant="panel", scale=2, visible=False) as user_setting: with gr.Tab(label='User Management'): _, user_table, user_role_dropdown = user_settings_tab() with gr.Tab(label='Role Management'): _, role_form, role_table = role_settings_tab() with gr.Row(): version_label = gr.Label( label='Version', value=f'Client Version: {client_api_version}', ) with gr.Tab(label='Cloud Models Management', variant='panel'): with gr.Row(): # todo: the output message is not right yet model_upload, model_list_dataframe = model_upload_tab() with gr.Row(visible=False): with gr.Row(equal_height=True, elem_id="aws_sagemaker_ui_row", visible=False): sm_load_params = gr.Button(value="Load Settings", elem_id="aws_load_params", visible=False) sm_save_params = gr.Button(value="Save Settings", elem_id="aws_save_params", visible=False) sm_train_model = gr.Button(value="Train", variant="primary", elem_id="aws_train_model", visible=False) sm_generate_checkpoint = gr.Button(value="Generate Ckpt", elem_id="aws_gen_ckpt", visible=False) with gr.Tab(label='Inference Endpoint Management', variant='panel'): with gr.Row(): sagemaker_part = ep_create_tab() endpoint_list_df = ep_list_tab() with gr.Tab(label='Datasets Management', variant='panel'): with gr.Row(): dataset_tab() with gr.Tab(label='Train Management', variant='panel'): with gr.Row(): train_list = trainings_tab() def get_version_info(): if not hasattr(shared.demo.server_app, 'api_version'): return f'Front-end Version: {client_api_version}' if shared.demo.server_app.api_version == client_api_version: return f'Front-end & Middleware API Version: {client_api_version}' version = f'Front-end Version {client_api_version}' if shared.demo.server_app.api_version: if client_api_version > shared.demo.server_app.api_version: version += (f' > Middleware API Version {shared.demo.server_app.api_version},' f' please update the Middleware API') if client_api_version < shared.demo.server_app.api_version: version += (f' < Middleware API Version {shared.demo.server_app.api_version},' f' please update the Front-end') return version def ui_tab_setup(req: gr.Request): logger.debug(f'user {req.username} logged in') user = api_manager.get_user_by_username(username=req.username, h_username=req.username) admin_visible = False sagemaker_create_visible = False role_management_visible = False if 'roles' in user: logger.debug(f"user roles are: {user['roles']}") # admin_visible = Admin_Role in user['roles'] for permission in user['permissions']: if permission == 'user:all' or permission == 'user:create': admin_visible = True if permission == 'sagemaker_endpoint:all' or permission == 'sagemaker_endpoint:create': sagemaker_create_visible = True if permission == 'user:all' or permission == 'role:all' or permission == 'role:create': role_management_visible = True # todo: any initial values should from here return gr.update(visible=admin_visible or not cloud_auth_manager.api_url), \ gr.update(visible=admin_visible), \ gr.update(visible=role_management_visible), \ gr.update(visible=sagemaker_create_visible), \ _list_models(req.username)[0:10], \ _list_trainings_job(req.username), \ _list_sagemaker_endpoints(req.username), \ req.username, \ _list_users(req.username, None, None)[:user_table_size], \ _get_roles_table(req.username)[:10], \ gr.update(choices=roles(req.username)), \ f'Welcome, {req.username}!', \ get_version_info() sagemaker_interface.load(ui_tab_setup, [], [ config_form, user_setting, role_form, sagemaker_part, model_list_dataframe, train_list, endpoint_list_df, invisible_user_name_for_ui, user_table, role_table, user_role_dropdown, whoami_label, version_label ]) return (sagemaker_interface, "Amazon SageMaker", "sagemaker_interface"), def api_setting_tab(): with gr.Column() as api_setting: gr.HTML(value="AWS Connection Setting") gr.HTML(value="Enter your API URL & Token to start the connection.") with gr.Row(): api_url_textbox = gr.Textbox(value=utils.host_url(), lines=1, placeholder="Please enter API URL", label="API URL (ApiGatewayUrl)", interactive=True, elem_id="aws_api_url") modules.ui.create_refresh_button(api_url_textbox, lambda: utils.host_url(), lambda: {"value": utils.host_url()}, "refresh_url_btn") with gr.Row(): api_token_textbox = gr.Textbox(value=utils.api_key(), lines=1, placeholder="Please enter API Token", label="API Token (ApiGatewayUrlToken)", interactive=True, elem_id="aws_api_gateway_url_token") modules.ui.create_refresh_button(api_token_textbox, lambda: utils.api_key(), lambda: {"value": utils.api_key()}, "refresh_api_token") with gr.Row(): username_textbox = gr.Textbox(value=utils.username(), interactive=True, placeholder='Please enter username', label="Username") modules.ui.create_refresh_button(username_textbox, lambda: utils.username(), lambda: {"value": utils.username()}, "refresh_username") with gr.Row(): password_textbox = gr.Textbox(type='password', interactive=True, placeholder='Please enter your password', label="Password") modules.ui.create_refresh_button(password_textbox, lambda: None, lambda: {"placeholder": 'Please reset your password!'}, "refresh_password") with gr.Row(): connection_output = gr.Label(title="Output", visible=True, show_label=False) with gr.Row(): aws_connect_button = gr.Button(value="Test Connection & Update Setting", variant='primary', elem_id="aws_config_save") with gr.Row(): restart_service = gr.Button(value="Restart WebUI", elem_id="restart_service") def update_connect_config(api_url, api_token, username=None, password=None, initial=True): show_output = connection_output.update(visible=True) if api_url == 'cancelled': return show_output, "cancelled" if not api_url: return show_output, "Please input api url" if not api_token: return show_output, "Please input api token" # Check if api_url ends with '/', if not append it if not api_url.endswith('/'): api_url += '/' if not test_aws_connect_config(api_url, api_token): return show_output, "Failed to connect to backend server, please check your API version or url and token" message = "Successfully Connected" save_variable_to_json('api_gateway_url', api_url) save_variable_to_json('api_token', api_token) save_variable_to_json('username', username) sagemaker_ui.init_refresh_resource_list_from_cloud(username) try: if not api_manager.upsert_user(username=username, password=password, roles=[], creator=username, initial=initial): return show_output, f'{message}, but update setting failed' except Exception as e: return show_output, f'{message}, but update setting failed, because {e}' if os.path.exists("/etc/systemd/system/sd-webui.service"): restart_sd_webui_service() return show_output, f"Setting Updated, Service will restart in 5 seconds" return show_output, f"{message} & Setting Updated" aws_connect_button.click(_js="update_auth_settings", fn=update_connect_config, inputs=[api_url_textbox, api_token_textbox, username_textbox, password_textbox], outputs=[connection_output, connection_output]) restart_service.click(fn=restart_sd_webui_service, inputs=[], outputs=[connection_output]) with gr.Row(visible=has_config()) as disclaimer_tab: with gr.Accordion("Disclaimer", open=False): gr.HTML( value= """You should perform your own independent assessment, and take measures to ensure that you comply with your own specific quality control practices and standards, and the local rules, laws, regulations, licenses and terms of use that apply to you, your content, and the third-party generative AI service in this web UI. Amazon Web Services has no control or authority over the third-party generative AI service in this web UI, and does not make any representations or warranties that the third-party generative AI service is secure, virus-free, operational, or compatible with your production environment and standards.""") with gr.Row(visible=has_config()): whoami_label = gr.Label(label='Current User') with gr.Row(visible=has_config()): logout_btn = gr.Button(value='Logout') logout_btn.click(fn=lambda: None, _js="logout", inputs=[], outputs=[]) return api_setting, disclaimer_tab, whoami_label def roles(username): resp = api_manager.list_roles(username=username) return [role['role_name'] for role in resp['roles']] def user_settings_tab(): gr.HTML(value="Manage User's Access") with gr.Row(variant='panel') as user_tab: with gr.Column(scale=1): gr.HTML(value="Update a User Setting") username_textbox = gr.Textbox(placeholder="Please Enter a username", label="User name") pwd_textbox = gr.Textbox(placeholder="Please Enter password", label="Password", type='password') with gr.Row(): user_roles_dropdown = gr.Dropdown(multiselect=True, label="User Role") create_refresh_button_by_user(user_roles_dropdown, lambda *args: None, lambda username: {"choices": roles(username)}, "refresh_create_user_roles") upsert_user_button = gr.Button(value="Insert or Update a User", variant='primary') delete_user_button = gr.Button(value="Delete a User", variant='primary') user_setting_output = gr.Textbox(interactive=False, show_label=False, visible=True) def upsert_user(username, password, user_roles, pr: gr.Request): show_output = user_setting_output.update(visible=True) try: if not username.rstrip() or len(username.rstrip()) < 1: return f'Please trim trailing spaces. Username should not be none.', show_output if not password or len(password) < 1: return f'Password should not be none.', show_output resp = api_manager.upsert_user(username=username.rstrip(), password=password, roles=user_roles, creator=pr.username) if resp: return f'User upsert complete "{username}"', show_output except Exception as e: return f'User upsert failed: {e}', show_output upsert_user_button.click(fn=upsert_user, inputs=[username_textbox, pwd_textbox, user_roles_dropdown], outputs=[user_setting_output, user_setting_output]) def delete_user(username): if not username or len(username) < 1: return f'Username should not be none.' try: resp = api_manager.delete_user(username=username, user_token=cloud_auth_manager.username) if resp: return f'User delete complete "{username}"' except Exception as e: return f'User delete failed: {e}' delete_user_button.click(fn=delete_user, inputs=[username_textbox], outputs=[user_setting_output]) # todo: need reload the user table with gr.Column(scale=2): gr.HTML(value="Users Table") user_table = gr.Dataframe( headers=["name", "role", "created by"], datatype=["str", "str", "str"], max_rows=user_table_size, ) def choose_user(evt: gr.SelectData): if evt.index[1] != 0: return gr.skip(), gr.skip(), gr.skip() # todo: to be done user = api_manager.get_user_by_username(username=evt.value, h_username=cloud_auth_manager.username, show_password=True) return user['username'], user['password'], user['roles'] def search_users(name: str, role: str, paging, rq: gr.Request): result = _list_users(rq.username, name, role) if len(result) == 0: return None, gr.skip() if paging >= len(result): return gr.skip(), gr.skip() start = paging + user_table_size if paging + user_table_size < len(result) else paging end = start + user_table_size if start + user_table_size < len(result) else len(result) return result[start: end], start user_table.select(fn=choose_user, inputs=[], outputs=[username_textbox, pwd_textbox, user_roles_dropdown]) with gr.Accordion("Users Table Filter", open=False): with gr.Row(): name_search_textbox = gr.Textbox(ele_id="name_search_txt", label="Search by Name", placeholder="role name") role_search_dropdown = gr.Dropdown(ele_id="role_search_drop", label="Search by Role", choices=[''] + roles(cloud_auth_manager.username)) with gr.Row(): current_page = gr.State(0) previous_page_btn = gr.Button(value="Previous Page", variant='primary') next_page_btn = gr.Button(value="Next Page", variant='primary') def list_users_prev(name, role, paging, rq: gr.Request): if paging == 0: return gr.skip(), gr.skip() result = _list_users(rq.username, name, role) start = paging - user_table_size if paging - user_table_size >= 0 else 0 end = start + user_table_size return result[start: end], start def list_users_next(name, role, paging, rq: gr.Request): result = _list_users(rq.username, name, role) if paging >= len(result): return gr.skip(), gr.skip() start = paging + user_table_size if paging + user_table_size < len(result) else paging end = start + user_table_size if start + user_table_size < len(result) else len(result) return result[start: end], start next_page_btn.click(fn=list_users_next, inputs=[name_search_textbox, role_search_dropdown, current_page], outputs=[user_table, current_page]) previous_page_btn.click(fn=list_users_prev, inputs=[name_search_textbox, role_search_dropdown, current_page], outputs=[user_table, current_page]) name_search_textbox.submit(fn=search_users, inputs=[name_search_textbox, role_search_dropdown, current_page], outputs=[user_table, current_page]) role_search_dropdown.change(fn=search_users, inputs=[name_search_textbox, role_search_dropdown, current_page], outputs=[user_table, current_page]) return user_tab, user_table, user_roles_dropdown def role_settings_tab(): with gr.Column() as ui_role_setting: gr.HTML('Manage Roles') with gr.Row(variant='panel') as role_tab: with gr.Column(scale=1) as upsert_role_form: gr.HTML(value="Update a Role") role_name_textbox = gr.Textbox(placeholder="Please Enter a role name", label="Role name") permissions_dropdown = gr.Dropdown(choices=all_permissions, multiselect=True, label="Role Permissions") upsert_role_button = gr.Button(value="Insert or Update a Role", variant='primary') role_setting_output = gr.Textbox(interactive=False, show_label=False, visible=True) def upsert_role(role_name, permissions, pr: gr.Request): show_output = role_setting_output.update(visible=True) if not role_name or not permissions: return 'Please input role name and permissions.', show_output try: resp = api_manager.upsert_role(role_name=role_name, permissions=permissions, creator=pr.username) if resp: return f'Role upsert complete "{role_name}"', show_output except Exception as e: return f'Role upsert failed: {e}', show_output upsert_role_button.click(fn=upsert_role, inputs=[role_name_textbox, permissions_dropdown], outputs=[role_setting_output, role_setting_output] ) with gr.Column(scale=2): gr.HTML(value="Role Table") role_table = gr.Dataframe( headers=["role name", "permissions", "created by"], datatype=["str", "str", "str"], max_rows=user_table_size, interactive=False, ) with gr.Row(): current_page = gr.State(0) previous_page_btn = gr.Button(value="Previous Page", variant='primary') next_page_btn = gr.Button(value="Next Page", variant='primary') def list_roles_prev(paging, rq: gr.Request): if paging == 0: return gr.skip(), gr.skip() result = _get_roles_table(rq.username) start = paging - user_table_size if paging - user_table_size >= 0 else 0 end = start + user_table_size return result[start: end], start def list_roles_next(paging, rq: gr.Request): result = _get_roles_table(rq.username) if paging >= len(result): return gr.skip(), gr.skip() start = paging + user_table_size if paging + user_table_size < len(result) else paging end = start + user_table_size if start + user_table_size < len(result) else len(result) return result[start: end], start next_page_btn.click(fn=list_roles_next, inputs=[current_page], outputs=[role_table, current_page]) previous_page_btn.click(fn=list_roles_prev, inputs=[current_page], outputs=[role_table, current_page]) return ui_role_setting, upsert_role_form, role_table def _list_models(username): result = api_manager.list_models_on_cloud(username=username, types=None, status=None) models = [] for model in result: allowed = '' if model['allowed_roles_or_users']: allowed = ', '.join(model['allowed_roles_or_users']) models.append([ model['name'], model['type'], allowed, model['status'], datetime.datetime.fromtimestamp(model['created']), model['id'], ], ), if len(models) == 0: return [['', '', '', '', '', '']] return models def _get_roles_table(username): resp = api_manager.list_roles(username=username) table = [] for role in resp['roles']: table.append([role['role_name'], ', '.join(role['permissions']), role['creator']]) return table def _list_users(username, name, role): resp = api_manager.list_users(username=username) if not resp['users']: return [] table = [] for user in resp['users']: if name and name not in user['username']: continue if role and role not in user['roles']: continue table.append([user['username'], ', '.join(user['roles']), user['creator']]) return table def model_upload_tab(): with gr.Column(scale=1) as upload_tab: gr.HTML(value="Upload Model to Cloud") # sagemaker_html_log = gr.HTML(elem_id=f'html_log_sagemaker') # with gr.Column(variant="panel"): with gr.Tab("From WebUI"): # gr.HTML(value="Upload Model to S3 from WebUI") gr.HTML(value="Refresh to select the model to upload to S3") exts = (".bin", ".pt", ".pth", ".safetensors", ".ckpt") root_path = os.getcwd() model_folders = { "ckpt": os.path.join(root_path, "models", "Stable-diffusion"), "text": os.path.join(root_path, "embeddings"), "lora": os.path.join(root_path, "models", "Lora"), "control": os.path.join(root_path, "models", "ControlNet"), "hyper": os.path.join(root_path, "models", "hypernetworks"), "vae": os.path.join(root_path, "models", "VAE"), } def scan_local_model_files_by_suffix(suffix): model_files = os.listdir(model_folders[suffix]) # filter non-model files not in exts model_files = [f for f in model_files if os.path.splitext(f)[1] in exts] model_files = [os.path.join(model_folders[suffix], f) for f in model_files] return model_files with FormRow(elem_id="model_upload_form_row_01"): sd_checkpoints_path = gr.Dropdown(label="SD Checkpoints", choices=sorted(scan_local_model_files_by_suffix("ckpt")), elem_id="sd_ckpt_dropdown") create_refresh_button(sd_checkpoints_path, lambda: None, lambda: {"choices": sorted(scan_local_model_files_by_suffix("ckpt"))}, "refresh_sd_ckpt") textual_inversion_path = gr.Dropdown(label="Textual Inversion", choices=sorted(scan_local_model_files_by_suffix("text")), elem_id="textual_inversion_model_dropdown") create_refresh_button(textual_inversion_path, lambda: None, lambda: {"choices": sorted(scan_local_model_files_by_suffix("text"))}, "refresh_textual_inversion_model") with FormRow(elem_id="model_upload_form_row_02"): lora_path = gr.Dropdown(label="LoRA model", choices=sorted(scan_local_model_files_by_suffix("lora")), elem_id="lora_model_dropdown") create_refresh_button(lora_path, lambda: None, lambda: {"choices": sorted(scan_local_model_files_by_suffix("lora"))}, "refresh_lora_model", ) controlnet_model_path = gr.Dropdown(label="ControlNet model", choices=sorted(scan_local_model_files_by_suffix("control")), elem_id="controlnet_model_dropdown") create_refresh_button(controlnet_model_path, lambda: None, lambda: {"choices": sorted(scan_local_model_files_by_suffix("control"))}, "refresh_controlnet_models") with FormRow(elem_id="model_upload_form_row_03"): hypernetwork_path = gr.Dropdown(label="Hypernetwork", choices=sorted(scan_local_model_files_by_suffix("hyper")), elem_id="hyper_model_dropdown") create_refresh_button(hypernetwork_path, lambda: None, lambda: {"choices": sorted(scan_local_model_files_by_suffix("hyper"))}, "refresh_hyper_models") vae_path = gr.Dropdown(label="VAE", choices=sorted(scan_local_model_files_by_suffix("vae")), elem_id="vae_model_dropdown") create_refresh_button(vae_path, lambda: None, lambda: {"choices": sorted(scan_local_model_files_by_suffix("vae"))}, "refresh_vae_models") with gr.Column(): model_update_button = gr.Button(value="Upload Models to Cloud", variant="primary", elem_id="sagemaker_model_update_button") webui_upload_model_textbox = gr.Textbox(interactive=False, show_label=False) model_update_button.click(fn=sagemaker_ui.sagemaker_upload_model_s3, inputs=[sd_checkpoints_path, textual_inversion_path, lora_path, hypernetwork_path, controlnet_model_path, vae_path], outputs=[webui_upload_model_textbox, sd_checkpoints_path, textual_inversion_path, lora_path, hypernetwork_path, controlnet_model_path, vae_path]) # with gr.Column(variant="panel"): with gr.Tab("From My Computer"): # gr.HTML(value="Upload Model to S3 from My Computer") # gr.HTML(value="Refresh to select the model to upload to S3") with FormRow(elem_id="model_upload_local_form_row_01"): model_type_drop_down = gr.Dropdown(label="Model Type", choices=["SD Checkpoints", "Textual Inversion", "LoRA model", "ControlNet model", "Hypernetwork", "VAE"], elem_id="model_type_ele_id") model_type_hiden_text = gr.Textbox(elem_id="model_type_value_ele_id", visible=False) def change_model_type_value(model_type: str): model_type_hiden_text.value = model_type return model_type model_type_drop_down.change(fn=change_model_type_value, _js="getModelTypeValue", inputs=[model_type_drop_down], outputs=model_type_hiden_text) file_upload_html_component = gr.HTML( '') with FormRow(elem_id="model_upload_local_form_row_02"): hidden_bind_html = gr.HTML(elem_id="hidden_bind_upload_files", value="
") with FormRow(elem_id="model_upload_local_form_row_03"): upload_label = gr.HTML(label="upload process", elem_id="progress-bar") upload_percent_label = gr.HTML(label="upload percent process", elem_id="progress-percent") with gr.Column(): model_update_button_local = gr.Button(value="Upload Models to Cloud", variant="primary", elem_id="sagemaker_model_update_button_local") mycomp_upload_model_textbox = gr.Textbox(interactive=False, show_label=False) model_update_button_local.click(_js="uploadFiles", fn=sagemaker_ui.sagemaker_upload_model_s3_local, outputs=[mycomp_upload_model_textbox] ) with gr.Tab("From URL"): with FormRow(elem_id="model_upload_url_form_row_01"): model_type_url_drop_down = gr.Dropdown(label="Model Type", choices=["SD Checkpoints", "Textual Inversion", "LoRA model", "ControlNet model", "Hypernetwork", "VAE"], elem_id="model_url_type_ele_id") with FormRow(elem_id="model_upload_url_form_row_02"): file_upload_url_component = gr.TextArea(label="URL List (Comma-separated in English)", elem_id="model_urls_value_ele_id", placeholder="Best to keep the total model size below 10 GB, and preferably not exceeding 5 urls.") file_upload_params_component = gr.TextArea(label="Models Description (Optional)", elem_id="model_params_value_ele_id", placeholder='for example: placeholder for chkpts upload test') with FormRow(elem_id="model_upload_url_form_row_03"): file_upload_result_component = gr.Label(elem_id="model_upload_result_value_ele_id") with gr.Row(): model_update_button_local = gr.Button(value="Upload Models to Cloud", variant="primary", elem_id="sagemaker_model_update_button_url") model_update_button_local.click(fn=sagemaker_ui.sagemaker_upload_model_s3_url, inputs=[model_type_url_drop_down, file_upload_url_component, file_upload_params_component], outputs=[file_upload_result_component] ) with gr.Column(scale=2): def list_ckpts_data(query_types, query_status, query_roles, current_page, rq: gr.Request): default_list = [['', '', '', '', '', '']] show_page_info = page_info.update(visible=True) params = { 'types': query_types, 'status': query_status, 'roles': query_roles, 'page': int(current_page), 'username': rq.username, } api.set_username(rq.username) if not has_config(): return default_list, show_page_info, 'Please config api url and token first' resp = api.list_checkpoints(params=params) models = [] if 'data' not in resp.json(): logger.error(f"list_checkpoints: {resp.json()}") return default_list, show_page_info, 'No data' page = resp.json()['data']['page'] per_page = resp.json()['data']['per_page'] total = resp.json()['data']['total'] pages = resp.json()['data']['pages'] if len(resp.json()['data']['checkpoints']) == 0: return default_list, show_page_info, 'No data' for model in resp.json()['data']['checkpoints']: allowed = '' if model['allowed_roles_or_users']: allowed = ', '.join(model['allowed_roles_or_users']) models.append([ model['name'], model['type'], allowed, model['status'], datetime.datetime.fromtimestamp(float(model['created'])), model['id'], ]) return models, show_page_info, f"Page: {page}/{pages} Total: {total} items PerPage: {per_page}" gr.HTML(value="Cloud Model List") model_list = gr.Dataframe(headers=['name', 'type', 'user/roles', 'status', 'time', 'id'], datatype=['str', 'str', 'str', 'str', 'str', 'str'], interactive=False, ) page_info = gr.Textbox(label="Page Info", interactive=False, show_label=False, visible=False) with gr.Row(): with gr.Column(): current_page = gr.Number(label="Page Number", value=1, minimum=1, step=1) with gr.Column(): query_types = gr.Dropdown( multiselect=True, choices=checkpoint_type, label="Types") with gr.Column(): query_status = gr.Dropdown( multiselect=True, choices=['Active', 'Initial'], label="Status") with gr.Column(): query_roles = gr.Dropdown( multiselect=True, choices=roles(cloud_auth_manager.username), label="Roles") with gr.Row(): refresh_button = gr.Button(value="Refresh List", variant="primary", elem_id="refresh_ckpts_button_id") refresh_button.click( fn=list_ckpts_data, inputs=[query_types, query_status, query_roles, current_page], outputs=[model_list, page_info, page_info] ) with gr.Row(): gr.HTML(value="Cloud Model Delete or Rename") with gr.Row(): ckpt_list_info = gr.Textbox(show_label=False, interactive=False, value="Please select one checkpoint to delete or rename",) ckpt_list_selected = gr.Textbox(show_label=False, interactive=False, visible=False) with gr.Row(): new_name_textbox = gr.TextArea(placeholder="Input new Checkpoint name", show_label=False, lines=1, elem_id="new_ckpt_value_ele_id") ckpts_rename_button = gr.Button(value='Rename Checkpoint', elem_id="ckpts_rename_btn") # ---- bind functions start ---- def choose_model(evt: gr.SelectData, models): row_index = evt.index[0] model_name = models.values[row_index][5] if model_name: message = f"You selected model is: {model_name}" else: message = "No model selected" model_name = "" return message, model_name model_list.select(fn=choose_model, inputs=[model_list], outputs=[ckpt_list_info, ckpt_list_selected]) def _rename_ckpt(ckpt_id, new_name, pr: gr.Request): show_output = ckpt_list_info.update(visible=True) if not ckpt_id: return 'Please select one checkpoint to rename.', show_output, '' if not new_name: return 'Please input new name.', show_output, '' return api_manager.ckpt_rename(ckpt_id=ckpt_id, name=new_name, user_token=pr.username), show_output, '' ckpts_rename_button.click(_rename_ckpt, inputs=[ckpt_list_selected, new_name_textbox], outputs=[ckpt_list_info, ckpt_list_info, ckpt_list_selected]) def _delete_ckpt(ckpt_id, pr: gr.Request): show_output = ckpt_list_info.update(visible=True) if not ckpt_id: message = "Please select one checkpoint to delete." else: message = api_manager.ckpts_delete(ckpts=[ckpt_id], user_token=pr.username) return show_output, message, '' delete_ckpt_btn = gr.Button(value='Delete \U0001F5D1', elem_id="delete_ckpt") delete_ckpt_btn.click(fn=_delete_ckpt, inputs=[ckpt_list_selected], outputs=[ckpt_list_info, ckpt_list_info, ckpt_list_selected]) # ---- bind functions end ---- return upload_tab, model_list def ep_create_tab(): with (gr.Column() as sagemaker_tab): gr.HTML(value="Deploy New SageMaker Endpoint") with gr.Column(variant="panel", scale=1): default_table = f"""| Default SageMaker Endpoint Config | |
|---|---|
| Endpoint Type | Async |
| Instance Type | {inference_choices_default} |
| Max Instance Count | 1 |
| Enable Autoscaling | yes(range: 0 to 1) |