olive installation and initialization

This commit is contained in:
Seunghoon Lee
2024-02-02 00:33:38 +09:00
parent b7046df441
commit 40653d5eaf
5 changed files with 75 additions and 58 deletions
+32
View File
@@ -5,6 +5,7 @@ import onnxruntime as ort
initialized = False
run_olive_workflow = None
class DynamicSessionOptions(ort.SessionOptions):
@@ -171,3 +172,34 @@ def initialize():
diffusers.ORTStableDiffusionXLImg2ImgPipeline = diffusers.OnnxStableDiffusionXLImg2ImgPipeline
initialized = True
def initialize_olive():
from installer import installed, log
if not installed("olive-ai"):
return
global run_olive_workflow # pylint: disable=global-statement
try:
from olive.workflows import run as run_olive_workflow # pylint: disable=redefined-outer-name
except Exception as e:
run_olive_workflow = None
log.error(f'Olive: Failed to load olive-ai: {e}')
def install_olive():
from installer import installed, install, log
if installed("olive-ai"):
return
try:
log.info('Installing Olive')
install('olive-ai', 'olive-ai', ignore=True)
import olive.workflows # pylint: disable=unused-import
except Exception as e:
log.error(f'Olive: Failed to load olive-ai: {e}')
else:
log.info('Olive: Please restart webui session.')
-10
View File
@@ -1,10 +0,0 @@
from installer import log, installed, install
def install_olive():
if installed("olive-ai"):
log.debug("Olive: olive-ai is already installed. Skipping olive-ai installation.")
return
install("olive-ai", "olive-ai")
log.info("Olive: olive-ai is installed. Please restart webui session.")
+40 -38
View File
@@ -21,7 +21,7 @@ from modules.paths import sd_configs_path, models_path
from modules.sd_models import CheckpointInfo
from modules.processing import StableDiffusionProcessing
from modules.olive_script import config
from . import DynamicSessionOptions, TorchCompatibleModule
from . import DynamicSessionOptions, TorchCompatibleModule, run_olive_workflow
from .utils import extract_device, move_inference_session, check_diffusers_cache, check_pipeline_sdxl, check_cache_onnx, load_init_dict, load_submodel, load_submodels, patch_kwargs, load_pipeline, get_base_constructor, get_io_config
from .execution_providers import ExecutionProvider, EP_TO_NAME, get_provider
@@ -224,7 +224,6 @@ class OnnxRawPipeline(PipelineBase):
if not shared.opts.olive_cache_optimized:
out_dir = shared.opts.onnx_temp_dir
from olive.workflows import run # pylint: disable=no-name-in-module
try:
from olive.model import ONNXModel # olive-ai==0.4.0
except ImportError:
@@ -262,7 +261,7 @@ class OnnxRawPipeline(PipelineBase):
if float16:
olive_config["passes"][pass_key]["config"]["keep_io_types"] = False
run(olive_config)
run_olive_workflow(olive_config)
with open(os.path.join("footprints", f"{submodel}_{EP_TO_NAME[shared.opts.onnx_execution_provider]}_footprints.json"), "r", encoding="utf-8") as footprint_file:
footprints = json.load(footprint_file)
@@ -371,47 +370,50 @@ class OnnxRawPipeline(PipelineBase):
out_dir = converted_dir
if shared.opts.cuda_compile_backend == "olive-ai":
submodels_for_olive = []
if "Text Encoder" in shared.opts.cuda_compile:
if not self.is_refiner:
submodels_for_olive.append("text_encoder")
if self._is_sdxl:
submodels_for_olive.append("text_encoder_2")
if "Model" in shared.opts.cuda_compile:
submodels_for_olive.append("unet")
if "VAE" in shared.opts.cuda_compile:
submodels_for_olive.append("vae_encoder")
submodels_for_olive.append("vae_decoder")
if len(submodels_for_olive) == 0:
log.warning("Olive: Skipping olive run.")
if run_olive_workflow is None:
log.warning('Olive: Skipping model compilation because olive-ai was loaded unsuccessfully.')
else:
log.warning("Olive implementation is experimental. It contains potentially an issue and is subject to change at any time.")
submodels_for_olive = []
in_dir = converted_dir
if "Text Encoder" in shared.opts.cuda_compile:
if not self.is_refiner:
submodels_for_olive.append("text_encoder")
if self._is_sdxl:
submodels_for_olive.append("text_encoder_2")
if "Model" in shared.opts.cuda_compile:
submodels_for_olive.append("unet")
if "VAE" in shared.opts.cuda_compile:
submodels_for_olive.append("vae_encoder")
submodels_for_olive.append("vae_decoder")
if p.width != p.height:
log.warning("Olive: Different width and height are detected. The quality of the result is not guaranteed.")
if len(submodels_for_olive) == 0:
log.warning("Olive: Skipping olive run.")
else:
log.warning("Olive implementation is experimental. It contains potentially an issue and is subject to change at any time.")
if shared.opts.olive_static_dims:
sess_options = DynamicSessionOptions()
sess_options.enable_static_dims({
"is_sdxl": self._is_sdxl,
"is_refiner": self.is_refiner,
in_dir = converted_dir
"hidden_batch_size": p.batch_size if disable_classifier_free_guidance else p.batch_size * 2,
"height": p.height,
"width": p.width,
})
kwargs["sess_options"] = sess_options
if p.width != p.height:
log.warning("Olive: Different width and height are detected. The quality of the result is not guaranteed.")
try:
out_dir = self.run_olive(submodels_for_olive, in_dir)
except Exception as e:
log.error(f"Olive: Failed to run olive passes: model='{self.original_filename}', error={e}")
shutil.rmtree(shared.opts.onnx_temp_dir, ignore_errors=True)
shutil.rmtree(os.path.join(shared.opts.onnx_cached_models_path, self.original_filename), ignore_errors=True)
if shared.opts.olive_static_dims:
sess_options = DynamicSessionOptions()
sess_options.enable_static_dims({
"is_sdxl": self._is_sdxl,
"is_refiner": self.is_refiner,
"hidden_batch_size": p.batch_size if disable_classifier_free_guidance else p.batch_size * 2,
"height": p.height,
"width": p.width,
})
kwargs["sess_options"] = sess_options
try:
out_dir = self.run_olive(submodels_for_olive, in_dir)
except Exception as e:
log.error(f"Olive: Failed to run olive passes: model='{self.original_filename}', error={e}")
shutil.rmtree(shared.opts.onnx_temp_dir, ignore_errors=True)
shutil.rmtree(os.path.join(shared.opts.onnx_cached_models_path, self.original_filename), ignore_errors=True)
pipeline = self.derive_properties(load_pipeline(self.constructor, out_dir, **kwargs))
+1 -1
View File
@@ -7,7 +7,7 @@ from modules.call_queue import wrap_gradio_call
from modules import timer, gr_hijack, shared, theme, sd_models, script_callbacks, modelloader, ui_common, ui_loadsave, ui_symbols, ui_javascript, generation_parameters_copypaste, call_queue
from modules.paths import script_path, data_path # pylint: disable=unused-import
from modules.dml import directml_override_opts
from modules.onnx_impl.olive_dep import install_olive
from modules.onnx_impl import install_olive
import modules.scripts
import modules.errors