| |
| |
|
|
| |
|
|
|
|
| |
|
|
| import os |
| import re |
| import time |
| import json |
| import requests |
| import subprocess |
| from datetime import timedelta |
| from subprocess import getoutput |
| from urllib.parse import unquote |
| from IPython.utils import capture |
| from IPython.display import clear_output |
|
|
|
|
| |
| def detect_environment(): |
| environments = { |
| 'COLAB_GPU': ('Google Colab', "/content"), |
| 'KAGGLE_URL_BASE': ('Kaggle', "/kaggle/working/content"), |
| 'SAGEMAKER_INTERNAL_IMAGE_URI': ('SageMaker Studio Lab', "/home/studio-lab-user/content") |
| } |
|
|
| for env_var, (environment, path) in environments.items(): |
| if env_var in os.environ: |
| return environment, path |
|
|
| env, root_path = detect_environment() |
| webui_path = f"{root_path}/sdw" |
| |
|
|
|
|
| |
| if env == "SageMaker Studio Lab": |
| print("Updating dependencies, may take some time...") |
| get_ipython().system('pip install -q --upgrade torchsde') |
| get_ipython().system('pip install -q --upgrade pip') |
| get_ipython().system('pip install -q --upgrade psutil') |
|
|
| clear_output() |
|
|
|
|
| |
| flag_file = f"{root_path}/libraries_installed.txt" |
|
|
| if not os.path.exists(flag_file): |
| |
| xformers = "xformers==0.0.23.post1 triton==2.1.0" |
| torch = "torch==2.1.2+cu121 torchvision==0.16.2+cu121 --extra-index-url https://download.pytorch.org/whl/cu121" |
|
|
| print("Installing the libraries, it's going to take a while....", end='') |
| with capture.capture_output() as cap: |
| get_ipython().system('apt-get update && apt -y install aria2') |
| get_ipython().system('npm install -g localtunnel &> /dev/null') |
| get_ipython().system('curl -s -OL https://github.com/DEX-1101/sd-webui-notebook/raw/main/res/new_tunnel --output-dir {root_path}') |
| get_ipython().system('curl -s -Lo /usr/bin/cl https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64 && chmod +x /usr/bin/cl') |
| get_ipython().system('pip install insightface') |
|
|
| if env == "SageMaker Studio Lab": |
| get_ipython().run_line_magic('pip', 'install -q opencv-python-headless huggingface-hub') |
| get_ipython().run_line_magic('conda', 'update -q -n base conda') |
| get_ipython().run_line_magic('conda', 'install -q -y aria2') |
| get_ipython().run_line_magic('conda', 'install -q -y glib') |
| get_ipython().system('pip install tensorflow') |
|
|
| get_ipython().system('wget -P /home/studio-lab-user https://huggingface.co/NagisaNao/fast_repo/resolve/main/sagemaker/FULL_DELETED_NOTEBOOK.ipynb') |
|
|
| if env == "Google Colab": |
| get_ipython().system('pip install -q {xformers} -U') |
| else: |
| get_ipython().system('pip install -q {torch} -U') |
| get_ipython().system('pip install -q {xformers} -U') |
|
|
| with open(flag_file, "w") as f: |
| f.write("hey ;3") |
| del cap |
| print("\rLibraries are installed!" + " "*35) |
| time.sleep(2) |
| clear_output() |
|
|
|
|
| |
| def load_settings(path): |
| if os.path.exists(path): |
| with open(path, 'r') as file: |
| return json.load(file) |
| return {} |
|
|
| settings = load_settings(f'{root_path}/settings.json') |
|
|
| variables = [ |
| 'Model', 'Model_Num', 'Inpainting_Model', |
| 'Vae', 'Vae_Num', |
| 'latest_webui', 'latest_exstensions', 'detailed_download', |
| 'controlnet', 'controlnet_Num', 'commit_hash', 'optional_huggingface_token', |
| 'ngrok_token' 'commandline_arguments', |
| 'Model_url', 'Vae_url', 'LoRA_url', 'Embedding_url', 'Extensions_url', 'custom_file_urls' |
| ] |
|
|
| locals().update({key: settings.get(key) for key in variables}) |
|
|
|
|
| |
| try: |
| start_colab |
| except: |
| start_colab = int(time.time())-5 |
|
|
| |
| models_dir = f"{webui_path}/models/Stable-diffusion" |
| vaes_dir = f"{webui_path}/models/VAE" |
| embeddings_dir = f"{webui_path}/embeddings" |
| loras_dir = f"{webui_path}/models/Lora" |
| extensions_dir = f"{webui_path}/extensions" |
| control_dir = f"{webui_path}/models/ControlNet" |
|
|
|
|
| |
| |
| if env == "SageMaker Studio Lab": |
| print("You are using the 'SageMaker' environment - this environment is outdated so many bugs will not be fixed and it will be cut in functionality. To save memory and/or to avoid bugs.\n\n") |
|
|
|
|
| if not os.path.exists(webui_path): |
| start_install = int(time.time()) |
| print("⌚ Unpacking Stable Diffusion...", end='') |
| with capture.capture_output() as cap: |
| get_ipython().system('aria2c --console-log-level=error -c -x 16 -s 16 -k 1M https://huggingface.co/NagisaNao/fast_repo/resolve/main/FULL_REPO.zip -o repo.zip') |
| get_ipython().system('unzip -q -o repo.zip -d {webui_path}') |
| get_ipython().system('rm -rf repo.zip') |
|
|
| get_ipython().run_line_magic('cd', '{root_path}') |
| os.environ["SAFETENSORS_FAST_GPU"]='1' |
| os.environ["CUDA_MODULE_LOADING"]="LAZY" |
| os.environ["TF_CPP_MIN_LOG_LEVEL"] = "3" |
| os.environ["PYTHONWARNINGS"] = "ignore" |
|
|
| get_ipython().system('echo -n {start_colab} > {webui_path}/static/colabTimer.txt') |
| del cap |
| install_time = timedelta(seconds=time.time()-start_install) |
| print("\r🚀 Unpacking is complete! For","%02d:%02d:%02d ⚡\n" % (install_time.seconds / 3600, (install_time.seconds / 60) % 60, install_time.seconds % 60), end='', flush=True) |
| else: |
| get_ipython().system('echo -n {start_colab} > {webui_path}/static/colabTimer.txt') |
| print("🚀 All unpacked... Skip. ⚡") |
| start_colab = float(open(f'{webui_path}/static/colabTimer.txt', 'r').read()) |
| time_since_start = str(timedelta(seconds=time.time()-start_colab)).split('.')[0] |
| print(f"⌚️ You have been conducting this session for - \033[33m{time_since_start}\033[0m") |
|
|
|
|
| |
| if latest_webui or latest_exstensions: |
| action = "Updating WebUI and Extensions" if latest_webui and latest_exstensions else ("WebUI Update" if latest_webui else "Update Extensions") |
| print(f"⌚️ {action}...", end='', flush=True) |
| with capture.capture_output() as cap: |
| get_ipython().system('git config --global user.email "you@example.com"') |
| get_ipython().system('git config --global user.name "Your Name"') |
|
|
| |
| if latest_webui: |
| get_ipython().run_line_magic('cd', '{webui_path}') |
| get_ipython().system('git restore .') |
| get_ipython().system('git pull -X theirs --rebase --autostash') |
|
|
| |
| if latest_exstensions: |
| if env != "SageMaker Studio Lab": |
| get_ipython().system('{\'for dir in \' + webui_path + \'/extensions/*/; do cd \\"$dir\\" && git reset --hard && git pull; done\'}') |
| else: |
| get_ipython().system('{\'for dir in /home/studio-lab-user/content/sdw/extensions/*/; do cd \\"$dir\\" && git fetch origin && git pull; done\'}') |
|
|
| get_ipython().system('cd {webui_path}/repositories/stable-diffusion-stability-ai && git restore .') |
| del cap |
| print(f"\r✨ {action} Completed!") |
|
|
|
|
| |
| |
| |
| get_ipython().system("sed -i '9,37d' {webui_path}/extensions/Encrypt-Image/javascript/encrypt_images_info.js") |
|
|
| |
| if env == "SageMaker Studio Lab": |
| with capture.capture_output() as cap: |
| |
| if os.path.exists(f"{webui_path}/extensions/supermerger"): |
| get_ipython().system('rm -rf {webui_path}/extensions/supermerger') |
| |
| get_ipython().system('wget -O {webui_path}/modules/styles.py https://huggingface.co/NagisaNao/fast_repo/resolve/main/sagemaker/fixing/webui/styles.py') |
| del cap |
|
|
|
|
| |
| if commit_hash: |
| print('⏳ Time machine activation...', end="", flush=True) |
| with capture.capture_output() as cap: |
| get_ipython().run_line_magic('cd', '{webui_path}') |
| get_ipython().system('git config --global user.email "you@example.com"') |
| get_ipython().system('git config --global user.name "Your Name"') |
| get_ipython().system('git reset --hard {commit_hash}') |
| del cap |
| print(f"\r⌛️ The time machine has been activated! Current commit: \033[34m{commit_hash}\033[0m") |
|
|
|
|
| |
| print("📦 Downloading models and stuff...", end='') |
| model_list = { |
| "1.Anime (by Xpuct) + INP": [ |
| {"url": "https://huggingface.co/XpucT/Anime/resolve/main/Anime_v2.safetensors", "name": "Anime_v2.safetensors"}, |
| {"url": "https://huggingface.co/XpucT/Anime/resolve/main/Anime_v2-inpainting.safetensors", "name": "Anime_v2-inpainting.safetensors"} |
| ], |
| "2.Cetus-Mix [Anime] [V4] + INP": [ |
| {"url": "https://civitai.com/api/download/models/130298", "name": "CetusMix_V4.safetensors"}, |
| {"url": "https://civitai.com/api/download/models/139882", "name": "CetusMix_V4-inpainting.safetensors"} |
| ], |
| "3.Counterfeit [Anime] [V3] + INP": [ |
| {"url": "https://civitai.com/api/download/models/125050", "name": "Counterfeit_V3.safetensors"}, |
| {"url": "https://civitai.com/api/download/models/137911", "name": "Counterfeit_V3-inpainting.safetensors"} |
| ], |
| "4.CuteColor [Anime] [V3]": [ |
| {"url": "https://civitai.com/api/download/models/138754", "name": "CuteColor_V3.safetensors"} |
| ], |
| "5.Dark-Sushi-Mix [Anime]": [ |
| {"url": "https://civitai.com/api/download/models/101640", "name": "DarkSushiMix_2_5D.safetensors"}, |
| {"url": "https://civitai.com/api/download/models/56071", "name": "DarkSushiMix_colorful.safetensors"} |
| ], |
| "6.Meina-Mix [Anime] [V11] + INP": [ |
| {"url": "https://civitai.com/api/download/models/119057", "name": "MeinaMix_V11.safetensors"}, |
| {"url": "https://civitai.com/api/download/models/120702", "name": "MeinaMix_V11-inpainting.safetensors"} |
| ], |
| "7.Mix-Pro [Anime] [V4] + INP": [ |
| {"url": "https://civitai.com/api/download/models/125668", "name": "MixPro_V4.safetensors"}, |
| {"url": "https://civitai.com/api/download/models/139878", "name": "MixPro_V4-inpainting.safetensors"} |
| ], |
| "8.BluMix [Anime] [V7]": [ |
| {"url": "https://civitai.com/api/download/models/361779", "name": "BluMix_v7.safetensors"} |
| ], |
| "9.pony": [ |
| {"url": "https://civitai.com/api/download/models/290640", "name": "pony.safetensors"} |
| ] |
| } |
|
|
| |
| vae_list = { |
| "1.Anime.vae": [ |
| {"url": "https://civitai.com/api/download/models/131654", "name": "Anime.vae.safetensors"}, |
| {"url": "https://civitai.com/api/download/models/131658", "name": "vae-ft-mse.vae.safetensors"} |
| ], |
| "2.Anything.vae": [{"url": "https://civitai.com/api/download/models/131656", "name": "Anything.vae.safetensors"}], |
| "3.Blessed2.vae": [{"url": "https://civitai.com/api/download/models/142467", "name": "Blessed2.vae.safetensors"}], |
| "4.ClearVae.vae": [{"url": "https://civitai.com/api/download/models/133362", "name": "ClearVae_23.vae.safetensors"}], |
| "5.WD.vae": [{"url": "https://huggingface.co/NoCrypt/resources/resolve/main/VAE/wd.vae.safetensors", "name": "WD.vae.safetensors"}] |
| } |
|
|
| controlnet_list = { |
| "1.canny": [ |
| {"url": "https://huggingface.co/ckpt/ControlNet-v1-1/resolve/main/control_v11p_sd15_canny_fp16.safetensors", "name": "control_v11p_sd15_canny_fp16.safetensors"}, |
| {"url": "https://huggingface.co/ckpt/ControlNet-v1-1/raw/main/control_v11p_sd15_canny_fp16.yaml", "name": "control_v11p_sd15_canny_fp16.yaml"} |
| ], |
| "2.openpose": [ |
| {"url": "https://huggingface.co/ckpt/ControlNet-v1-1/resolve/main/control_v11p_sd15_openpose_fp16.safetensors", "name": "control_v11p_sd15_openpose_fp16.safetensors"}, |
| {"url": "https://huggingface.co/ckpt/ControlNet-v1-1/raw/main/control_v11p_sd15_openpose_fp16.yaml", "name": "control_v11p_sd15_openpose_fp16.yaml"} |
| ], |
| "3.depth": [ |
| {"url": "https://huggingface.co/ckpt/ControlNet-v1-1/resolve/main/control_v11f1p_sd15_depth_fp16.safetensors", "name": "control_v11f1p_sd15_depth_fp16.safetensors"}, |
| {"url": "https://huggingface.co/ckpt/ControlNet-v1-1/raw/main/control_v11f1p_sd15_depth_fp16.yaml", "name": "control_v11f1p_sd15_depth_fp16.yaml"}, |
| {"url": "https://huggingface.co/NagisaNao/models/resolve/main/ControlNet_v11/control_v11p_sd15_depth_anything_fp16.safetensors", "name": "control_v11p_sd15_depth_anything_fp16.safetensors"} |
| ], |
| "4.normal_map": [ |
| {"url": "https://huggingface.co/ckpt/ControlNet-v1-1/resolve/main/control_v11p_sd15_normalbae_fp16.safetensors", "name": "control_v11p_sd15_normalbae_fp16.safetensors"}, |
| {"url": "https://huggingface.co/ckpt/ControlNet-v1-1/raw/main/control_v11p_sd15_normalbae_fp16.yaml", "name": "control_v11p_sd15_normalbae_fp16.yaml"} |
| ], |
| "5.mlsd": [ |
| {"url": "https://huggingface.co/ckpt/ControlNet-v1-1/resolve/main/control_v11p_sd15_mlsd_fp16.safetensors", "name": "control_v11p_sd15_mlsd_fp16.safetensors"}, |
| {"url": "https://huggingface.co/ckpt/ControlNet-v1-1/raw/main/control_v11p_sd15_mlsd_fp16.yaml", "name": "control_v11p_sd15_mlsd_fp16.yaml"} |
| ], |
| "6.lineart": [ |
| {"url": "https://huggingface.co/ckpt/ControlNet-v1-1/resolve/main/control_v11p_sd15_lineart_fp16.safetensors", "name": "control_v11p_sd15_lineart_fp16.safetensors"}, |
| {"url": "https://huggingface.co/ckpt/ControlNet-v1-1/resolve/main/control_v11p_sd15s2_lineart_anime_fp16.safetensors", "name": "control_v11p_sd15s2_lineart_anime_fp16.safetensors"}, |
| {"url": "https://huggingface.co/ckpt/ControlNet-v1-1/raw/main/control_v11p_sd15_lineart_fp16.yaml", "name": "control_v11p_sd15_lineart_fp16.yaml"}, |
| {"url": "https://huggingface.co/ckpt/ControlNet-v1-1/raw/main/control_v11p_sd15s2_lineart_anime_fp16.yaml", "name": "control_v11p_sd15s2_lineart_anime_fp16.yaml"} |
| ], |
| "7.soft_edge": [ |
| {"url": "https://huggingface.co/ckpt/ControlNet-v1-1/resolve/main/control_v11p_sd15_softedge_fp16.safetensors", "name": "control_v11p_sd15_softedge_fp16.safetensors"}, |
| {"url": "https://huggingface.co/ckpt/ControlNet-v1-1/raw/main/control_v11p_sd15_softedge_fp16.yaml", "name": "control_v11p_sd15_softedge_fp16.yaml"} |
| ], |
| "8.scribble": [ |
| {"url": "https://huggingface.co/ckpt/ControlNet-v1-1/resolve/main/control_v11p_sd15_scribble_fp16.safetensors", "name": "control_v11p_sd15_scribble_fp16.safetensors"}, |
| {"url": "https://huggingface.co/ckpt/ControlNet-v1-1/raw/main/control_v11p_sd15_scribble_fp16.yaml", "name": "control_v11p_sd15_scribble_fp16.yaml"} |
| ], |
| "9.segmentation": [ |
| {"url": "https://huggingface.co/ckpt/ControlNet-v1-1/resolve/main/control_v11p_sd15_seg_fp16.safetensors", "name": "control_v11p_sd15_seg_fp16.safetensors"}, |
| {"url": "https://huggingface.co/ckpt/ControlNet-v1-1/raw/main/control_v11p_sd15_seg_fp16.yaml", "name": "control_v11p_sd15_seg_fp16.yaml"} |
| ], |
| "10.shuffle": [ |
| {"url": "https://huggingface.co/ckpt/ControlNet-v1-1/resolve/main/control_v11e_sd15_shuffle_fp16.safetensors", "name": "control_v11e_sd15_shuffle_fp16.safetensors"}, |
| {"url": "https://huggingface.co/ckpt/ControlNet-v1-1/raw/main/control_v11e_sd15_shuffle_fp16.yaml", "name": "control_v11e_sd15_shuffle_fp16.yaml"} |
| ], |
| "11.tile": [ |
| {"url": "https://huggingface.co/ckpt/ControlNet-v1-1/resolve/main/control_v11f1e_sd15_tile_fp16.safetensors", "name": "control_v11f1e_sd15_tile_fp16.safetensors"}, |
| {"url": "https://huggingface.co/ckpt/ControlNet-v1-1/raw/main/control_v11f1e_sd15_tile_fp16.yaml", "name": "control_v11f1e_sd15_tile_fp16.yaml"} |
| ], |
| "12.inpaint": [ |
| {"url": "https://huggingface.co/ckpt/ControlNet-v1-1/resolve/main/control_v11p_sd15_inpaint_fp16.safetensors", "name": "control_v11p_sd15_inpaint_fp16.safetensors"}, |
| {"url": "https://huggingface.co/ckpt/ControlNet-v1-1/raw/main/control_v11p_sd15_inpaint_fp16.yaml", "name": "control_v11p_sd15_inpaint_fp16.yaml"} |
| ], |
| "13.instruct_p2p": [ |
| {"url": "https://huggingface.co/ckpt/ControlNet-v1-1/resolve/main/control_v11e_sd15_ip2p_fp16.safetensors", "name": "control_v11e_sd15_ip2p_fp16.safetensors"}, |
| {"url": "https://huggingface.co/ckpt/ControlNet-v1-1/raw/main/control_v11e_sd15_ip2p_fp16.yaml", "name": "control_v11e_sd15_ip2p_fp16.yaml"} |
| ] |
| } |
|
|
| extension_repo = [] |
| prefixes = [ |
| "model:", |
| "vae:", |
| "lora:", |
| "embeddings:", |
| "extensions:" |
| ] |
|
|
| get_ipython().system('mkdir -p {models_dir} {vaes_dir} {embeddings_dir} {loras_dir} {control_dir}') |
|
|
| url = "" |
| hf_token = optional_huggingface_token if optional_huggingface_token else "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" |
| user_header = f"\"Authorization: Bearer {hf_token}\"" |
|
|
| def handle_manual(url): |
| original_url = url |
| url = url.split(':', 1)[1] |
| file_name = re.search(r'\[(.*?)\]', url) |
| file_name = file_name.group(1) if file_name else None |
| if file_name: |
| url = re.sub(r'\[.*?\]', '', url) |
|
|
| dir_mapping = {"model": models_dir, "vae": vaes_dir, "lora": loras_dir, "embeddings": embeddings_dir, "extensions": None} |
|
|
| for prefix, dir in dir_mapping.items(): |
| if original_url.startswith(f"{prefix}:"): |
| if prefix != "extensions": |
| if '|' in url: |
| urls = [url.strip() for url in url.split('|')] |
| for urll in urls: |
| print("inn******************************prefix:{},dir:{},url:{},ddfile_name:{}".format(prefix, dir, |
| urll, |
| file_name)) |
|
|
| manual_download(urll, dir, file_name=file_name) |
| else: |
|
|
| print("******************************prefix:{},dir:{},url:{},file_name:{}".format(prefix, dir,url,file_name)) |
| manual_download(url, dir, file_name=file_name) |
| else: |
| if '|' in url: |
| urls = [url.strip() for url in url.split('|')] |
| for urll in urls: |
| extension_repo.append((urll, file_name)) |
| print("this is the extension:url:{},file_name:{}".format(urll, file_name)) |
| else: |
| print("this is the extension:url:{},file_name:{}".format(url,file_name)) |
| extension_repo.append((url, file_name)) |
|
|
| def manual_download(url, dst_dir, file_name): |
| basename = url.split("/")[-1] if file_name is None else file_name |
|
|
| |
| civitai_token = "62c0c5956b2f9defbd844d754000180b" |
| if 'civitai' in url and civitai_token: |
| url = f"{url}?token={civitai_token}" |
|
|
| |
| if 'drive.google' in url: |
| if 'folders' in url: |
| get_ipython().system('gdown --folder "{url}" -O {dst_dir} --fuzzy -c') |
| else: |
| get_ipython().system('gdown "{url}" -O {dst_dir} --fuzzy -c') |
| |
| elif 'huggingface' in url: |
| if '/blob/' in url: |
| url = url.replace('/blob/', '/resolve/') |
| if file_name: |
| get_ipython().system('aria2c --optimize-concurrent-downloads --console-log-level=error --summary-interval=10 --header={user_header} -c -j5 -x16 -s16 -k1M -d {dst_dir} -o {basename} {url}') |
| else: |
| parsed_link = '\n{}\n\tout={}'.format(url, unquote(url.split('/')[-1])) |
| get_ipython().system('echo -e "{parsed_link}" | aria2c --header={user_header} --console-log-level=error --summary-interval=10 -i- -j5 -x16 -s16 -k1M -c -d "{dst_dir}" -o {basename}') |
| |
| elif 'http' in url or 'magnet' in url: |
| if file_name: |
| get_ipython().system('aria2c --optimize-concurrent-downloads --console-log-level=error --summary-interval=10 -j5 -x16 -s16 -k1M -c -d {dst_dir} -o {file_name} {url}') |
| else: |
| parsed_link = '"{}"'.format(url) |
| get_ipython().system('aria2c --optimize-concurrent-downloads --console-log-level=error --summary-interval=10 -j5 -x16 -s16 -k1M -c -d {dst_dir} -Z {parsed_link}') |
|
|
| def download(url): |
| links_and_paths = url.split(',') |
|
|
| for link_or_path in links_and_paths: |
| link_or_path = link_or_path.strip() |
| if not link_or_path: |
| continue |
|
|
| if any(link_or_path.startswith(prefix.lower()) for prefix in prefixes): |
| handle_manual(link_or_path) |
| continue |
|
|
| url, dst_dir, file_name = link_or_path.split() |
| manual_download(url, dst_dir, file_name) |
|
|
| submodels = [] |
|
|
| def add_submodels(selection, num_selection, model_dict, dst_dir): |
| if selection == "none": |
| return [] |
| if selection == "ALL": |
| all_models = [] |
| for models in model_dict.values(): |
| all_models.extend(models) |
| selected_models = all_models |
| else: |
| selected_models = model_dict[selection] |
| selected_nums = map(int, num_selection.replace(',', '').split()) |
|
|
| for num in selected_nums: |
| if 1 <= num <= len(model_dict): |
| name = list(model_dict)[num - 1] |
| selected_models.extend(model_dict[name]) |
|
|
| unique_models = list({model['name']: model for model in selected_models}.values()) |
|
|
| for model in unique_models: |
| model['dst_dir'] = dst_dir |
|
|
| return unique_models |
|
|
| submodels += add_submodels(Model, Model_Num, model_list, models_dir) |
| submodels += add_submodels(Vae, Vae_Num, vae_list, vaes_dir) |
| submodels += add_submodels(controlnet, "" if controlnet == "ALL" else controlnet_Num, controlnet_list, control_dir) |
|
|
| for submodel in submodels: |
| if not Inpainting_Model and "inpainting" in submodel['name']: |
| continue |
|
|
| url += f"{submodel['url']} {submodel['dst_dir']} {submodel['name']}, " |
|
|
| def process_file_download(file_url): |
| global Model_url, Vae_url, LoRA_url, Embedding_url, Extensions_url |
| urls_dict = { |
| 'model': 'Model_url', |
| 'vae': 'Vae_url', |
| 'embed': 'Embedding_url', |
| 'lora': 'LoRA_url', |
| 'extension': 'Extensions_url' |
| } |
|
|
| if file_url.startswith("http"): |
| if "blob" in file_url: |
| file_url = file_url.replace("blob", "raw") |
| response = requests.get(file_url) |
| lines = response.text.split('\n') |
| else: |
| with open(file_url, 'r') as file: |
| lines = file.readlines() |
|
|
| current_tag = None |
| for line in lines: |
| if line.strip().startswith('#'): |
| current_tag = next((tag for tag in urls_dict if tag in line.lower()), None) |
| elif current_tag and line.strip(): |
| urls = [url.strip() for url in line.split()] |
| for url in urls: |
| if url.startswith("http"): |
| globals()[urls_dict[current_tag]] += ", " + url |
|
|
| |
| if custom_file_urls: |
| if not custom_file_urls.endswith('.txt'): |
| custom_file_urls += '.txt' |
| if not custom_file_urls.startswith('http'): |
| if not custom_file_urls.startswith(root_path): |
| custom_file_urls = f'{root_path}/{custom_file_urls}' |
| if custom_file_urls.count('/content') >= 2: |
| custom_file_urls = re.sub(r'(/content){2,}', '/content', custom_file_urls) |
|
|
| try: |
| process_file_download(custom_file_urls) |
| except FileNotFoundError: |
| pass |
|
|
| urls = [Model_url, Vae_url, LoRA_url, Embedding_url, Extensions_url] |
|
|
| for i, prefix in enumerate(prefixes): |
| if urls[i]: |
| prefixed_urls = [f"{prefix}{u}" for u in urls[i].replace(',', '').split()] |
| if prefixed_urls: |
| url += ", ".join(prefixed_urls) + ", " |
| print("url:",url) |
| if detailed_download == "on": |
| print("\n\n\033[33m# ====== Detailed Download ====== #\n\033[0m") |
| download(url) |
| print("\n\033[33m# =============================== #\n\033[0m") |
| else: |
| with capture.capture_output() as cap: |
| download(url) |
| del cap |
|
|
| print("\r🏁 Download Complete!" + " "*15) |
|
|
|
|
| |
| get_ipython().system('find \\( -name ".ipynb_checkpoints" -o -name ".aria2" \\) -type d -exec rm -r {} \\; >/dev/null 2>&1') |
|
|
|
|
| |
| if len(extension_repo) > 0: |
| print("✨ Installing custom extensions...", end='', flush=True) |
| with capture.capture_output() as cap: |
| for repo, repo_name in extension_repo: |
| if not repo_name: |
| repo_name = repo.split('/')[-1] |
| get_ipython().system('cd {extensions_dir} && git clone {repo} {repo_name} && cd {repo_name} && git fetch') |
| del cap |
| print(f"\r📦 Installed '{len(extension_repo)}', Custom extensions!") |
|
|
|
|
| |
| if detailed_download == "off": |
| print("\n\n\033[33mIf you don't see any downloaded files, enable the 'Detailed Downloads' feature in the widget.") |
|
|
| if any(not file.endswith('.txt') for file in os.listdir(models_dir)): |
| print("\n\033[33m➤ Models\033[0m") |
| get_ipython().system("find {models_dir}/ -mindepth 1 ! -name '*.txt' -printf '%f\\n'") |
| if any(not file.endswith('.txt') for file in os.listdir(vaes_dir)): |
| print("\n\033[33m➤ VAEs\033[0m") |
| get_ipython().system("find {vaes_dir}/ -mindepth 1 ! -name '*.txt' -printf '%f\\n'") |
| if any(not file.endswith('.txt') and not os.path.isdir(os.path.join(embeddings_dir, file)) for file in os.listdir(embeddings_dir)): |
| print("\n\033[33m➤ Embeddings\033[0m") |
| get_ipython().system("find {embeddings_dir}/ -mindepth 1 -maxdepth 1 \\( -name '*.pt' -or -name '*.safetensors' \\) -printf '%f\\n'") |
| if any(not file.endswith('.txt') for file in os.listdir(loras_dir)): |
| print("\n\033[33m➤ LoRAs\033[0m") |
| get_ipython().system("find {loras_dir}/ -mindepth 1 ! -name '*.keep' -printf '%f\\n'") |
| print(f"\n\033[33m➤ Extensions\033[0m") |
| get_ipython().system("find {extensions_dir}/ -mindepth 1 -maxdepth 1 ! -name '*.txt' -printf '%f\\n'") |
| if any(not file.endswith(('.txt', '.yaml')) for file in os.listdir(control_dir)): |
| print("\n\033[33m➤ ControlNet\033[0m") |
| get_ipython().system("find {control_dir}/ -mindepth 1 ! -name '*.yaml' -printf '%f\\n' | sed 's/^[^_]*_[^_]*_[^_]*_\\(.*\\)_fp16\\.safetensors$/\\1/'") |
|
|
|
|
| |
| |
| files_umi = [ |
| "https://huggingface.co/NagisaNao/fast_repo/resolve/main/extensions/UmiWildacrd/discord/200_pan_gen.txt", |
| "https://huggingface.co/NagisaNao/fast_repo/resolve/main/extensions/UmiWildacrd/discord/150_bra_gen.txt" |
| ] |
| save_dir_path = f"{webui_path}/extensions/Umi-AI-Wildcards/wildcards/discord" |
|
|
| with capture.capture_output() as cap: |
| for file in files_umi: |
| get_ipython().system('aria2c --optimize-concurrent-downloads --console-log-level=error --summary-interval=10 -j5 -x16 -s16 -k1M -c -d {save_dir_path} {file}') |
| del cap |
|
|
|
|
| |
| if env == "SageMaker Studio Lab": |
| with capture.capture_output() as cap: |
| get_ipython().system('rm -rf /home/studio-lab-user/.conda/envs/studiolab-safemode') |
| get_ipython().system('rm -rf /home/studio-lab-user/.conda/envs/sagemaker-distribution') |
| get_ipython().system('rm -rf /home/studio-lab-user/.conda/pkgs/cache') |
| get_ipython().system('pip cache purge') |
| get_ipython().system('rm -rf ~/.cache') |
| del cap |
|
|
|
|