From 082f5b1665848430b30b53231b72710e69c33109 Mon Sep 17 00:00:00 2001 From: xieyongliang Date: Tue, 7 Mar 2023 15:17:43 +0800 Subject: [PATCH 1/7] cleanup --- modules/call_queue.py | 35 +++-- modules/shared.py | 1 - modules/ui.py | 351 ++++++++++++++---------------------------- webui.py | 12 ++ 4 files changed, 156 insertions(+), 243 deletions(-) diff --git a/modules/call_queue.py b/modules/call_queue.py index d8442f7a32a..69e45c0bae8 100644 --- a/modules/call_queue.py +++ b/modules/call_queue.py @@ -18,6 +18,7 @@ from PIL import Image, ImageOps, ImageFilter, ImageEnhance, ImageChops from modules import shared +import gradio as gr queue_lock = threading.Lock() @@ -31,7 +32,16 @@ def f(*args, **kwargs): return f -def wrap_gradio_gpu_call(func, extra_outputs=None): +def wrap_gradio_gpu_call(func, request:gr.Request, extra_outputs=None): + tokens = shared.demo.server_app.tokens + cookies = request.headers['cookie'].split('; ') + access_token = None + for cookie in cookies: + if cookie.startswith('access-token'): + access_token = cookie[len('access-token=') : ] + break + username = tokens[access_token] if access_token else None + def encode_image_to_base64(image): if isinstance(image, bytes): encoded_string = base64.b64encode(image) @@ -75,7 +85,7 @@ def handle_sagemaker_inference_async(response): return processed - def sagemaker_inference(task, infer, username, sagemaker_endpoint, *args, **kwargs): + def sagemaker_inference(task, infer, sagemaker_endpoint, *args, **kwargs): infer = 'async' if task == 'text-to-image' or task == 'image-to-image': if task == 'text-to-image': @@ -410,20 +420,17 @@ def sagemaker_inference(task, infer, username, sagemaker_endpoint, *args, **kwar def f(*args, **kwargs): if cmd_opts.pureui and func == modules.txt2img.txt2img: - username = args[len(args) - 2] sagemaker_endpoint = args[len(args) -1] args = args[:-2] - res = sagemaker_inference('text-to-image', 'sync', username, sagemaker_endpoint, *args, **kwargs) + res = sagemaker_inference('text-to-image', 'sync', sagemaker_endpoint, *args, **kwargs) elif cmd_opts.pureui and func == modules.img2img.img2img: - username = args[len(args) - 2] sagemaker_endpoint = args[len(args) -1] args = args[:-2] - res = sagemaker_inference('image-to-image', 'sync', username, sagemaker_endpoint, *args, **kwargs) + res = sagemaker_inference('image-to-image', 'sync', sagemaker_endpoint, *args, **kwargs) elif cmd_opts.pureui and func == modules.extras.run_extras: - username = args[len(args) - 2] sagemaker_endpoint = args[len(args) -1] args = args[:-2] - res = sagemaker_inference('extras', 'sync', username, sagemaker_endpoint, *args, **kwargs) + res = sagemaker_inference('extras', 'sync', sagemaker_endpoint, *args, **kwargs) else: shared.state.begin() with queue_lock: @@ -435,7 +442,16 @@ def f(*args, **kwargs): return wrap_gradio_call(f, extra_outputs=extra_outputs, add_stats=True) -def wrap_gradio_call(func, extra_outputs=None, add_stats=False): +def wrap_gradio_call(func, request : gr.Request, extra_outputs=None, add_stats=False): + tokens = shared.demo.server_app.tokens + cookies = request.headers['cookie'].split('; ') + access_token = None + for cookie in cookies: + if cookie.startswith('access-token'): + access_token = cookie[len('access-token=') : ] + break + username = tokens[access_token] if access_token else None + def f(*args, extra_outputs_array=extra_outputs, **kwargs): run_memmon = shared.opts.memmon_poll_rate > 0 and not shared.mem_mon.disabled and add_stats if run_memmon: @@ -443,6 +459,7 @@ def f(*args, extra_outputs_array=extra_outputs, **kwargs): t = time.perf_counter() try: + args.append(username) res = list(func(*args, **kwargs)) except Exception as e: # When printing out our debug argument list, do not print out more than a MB of text diff --git a/modules/shared.py b/modules/shared.py index bb18058403a..cc63becf97a 100644 --- a/modules/shared.py +++ b/modules/shared.py @@ -140,7 +140,6 @@ api_endpoint = os.environ['api_endpoint'] industrial_model = '' default_options = {} -username_state = None sagemaker_endpoint_component = None sd_model_checkpoint_component = None create_train_dreambooth_component = None diff --git a/modules/ui.py b/modules/ui.py index 685b5d071eb..44912c0c0f9 100644 --- a/modules/ui.py +++ b/modules/ui.py @@ -433,7 +433,7 @@ def create_toprow(is_img2img): with gr.Row(): skip = gr.Button('Skip', elem_id=f"{id_part}_skip") interrupt = gr.Button('Interrupt', elem_id=f"{id_part}_interrupt") - submit = gr.Button('Generate', elem_id=f"{id_part}_generate", variant='primary', visible=(not cmd_opts.pureui)) + submit = gr.Button('Generate', elem_id=f"{id_part}_generate", variant='primary') skip.click( fn=lambda: shared.state.skip(), @@ -533,7 +533,16 @@ def refresh(): return gr.update(**(args or {})) - def refresh_sagemaker_endpoints(username): + def refresh_sagemaker_endpoints(request : gr.Request): + tokens = shared.demo.server_app.tokens + cookies = request.headers['cookie'].split('; ') + access_token = None + for cookie in cookies: + if cookie.startswith('access-token'): + access_token = cookie[len('access-token=') : ] + break + username = tokens[access_token] if access_token else None + refresh_method(username) args = refreshed_args() if callable(refreshed_args) else refreshed_args @@ -555,7 +564,7 @@ def refresh_checkpoints(sagemaker_endpoint): if elem_id == 'refresh_sagemaker_endpoint': refresh_button.click( fn=refresh_sagemaker_endpoints, - inputs=[shared.username_state], + inputs=[], outputs=[refresh_component] ) elif elem_id == 'refresh_sd_model_checkpoint': @@ -676,7 +685,6 @@ def create_ui(): interfaces = [] with gr.Blocks(analytics_enabled=False) as pnginfo_interface: - shared.username_state = gr.Text(value='', visible=False) with gr.Row().style(equal_height=False): with gr.Column(variant='panel'): image = gr.Image(elem_id="pnginfo_image", label="Source", source="upload", interactive=True, type="pil") @@ -784,7 +792,16 @@ def run_settings(*args): return opts.dumpjson(), f'{len(changed)} settings changed without save: {", ".join(changed)}.' return opts.dumpjson(), f'{len(changed)} settings changed: {", ".join(changed)}.' - def run_settings_single(value, key, username): + def run_settings_single(value, key, request : gr.Request): + tokens = shared.demo.server_app.tokens + cookies = request.headers['cookie'].split('; ') + access_token = None + for cookie in cookies: + if cookie.startswith('access-token'): + access_token = cookie[len('access-token=') : ] + break + username = tokens[access_token] if access_token else None + if username and username != '': if not opts.same_type(value, opts.data_labels[key].default): return gr.update(visible=True), opts.dumpjson() @@ -984,7 +1001,7 @@ def request_restart(): denoising_strength, firstphase_width, firstphase_height, - ] + custom_inputs + [shared.username_state, shared.sagemaker_endpoint_component], + ] + custom_inputs + [shared.sagemaker_endpoint_component], outputs=[ txt2img_gallery, @@ -1226,7 +1243,7 @@ def update_orig(image, state): inpainting_mask_invert, img2img_batch_input_dir if not cmd_opts.pureui else dummy_component, img2img_batch_output_dir if not cmd_opts.pureui else dummy_component, - ] + custom_inputs + [shared.username_state, shared.sagemaker_endpoint_component], + ] + custom_inputs + [shared.sagemaker_endpoint_component], outputs=[ img2img_gallery, generation_info, @@ -1331,7 +1348,7 @@ def update_orig(image, state): extras_batch_output_dir = gr.Textbox(label="Output directory", **shared.hide_dirs, placeholder="Leave blank to save images to the default path.") show_extras_results = gr.Checkbox(label='Show result images', value=True) - submit = gr.Button('Generate', elem_id="extras_generate", variant='primary', visible=(not cmd_opts.pureui)) + submit = gr.Button('Generate', elem_id="extras_generate", variant='primary') extras_submit = submit with gr.Tabs(elem_id="extras_resize_mode"): @@ -1385,7 +1402,7 @@ def update_orig(image, state): extras_upscaler_2, extras_upscaler_2_visibility, upscale_before_face_fix, - ] + [shared.username_state, shared.sagemaker_endpoint_component], + ] + [shared.sagemaker_endpoint_component], outputs=[ result_images, html_info_x, @@ -1511,7 +1528,7 @@ def update_orig(image, state): embedding_output = gr.Label(label='Output') with gr.Column(): - create_train_embedding = gr.Button(value="Train Embedding", variant='primary', visible=False) + create_train_embedding = gr.Button(value="Train Embedding", variant='primary') with gr.Tab(label="Train Hypernetwork"): gr.HTML(value="

Train an hypernetwork; you must specify a directory with a set of 1:1 ratio images [wiki]

") @@ -1597,14 +1614,13 @@ def update_orig(image, state): hypernetwork_output = gr.Label(label='Output') with gr.Column(): - create_train_hypernetwork = gr.Button(value="Train Hypernetwork", variant='primary', visible=False) + create_train_hypernetwork = gr.Button(value="Train Hypernetwork", variant='primary') if dreambooth_tab: with gr.Tab(label="Train Dreambooth"): dreambooth_tab.render() def sagemaker_train_embedding( - username, sd_model_checkpoint, new_embedding_name, initialization_text, @@ -1641,9 +1657,19 @@ def sagemaker_train_embedding( embedding_preview_from_txt2img, embedding_training_instance_type, embedding_training_instance_count, - *txt2img_preview_params + *txt2img_preview_params, + request: gr.Request ): + tokens = shared.demo.server_app.tokens + cookies = request.headers['cookie'].split('; ') + access_token = None + for cookie in cookies: + if cookie.startswith('access-token'): + access_token = cookie[len('access-token=') : ] + break + username = tokens[access_token] if access_token else None + train_args = { 'embedding_settings': { 'name': new_embedding_name, @@ -1720,7 +1746,6 @@ def sagemaker_train_embedding( } def sagemaker_train_hypernetwork( - username, sd_model_checkpoint, new_hypernetwork_name, new_hypernetwork_sizes, @@ -1761,9 +1786,19 @@ def sagemaker_train_hypernetwork( hypernetwork_preview_from_txt2img, hypernetwork_training_instance_type, hypernetwork_training_instance_count, - *txt2img_preview_params + *txt2img_preview_params, + request: gr.Request ): + tokens = shared.demo.server_app.tokens + cookies = request.headers['cookie'].split('; ') + access_token = None + for cookie in cookies: + if cookie.startswith('access-token'): + access_token = cookie[len('access-token=') : ] + break + username = tokens[access_token] if access_token else None + train_args = { 'hypernetwork_settings': { 'name': new_hypernetwork_name, @@ -1846,7 +1881,6 @@ def sagemaker_train_hypernetwork( create_train_embedding.click( fn=sagemaker_train_embedding, inputs=[ - shared.username_state, shared.sd_model_checkpoint_component, new_embedding_name, initialization_text, @@ -1891,7 +1925,6 @@ def sagemaker_train_hypernetwork( create_train_hypernetwork.click( fn=sagemaker_train_hypernetwork, inputs=[ - shared.username_state, shared.sd_model_checkpoint_component, new_hypernetwork_name, new_hypernetwork_sizes, @@ -1938,233 +1971,85 @@ def sagemaker_train_hypernetwork( ) with gr.Blocks(analytics_enabled=False) as user_interface: - def change_sign_options(choice): - return { - signin_column: gr.update(visible=(choice=="Sign In")), - signup_column: gr.update(visible=(choice=="Sign Up")) - } - - with gr.Row(visible=False) as user_login_row: - with gr.Column(): - login_username = gr.Text(label="Username") - login_password = gr.Text(label="Password", type="password") - login_email = gr.Text(label="Email", type="email") - - with gr.Column(): - signout = gr.Button("Sign Out") - userupdate = gr.Button("Update") - userdelete = gr.Button("Delete") - login_output = gr.Label(label="Output") - - with gr.Row(visible=True) as user_sign_row: - with gr.Column(): - sign_options = gr.Radio(["Sign In", "Sign Up"], label="Sign Options", value="Sign In", interactive=True) - - with gr.Column(visible=(sign_options.value=="Sign In")) as signin_column: - signin_username = gr.Textbox(label="Username") - signin_password = gr.Textbox(label="Password", type="password") - signin_output = gr.Label(label="Output") - signin = gr.Button("Sign In") - - with gr.Column(visible=(sign_options.value=="Sign Up")) as signup_column: - signup_username = gr.Textbox(label="Username") - signup_password = gr.Textbox(label="Password", type="password") - signup_email = gr.Textbox(label="Email", type="email") - signup_output = gr.Label(label="Output") - signup = gr.Button("Sign Up") - - sign_options.change(change_sign_options, sign_options, [signin_column, signup_column]) - - def user_signin(signin_username, signin_password): - inputs = { - 'action': 'signin', - 'username': signin_username, - 'password': signin_password - } - - response = requests.post(url=f'{shared.api_endpoint}/sd/user', json=inputs) - if response.status_code == 200: - username = json.loads(response.text)['username'] - password = json.loads(response.text)['password'] - email = json.loads(response.text)['email'] - options = json.loads(response.text)['options'] if 'options' in json.loads(response.text) else None - - response = { - shared.username_state: gr.update(value=username), - user_login_row: gr.update(visible=True), - user_sign_row: gr.update(visible=False), - login_username: gr.update(value=signin_username), - login_password: gr.update(value=password), - login_email: gr.update(value=email), - txt2img_submit: gr.update(visible=True), - img2img_submit: gr.update(visible=True), - extras_submit: gr.update(visible=True), - create_train_embedding: gr.update(visible=True), - create_train_hypernetwork: gr.update(visible=True), - shared.create_train_dreambooth_component: gr.update(visible=True), - signin_output: gr.update(value='') - } - - if options != None: - opts.data = json.loads(options) - sagemaker_endpoint = None - for key in opts.data: - if key in component_dict: - if key == 'sagemaker_endpoint': - sagemaker_endpoint = opts.data[key] - response[component_dict[key]] = gr.update(value=opts.data[key], choices=shared.refresh_sagemaker_endpoints(username)) - elif key == 'sd_model_checkpoint': - shared.refresh_checkpoints(sagemaker_endpoint) - response[component_dict[key]] = gr.update(value=opts.data[key], choices=shared.list_checkpoint_tiles()) - else: - response[component_dict[key]] = gr.update(value=opts.data[key]) - return response - else: - return { - signin_output: gr.update(value='Mismatched username/password or not existed username') - } - - def user_signup(signup_username, signup_password, signup_email): - inputs = { - 'action': 'signup', - 'username': signup_username, - 'password': signup_password, - 'email': signup_email - } - - response = requests.post(url=f'{shared.api_endpoint}/sd/user', json=inputs) - if response.status_code == 200: - username = json.loads(response.text)['username'] - - return { - shared.username_state: gr.update(value=username), - user_login_row: gr.update(visible=True), - user_sign_row: gr.update(visible=False), - login_username: gr.update(value=signup_username), - login_password: gr.update(value=signup_password), - login_email: gr.update(value=signup_email), - txt2img_submit: gr.update(visible=True), - img2img_submit: gr.update(visible=True), - extras_submit: gr.update(visible=True), - create_train_embedding: gr.update(visible=True), - create_train_hypernetwork: gr.update(visible=True), - shared.create_train_dreambooth_component: gr.update(visible=True), - signup_output: gr.update(value='') - } - else: - return { - signup_output: gr.update(value='Signup failed, please check and retry again') - } - - def user_signout(): - username = '' - - opts.data = shared.default_options - response = { - shared.username_state: gr.update(value=username), - user_login_row: gr.update(visible=False), - user_sign_row: gr.update(visible=True), - txt2img_submit: gr.update(visible=False), - img2img_submit: gr.update(visible=False), - extras_submit: gr.update(visible=True), - create_train_embedding: gr.update(visible=False), - create_train_hypernetwork: gr.update(visible=False), - shared.create_train_dreambooth_component: gr.update(visible=False), - } - - for key in opts.data: - if key in component_dict: - if key == 'sagemaker_endpoint': - response[component_dict[key]] = gr.update(value=opts.data[key], choices=[]) - elif key == 'sd_model_checkpoint': - response[component_dict[key]] = gr.update(value=opts.data[key], choices=[]) - else: - response[component_dict[key]] = gr.update(value=opts.data[key]) - - return response + user_dataframe = gr.Dataframe( + headers=["username", "password", "options"], + row_count=2, + col_count=(3,"fixed"), + label="Input Data", + interactive=True, + visible=True, + datatype=["str","str","str"], + type="array" + ) - def user_update(login_username, login_password, login_email): + with gr.Row(): + load_userdata_btn = gr.Button(value="Load") + save_userdata_btn = gr.Button(value="Save") + + def load_userdata(request: gr.Request): + tokens = shared.demo.server_app.tokens + cookies = request.headers['cookie'].split('; ') + access_token = None + for cookie in cookies: + if cookie.startswith('access-token'): + access_token = cookie[len('access-token=') : ] + break + if not access_token or tokens[access_token] != 'admin': + return gr.update() inputs = { - 'action': 'edit', - 'username': login_username, - 'password': login_password, - 'email': login_email + 'action': 'load' } - response = requests.post(url=f'{shared.api_endpoint}/sd/user', json=inputs) + print(response.text) if response.status_code == 200: - return { - login_output: gr.update(value='Update succeed') - } + items = [] + for item in json.loads(response.text): + items.append([item['username'], item['password'], item['options'] if 'options' in item else '']) + print(items) + return gr.update(value=items) else: - return { - login_output: gr.update(value='Update failed, please check and retry again') - } - - def user_delete(login_username, login_password, login_email): + return gr.update() + + def save_userdata(user_dataframe, request: gr.Request): + tokens = shared.demo.server_app.tokens + cookies = request.headers['cookie'].split('; ') + access_token = None + for cookie in cookies: + if cookie.startswith('access-token'): + access_token = cookie[len('access-token=') : ] + break + if not access_token or tokens[access_token] != 'admin': + return gr.update() + items = [] + for item in user_dataframe: + items.append( + { + 'username': item[0], + 'password': item[1], + 'options': item[2] + } + ) inputs = { - 'action': 'delete', - 'username': login_username, - 'password': login_password + 'action': 'save', + 'items': items } - + print(inputs) response = requests.post(url=f'{shared.api_endpoint}/sd/user', json=inputs) + print(response.text) if response.status_code == 200: - username = '' - opts.data = shared.default_options - - response = { - shared.username_state: gr.update(value=username), - user_login_row: gr.update(visible=False), - user_sign_row: gr.update(visible=True), - txt2img_submit: gr.update(visible=False), - img2img_submit: gr.update(visible=False), - extras_submit: gr.update(visible=True), - login_output: gr.update(value='') - } - - for key in opts.data: - if key in component_dict: - if key == 'sagemaker_endpoint': - response[component_dict[key]] = gr.update(value=opts.data[key], choices=[]) - elif key == 'sd_model_checkpoint': - response[component_dict[key]] = gr.update(value=opts.data[key], choices=[]) - else: - response[component_dict[key]] = gr.update(value=opts.data[key]) - return response - else: - return { - login_output: gr.update(value='Delete failed, please check and retry again') - } - - signin.click( - fn=user_signin, - inputs=[signin_username, signin_password], - outputs=[shared.username_state, user_login_row, user_sign_row, login_username, login_password, login_email,txt2img_submit, img2img_submit, extras_submit, create_train_embedding, create_train_hypernetwork, shared.create_train_dreambooth_component if shared.create_train_dreambooth_component else dummy_component, signin_output] + components - ) - - signup.click( - fn=user_signup, - inputs=[signup_username, signup_password, signup_email], - outputs=[shared.username_state, user_login_row, user_sign_row, login_username, login_password, login_email, txt2img_submit, img2img_submit, extras_submit, create_train_embedding, create_train_hypernetwork, shared.create_train_dreambooth_component if shared.create_train_dreambooth_component else dummy_component, signup_output] - ) + print(response.text) + return user_dataframe - signout.click( - fn=user_signout, + load_userdata_btn.click( + load_userdata, inputs=[], - outputs=[shared.username_state, user_login_row, user_sign_row, txt2img_submit, img2img_submit, extras_submit, create_train_embedding, create_train_hypernetwork, shared.create_train_dreambooth_component if shared.create_train_dreambooth_component else dummy_component] + components - ) - - userupdate.click( - fn=user_update, - inputs=[login_username, login_password, login_email], - outputs=[user_login_row, user_sign_row, txt2img_submit, img2img_submit, extras_submit, login_output] + outputs=[user_dataframe] ) - userdelete.click( - fn=user_delete, - inputs=[login_username, login_password, login_email], - outputs=[shared.username_state, user_login_row, user_sign_row, txt2img_submit, img2img_submit, extras_submit, create_train_embedding, create_train_hypernetwork, shared.create_train_dreambooth_component if shared.create_train_dreambooth_component else dummy_component, login_output] + components + save_userdata_btn.click( + save_userdata, + inputs=[user_dataframe], + outputs=[user_dataframe] ) if cmd_opts.pureui: @@ -2229,7 +2114,7 @@ def user_delete(login_username, login_password, login_email): text_settings = gr.Textbox(elem_id="settings_json", value=lambda: opts.dumpjson(), visible=False) settings_submit.click( fn=wrap_gradio_call(run_settings, extra_outputs=[gr.update()]), - inputs=components + [shared.username_state], + inputs=components, outputs=[text_settings, result], ) @@ -2237,8 +2122,8 @@ def user_delete(login_username, login_password, login_email): component = component_dict[k] component.change( - fn=lambda value, k=k: run_settings_single(value, key=k, username=shared.username_state), - inputs=[component] + [shared.username_state], + fn=lambda value, k=k: run_settings_single(value, key=k), + inputs=[component], outputs=[component, text_settings], ) diff --git a/webui.py b/webui.py index ec1067d4ffd..a0d28ddd4ec 100644 --- a/webui.py +++ b/webui.py @@ -163,6 +163,18 @@ def user_auth(username, password): response = requests.post(url=f'{api_endpoint}/sd/login', json=inputs) print(response) + if response.status_code == 200: + try: + options = json.loads(response.text)['options'] + except: + options = None + + if options != None: + shared.opts.data = json.loads(options) + + shared.refresh_sagemaker_endpoints(username) + shared.refresh_checkpoints(shared.opts.sagemaker_endpoint) + return response.status_code == 200 def webui(): From 231076a319c931f2436781938a0933685105c07d Mon Sep 17 00:00:00 2001 From: xieyongliang Date: Tue, 7 Mar 2023 18:39:53 +0800 Subject: [PATCH 2/7] fix issues with dreambooth training --- modules/shared.py | 57 ++++++++++++++++++++++++----------------------- 1 file changed, 29 insertions(+), 28 deletions(-) diff --git a/modules/shared.py b/modules/shared.py index cc63becf97a..5c330aca2d1 100644 --- a/modules/shared.py +++ b/modules/shared.py @@ -137,36 +137,37 @@ hypernetworks = {} loaded_hypernetwork = None -api_endpoint = os.environ['api_endpoint'] -industrial_model = '' -default_options = {} -sagemaker_endpoint_component = None -sd_model_checkpoint_component = None -create_train_dreambooth_component = None - -response = requests.get(url=f'{api_endpoint}/sd/industrialmodel') -if response.status_code == 200: - industrial_model = response.text -else: - model_name = 'stable-diffusion-webui' - model_description = model_name - inputs = { - 'model_algorithm': 'stable-diffusion-webui', - 'model_name': model_name, - 'model_description': model_description, - 'model_extra': '{"visible": "false"}', - 'model_samples': '', - 'file_content': { - 'data': [(lambda x: int(x))(x) for x in open(os.path.join(script_path, 'logo.ico'), 'rb').read()] - } - } - - response = requests.post(url=f'{api_endpoint}/industrialmodel', json = inputs) +if not cmd_opts.train: + api_endpoint = os.environ['api_endpoint'] + industrial_model = '' + default_options = {} + sagemaker_endpoint_component = None + sd_model_checkpoint_component = None + create_train_dreambooth_component = None + + response = requests.get(url=f'{api_endpoint}/sd/industrialmodel') if response.status_code == 200: - body = json.loads(response.text) - industrial_model = body['id'] + industrial_model = response.text else: - print(response.text) + model_name = 'stable-diffusion-webui' + model_description = model_name + inputs = { + 'model_algorithm': 'stable-diffusion-webui', + 'model_name': model_name, + 'model_description': model_description, + 'model_extra': '{"visible": "false"}', + 'model_samples': '', + 'file_content': { + 'data': [(lambda x: int(x))(x) for x in open(os.path.join(script_path, 'logo.ico'), 'rb').read()] + } + } + + response = requests.post(url=f'{api_endpoint}/industrialmodel', json = inputs) + if response.status_code == 200: + body = json.loads(response.text) + industrial_model = body['id'] + else: + print(response.text) def reload_hypernetworks(): from modules.hypernetworks import hypernetwork From c25694cc4f1e8926f03185f7f5582eee5d290e2a Mon Sep 17 00:00:00 2001 From: xieyongliang Date: Wed, 8 Mar 2023 09:41:05 +0800 Subject: [PATCH 3/7] revise to get username from session token --- modules/call_queue.py | 47 ++++++++++++++++++------------------------- 1 file changed, 20 insertions(+), 27 deletions(-) diff --git a/modules/call_queue.py b/modules/call_queue.py index 69e45c0bae8..19d17f436cf 100644 --- a/modules/call_queue.py +++ b/modules/call_queue.py @@ -32,16 +32,7 @@ def f(*args, **kwargs): return f -def wrap_gradio_gpu_call(func, request:gr.Request, extra_outputs=None): - tokens = shared.demo.server_app.tokens - cookies = request.headers['cookie'].split('; ') - access_token = None - for cookie in cookies: - if cookie.startswith('access-token'): - access_token = cookie[len('access-token=') : ] - break - username = tokens[access_token] if access_token else None - +def wrap_gradio_gpu_call(func, extra_outputs=None): def encode_image_to_base64(image): if isinstance(image, bytes): encoded_string = base64.b64encode(image) @@ -85,7 +76,7 @@ def handle_sagemaker_inference_async(response): return processed - def sagemaker_inference(task, infer, sagemaker_endpoint, *args, **kwargs): + def sagemaker_inference(task, infer, username, sagemaker_endpoint, *args, **kwargs): infer = 'async' if task == 'text-to-image' or task == 'image-to-image': if task == 'text-to-image': @@ -418,19 +409,19 @@ def sagemaker_inference(task, infer, sagemaker_endpoint, *args, **kwargs): info = processed['html_info'] return images, modules.ui.plaintext_to_html(info), '' - def f(*args, **kwargs): + def f(username, *args, **kwargs): if cmd_opts.pureui and func == modules.txt2img.txt2img: sagemaker_endpoint = args[len(args) -1] args = args[:-2] - res = sagemaker_inference('text-to-image', 'sync', sagemaker_endpoint, *args, **kwargs) + res = sagemaker_inference('text-to-image', 'sync', username, sagemaker_endpoint, *args, **kwargs) elif cmd_opts.pureui and func == modules.img2img.img2img: sagemaker_endpoint = args[len(args) -1] args = args[:-2] - res = sagemaker_inference('image-to-image', 'sync', sagemaker_endpoint, *args, **kwargs) + res = sagemaker_inference('image-to-image', 'sync', username, sagemaker_endpoint, *args, **kwargs) elif cmd_opts.pureui and func == modules.extras.run_extras: sagemaker_endpoint = args[len(args) -1] args = args[:-2] - res = sagemaker_inference('extras', 'sync', sagemaker_endpoint, *args, **kwargs) + res = sagemaker_inference('extras', 'sync', username, sagemaker_endpoint, *args, **kwargs) else: shared.state.begin() with queue_lock: @@ -442,25 +433,27 @@ def f(*args, **kwargs): return wrap_gradio_call(f, extra_outputs=extra_outputs, add_stats=True) -def wrap_gradio_call(func, request : gr.Request, extra_outputs=None, add_stats=False): - tokens = shared.demo.server_app.tokens - cookies = request.headers['cookie'].split('; ') - access_token = None - for cookie in cookies: - if cookie.startswith('access-token'): - access_token = cookie[len('access-token=') : ] - break - username = tokens[access_token] if access_token else None +def wrap_gradio_call(func, extra_outputs=None, add_stats=False): + def f(request: gr.Request, *args, extra_outputs_array=extra_outputs, **kwargs): + tokens = shared.demo.server_app.tokens + cookies = request.headers['cookie'].split('; ') + access_token = None + for cookie in cookies: + if cookie.startswith('access-token'): + access_token = cookie[len('access-token=') : ] + break + username = tokens[access_token] - def f(*args, extra_outputs_array=extra_outputs, **kwargs): run_memmon = shared.opts.memmon_poll_rate > 0 and not shared.mem_mon.disabled and add_stats if run_memmon: shared.mem_mon.monitor() t = time.perf_counter() try: - args.append(username) - res = list(func(*args, **kwargs)) + if func.__name__ == 'f': + res = list(func(username, *args, **kwargs)) + else: + res = list(func(*args, **kwargs)) except Exception as e: # When printing out our debug argument list, do not print out more than a MB of text max_debug_str_len = 131072 # (1024*1024)/8 From 541d7c54a54dacee42c5fd2298b270b69cab9007 Mon Sep 17 00:00:00 2001 From: xieyongliang Date: Wed, 8 Mar 2023 15:50:41 +0800 Subject: [PATCH 4/7] add queue lock for load_model_weights --- modules/api/api.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/api/api.py b/modules/api/api.py index 70887d7c0a5..fd5db0605e8 100644 --- a/modules/api/api.py +++ b/modules/api/api.py @@ -418,7 +418,8 @@ def invocations(self, req: InvocationsRequest): response = requests.post(url=f'{api_endpoint}/sd/user', json=inputs) if response.status_code == 200 and response.text != '': shared.opts.data = json.loads(response.text) - sd_models.reload_model_weights() + with self.queue_lock: + sd_models.reload_model_weights() self.download_s3files(hypernetwork_s3uri, os.path.join(script_path, shared.cmd_opts.hypernetwork_dir)) hypernetworks.hypernetwork.load_hypernetwork(shared.opts.sd_hypernetwork) From a32195b8b41983b11ed90dcc8f6d1c70eda6dc37 Mon Sep 17 00:00:00 2001 From: xieyongliang Date: Sat, 11 Mar 2023 08:27:57 +0800 Subject: [PATCH 5/7] revise for user authentication --- localizations/zh_CN.json | 28 +++++++---- localizations/zh_TW.json | 20 +++++++- modules/sd_models.py | 39 ++++++++------- modules/shared.py | 49 ++++++++++--------- modules/ui.py | 27 +++++++++-- modules/ui_extensions.py | 92 ++++++++++++++++++------------------ requirements_versions.txt | 2 +- requirements_versions.txt.cn | 2 +- webui.py | 14 ++++-- 9 files changed, 166 insertions(+), 107 deletions(-) diff --git a/localizations/zh_CN.json b/localizations/zh_CN.json index d1dd0ac2ac8..7ca61f6c52e 100644 --- a/localizations/zh_CN.json +++ b/localizations/zh_CN.json @@ -625,17 +625,11 @@ "Train settings": "训练设置", "Train an hypernetwork; you must specify a directory with a set of 1:1 ratio images": "训练 hypernetwork; 必须指定一组具有 1:1 比例图像的目录", "Hypernetwork settings": "Hypernetwork 设置", - "Sign Options": "登陆选项", - "Sign In": "登入", - "Sign Up": "注册", - "Sign Out": "登出", "Username": "用户名", "Password": "密码", - "Email": "电子邮箱", - "Mismatched username/password or not existed username": "用户名/密码不匹配或用户不存在", - "Signup failed, please check and retry again": "注册失败,请检查后并重试", - "Update failed, please check and retry again": "更新失败,请检查后并重试", + "Options": "选项", "Output": "输出", + "User management (Only available for admin user)": "用户管理 (仅管理员用户可用)", "Images S3 URI": "图像 S3 位置", "Models S3 URI": "模型 S3 位置", "Instance type": "实例类型", @@ -754,6 +748,24 @@ "Sample CFG Scale": "采样扩散度", "Sample Steps": "采样步数", "Cancel": "取消", + "Invert colors if your image has white background. Change your brush width to make it thinner if you want to draw something.": "如果您的图像有白色背景,请反转颜色。 如果你想画东西,改变你的画笔宽度让它更细", + "Enable": "启用", + "Invert Input Color": "反转输入颜色", + "RGB to BGR": "RGB 转为 BGR", + "Low VRAM": "低 VRAM", + "Guess Mode": "猜测模式", + "Preprocessor": "预处理器", + "Weight": "权重", + "Guidance strength (T)": "引导强度 (T)", + "Resize Mode": "调整模式", + "Envelope (Outer Fit)": "信封(外部适配)", + "Scale to Fit (Inner Fit)": "缩放以适合 (内部适配)", + "Just Resize": "调整大小", + "Canvas Width": "画布宽度", + "Canvas Height": "画布高度", + "Create blank canvas": "创建空白画布", + "Preview annotator result": "预览标注结果", + "Hide annotator result": "隐藏标注结果", "--------": "--------" } diff --git a/localizations/zh_TW.json b/localizations/zh_TW.json index 17c89ce4145..d24ed8b9e8c 100644 --- a/localizations/zh_TW.json +++ b/localizations/zh_TW.json @@ -744,6 +744,24 @@ "Sample CFG Scale": "採樣擴散度", "Sample Steps": "採樣步數", "Cancel": "取消", - +"Invert colors if your image has white background. Change your brush width to make it thinner if you want to draw something.": "如果您的圖像有白色背景,請反轉顏色。 如果你想畫東西,改變你的畫筆寬度讓它更細", + "Enable": "啟用", + "Invert Input Color": "反轉輸入顏色", + "RGB to BGR": "RGB 轉為 BGR", + "Low VRAM": "低 VRAM", + "Guess Mode": "猜測模式", + "Preprocessor": "預處理器", + "Weight": "權重", + "Guidance strength (T)": "引導強度 (T)", + "Resize Mode": "調整模式", + "Envelope (Outer Fit)": "信封(外部適配)", + "Scale to Fit (Inner Fit)": "縮放以適合 (內部適配)", + "Just Resize": "調整大小", + "Canvas Width": "畫布寬度", + "Canvas Height": "畫布高度", + "Create blank canvas": "創建空白畫布", + "Preview annotator result": "預覽標註結果", + "Hide annotator result": "隱藏標註結果", + "--------": "--------" } diff --git a/modules/sd_models.py b/modules/sd_models.py index 85acd7e49ca..5c2d7e13d2a 100644 --- a/modules/sd_models.py +++ b/modules/sd_models.py @@ -79,24 +79,27 @@ def modeltitle(path, shorthash): return f'{name} [{shorthash}]', shortname if shared.cmd_opts.pureui: - params = { - 'module': 'Stable-diffusion', 'endpoint_name': sagemaker_endpoint - } - response = requests.get(url=f'{api_endpoint}/sd/models', params=params) - if response.status_code == 200: - model_list = json.loads(response.text) - - for model in model_list: - h = model['hash'] - filename = model['filename'] - title = model['title'] - short_model_name = model['model_name'] - config = model['config'] - - if 'sd_model_checkpoint' not in shared.opts.data: - shared.opts.data['sd_model_checkpoint'] = title - - checkpoints_list[title] = CheckpointInfo(filename, title, h, short_model_name, config) + if sagemaker_endpoint: + params = { + 'module': 'Stable-diffusion', 'endpoint_name': sagemaker_endpoint + } + response = requests.get(url=f'{api_endpoint}/sd/models', params=params) + if response.status_code == 200: + model_list = json.loads(response.text) + + for model in model_list: + h = model['hash'] + filename = model['filename'] + title = model['title'] + short_model_name = model['model_name'] + config = model['config'] + + if 'sd_model_checkpoint' not in shared.opts.data: + shared.opts.data['sd_model_checkpoint'] = title + + checkpoints_list[title] = CheckpointInfo(filename, title, h, short_model_name, config) + else: + print(response.text) sd_model_checkpoint = shared.opts.data['sd_model_checkpoint'] if sd_model_checkpoint and sd_model_checkpoint in checkpoints_list: diff --git a/modules/shared.py b/modules/shared.py index 5c330aca2d1..883fc62afc4 100644 --- a/modules/shared.py +++ b/modules/shared.py @@ -144,30 +144,31 @@ sagemaker_endpoint_component = None sd_model_checkpoint_component = None create_train_dreambooth_component = None + username = '' + +response = requests.get(url=f'{api_endpoint}/sd/industrialmodel') +if response.status_code == 200: + industrial_model = response.text +else: + model_name = 'stable-diffusion-webui' + model_description = model_name + inputs = { + 'model_algorithm': 'stable-diffusion-webui', + 'model_name': model_name, + 'model_description': model_description, + 'model_extra': '{"visible": "false"}', + 'model_samples': '', + 'file_content': { + 'data': [(lambda x: int(x))(x) for x in open(os.path.join(script_path, 'logo.ico'), 'rb').read()] + } + } - response = requests.get(url=f'{api_endpoint}/sd/industrialmodel') + response = requests.post(url=f'{api_endpoint}/industrialmodel', json = inputs) if response.status_code == 200: - industrial_model = response.text + body = json.loads(response.text) + industrial_model = body['id'] else: - model_name = 'stable-diffusion-webui' - model_description = model_name - inputs = { - 'model_algorithm': 'stable-diffusion-webui', - 'model_name': model_name, - 'model_description': model_description, - 'model_extra': '{"visible": "false"}', - 'model_samples': '', - 'file_content': { - 'data': [(lambda x: int(x))(x) for x in open(os.path.join(script_path, 'logo.ico'), 'rb').read()] - } - } - - response = requests.post(url=f'{api_endpoint}/industrialmodel', json = inputs) - if response.status_code == 200: - body = json.loads(response.text) - industrial_model = body['id'] - else: - print(response.text) + print(response.text) def reload_hypernetworks(): from modules.hypernetworks import hypernetwork @@ -301,7 +302,9 @@ def list_checkpoint_tiles(): def refresh_checkpoints(sagemaker_endpoint=None): import modules.sd_models - return modules.sd_models.list_models(sagemaker_endpoint) + modules.sd_models.list_models(sagemaker_endpoint) + checkpoints = modules.sd_models.checkpoints_list + return checkpoints def list_samplers(): @@ -320,7 +323,7 @@ def list_sagemaker_endpoints(): return sagemaker_endpoints -def refresh_sagemaker_endpoints(username=None): +def refresh_sagemaker_endpoints(username): global industrial_model, api_endpoint, sagemaker_endpoints sagemaker_endpoints = [] diff --git a/modules/ui.py b/modules/ui.py index 44912c0c0f9..c28744ceb9d 100644 --- a/modules/ui.py +++ b/modules/ui.py @@ -416,8 +416,8 @@ def create_toprow(is_img2img): with gr.Column(scale=1, elem_id="roll_col"): roll = gr.Button(value=art_symbol, elem_id="roll", visible=len(shared.artist_db.artists) > 0) paste = gr.Button(value=paste_symbol, elem_id="paste") - save_style = gr.Button(value=save_style_symbol, elem_id="style_create") - prompt_style_apply = gr.Button(value=apply_style_symbol, elem_id="style_apply") + save_style = gr.Button(value=save_style_symbol, elem_id="style_create", visible=False) + prompt_style_apply = gr.Button(value=apply_style_symbol, elem_id="style_apply", visible=False) token_counter = gr.HTML(value="", elem_id=f"{id_part}_token_counter") token_button = gr.Button(visible=False, elem_id=f"{id_part}_token_button") @@ -671,6 +671,15 @@ def open_folder(f): img2img_submit = None extras_submit = None +def update_sagemaker_endpoint(): + return gr.update(value=shared.opts.sagemaker_endpoint, choices=shared.sagemaker_endpoints) + +def update_sd_model_checkpoint(): + return gr.update(value=shared.opts.sd_model_checkpoint, choices=modules.sd_models.checkpoint_tiles()) + +def update_username(): + return gr.update(value=shared.username) + def create_ui(): import modules.img2img import modules.txt2img @@ -1971,11 +1980,14 @@ def sagemaker_train_hypernetwork( ) with gr.Blocks(analytics_enabled=False) as user_interface: + username_state = gr.Textbox(value="", elem_id="username", visible=False) + username_state.change(fn=None, inputs=[username_state], outputs=None, _js="function(username){var x=gradioApp().querySelector('#tabs').querySelectorAll('button')[5];x.style.display=(username=='admin'?'block':'none')}") + user_dataframe = gr.Dataframe( - headers=["username", "password", "options"], + headers=["Username", "Password", "Options"], row_count=2, col_count=(3,"fixed"), - label="Input Data", + label="User management (Only available for admin user)", interactive=True, visible=True, datatype=["str","str","str"], @@ -2049,9 +2061,14 @@ def save_userdata(user_dataframe, request: gr.Request): save_userdata_btn.click( save_userdata, inputs=[user_dataframe], - outputs=[user_dataframe] + outputs=[user_dataframe], + _js="var if alert('Only admin user can save user data')" ) + user_interface.load(update_sagemaker_endpoint, inputs=None, outputs=[shared.sagemaker_endpoint_component]) + user_interface.load(update_sd_model_checkpoint, inputs=None, outputs=[shared.sd_model_checkpoint_component]) + user_interface.load(update_username, inputs=None, outputs=[username_state]) + if cmd_opts.pureui: interfaces += [ (txt2img_interface, "txt2img", "txt2img"), diff --git a/modules/ui_extensions.py b/modules/ui_extensions.py index b487ac25ba6..eda9e26ebd8 100644 --- a/modules/ui_extensions.py +++ b/modules/ui_extensions.py @@ -91,7 +91,7 @@ def extension_table(): code += f""" - + {remote} {ext_status} @@ -243,8 +243,8 @@ def create_ui(): with gr.TabItem("Installed"): with gr.Row(): - apply = gr.Button(value="Apply and restart UI", variant="primary") - check = gr.Button(value="Check for updates") + apply = gr.Button(value="Apply and restart UI", variant="primary", visible=False) + check = gr.Button(value="Check for updates", visible=False) extensions_disabled_list = gr.Text(elem_id="extensions_disabled_list", visible=False).style(container=False) extensions_update_list = gr.Text(elem_id="extensions_update_list", visible=False).style(container=False) @@ -263,48 +263,48 @@ def create_ui(): inputs=[], outputs=[extensions_table], ) - - with gr.TabItem("Available"): - with gr.Row(): - refresh_available_extensions_button = gr.Button(value="Load from:", variant="primary") - available_extensions_index = gr.Text(value="https://raw.githubusercontent.com/wiki/AUTOMATIC1111/stable-diffusion-webui/Extensions-index.md", label="Extension index URL").style(container=False) - extension_to_install = gr.Text(elem_id="extension_to_install", visible=False) - install_extension_button = gr.Button(elem_id="install_extension_button", visible=False) - - with gr.Row(): - hide_tags = gr.CheckboxGroup(value=["ads", "localization"], label="Hide extensions with tags", choices=["script", "ads", "localization"]) - - install_result = gr.HTML() - available_extensions_table = gr.HTML() - - refresh_available_extensions_button.click( - fn=modules.ui.wrap_gradio_call(refresh_available_extensions, extra_outputs=[gr.update(), gr.update(), gr.update()]), - inputs=[available_extensions_index, hide_tags], - outputs=[available_extensions_index, available_extensions_table, hide_tags, install_result], - ) - - install_extension_button.click( - fn=modules.ui.wrap_gradio_call(install_extension_from_index, extra_outputs=[gr.update(), gr.update()]), - inputs=[extension_to_install, hide_tags], - outputs=[available_extensions_table, extensions_table, install_result], - ) - - hide_tags.change( - fn=modules.ui.wrap_gradio_call(refresh_available_extensions_for_tags, extra_outputs=[gr.update()]), - inputs=[hide_tags], - outputs=[available_extensions_table, install_result] - ) - - with gr.TabItem("Install from URL"): - install_url = gr.Text(label="URL for extension's git repository") - install_dirname = gr.Text(label="Local directory name", placeholder="Leave empty for auto") - install_button = gr.Button(value="Install", variant="primary") - install_result = gr.HTML(elem_id="extension_install_result") - - install_button.click( - fn=modules.ui.wrap_gradio_call(install_extension_from_url, extra_outputs=[gr.update()]), - inputs=[install_dirname, install_url], - outputs=[extensions_table, install_result], - ) + if not shared.cmd_opts.pureui: + with gr.TabItem("Available"): + with gr.Row(): + refresh_available_extensions_button = gr.Button(value="Load from:", variant="primary") + available_extensions_index = gr.Text(value="https://raw.githubusercontent.com/wiki/AUTOMATIC1111/stable-diffusion-webui/Extensions-index.md", label="Extension index URL").style(container=False) + extension_to_install = gr.Text(elem_id="extension_to_install", visible=False) + install_extension_button = gr.Button(elem_id="install_extension_button", visible=False) + + with gr.Row(): + hide_tags = gr.CheckboxGroup(value=["ads", "localization"], label="Hide extensions with tags", choices=["script", "ads", "localization"]) + + install_result = gr.HTML() + available_extensions_table = gr.HTML() + + refresh_available_extensions_button.click( + fn=modules.ui.wrap_gradio_call(refresh_available_extensions, extra_outputs=[gr.update(), gr.update(), gr.update()]), + inputs=[available_extensions_index, hide_tags], + outputs=[available_extensions_index, available_extensions_table, hide_tags, install_result], + ) + + install_extension_button.click( + fn=modules.ui.wrap_gradio_call(install_extension_from_index, extra_outputs=[gr.update(), gr.update()]), + inputs=[extension_to_install, hide_tags], + outputs=[available_extensions_table, extensions_table, install_result], + ) + + hide_tags.change( + fn=modules.ui.wrap_gradio_call(refresh_available_extensions_for_tags, extra_outputs=[gr.update()]), + inputs=[hide_tags], + outputs=[available_extensions_table, install_result] + ) + + with gr.TabItem("Install from URL"): + install_url = gr.Text(label="URL for extension's git repository") + install_dirname = gr.Text(label="Local directory name", placeholder="Leave empty for auto") + install_button = gr.Button(value="Install", variant="primary") + install_result = gr.HTML(elem_id="extension_install_result") + + install_button.click( + fn=modules.ui.wrap_gradio_call(install_extension_from_url, extra_outputs=[gr.update()]), + inputs=[install_dirname, install_url], + outputs=[extensions_table, install_result], + ) return ui diff --git a/requirements_versions.txt b/requirements_versions.txt index ad410616b20..b5d15750386 100644 --- a/requirements_versions.txt +++ b/requirements_versions.txt @@ -3,7 +3,7 @@ diffusers==0.3.0 accelerate==0.12.0 basicsr==1.4.2 gfpgan==1.3.8 -gradio==3.9 +gradio==3.16.2 numpy==1.23.3 Pillow==9.2.0 realesrgan==0.3.0 diff --git a/requirements_versions.txt.cn b/requirements_versions.txt.cn index 65be9d1e2c3..985a27a33fc 100644 --- a/requirements_versions.txt.cn +++ b/requirements_versions.txt.cn @@ -4,7 +4,7 @@ diffusers==0.3.0 accelerate==0.12.0 basicsr==1.4.2 gfpgan==1.3.8 -gradio==3.9 +gradio==3.16.2 numpy==1.23.3 Pillow==9.2.0 realesrgan==0.3.0 diff --git a/webui.py b/webui.py index a0d28ddd4ec..c6d390629b8 100644 --- a/webui.py +++ b/webui.py @@ -161,12 +161,13 @@ def user_auth(username, password): api_endpoint = os.environ['api_endpoint'] response = requests.post(url=f'{api_endpoint}/sd/login', json=inputs) - print(response) if response.status_code == 200: try: - options = json.loads(response.text)['options'] - except: + body = json.loads(response.text) + options = json.loads(body)['options'] + except Exception as e: + print(e) options = None if options != None: @@ -174,6 +175,12 @@ def user_auth(username, password): shared.refresh_sagemaker_endpoints(username) shared.refresh_checkpoints(shared.opts.sagemaker_endpoint) + shared.username = username + modules.ui.update_sagemaker_endpoint() + modules.ui.update_sd_model_checkpoint() + modules.ui.update_username() + else: + print(response.text) return response.status_code == 200 @@ -195,7 +202,6 @@ def webui(): ssl_certfile=cmd_opts.tls_certfile, debug=cmd_opts.gradio_debug, auth=user_auth, - auth_message="This login process is being used to verify your eligibility to use this stable-diffusion-webui. It's up to your organization's implementation", inbrowser=cmd_opts.autolaunch, prevent_thread_lock=True ) From 2bd0d52704763eff99f91321f545bc0f0addf585 Mon Sep 17 00:00:00 2001 From: xieyongliang Date: Sat, 11 Mar 2023 09:31:40 +0800 Subject: [PATCH 6/7] update the localizations for zh_CN & zh_TW --- localizations/zh_CN.json | 9 ++++++++- localizations/zh_TW.json | 12 ++++++++---- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/localizations/zh_CN.json b/localizations/zh_CN.json index 7ca61f6c52e..8ecfc6c3e60 100644 --- a/localizations/zh_CN.json +++ b/localizations/zh_CN.json @@ -292,7 +292,13 @@ "[wiki]": "[wiki文档]", "Embedding": "Embedding", "Embedding Learning rate": "Embedding 学习率", + "Gradient accumulation steps": "梯度累计步数", + "Shuffle tags by ',' when creating prompts.": "创建提示时按“,”打乱标签。", + "Drop out tags when creating prompts.": "创建提示时删除标签。", + "Choose latent sampling method": "选择隐采样方法", "Hypernetwork Learning rate": "Hypernetwork 学习率", + "Select activation function of hypernetwork. Recommended : Swish / Linear(none)": "选择 Hypernetwork 的激活函数,推荐Swish / Linear(none)", + "Select Layer weights initialization. Recommended: Kaiming for relu-like, Xavier for sigmoid-like, Normal otherwise": "选择图层权重初始化。 推荐:Kaiming 用于 relu-like,Xavier 用于 sigmoid-like,否则为 Normal", "Dataset directory": "数据集目录", "Log directory": "日志目录", "Prompt template file": "提示词模版文件", @@ -748,7 +754,8 @@ "Sample CFG Scale": "采样扩散度", "Sample Steps": "采样步数", "Cancel": "取消", - "Invert colors if your image has white background. Change your brush width to make it thinner if you want to draw something.": "如果您的图像有白色背景,请反转颜色。 如果你想画东西,改变你的画笔宽度让它更细", + "Invert colors if your image has white background.": "如果您的图像有白色背景,请反转颜色。 ", + "Change your brush width to make it thinner if you want to draw something.": "如果你想画东西,改变你的画笔宽度让它更细。", "Enable": "启用", "Invert Input Color": "反转输入颜色", "RGB to BGR": "RGB 转为 BGR", diff --git a/localizations/zh_TW.json b/localizations/zh_TW.json index d24ed8b9e8c..4aabe47df1c 100644 --- a/localizations/zh_TW.json +++ b/localizations/zh_TW.json @@ -303,7 +303,12 @@ "[wiki]": "[wiki文件]", "Embedding": "Embedding", "Embedding Learning rate": "Embedding 學習率", - "Hypernetwork Learning rate": "超網路(Hypernetwork)學習率", + "Gradient accumulation steps": "梯度累計步數", + "Shuffle tags by ',' when creating prompts.": "創建提示時按“,”打亂標籤。", + "Drop out tags when creating prompts.": "創建提示時刪除標籤。", + "Choose latent sampling method": "選擇隱採樣方法", + "Hypernetwork Learning rate": "Hypernetwork 學習率", + "Select activation function of hypernetwork. Recommended : Swish / Linear(none)": "選擇 Hypernetwork 的激活函數,推薦Swish / Linear(none)", "Learning rate": "學習率", "Dataset directory": "資料集目錄", "Log directory": "日誌目錄", @@ -338,7 +343,6 @@ "End Page": "尾頁", "number of images to delete consecutively next": "接下來要連續刪除的圖像數", "delete next": "刪除下一張", - "Delete": "刪除", "sort by": "排序方式", "path name": "路徑名", "date": "日期", @@ -489,7 +493,6 @@ "Check for updates": "檢查更新", "Extension": "擴充", "URL": "網址", - "Update": "更新", "a1111-sd-webui-tagcomplete": "標記自動補全", "unknown": "未知", "deforum-for-automatic1111-webui": "Deforum", @@ -744,7 +747,8 @@ "Sample CFG Scale": "採樣擴散度", "Sample Steps": "採樣步數", "Cancel": "取消", -"Invert colors if your image has white background. Change your brush width to make it thinner if you want to draw something.": "如果您的圖像有白色背景,請反轉顏色。 如果你想畫東西,改變你的畫筆寬度讓它更細", + "Invert colors if your image has white background.": "如果您的圖像有白色背景,請反轉顏色。 ", + "Change your brush width to make it thinner if you want to draw something.": "如果你想畫東西,改變你的畫筆寬度讓它更細。", "Enable": "啟用", "Invert Input Color": "反轉輸入顏色", "RGB to BGR": "RGB 轉為 BGR", From bdd7135e7a0218bd50ff8c1fc805435b63226e31 Mon Sep 17 00:00:00 2001 From: xieyongliang Date: Sat, 11 Mar 2023 21:04:12 +0800 Subject: [PATCH 7/7] cleanup --- requirements.txt.cn | 34 ---------------------------------- 1 file changed, 34 deletions(-) delete mode 100644 requirements.txt.cn diff --git a/requirements.txt.cn b/requirements.txt.cn deleted file mode 100644 index d122489c578..00000000000 --- a/requirements.txt.cn +++ /dev/null @@ -1,34 +0,0 @@ --i https://pypi.tuna.tsinghua.edu.cn/simple -accelerate -basicsr -diffusers -fairscale==0.4.4 -fonts -font-roboto -gfpgan -gradio==3.9 -invisible-watermark -numpy -omegaconf -opencv-python -requests -piexif -Pillow -pytorch_lightning==1.7.7 -realesrgan -scikit-image>=0.19 -timm==0.4.12 -transformers==4.19.2 -torch -einops -jsonmerge -clean-fid -resize-right -torchdiffeq -kornia -lark -inflection -GitPython -torchsde -safetensors -boto3