diff --git a/.gitignore b/.gitignore index b7e99e2..71fe116 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,5 @@ venv __pycache__ -*.txt cudnn_windows .vscode *.egg-info @@ -9,4 +8,4 @@ wd14_tagger_model .DS_Store locon gui-user.bat -gui-user.ps1 +gui-user.ps1 \ No newline at end of file diff --git a/README.md b/README.md index 30beda2..f3af693 100644 --- a/README.md +++ b/README.md @@ -118,7 +118,7 @@ When a new release comes out, you can upgrade your repo with the following comma upgrade_macos.sh ``` -Once the commands have completed successfully you should be ready to use the new version. +Once the commands have completed successfully you should be ready to use the new version. MacOS support is not tested and has been mostly taken from https://gist.github.com/jstayco/9f5733f05b9dc29de95c4056a023d645 ## Upgrading Windows @@ -213,6 +213,9 @@ This will store your a backup file with your current locally installed pip packa ## Change History +* 2023/03/26 (v21.3.5) + - Fix for https://github.com/bmaltais/kohya_ss/issues/230 + - Added detection for Google Colab to not bring up the GUI file/folder window on the platform. Instead it will only use the file/folder path provided in the input field. * 2023/03/25 (v21.3.4) - Added untested support for MacOS base on this gist: https://gist.github.com/jstayco/9f5733f05b9dc29de95c4056a023d645 diff --git a/examples/lucoris extract examples.txt b/examples/lucoris extract examples.txt new file mode 100644 index 0000000..d7cc763 --- /dev/null +++ b/examples/lucoris extract examples.txt @@ -0,0 +1,13 @@ +python tools\lycoris_locon_extract.py --mode quantile --safetensors --linear_ratio 0.9 --conv_ratio 0.9 --device cuda D:/models/v1-5-pruned.ckpt D:/models/cyberrealistic_v12.safetensors "D:/lora/sd1.5/cyberrealistic_v12.safetensors" + +python tools\lycoris_locon_extract.py --mode quantile --safetensors --linear_quantile 0.75 --conv_quantile 0.75 --device cuda D:/models/v1-5-pruned.ckpt "C:\Users\berna\Downloads\deliberate_v2.safetensors" "D:/lora/sd1.5/deliberate_v2.safetensors" + +python tools\lycoris_locon_extract.py --mode fixed --safetensors --linear_dim 512 --conv_dim 512 --device cuda D:/models/v1-5-pruned.ckpt D:/models/cyberrealistic_v12.safetensors "D:/lora/sd1.5/cyberrealistic_v12.safetensors" + +python tools\lycoris_locon_extract.py --use_sparse_bias --sparsity 0.98 --mode quantile --safetensors --linear_quantile 0.75 --conv_quantile 0.75 --device cuda D:/models/v1-5-pruned.ckpt "C:\Users\berna\Downloads\deliberate_v2.safetensors" "D:/lora/sd1.5/deliberate_v2.safetensors" + +python tools\lycoris_locon_extract.py --use_sparse_bias --sparsity 0.98 --mode quantile --safetensors --linear_quantile 0.75 --conv_quantile 0.75 --device cuda D:/models/v1-5-pruned.ckpt "D:/models/test\claire_v1.0ee2-000003.safetensors" "D:/lora/sd1.5/claire_v1.0ee2-000003.safetensors" + +python tools\lycoris_locon_extract.py --use_sparse_bias --sparsity 0.98 --mode quantile --safetensors --linear_quantile 0.5 --conv_quantile 0.5 --device cuda D:/models/v1-5-pruned.ckpt "D:/models/test\claire_v1.0ee2-000003.safetensors" "D:/lora/sd1.5/claire_v1.0ee2-0.5.safetensors" + +python tools\lycoris_locon_extract.py --use_sparse_bias --sparsity 0.98 --mode quantile --safetensors --linear_quantile 0.5 --conv_quantile 0.5 --device cuda D:/models/v1-5-pruned.ckpt "D:/models/test\claire_v1.0f.safetensors" "D:/lora/sd1.5/claire_v1.0f0.5.safetensors" \ No newline at end of file diff --git a/library/common_gui.py b/library/common_gui.py index 8ff6a27..25e7379 100644 --- a/library/common_gui.py +++ b/library/common_gui.py @@ -31,6 +31,8 @@ V1_MODELS = [ # define a list of substrings to search for ALL_PRESET_MODELS = V2_BASE_MODELS + V_PARAMETERIZATION_MODELS + V1_MODELS +FILE_ENV_EXCLUSION = ['COLAB_GPU', 'RUNPOD_ENVIRONMENT'] + def check_if_model_exist(output_name, output_dir, save_model_as): if save_model_as in ['diffusers', 'diffusers_safetendors']: @@ -118,54 +120,58 @@ def get_dir_and_file(file_path): def get_file_path( file_path='', default_extension='.json', extension_name='Config files' ): - current_file_path = file_path - # print(f'current file path: {current_file_path}') + if not any(var in os.environ for var in FILE_ENV_EXCLUSION): + current_file_path = file_path + # print(f'current file path: {current_file_path}') - initial_dir, initial_file = get_dir_and_file(file_path) + initial_dir, initial_file = get_dir_and_file(file_path) - # Create a hidden Tkinter root window - root = Tk() - root.wm_attributes('-topmost', 1) - root.withdraw() + # Create a hidden Tkinter root window + root = Tk() + root.wm_attributes('-topmost', 1) + root.withdraw() - # Show the open file dialog and get the selected file path - file_path = filedialog.askopenfilename( - filetypes=( - (extension_name, f'*{default_extension}'), - ('All files', '*.*'), - ), - defaultextension=default_extension, - initialfile=initial_file, - initialdir=initial_dir, - ) + # Show the open file dialog and get the selected file path + file_path = filedialog.askopenfilename( + filetypes=( + (extension_name, f'*{default_extension}'), + ('All files', '*.*'), + ), + defaultextension=default_extension, + initialfile=initial_file, + initialdir=initial_dir, + ) - # Destroy the hidden root window - root.destroy() + # Destroy the hidden root window + root.destroy() - # If no file is selected, use the current file path - if not file_path: - file_path = current_file_path + # If no file is selected, use the current file path + if not file_path: + file_path = current_file_path + current_file_path = file_path + # print(f'current file path: {current_file_path}') return file_path def get_any_file_path(file_path=''): - current_file_path = file_path - # print(f'current file path: {current_file_path}') + if not any(var in os.environ for var in FILE_ENV_EXCLUSION): + current_file_path = file_path + # print(f'current file path: {current_file_path}') - initial_dir, initial_file = get_dir_and_file(file_path) + initial_dir, initial_file = get_dir_and_file(file_path) - root = Tk() - root.wm_attributes('-topmost', 1) - root.withdraw() - file_path = filedialog.askopenfilename( - initialdir=initial_dir, - initialfile=initial_file, - ) - root.destroy() + root = Tk() + root.wm_attributes('-topmost', 1) + root.withdraw() + file_path = filedialog.askopenfilename( + initialdir=initial_dir, + initialfile=initial_file, + ) + root.destroy() - if file_path == '': - file_path = current_file_path + if file_path == '': + file_path = current_file_path return file_path @@ -191,18 +197,19 @@ def remove_doublequote(file_path): def get_folder_path(folder_path=''): - current_folder_path = folder_path + if not any(var in os.environ for var in FILE_ENV_EXCLUSION): + current_folder_path = folder_path - initial_dir, initial_file = get_dir_and_file(folder_path) + initial_dir, initial_file = get_dir_and_file(folder_path) - root = Tk() - root.wm_attributes('-topmost', 1) - root.withdraw() - folder_path = filedialog.askdirectory(initialdir=initial_dir) - root.destroy() + root = Tk() + root.wm_attributes('-topmost', 1) + root.withdraw() + folder_path = filedialog.askdirectory(initialdir=initial_dir) + root.destroy() - if folder_path == '': - folder_path = current_folder_path + if folder_path == '': + folder_path = current_folder_path return folder_path @@ -210,34 +217,35 @@ def get_folder_path(folder_path=''): def get_saveasfile_path( file_path='', defaultextension='.json', extension_name='Config files' ): - current_file_path = file_path - # print(f'current file path: {current_file_path}') + if not any(var in os.environ for var in FILE_ENV_EXCLUSION): + current_file_path = file_path + # print(f'current file path: {current_file_path}') - initial_dir, initial_file = get_dir_and_file(file_path) + initial_dir, initial_file = get_dir_and_file(file_path) - root = Tk() - root.wm_attributes('-topmost', 1) - root.withdraw() - save_file_path = filedialog.asksaveasfile( - filetypes=( - (f'{extension_name}', f'{defaultextension}'), - ('All files', '*'), - ), - defaultextension=defaultextension, - initialdir=initial_dir, - initialfile=initial_file, - ) - root.destroy() + root = Tk() + root.wm_attributes('-topmost', 1) + root.withdraw() + save_file_path = filedialog.asksaveasfile( + filetypes=( + (f'{extension_name}', f'{defaultextension}'), + ('All files', '*'), + ), + defaultextension=defaultextension, + initialdir=initial_dir, + initialfile=initial_file, + ) + root.destroy() - # print(save_file_path) + # print(save_file_path) - if save_file_path == None: - file_path = current_file_path - else: - print(save_file_path.name) - file_path = save_file_path.name + if save_file_path == None: + file_path = current_file_path + else: + print(save_file_path.name) + file_path = save_file_path.name - # print(file_path) + # print(file_path) return file_path @@ -245,27 +253,28 @@ def get_saveasfile_path( def get_saveasfilename_path( file_path='', extensions='*', extension_name='Config files' ): - current_file_path = file_path - # print(f'current file path: {current_file_path}') + if not any(var in os.environ for var in FILE_ENV_EXCLUSION): + current_file_path = file_path + # print(f'current file path: {current_file_path}') - initial_dir, initial_file = get_dir_and_file(file_path) + initial_dir, initial_file = get_dir_and_file(file_path) - root = Tk() - root.wm_attributes('-topmost', 1) - root.withdraw() - save_file_path = filedialog.asksaveasfilename( - filetypes=((f'{extension_name}', f'{extensions}'), ('All files', '*')), - defaultextension=extensions, - initialdir=initial_dir, - initialfile=initial_file, - ) - root.destroy() + root = Tk() + root.wm_attributes('-topmost', 1) + root.withdraw() + save_file_path = filedialog.asksaveasfilename( + filetypes=((f'{extension_name}', f'{extensions}'), ('All files', '*')), + defaultextension=extensions, + initialdir=initial_dir, + initialfile=initial_file, + ) + root.destroy() - if save_file_path == '': - file_path = current_file_path - else: - # print(save_file_path) - file_path = save_file_path + if save_file_path == '': + file_path = current_file_path + else: + # print(save_file_path) + file_path = save_file_path return file_path @@ -316,33 +325,6 @@ def add_pre_postfix( ) -# def add_pre_postfix( -# folder='', prefix='', postfix='', caption_file_ext='.caption' -# ): -# if not has_ext_files(folder, caption_file_ext): -# msgbox( -# f'No files with extension {caption_file_ext} were found in {folder}...' -# ) -# return - -# if prefix == '' and postfix == '': -# return - -# files = [f for f in os.listdir(folder) if f.endswith(caption_file_ext)] -# if not prefix == '': -# prefix = f'{prefix} ' -# if not postfix == '': -# postfix = f' {postfix}' - -# for file in files: -# with open(os.path.join(folder, file), 'r+') as f: -# content = f.read() -# content = content.rstrip() -# f.seek(0, 0) -# f.write(f'{prefix} {content} {postfix}') -# f.close() - - def has_ext_files(folder_path: str, file_extension: str) -> bool: """ Check if there are any files with the specified extension in the given folder. @@ -402,28 +384,6 @@ def find_replace( f.write(content) -# def find_replace(folder='', caption_file_ext='.caption', find='', replace=''): -# print('Running caption find/replace') -# if not has_ext_files(folder, caption_file_ext): -# msgbox( -# f'No files with extension {caption_file_ext} were found in {folder}...' -# ) -# return - -# if find == '': -# return - -# files = [f for f in os.listdir(folder) if f.endswith(caption_file_ext)] -# for file in files: -# with open(os.path.join(folder, file), 'r', errors='ignore') as f: -# content = f.read() -# f.close -# content = content.replace(find, replace) -# with open(os.path.join(folder, file), 'w') as f: -# f.write(content) -# f.close() - - def color_aug_changed(color_aug): if color_aug: msgbox( diff --git a/lora_gui.py b/lora_gui.py index 13223fe..e7ada89 100644 --- a/lora_gui.py +++ b/lora_gui.py @@ -1103,6 +1103,8 @@ def UI(**kwargs): launch_kwargs['server_port'] = kwargs.get('server_port', 0) if kwargs.get('inbrowser', False): launch_kwargs['inbrowser'] = kwargs.get('inbrowser', False) + if kwargs.get('listen', True): + launch_kwargs['server_name'] = "0.0.0.0" print(launch_kwargs) interface.launch(**launch_kwargs) @@ -1125,6 +1127,9 @@ if __name__ == '__main__': parser.add_argument( '--inbrowser', action='store_true', help='Open in browser' ) + parser.add_argument( + '--listen', action='store_true', help='Launch gradio with server name 0.0.0.0, allowing LAN access' + ) args = parser.parse_args() diff --git a/macos_setup.sh b/macos_setup.sh index d429c65..4de8417 100755 --- a/macos_setup.sh +++ b/macos_setup.sh @@ -30,7 +30,7 @@ if command -v python3.10 >/dev/null; then pip install torch==2.0.0 torchvision==0.15.1 -f https://download.pytorch.org/whl/cpu/torch_stable.html python -m pip install --use-pep517 --upgrade -r requirements_macos.txt accelerate config - echo -e "Setup finished! Run ./gui.sh to start." + echo -e "Setup finished! Run ./gui_macos.sh to start." else echo "Python not found. Please ensure you install Python." echo "The brew command for Python 3.10 is: brew install python@3.10" diff --git a/requirements_macos.txt b/requirements_macos.txt new file mode 100644 index 0000000..4ee4eec --- /dev/null +++ b/requirements_macos.txt @@ -0,0 +1,32 @@ +accelerate==0.15.0 +albumentations==1.3.0 +altair==4.2.2 +bitsandbytes==0.35.0 +dadaptation==1.5 +diffusers[torch]==0.10.2 +easygui==0.98.3 +einops==0.6.0 +ftfy==6.1.1 +gradio==3.19.1; sys_platform != 'darwin' +gradio==3.23.0; sys_platform == 'darwin' +lion-pytorch==0.0.6 +opencv-python==4.7.0.68 +pytorch-lightning==1.9.0 +safetensors==0.2.6 +tensorboard==2.10.1 +tk==0.1.0 +toml==0.10.2 +transformers==4.26.0 +voluptuous==0.13.1 +# for BLIP captioning +fairscale==0.4.13 +requests==2.28.2 +timm==0.6.12 +# tensorflow<2.11 +huggingface-hub==0.12.0; sys_platform != 'darwin' +huggingface-hub==0.13.0; sys_platform == 'darwin' +tensorflow==2.10.1; sys_platform != 'darwin' +# For locon support +lycoris_lora==0.1.2 +# for kohya_ss library +. \ No newline at end of file