diff --git a/localizations/zh_CN.json b/localizations/zh_CN.json index 95dd39412f6..2eb9c4d0c3f 100644 --- a/localizations/zh_CN.json +++ b/localizations/zh_CN.json @@ -844,7 +844,7 @@ "Output S3 folder":"S3文件夹目录", "Upload Train Images to S3":"上传训练图片到S3", "Error, please configure a S3 bucket at settings page first":"失败,请先到设置页面配置S3桶名", - "Upload":"上传", + "Upload Images":"上传图片", "Reload all models":"重新加载模型文件", "Update model files path":"更新模型加载路径", "S3 path for downloading model files (E.g, s3://bucket-name/models/)":"加载模型的S3路径,例如:s3://bucket-name/models/", diff --git a/modules/call_queue.py b/modules/call_queue.py index 7578d963188..fce0938cedb 100644 --- a/modules/call_queue.py +++ b/modules/call_queue.py @@ -450,7 +450,7 @@ def f(request: gr.Request, *args, extra_outputs_array=extra_outputs, **kwargs): t = time.perf_counter() try: - if func.__name__ == 'f' or func.__name__ == 'run_settings': + if func.__name__ == 'f' or func.__name__ == 'run_settings' or func.__name__ == 'save_files': res = list(func(username, *args, **kwargs)) else: res = list(func(*args, **kwargs)) diff --git a/modules/paths.py b/modules/paths.py index 4dd03a3594c..c80b317bdc0 100644 --- a/modules/paths.py +++ b/modules/paths.py @@ -2,9 +2,11 @@ import os import sys import modules.safe - script_path = os.path.dirname(os.path.dirname(os.path.realpath(__file__))) -models_path = os.path.join(script_path, "models") +## Change by River +# models_path = os.path.join(script_path, "models") +models_path = '/tmp/models' +## sys.path.insert(0, script_path) # search for directory of stable diffusion in following places diff --git a/modules/scripts.py b/modules/scripts.py index bba8707d0b4..6320d3c9641 100644 --- a/modules/scripts.py +++ b/modules/scripts.py @@ -181,7 +181,7 @@ def load_scripts(): script_callbacks.clear_callbacks() scripts_list = list_scripts("scripts", ".py") - + print('scripts_list:',scripts_list) syspath = sys.path for scriptfile in sorted(scripts_list): @@ -203,6 +203,7 @@ def load_scripts(): finally: sys.path = syspath current_basedir = paths.script_path + print('scripts_data',scripts_data) def wrap_call(func, filename, funcname, *args, default=None, **kwargs): @@ -225,6 +226,9 @@ def __init__(self): self.infotext_fields = [] def initialize_scripts(self, is_img2img): + print('----initialize_scripts()------') + print(f'--scripts_data--{scripts_data}') + traceback.print_stack() self.scripts.clear() self.alwayson_scripts.clear() self.selectable_scripts.clear() @@ -316,7 +320,8 @@ def run(self, p: StableDiffusionProcessing, *args): if script_index == 0: return None - + print('self.selectable_scripts:',self.selectable_scripts) + print('script_index:',script_index) script = self.selectable_scripts[script_index-1] if script is None: diff --git a/modules/shared.py b/modules/shared.py index 2681327dba4..d90009be911 100644 --- a/modules/shared.py +++ b/modules/shared.py @@ -25,7 +25,7 @@ s3_folder_cn = None syncLock = threading.Lock() tmp_models_dir = '/tmp/models' -tmp_cache_dir = '/tmp/cache' +tmp_cache_dir = '/tmp/model_sync_cache' #end sd_model_file = os.path.join(script_path, 'model.ckpt') @@ -514,6 +514,7 @@ def refresh_sagemaker_endpoints(username): options_templates.update(options_section(('sd', "Stable Diffusion"), { + # "models_s3_bucket": OptionInfo(f'{get_default_sagemaker_bucket()}/stable-diffusion-webui/models/', "S3 path for downloading model files (E.g, s3://bucket-name/models/)", ), "sagemaker_endpoint": OptionInfo(None, "SaegMaker endpoint", gr.Dropdown, lambda: {"choices": list_sagemaker_endpoints()}, refresh=refresh_sagemaker_endpoints), "sd_model_checkpoint": OptionInfo(None, "Stable Diffusion checkpoint", gr.Dropdown, lambda: {"choices": list_checkpoint_tiles()}, refresh=refresh_checkpoints), "sd_checkpoint_cache": OptionInfo(0, "Checkpoints to cache in RAM", gr.Slider, {"minimum": 0, "maximum": 10, "step": 1}), diff --git a/modules/ui.py b/modules/ui.py index 3406400d422..12d2f9d284c 100644 --- a/modules/ui.py +++ b/modules/ui.py @@ -89,10 +89,22 @@ def gr_show(visible=True): ## Begin output images uploaded to s3 by River s3_resource = boto3.resource('s3') -def save_images_to_s3(full_fillnames,timestamp): - username = shared.username +def get_webui_username(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 + return username + +def save_images_to_s3(full_fillnames,timestamp,username): sagemaker_endpoint = shared.opts.sagemaker_endpoint - bucket_name = opts.train_files_s3bucket + bucket_name = opts.train_files_s3bucket.replace('s3://','') + if bucket_name.endswith('/'): + bucket_name= bucket_name[:-1] if bucket_name == '': return 'Error, please configure a S3 bucket at settings page first' s3_bucket = s3_resource.Bucket(bucket_name) @@ -134,6 +146,10 @@ def save_images_to_s3(full_fillnames,timestamp): save_style_symbol = '\U0001f4be' # 💾 apply_style_symbol = '\U0001f4cb' # 📋 +def text_to_hyperlink_html(url): + text= f'

{url}

' + return text + def plaintext_to_html(text): text = "

" + "
\n".join([f"{html.escape(x)}" for x in text.split('\n')]) + "

" return text @@ -143,7 +159,7 @@ def send_gradio_gallery_to_image(x): return None return image_from_url_text(x[0]) -def save_files(js_data, images, do_make_zip, index): +def save_files(username,js_data, images, do_make_zip, index): import csv filenames = [] fullfns = [] @@ -197,8 +213,7 @@ def __init__(self, d=None): timestamp = datetime.now(timezone(timedelta(hours=+8))).strftime('%Y-%m-%dT%H:%M:%S') logfile = os.path.join(opts.outdir_save, "log.csv") - s3folder = save_images_to_s3(fullfns,timestamp) - save_images_to_s3([logfile],timestamp) + s3folder = save_images_to_s3(fullfns+[logfile],timestamp,username) # Make Zip if do_make_zip: zip_filepath = os.path.join(path, "images.zip") @@ -210,7 +225,7 @@ def __init__(self, d=None): zip_file.writestr(filenames[i], f.read()) fullfns.insert(0, zip_filepath) - return gr.File.update(value=fullfns, visible=True), '', '', plaintext_to_html(f"Saved: {filenames[0]}, \nS3 folder:\n{s3folder}") + return gr.File.update(value=fullfns, visible=True), '', '', plaintext_to_html(f"Saved: {filenames[0]}"),text_to_hyperlink_html(s3folder) @@ -683,13 +698,14 @@ def open_folder(f): generation_info, result_gallery, do_make_zip, - html_info, + html_info ], outputs=[ download_files, html_info, html_info, html_info, + html_info ] ) else: @@ -711,20 +727,20 @@ def create_ui(): interfaces = [] - ##add images viewer - def translate(text): - return f'translated:{text}' - with gr.Blocks(analytics_enabled=False) as imagesviewer_interface: - with gr.Row().style(equal_height=False): - with gr.Column(): - english = gr.Textbox(label="Placeholder") - translate_btn = gr.Button(value="Translate") - with gr.Column(): - german = gr.Textbox(label="German Text") - - translate_btn.click(translate, inputs=english, outputs=german, api_name="translate-to-german") - examples = gr.Examples(examples=["I went to the supermarket yesterday.", "Helen is a good swimmer."], - inputs=[english]) + ##add River + # def translate(text): + # return f'translated:{text}' + # with gr.Blocks(analytics_enabled=False) as imagesviewer_interface: + # with gr.Row().style(equal_height=False): + # with gr.Column(): + # english = gr.Textbox(label="Placeholder") + # translate_btn = gr.Button(value="Translate") + # with gr.Column(): + # german = gr.Textbox(label="German Text") + + # translate_btn.click(translate, inputs=english, outputs=german, api_name="translate-to-german") + # examples = gr.Examples(examples=["I went to the supermarket yesterday.", "Helen is a good swimmer."], + # inputs=[english]) with gr.Blocks(analytics_enabled=False) as pnginfo_interface: with gr.Row().style(equal_height=False): @@ -880,13 +896,14 @@ def run_settings_single(value, key, request : gr.Request): with gr.Row(): settings_submit = gr.Button(value="Apply settings", variant='primary') with gr.Row(): - with gr.Column(scale=2): + with gr.Column(scale=4): models_s3bucket = gr.Textbox(label="S3 path for downloading model files (E.g, s3://bucket-name/models/)", value=default_s3_path) with gr.Column(scale=1): set_models_s3bucket_btn = gr.Button(value="Update model files path",elem_id='id_set_models_s3bucket') with gr.Column(scale=1): reload_models_btn = gr.Button(value='Reload all models', elem_id='id_reload_all_models') + result = gr.HTML() @@ -996,7 +1013,8 @@ def reload_all_models(): inputs=[], outputs=[result] ) - + + # River def set_models_s3bucket(bucket_name): if bucket_name == '': return 'Error, please configure a S3 bucket for downloading model files' @@ -1539,10 +1557,13 @@ def update_orig(image, state): with gr.Row().style(equal_height=False): with gr.Tabs(elem_id="train_tabs"): ## Begin add s3 images upload interface by River - def upload_to_s3(imgs): - username = shared.username + def upload_to_s3(imgs,request : gr.Request): + username = get_webui_username(request) + print (f'--get_webui_username--:{username}') timestamp = datetime.now(timezone(timedelta(hours=+8))).strftime('%Y-%m-%dT%H:%M:%S') - bucket_name = opts.train_files_s3bucket + bucket_name = opts.train_files_s3bucket.replace('s3://','') + if bucket_name.endswith('/'): + bucket_name= bucket_name[:-1] if bucket_name == '': return 'Error, please configure a S3 bucket at settings page first' s3_bucket = s3_resource.Bucket(bucket_name.replace('s3://','')) @@ -1561,7 +1582,7 @@ def upload_to_s3(imgs): with gr.Tab(label="Upload Train Images to S3"): upload_files = gr.Files(label="Files") url_output = gr.Textbox(label="Output S3 folder") - sub_btn = gr.Button(label="Upload",variant='primary',elem_id='id_upload_train_files') + sub_btn = gr.Button(value="Upload Images",elem_id='id_upload_train_images',variant='primary') sub_btn.click(fn=upload_to_s3, inputs=upload_files, outputs=url_output) ## End add s3 images upload interface by River with gr.Tab(label="Train Embedding"): @@ -2194,7 +2215,7 @@ def save_userdata(user_dataframe, request: gr.Request): # interfaces += script_callbacks.ui_tabs_callback() interfaces += [(settings_interface, "Settings", "settings")] - interfaces += [(imagesviewer_interface,"Images Viewer","imagesviewer")] + # interfaces += [(imagesviewer_interface,"Images Viewer","imagesviewer")] extensions_interface = ui_extensions.create_ui() interfaces += [(extensions_interface, "Extensions", "extensions")] diff --git a/webui.py b/webui.py index 7d761e6633d..ff51d2b83d1 100644 --- a/webui.py +++ b/webui.py @@ -79,8 +79,11 @@ def initialize(): region_name = session.region_name sts_client = session.client('sts') account_id = sts_client.get_caller_identity()['Account'] + sg_s3_bucket = f"sagemaker-{region_name}-{account_id}" + #print ('environ:',os.environ) if not shared.models_s3_bucket: - shared.models_s3_bucket = f"sagemaker-{region_name}-{account_id}" + + shared.models_s3_bucket = os.environ['sg_default_bucket'] if os.environ.get('sg_default_bucket') else sg_s3_bucket shared.s3_folder_sd = "stable-diffusion-webui/models/Stable-diffusion" shared.s3_folder_cn = "stable-diffusion-webui/models/ControlNet" @@ -99,7 +102,7 @@ def initialize(): modules.scripts.load_scripts() modelloader.load_upscalers() - + modules.sd_vae.refresh_vae_list() if not cmd_opts.pureui: modules.sd_models.load_model() @@ -187,92 +190,6 @@ def user_auth(username, password): return response.status_code == 200 -# def register_models(models_dir,mode): -# if mode == 'sd': -# register_sd_models(models_dir) -# elif mode == 'cn': -# register_cn_models(models_dir) - -# def register_sd_models(sd_models_dir): -# print ('---register_sd_models()----') -# if 'endpoint_name' in os.environ: -# items = [] -# api_endpoint = os.environ['api_endpoint'] -# endpoint_name = os.environ['endpoint_name'] -# print(f'api_endpoint:{api_endpoint}\nendpoint_name:{endpoint_name}') -# for file in os.listdir(sd_models_dir): -# if os.path.isfile(os.path.join(sd_models_dir, file)) and (file.endswith('.ckpt') or file.endswith('.safetensors')): -# hash = modules.sd_models.model_hash(os.path.join(sd_models_dir, file)) -# item = {} -# item['model_name'] = file -# item['config'] = '/opt/ml/code/stable-diffusion-webui/repositories/stable-diffusion/configs/stable-diffusion/v1-inference.yaml' -# item['filename'] = '/opt/ml/code/stable-diffusion-webui/models/Stable-diffusion/{0}'.format(file) -# item['hash'] = hash -# item['title'] = '{0} [{1}]'.format(file, hash) -# item['endpoint_name'] = endpoint_name -# items.append(item) -# inputs = { -# 'items': items -# } -# params = { -# 'module': 'Stable-diffusion' -# } -# if api_endpoint.startswith('http://') or api_endpoint.startswith('https://'): -# response = requests.post(url=f'{api_endpoint}/sd/models', json=inputs, params=params) -# print(response) - -# def register_cn_models(cn_models_dir): -# print ('---register_cn_models()----') -# if 'endpoint_name' in os.environ: -# items = [] -# api_endpoint = os.environ['api_endpoint'] -# endpoint_name = os.environ['endpoint_name'] -# print(f'api_endpoint:{api_endpoint}\nendpoint_name:{endpoint_name}') - -# inputs = { -# 'items': items -# } -# params = { -# 'module': 'ControlNet' -# } -# for file in os.listdir(cn_models_dir): -# if os.path.isfile(os.path.join(cn_models_dir, file)) and \ -# (file.endswith('.pt') or file.endswith('.pth') or file.endswith('.ckpt') or file.endswith('.safetensors')): -# hash = modules.sd_models.model_hash(os.path.join(cn_models_dir, file)) -# item = {} -# item['model_name'] = file -# item['title'] = '{0} [{1}]'.format(os.path.splitext(file)[0], hash) -# item['endpoint_name'] = endpoint_name -# items.append(item) - -# if api_endpoint.startswith('http://') or api_endpoint.startswith('https://'): -# response = requests.post(url=f'{api_endpoint}/sd/models', json=inputs, params=params) -# print(response) - -# def de_register_model(model_name,mode): -# models_Ref = shared.sd_models_Ref -# if mode == 'sd' : -# models_Ref = shared.sd_models_Ref -# elif mode == 'cn': -# models_Ref = shared.cn_models_Ref -# models_Ref.remove_model_ref(model_name) -# print (f'---de_register_{mode}_model({model_name})---models_Ref({models_Ref.get_models_ref_dict()})----') -# if 'endpoint_name' in os.environ: -# api_endpoint = os.environ['api_endpoint'] -# endpoint_name = os.environ['endpoint_name'] -# data = { -# "module":mode, -# "model_name": model_name, -# "endpoint_name": endpoint_name -# } -# response = requests.delete(url=f'{api_endpoint}/sd/models', json=data) -# # Check if the request was successful -# if response.status_code == requests.codes.ok: -# print(f"{model_name} deleted successfully!") -# else: -# print(f"Error deleting {model_name}: ", response.text) - - def check_space_s3_download(s3,bucket_name,s3_folder,local_folder,file,size,mode): src = s3_folder + '/' + file @@ -365,7 +282,6 @@ def initial_s3_download(s3_folder, local_folder,cache_dir,mode): model.append(filename) else: fnames_dict[root] = [filename] - print(f'-----fnames_dict---{fnames_dict}') tmp_s3_files = {} for i, obj in enumerate (s3_objects): @@ -460,12 +376,13 @@ def sync(mode): retry = retry - 1 if registerflag: register_models(local_folder,mode) - if mode == 'sd': - #Refreshing Model List - modules.sd_models.list_models() - elif mode == 'cn': - #Reload extension models, such as ControlNet - modules.scripts.reload_scripts() + reload_webui_infer(mode) + # if mode == 'sd': + # #Refreshing Model List + # modules.sd_models.list_models() + # elif mode == 'cn': + # #Reload extension models, such as ControlNet + # modules.scripts.reload_scripts() # Create a thread function to keep syncing with the S3 folder @@ -479,7 +396,17 @@ def sync_thread(mode): thread.start() return thread - +def reload_webui_infer(mode): + extensions.list_extensions() + print('Reloading custom scripts') + modules.scripts.load_scripts() + modelloader.load_upscalers() + # print('Reloading modules: modules.ui') + # importlib.reload(modules.ui) + if mode == 'sd': + print('Refreshing SD Model List') + modules.sd_models.list_models() + shared.opts.onchange("sd_model_checkpoint", wrap_queued_call(lambda: modules.sd_models.reload_model_weights())) def webui(): launch_api = cmd_opts.api