diff --git a/ui/server.py b/ui/server.py index 2f428894..fae34dec 100644 --- a/ui/server.py +++ b/ui/server.py @@ -31,7 +31,6 @@ APP_CONFIG_DEFAULT_MODELS = [ 'sd-v1-4', # Default fallback. ] -import asyncio from fastapi import FastAPI, HTTPException from fastapi.staticfiles import StaticFiles from starlette.responses import FileResponse, JSONResponse, StreamingResponse @@ -42,7 +41,6 @@ from typing import Any, Generator, Hashable, List, Optional, Union from sd_internal import Request, Response, task_manager -LOOP = asyncio.get_event_loop() app = FastAPI() modifiers_cache = None @@ -362,54 +360,39 @@ logging.getLogger('uvicorn.access').addFilter(LogSuppressFilter()) config = getConfig() -async def check_status(): # Task to Validate user config shortly after startup. - # Check that the loaded config.json yielded a server in a known valid state. - # When issues are found, try to fix them when possible and warn the user. - device_count = 0 - # Wait for devices to register and/or change names. - THREAD_START_DELAY = 5 # seconds - Give time for devices/threads to start. - for i in range(10): # Maximum number of retry. - await asyncio.sleep(THREAD_START_DELAY) - new_count = task_manager.is_alive() - # Stops retry once no more devices show up. - if new_count > 0 and device_count == new_count: break - device_count = new_count - - if 'render_devices' in config and task_manager.is_alive() <= 0: # No running devices, probably invalid user config. Try to apply defaults. - print('WARNING: No active render devices after loading config. Validate "render_devices" in config.json') - task_manager.start_render_thread('auto') # Detect best device for renders - task_manager.start_render_thread('cpu') # Allow CPU to be used for renders - await asyncio.sleep(THREAD_START_DELAY) # delay message after thread start. - print('Default render devices loaded to replace missing render_devices', config['render_devices']) - - display_warning = False - if not 'render_devices' in config and task_manager.is_alive(0) <= 0: # No config set, is on auto mode and without cuda:0 - task_manager.start_render_thread('cuda') # An other cuda device is better and cuda:0 is missing, start it... - display_warning = True # And warn user to update settings... - await asyncio.sleep(THREAD_START_DELAY) # delay message after thread start. - - if display_warning or task_manager.is_alive(0) <= 0: - print('WARNING: GFPGANer only works on GPU:0, use CUDA_VISIBLE_DEVICES if GFPGANer is needed on a specific GPU.') - print('Using CUDA_VISIBLE_DEVICES will remap the selected devices starting at GPU:0 fixing GFPGANer') - print('Add the line "@set CUDA_VISIBLE_DEVICES=N" where N is the GPUs to use to config.bat') - print('Add the line "CUDA_VISIBLE_DEVICES=N" where N is the GPUs to use to config.sh') - # Start the task_manager task_manager.default_model_to_load = resolve_model_to_use() -if 'render_devices' in config: # Start a new thread for each device. +# Check that the loaded config.json yielded a server in a known valid state. +# When issues are found, try to fix them when possible and warn the user. +if 'render_devices' in config: # Start a new thread for each device. if isinstance(config['render_devices'], str): config['render_devices'] = config['render_devices'].split(',') if not isinstance(config['render_devices'], list): raise Exception('Invalid render_devices value in config.') for device in config['render_devices']: task_manager.start_render_thread(device) -else: + if task_manager.is_alive() <= 0: # No running devices, probably invalid user config. + print('WARNING: No active render devices after loading config. Validate "render_devices" in config.json') + print('Loading default render devices to replace invalid render_devices field from config', config['render_devices']) + +display_warning = False +if task_manager.is_alive() <= 0: # Either no defauls or no devices after loading config. # Select best GPU device using free memory, if more than one device. task_manager.start_render_thread('auto') # Detect best device for renders - task_manager.start_render_thread('cpu') # Allow CPU to be used for renders + if task_manager.is_alive(0) <= 0: # without cuda:0 + task_manager.start_render_thread('cuda') # An other cuda device is better and cuda:0 is missing, start it... + display_warning = True # And warn user to update settings... + if task_manager.is_alive('cpu') <= 0: + # Allow CPU to be used for renders + task_manager.start_render_thread('cpu') -# Task to Validate user config shortly after startup. -LOOP.create_task(check_status()) +if display_warning or task_manager.is_alive(0) <= 0: + print('WARNING: GFPGANer only works on GPU:0, use CUDA_VISIBLE_DEVICES if GFPGANer is needed on a specific GPU.') + print('Using CUDA_VISIBLE_DEVICES will remap the selected devices starting at GPU:0 fixing GFPGANer') + print('Add the line "@set CUDA_VISIBLE_DEVICES=N" where N is the GPUs to use to config.bat') + print('Add the line "CUDA_VISIBLE_DEVICES=N" where N is the GPUs to use to config.sh') + +del display_warning # start the browser ui import webbrowser; webbrowser.open('http://localhost:9000') \ No newline at end of file