horde-engine 3.1.1__tar.gz → 3.2.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {horde_engine-3.1.1 → horde_engine-3.2.2}/PKG-INFO +43 -28
- {horde_engine-3.1.1 → horde_engine-3.2.2}/README.md +24 -17
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/_version.py +2 -2
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/api.py +22 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/comfy_horde.py +11 -5
- horde_engine-3.2.2/hordelib/feature_requirements.py +115 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/initialisation.py +13 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/installation/installer.py +17 -9
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/nodes/facerestore_cf/__init__.py +2 -1
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/nodes/facerestore_cf/basicsr/utils/realesrgan_utils.py +2 -1
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/pipeline/context.py +0 -20
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/pipeline/families/image.py +20 -9
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/pipeline/patches.py +3 -3
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/preload.py +22 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/shared_model_manager.py +44 -6
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/utils/gpuinfo.py +12 -6
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/utils/image_utils.py +7 -1
- horde_engine-3.2.2/hordelib/utils/optional_deps.py +74 -0
- horde_engine-3.2.2/hordelib/utils/torch_build.py +161 -0
- horde_engine-3.2.2/hordelib/utils/torch_memory.py +278 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/pyproject.toml +74 -26
- horde_engine-3.1.1/hordelib/utils/torch_memory.py +0 -63
- {horde_engine-3.1.1 → horde_engine-3.2.2}/.gitignore +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/LICENSE +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/__init__.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/__pyinstaller.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/benchmark.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/beta_models.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/config_path.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/consts.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/exceptions.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/execution/__init__.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/execution/comfy_patches.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/execution/graph_utils.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/execution/in_process.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/execution/interface.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/execution/phase_timing.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/execution/progress_hook.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/execution/sampling_lease.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/feature_impact.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/horde.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/installation/__init__.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/installation/__main__.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/installation/manifest.json +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/installation/manifest.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/integrations/__init__.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/integrations/logfire_comfy_internals.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/integrations/logfire_setup.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/metrics.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/model_database/db_dep.json +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/model_database/db_embeds.json +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/model_database/diffusers.json +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/model_database/med_config.json +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/model_manager/__init__.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/model_manager/base.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/model_manager/civitai_adhoc.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/model_manager/civitai_provider.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/model_manager/civitai_records.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/model_manager/codeformer.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/model_manager/compvis.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/model_manager/controlnet.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/model_manager/diffusers.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/model_manager/esrgan.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/model_manager/gfpgan.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/model_manager/hyper.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/model_manager/lora.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/model_manager/miscellaneous.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/model_manager/safety_checker.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/model_manager/ti.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/nodes/__init__.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/nodes/comfyui_layerdiffuse/LICENSE +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/nodes/comfyui_layerdiffuse/README.md +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/nodes/comfyui_layerdiffuse/__init__.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/nodes/comfyui_layerdiffuse/examples/layer_diffusion_cond_example.json +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/nodes/comfyui_layerdiffuse/examples/layer_diffusion_cond_fg_all.json +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/nodes/comfyui_layerdiffuse/examples/layer_diffusion_cond_joint_bg.json +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/nodes/comfyui_layerdiffuse/examples/layer_diffusion_cond_joint_fg.json +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/nodes/comfyui_layerdiffuse/examples/layer_diffusion_diff_bg.json +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/nodes/comfyui_layerdiffuse/examples/layer_diffusion_diff_bg_stop_at.json +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/nodes/comfyui_layerdiffuse/examples/layer_diffusion_diff_fg.json +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/nodes/comfyui_layerdiffuse/examples/layer_diffusion_fg_example.json +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/nodes/comfyui_layerdiffuse/examples/layer_diffusion_fg_example_rgba.json +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/nodes/comfyui_layerdiffuse/examples/layer_diffusion_joint.json +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/nodes/comfyui_layerdiffuse/layered_diffusion.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/nodes/comfyui_layerdiffuse/lib_layerdiffusion/__init__.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/nodes/comfyui_layerdiffuse/lib_layerdiffusion/attention_sharing.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/nodes/comfyui_layerdiffuse/lib_layerdiffusion/enums.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/nodes/comfyui_layerdiffuse/lib_layerdiffusion/models.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/nodes/comfyui_layerdiffuse/lib_layerdiffusion/utils.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/nodes/comfyui_layerdiffuse/pyproject.toml +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/nodes/comfyui_layerdiffuse/requirements.txt +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/nodes/facerestore_cf/LICENSE +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/nodes/facerestore_cf/README.md +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/nodes/facerestore_cf/basicsr/VERSION +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/nodes/facerestore_cf/basicsr/__init__.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/nodes/facerestore_cf/basicsr/archs/__init__.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/nodes/facerestore_cf/basicsr/archs/arcface_arch.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/nodes/facerestore_cf/basicsr/archs/arch_util.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/nodes/facerestore_cf/basicsr/archs/codeformer_arch.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/nodes/facerestore_cf/basicsr/archs/rrdbnet_arch.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/nodes/facerestore_cf/basicsr/archs/vgg_arch.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/nodes/facerestore_cf/basicsr/archs/vqgan_arch.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/nodes/facerestore_cf/basicsr/data/__init__.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/nodes/facerestore_cf/basicsr/data/data_sampler.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/nodes/facerestore_cf/basicsr/data/data_util.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/nodes/facerestore_cf/basicsr/data/prefetch_dataloader.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/nodes/facerestore_cf/basicsr/data/transforms.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/nodes/facerestore_cf/basicsr/losses/__init__.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/nodes/facerestore_cf/basicsr/losses/loss_util.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/nodes/facerestore_cf/basicsr/losses/losses.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/nodes/facerestore_cf/basicsr/metrics/__init__.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/nodes/facerestore_cf/basicsr/metrics/metric_util.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/nodes/facerestore_cf/basicsr/metrics/psnr_ssim.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/nodes/facerestore_cf/basicsr/models/__init__.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/nodes/facerestore_cf/basicsr/ops/__init__.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/nodes/facerestore_cf/basicsr/ops/dcn/__init__.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/nodes/facerestore_cf/basicsr/ops/dcn/deform_conv.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/nodes/facerestore_cf/basicsr/ops/dcn/src/deform_conv_cuda.cpp +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/nodes/facerestore_cf/basicsr/ops/dcn/src/deform_conv_cuda_kernel.cu +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/nodes/facerestore_cf/basicsr/ops/dcn/src/deform_conv_ext.cpp +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/nodes/facerestore_cf/basicsr/ops/fused_act/__init__.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/nodes/facerestore_cf/basicsr/ops/fused_act/fused_act.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/nodes/facerestore_cf/basicsr/ops/fused_act/src/fused_bias_act.cpp +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/nodes/facerestore_cf/basicsr/ops/fused_act/src/fused_bias_act_kernel.cu +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/nodes/facerestore_cf/basicsr/ops/upfirdn2d/__init__.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/nodes/facerestore_cf/basicsr/ops/upfirdn2d/src/upfirdn2d.cpp +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/nodes/facerestore_cf/basicsr/ops/upfirdn2d/src/upfirdn2d_kernel.cu +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/nodes/facerestore_cf/basicsr/ops/upfirdn2d/upfirdn2d.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/nodes/facerestore_cf/basicsr/setup.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/nodes/facerestore_cf/basicsr/train.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/nodes/facerestore_cf/basicsr/utils/__init__.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/nodes/facerestore_cf/basicsr/utils/dist_util.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/nodes/facerestore_cf/basicsr/utils/download_util.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/nodes/facerestore_cf/basicsr/utils/file_client.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/nodes/facerestore_cf/basicsr/utils/img_util.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/nodes/facerestore_cf/basicsr/utils/lmdb_util.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/nodes/facerestore_cf/basicsr/utils/logger.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/nodes/facerestore_cf/basicsr/utils/matlab_functions.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/nodes/facerestore_cf/basicsr/utils/misc.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/nodes/facerestore_cf/basicsr/utils/options.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/nodes/facerestore_cf/basicsr/utils/registry.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/nodes/facerestore_cf/basicsr/version.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/nodes/facerestore_cf/facelib/__init__.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/nodes/facerestore_cf/facelib/detection/__init__.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/nodes/facerestore_cf/facelib/detection/align_trans.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/nodes/facerestore_cf/facelib/detection/matlab_cp2tform.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/nodes/facerestore_cf/facelib/detection/retinaface/retinaface.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/nodes/facerestore_cf/facelib/detection/retinaface/retinaface_net.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/nodes/facerestore_cf/facelib/detection/retinaface/retinaface_utils.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/nodes/facerestore_cf/facelib/detection/yolov5face/__init__.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/nodes/facerestore_cf/facelib/detection/yolov5face/face_detector.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/nodes/facerestore_cf/facelib/detection/yolov5face/models/__init__.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/nodes/facerestore_cf/facelib/detection/yolov5face/models/common.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/nodes/facerestore_cf/facelib/detection/yolov5face/models/experimental.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/nodes/facerestore_cf/facelib/detection/yolov5face/models/yolo.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/nodes/facerestore_cf/facelib/detection/yolov5face/models/yolov5l.yaml +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/nodes/facerestore_cf/facelib/detection/yolov5face/models/yolov5n.yaml +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/nodes/facerestore_cf/facelib/detection/yolov5face/utils/__init__.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/nodes/facerestore_cf/facelib/detection/yolov5face/utils/autoanchor.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/nodes/facerestore_cf/facelib/detection/yolov5face/utils/datasets.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/nodes/facerestore_cf/facelib/detection/yolov5face/utils/extract_ckpt.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/nodes/facerestore_cf/facelib/detection/yolov5face/utils/general.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/nodes/facerestore_cf/facelib/detection/yolov5face/utils/torch_utils.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/nodes/facerestore_cf/facelib/parsing/__init__.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/nodes/facerestore_cf/facelib/parsing/bisenet.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/nodes/facerestore_cf/facelib/parsing/parsenet.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/nodes/facerestore_cf/facelib/parsing/resnet.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/nodes/facerestore_cf/facelib/utils/__init__.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/nodes/facerestore_cf/facelib/utils/face_restoration_helper.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/nodes/facerestore_cf/facelib/utils/face_utils.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/nodes/facerestore_cf/facelib/utils/misc.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/nodes/facerestore_cf/r_chainner/README.md +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/nodes/facerestore_cf/r_chainner/__init__.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/nodes/facerestore_cf/r_chainner/gfpganv1_clean_arch.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/nodes/facerestore_cf/r_chainner/model_loading.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/nodes/facerestore_cf/r_chainner/stylegan2_clean_arch.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/nodes/facerestore_cf/r_chainner/types.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/nodes/node_controlnet_model_loader.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/nodes/node_image_loader.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/nodes/node_image_output.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/nodes/node_lora_loader.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/nodes/node_model_loader.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/nodes/node_upscale_model_loader.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/pipeline/__init__.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/pipeline/constants.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/pipeline/families/__init__.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/pipeline/families/post_processing.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/pipeline/graph.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/pipeline/horde_compat.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/pipeline/payload.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/pipeline/payload_pp.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/pipeline/registry.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/pipeline/resolution.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/pipeline/template.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/pipeline_designs/pipeline_controlnet.json +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/pipeline_designs/pipeline_controlnet_annotator.json +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/pipeline_designs/pipeline_controlnet_hires_fix.json +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/pipeline_designs/pipeline_flux.json +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/pipeline_designs/pipeline_image_facefix.json +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/pipeline_designs/pipeline_image_upscale.json +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/pipeline_designs/pipeline_qr_code.json +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/pipeline_designs/pipeline_qwen.json +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/pipeline_designs/pipeline_stable_cascade.json +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/pipeline_designs/pipeline_stable_cascade_2pass.json +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/pipeline_designs/pipeline_stable_cascade_remix.json +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/pipeline_designs/pipeline_stable_diffusion.json +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/pipeline_designs/pipeline_stable_diffusion_hires_fix.json +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/pipeline_designs/pipeline_stable_diffusion_img2img_mask.json +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/pipeline_designs/pipeline_stable_diffusion_paint.json +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/pipelines/pipeline_controlnet.json +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/pipelines/pipeline_controlnet_annotator.json +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/pipelines/pipeline_controlnet_hires_fix.json +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/pipelines/pipeline_flux.json +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/pipelines/pipeline_image_facefix.json +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/pipelines/pipeline_image_upscale.json +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/pipelines/pipeline_qr_code.json +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/pipelines/pipeline_qwen.json +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/pipelines/pipeline_stable_cascade.json +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/pipelines/pipeline_stable_cascade_2pass.json +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/pipelines/pipeline_stable_cascade_remix.json +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/pipelines/pipeline_stable_diffusion.json +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/pipelines/pipeline_stable_diffusion_hires_fix.json +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/pipelines/pipeline_stable_diffusion_img2img_mask.json +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/pipelines/pipeline_stable_diffusion_paint.json +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/py.typed +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/pyinstaller_hooks/__init__.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/pyinstaller_hooks/hook-hordelib.horde.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/safety.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/safety_checker.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/settings.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/train.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/utils/__init__.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/utils/distance.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/utils/dynamicprompt.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/utils/ioredirect.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/utils/logger.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/utils/sanitizer.py +0 -0
- {horde_engine-3.1.1 → horde_engine-3.2.2}/hordelib/utils/switch.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: horde-engine
|
|
3
|
-
Version: 3.
|
|
3
|
+
Version: 3.2.2
|
|
4
4
|
Summary: A wrapper around ComfyUI to allow use by AI Horde.
|
|
5
5
|
Project-URL: Homepage, https://github.com/Haidra-Org/hordelib
|
|
6
6
|
Project-URL: Bug Tracker, https://github.com/Haidra-Org/hordelib/issues
|
|
@@ -679,17 +679,15 @@ Requires-Dist: aiohttp>=3.11.8
|
|
|
679
679
|
Requires-Dist: alembic
|
|
680
680
|
Requires-Dist: av>=16.0.0
|
|
681
681
|
Requires-Dist: blake3
|
|
682
|
-
Requires-Dist: clip-anytorch>=2.6.0
|
|
683
682
|
Requires-Dist: comfy-aimdo==0.4.9
|
|
684
683
|
Requires-Dist: comfy-kitchen==0.2.10
|
|
685
684
|
Requires-Dist: comfyui-embedded-docs==0.5.3
|
|
686
685
|
Requires-Dist: comfyui-frontend-package==1.45.15
|
|
687
686
|
Requires-Dist: comfyui-workflow-templates==0.9.98
|
|
688
|
-
Requires-Dist: diffusers>=0.25.0
|
|
689
687
|
Requires-Dist: distro>=1.9.0
|
|
690
688
|
Requires-Dist: einops
|
|
691
|
-
Requires-Dist: fairscale>=0.4.13
|
|
692
689
|
Requires-Dist: filelock
|
|
690
|
+
Requires-Dist: ftfy
|
|
693
691
|
Requires-Dist: fuzzywuzzy>=0.18.0
|
|
694
692
|
Requires-Dist: gitpython>=3.1.45
|
|
695
693
|
Requires-Dist: horde-model-reference<6.0.0,>=5.1.1
|
|
@@ -697,11 +695,9 @@ Requires-Dist: horde-sdk>=0.20.1
|
|
|
697
695
|
Requires-Dist: kornia>=0.7.1
|
|
698
696
|
Requires-Dist: logfire[system-metrics]==4.14.2
|
|
699
697
|
Requires-Dist: loguru>=0.7.3
|
|
700
|
-
Requires-Dist: lpips>=0.1.4
|
|
701
698
|
Requires-Dist: matplotlib>=3.10.9
|
|
702
699
|
Requires-Dist: numpy>=1.25.0
|
|
703
700
|
Requires-Dist: omegaconf>=2.3.0
|
|
704
|
-
Requires-Dist: open-clip-torch>=2.32.0
|
|
705
701
|
Requires-Dist: opencv-contrib-python>=4.11.0.86
|
|
706
702
|
Requires-Dist: opencv-python>=4.11.0.86
|
|
707
703
|
Requires-Dist: opentelemetry-instrumentation-aiohttp-client>=0.59b0
|
|
@@ -712,24 +708,18 @@ Requires-Dist: pydantic-settings~=2.0
|
|
|
712
708
|
Requires-Dist: pydantic~=2.0
|
|
713
709
|
Requires-Dist: pynvml>=13.0.1
|
|
714
710
|
Requires-Dist: python-dotenv>=1.2.1
|
|
715
|
-
Requires-Dist: pytorch-lightning>=2.5.6
|
|
716
711
|
Requires-Dist: pyyaml
|
|
717
712
|
Requires-Dist: qrcode==7.4.2
|
|
718
|
-
Requires-Dist: rembg[cpu]>=2.0.67
|
|
719
713
|
Requires-Dist: requests
|
|
720
714
|
Requires-Dist: safetensors>=0.4.2
|
|
721
715
|
Requires-Dist: scikit-image>=0.25.2
|
|
722
716
|
Requires-Dist: scipy
|
|
723
717
|
Requires-Dist: sentencepiece
|
|
724
718
|
Requires-Dist: simpleeval>=1.0.0
|
|
725
|
-
Requires-Dist: soundfile>=0.13.1
|
|
726
|
-
Requires-Dist: spandrel-extra-arches>=0.2.0
|
|
727
719
|
Requires-Dist: spandrel>=0.4.1
|
|
728
720
|
Requires-Dist: sqlalchemy>=2.0.0
|
|
729
721
|
Requires-Dist: strenum>=0.4.15
|
|
730
|
-
Requires-Dist: timm==0.9.16
|
|
731
722
|
Requires-Dist: tokenizers>=0.13.3
|
|
732
|
-
Requires-Dist: torchaudio<2.13,>=2.9.0
|
|
733
723
|
Requires-Dist: torchdiffeq>=0.2.5
|
|
734
724
|
Requires-Dist: torchsde
|
|
735
725
|
Requires-Dist: torchvision<0.28,>=0.24.0
|
|
@@ -739,14 +729,32 @@ Requires-Dist: typing-extensions>=4.15.0
|
|
|
739
729
|
Requires-Dist: unidecode>=1.4.0
|
|
740
730
|
Requires-Dist: yapf>=0.43.0
|
|
741
731
|
Requires-Dist: yarl>=1.18.0
|
|
732
|
+
Provides-Extra: controlnet
|
|
733
|
+
Requires-Dist: albumentations; extra == 'controlnet'
|
|
734
|
+
Requires-Dist: fvcore; extra == 'controlnet'
|
|
735
|
+
Requires-Dist: mediapipe>=0.10; extra == 'controlnet'
|
|
736
|
+
Requires-Dist: onnxruntime>=1.16; extra == 'controlnet'
|
|
737
|
+
Requires-Dist: scikit-learn; extra == 'controlnet'
|
|
738
|
+
Requires-Dist: trimesh[easy]; extra == 'controlnet'
|
|
739
|
+
Requires-Dist: yacs; extra == 'controlnet'
|
|
742
740
|
Provides-Extra: cpu
|
|
743
741
|
Requires-Dist: torch; extra == 'cpu'
|
|
742
|
+
Requires-Dist: torchvision; extra == 'cpu'
|
|
744
743
|
Provides-Extra: cu126
|
|
745
744
|
Requires-Dist: torch; extra == 'cu126'
|
|
745
|
+
Requires-Dist: torchvision; extra == 'cu126'
|
|
746
746
|
Provides-Extra: cu130
|
|
747
747
|
Requires-Dist: torch; extra == 'cu130'
|
|
748
|
+
Requires-Dist: torchvision; extra == 'cu130'
|
|
748
749
|
Provides-Extra: cu132
|
|
749
750
|
Requires-Dist: torch; extra == 'cu132'
|
|
751
|
+
Requires-Dist: torchvision; extra == 'cu132'
|
|
752
|
+
Provides-Extra: layerdiffuse
|
|
753
|
+
Requires-Dist: diffusers>=0.25.0; extra == 'layerdiffuse'
|
|
754
|
+
Provides-Extra: rembg
|
|
755
|
+
Requires-Dist: rembg[cpu]>=2.0.67; extra == 'rembg'
|
|
756
|
+
Provides-Extra: upscale-extra
|
|
757
|
+
Requires-Dist: spandrel-extra-arches>=0.2.0; extra == 'upscale-extra'
|
|
750
758
|
Description-Content-Type: text/markdown
|
|
751
759
|
|
|
752
760
|
# horde-engine
|
|
@@ -836,29 +844,36 @@ uv sync # installs the latest torch (2.12.0, the CUDA 12.6 build) -- see "Choo
|
|
|
836
844
|
|
|
837
845
|
### Choosing a PyTorch build
|
|
838
846
|
|
|
839
|
-
`horde-engine` does not pin `torch`: it declares `torchvision
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
847
|
+
`horde-engine` does not pin `torch`: it declares `torchvision` as a version *range*, and torchvision
|
|
848
|
+
pins the exact matching torch in its metadata, so installing the library pulls the latest supported
|
|
849
|
+
torch (**2.12.0** -> torchvision 0.27.0). You only pick the *build* (which CUDA/ROCm wheels) for your
|
|
850
|
+
hardware. `torch` and `torchvision` are both routed per-build in `[tool.uv.sources]` so they always
|
|
851
|
+
share one CUDA build (a torchvision left on generic PyPI would pull a different CUDA build and break the
|
|
852
|
+
install).
|
|
843
853
|
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
854
|
+
`torchaudio` is **not** installed by default: it is the only package in the trio with no `+cu132` wheel,
|
|
855
|
+
and audio generation is currently unsupported. ComfyUI's eager `import torchaudio` is satisfied by a
|
|
856
|
+
lazy stub (`hordelib.utils.torch_build`) when it is absent; audio operations raise a clear error only if
|
|
857
|
+
actually used. Install a matching torchaudio ad-hoc if you need audio (cu126/cu130/cpu only).
|
|
858
|
+
|
|
859
|
+
For development, `uv sync --extra cu126` installs the **CUDA 12.6** build of torch 2.12.0. It runs on any
|
|
860
|
+
CUDA 12.6+ driver and, via NVIDIA driver backward-compatibility, on CUDA 13 drivers too -- the broadest
|
|
861
|
+
single build. Pick a different build with the matching extra:
|
|
848
862
|
|
|
849
863
|
```bash
|
|
850
|
-
uv sync
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
uv
|
|
864
|
+
uv sync --extra cu132 # exact CUDA 13.2 build
|
|
865
|
+
uv sync --extra cu130 # CUDA 13.0/13.1 build (also runs on a 13.2 driver)
|
|
866
|
+
uv sync --extra cu126 # CUDA 12.6+ build (also runs on CUDA 13 drivers)
|
|
867
|
+
uv sync --extra cpu # no GPU; ~100x slower, testing only
|
|
854
868
|
```
|
|
855
869
|
|
|
856
|
-
With `pip`, select the index with `--extra-index-url
|
|
870
|
+
With `pip`, select the index with `--extra-index-url` (install `torch` **and** `torchvision` from the
|
|
871
|
+
same index):
|
|
857
872
|
|
|
858
873
|
| Hardware | index | Notes |
|
|
859
874
|
|---|---|---|
|
|
860
|
-
| NVIDIA, CUDA 13
|
|
861
|
-
| NVIDIA, CUDA 13.
|
|
875
|
+
| NVIDIA, CUDA 13.2 (exact) | `cu132` | torch 2.12.0; no torchaudio wheel (audio unavailable on this build). |
|
|
876
|
+
| NVIDIA, CUDA 13.0/13.1 driver | `cu130` | torch 2.12.0; also runs on a 13.2 driver. |
|
|
862
877
|
| NVIDIA, CUDA 12.6+ driver | `cu126` | torch 2.12.0; the only CUDA-12 build of 2.12.0. |
|
|
863
878
|
| NVIDIA, CUDA 12.x, older torch | `cu128` | No 2.12.0 wheel; caps at torch **2.11.0** (add `"torch==2.11.0"`). |
|
|
864
879
|
| AMD (Linux only) | `rocm6.4` | torch **2.9.1 only** (see note below). |
|
|
@@ -866,7 +881,7 @@ With `pip`, select the index with `--extra-index-url`:
|
|
|
866
881
|
|
|
867
882
|
> **ROCm:** only torch 2.9.1 (ROCm 6.4) is currently installable. PyTorch publishes torch 2.10-2.12 on
|
|
868
883
|
> rocm7.x but not the matching `pytorch-triton-rocm` (3.6.0/3.7.0) those wheels hard-depend on, so they
|
|
869
|
-
> cannot be resolved yet. Install it ad-hoc: `uv pip install torch==2.9.1 torchvision
|
|
884
|
+
> cannot be resolved yet. Install it ad-hoc: `uv pip install torch==2.9.1 torchvision
|
|
870
885
|
> pytorch-triton-rocm --extra-index-url https://download.pytorch.org/whl/rocm6.4`.
|
|
871
886
|
|
|
872
887
|
---
|
|
@@ -85,29 +85,36 @@ uv sync # installs the latest torch (2.12.0, the CUDA 12.6 build) -- see "Choo
|
|
|
85
85
|
|
|
86
86
|
### Choosing a PyTorch build
|
|
87
87
|
|
|
88
|
-
`horde-engine` does not pin `torch`: it declares `torchvision
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
88
|
+
`horde-engine` does not pin `torch`: it declares `torchvision` as a version *range*, and torchvision
|
|
89
|
+
pins the exact matching torch in its metadata, so installing the library pulls the latest supported
|
|
90
|
+
torch (**2.12.0** -> torchvision 0.27.0). You only pick the *build* (which CUDA/ROCm wheels) for your
|
|
91
|
+
hardware. `torch` and `torchvision` are both routed per-build in `[tool.uv.sources]` so they always
|
|
92
|
+
share one CUDA build (a torchvision left on generic PyPI would pull a different CUDA build and break the
|
|
93
|
+
install).
|
|
94
|
+
|
|
95
|
+
`torchaudio` is **not** installed by default: it is the only package in the trio with no `+cu132` wheel,
|
|
96
|
+
and audio generation is currently unsupported. ComfyUI's eager `import torchaudio` is satisfied by a
|
|
97
|
+
lazy stub (`hordelib.utils.torch_build`) when it is absent; audio operations raise a clear error only if
|
|
98
|
+
actually used. Install a matching torchaudio ad-hoc if you need audio (cu126/cu130/cpu only).
|
|
99
|
+
|
|
100
|
+
For development, `uv sync --extra cu126` installs the **CUDA 12.6** build of torch 2.12.0. It runs on any
|
|
101
|
+
CUDA 12.6+ driver and, via NVIDIA driver backward-compatibility, on CUDA 13 drivers too -- the broadest
|
|
102
|
+
single build. Pick a different build with the matching extra:
|
|
97
103
|
|
|
98
104
|
```bash
|
|
99
|
-
uv sync
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
uv
|
|
105
|
+
uv sync --extra cu132 # exact CUDA 13.2 build
|
|
106
|
+
uv sync --extra cu130 # CUDA 13.0/13.1 build (also runs on a 13.2 driver)
|
|
107
|
+
uv sync --extra cu126 # CUDA 12.6+ build (also runs on CUDA 13 drivers)
|
|
108
|
+
uv sync --extra cpu # no GPU; ~100x slower, testing only
|
|
103
109
|
```
|
|
104
110
|
|
|
105
|
-
With `pip`, select the index with `--extra-index-url
|
|
111
|
+
With `pip`, select the index with `--extra-index-url` (install `torch` **and** `torchvision` from the
|
|
112
|
+
same index):
|
|
106
113
|
|
|
107
114
|
| Hardware | index | Notes |
|
|
108
115
|
|---|---|---|
|
|
109
|
-
| NVIDIA, CUDA 13
|
|
110
|
-
| NVIDIA, CUDA 13.
|
|
116
|
+
| NVIDIA, CUDA 13.2 (exact) | `cu132` | torch 2.12.0; no torchaudio wheel (audio unavailable on this build). |
|
|
117
|
+
| NVIDIA, CUDA 13.0/13.1 driver | `cu130` | torch 2.12.0; also runs on a 13.2 driver. |
|
|
111
118
|
| NVIDIA, CUDA 12.6+ driver | `cu126` | torch 2.12.0; the only CUDA-12 build of 2.12.0. |
|
|
112
119
|
| NVIDIA, CUDA 12.x, older torch | `cu128` | No 2.12.0 wheel; caps at torch **2.11.0** (add `"torch==2.11.0"`). |
|
|
113
120
|
| AMD (Linux only) | `rocm6.4` | torch **2.9.1 only** (see note below). |
|
|
@@ -115,7 +122,7 @@ With `pip`, select the index with `--extra-index-url`:
|
|
|
115
122
|
|
|
116
123
|
> **ROCm:** only torch 2.9.1 (ROCm 6.4) is currently installable. PyTorch publishes torch 2.10-2.12 on
|
|
117
124
|
> rocm7.x but not the matching `pytorch-triton-rocm` (3.6.0/3.7.0) those wheels hard-depend on, so they
|
|
118
|
-
> cannot be resolved yet. Install it ad-hoc: `uv pip install torch==2.9.1 torchvision
|
|
125
|
+
> cannot be resolved yet. Install it ad-hoc: `uv pip install torch==2.9.1 torchvision
|
|
119
126
|
> pytorch-triton-rocm --extra-index-url https://download.pytorch.org/whl/rocm6.4`.
|
|
120
127
|
|
|
121
128
|
---
|
|
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
|
|
|
18
18
|
commit_id: str | None
|
|
19
19
|
__commit_id__: str | None
|
|
20
20
|
|
|
21
|
-
__version__ = version = '3.
|
|
22
|
-
__version_tuple__ = version_tuple = (3,
|
|
21
|
+
__version__ = version = '3.2.2'
|
|
22
|
+
__version_tuple__ = version_tuple = (3, 2, 2)
|
|
23
23
|
|
|
24
24
|
__commit_id__ = commit_id = None
|
|
@@ -31,6 +31,14 @@ from hordelib.feature_impact import (
|
|
|
31
31
|
get_baseline_burden,
|
|
32
32
|
get_feature_impact_registry,
|
|
33
33
|
)
|
|
34
|
+
from hordelib.feature_requirements import (
|
|
35
|
+
FeatureRequirement,
|
|
36
|
+
available_features,
|
|
37
|
+
feature_available,
|
|
38
|
+
get_feature_requirement,
|
|
39
|
+
get_feature_requirement_registry,
|
|
40
|
+
missing_packages,
|
|
41
|
+
)
|
|
34
42
|
from hordelib.horde import (
|
|
35
43
|
HordeLib,
|
|
36
44
|
ProgressReport,
|
|
@@ -58,6 +66,10 @@ from hordelib.shared_model_manager import SharedModelManager
|
|
|
58
66
|
from hordelib.utils.ioredirect import ComfyUIProgress, ComfyUIProgressUnit
|
|
59
67
|
from hordelib.utils.logger import HordeLog
|
|
60
68
|
from hordelib.utils.torch_memory import (
|
|
69
|
+
AcceleratorInfo,
|
|
70
|
+
AcceleratorKind,
|
|
71
|
+
clear_accelerator_cache,
|
|
72
|
+
enumerate_accelerators,
|
|
61
73
|
get_free_ram_mb,
|
|
62
74
|
get_torch_free_vram_mb,
|
|
63
75
|
get_torch_total_vram_mb,
|
|
@@ -66,6 +78,8 @@ from hordelib.utils.torch_memory import (
|
|
|
66
78
|
|
|
67
79
|
__all__ = [
|
|
68
80
|
"FEATURE_KIND",
|
|
81
|
+
"AcceleratorInfo",
|
|
82
|
+
"AcceleratorKind",
|
|
69
83
|
"BaselineBurden",
|
|
70
84
|
"BurdenEstimate",
|
|
71
85
|
"CalibrationSample",
|
|
@@ -75,6 +89,7 @@ __all__ = [
|
|
|
75
89
|
"DownloadTrigger",
|
|
76
90
|
"FeatureImpact",
|
|
77
91
|
"FeatureImpactRegistry",
|
|
92
|
+
"FeatureRequirement",
|
|
78
93
|
"ExecutionBackend",
|
|
79
94
|
"FacefixPayload",
|
|
80
95
|
"HordeLib",
|
|
@@ -96,10 +111,17 @@ __all__ = [
|
|
|
96
111
|
"StripBackgroundPayload",
|
|
97
112
|
"UpscalePayload",
|
|
98
113
|
"VRAMStats",
|
|
114
|
+
"available_features",
|
|
99
115
|
"classify_post_processor",
|
|
116
|
+
"clear_accelerator_cache",
|
|
117
|
+
"enumerate_accelerators",
|
|
100
118
|
"estimate_job_burden",
|
|
119
|
+
"feature_available",
|
|
101
120
|
"get_baseline_burden",
|
|
102
121
|
"get_feature_impact_registry",
|
|
122
|
+
"get_feature_requirement",
|
|
123
|
+
"get_feature_requirement_registry",
|
|
124
|
+
"missing_packages",
|
|
103
125
|
"get_free_ram_mb",
|
|
104
126
|
"get_metrics_collector",
|
|
105
127
|
"get_torch_free_vram_mb",
|
|
@@ -32,6 +32,7 @@ from hordelib.utils.ioredirect import ComfyUIProgress, OutputCollector
|
|
|
32
32
|
from hordelib.config_path import get_hordelib_path
|
|
33
33
|
from hordelib.execution import comfy_patches
|
|
34
34
|
from hordelib.execution.graph_utils import GraphDict
|
|
35
|
+
from hordelib.utils.torch_memory import clear_accelerator_cache
|
|
35
36
|
|
|
36
37
|
# Note It may not be abundantly clear with no context what is going on below, and I will attempt to clarify:
|
|
37
38
|
#
|
|
@@ -264,6 +265,13 @@ def do_comfy_import(
|
|
|
264
265
|
if extra_comfyui_args is not None:
|
|
265
266
|
sys.argv.extend(extra_comfyui_args)
|
|
266
267
|
|
|
268
|
+
# ComfyUI imports torchaudio eagerly in several node modules loaded just below. torchaudio is an
|
|
269
|
+
# optional, non-default dependency (no cu132 wheel; audio unsupported), so install a lazy stub when
|
|
270
|
+
# it is absent, BEFORE comfy is imported, so those imports succeed for image/video work.
|
|
271
|
+
from hordelib.utils.torch_build import ensure_torchaudio_importable
|
|
272
|
+
|
|
273
|
+
ensure_torchaudio_importable()
|
|
274
|
+
|
|
267
275
|
# Note these imports are intentionally somewhat obfuscated as a reminder to other modules
|
|
268
276
|
# that they should never call through this module into comfy directly. All calls into
|
|
269
277
|
# comfy should be abstracted through functions in this module.
|
|
@@ -367,11 +375,9 @@ def do_comfy_import(
|
|
|
367
375
|
|
|
368
376
|
|
|
369
377
|
def clear_gc_and_torch_cache() -> None:
|
|
370
|
-
"""Clear the garbage collector and the
|
|
378
|
+
"""Clear the garbage collector and the active backend's device cache."""
|
|
371
379
|
gc.collect()
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
empty_cache()
|
|
380
|
+
clear_accelerator_cache()
|
|
375
381
|
|
|
376
382
|
|
|
377
383
|
def pin_models_in_vram() -> bool:
|
|
@@ -1072,7 +1078,7 @@ class Comfy_Horde:
|
|
|
1072
1078
|
_mc.record_phase("pipeline_validate", _validate_seconds)
|
|
1073
1079
|
_mc.record_phase("pipeline_execute", _execute_seconds)
|
|
1074
1080
|
_mc.record_phase("pipeline_finalize", time.perf_counter() - _t_post_execute)
|
|
1075
|
-
except Exception:
|
|
1081
|
+
except Exception:
|
|
1076
1082
|
pass
|
|
1077
1083
|
|
|
1078
1084
|
# Record pipeline duration
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
"""Which optional features are actually installable in this environment.
|
|
2
|
+
|
|
3
|
+
Some hordelib features depend on heavy, platform-constrained native packages that are not
|
|
4
|
+
part of the lean base install (they have no wheels for some accelerators, e.g. Intel XPU /
|
|
5
|
+
Apple MPS / Ascend, so forcing them into base would block a base install there). Those
|
|
6
|
+
packages live in ``horde-engine`` feature extras (see ``[project.optional-dependencies]``)
|
|
7
|
+
and the feature's call site guards its import via :mod:`hordelib.utils.optional_deps`.
|
|
8
|
+
|
|
9
|
+
This module is the single, typed source of truth mapping each such feature to the extra and
|
|
10
|
+
the import-names that back it, plus a runtime probe (:func:`feature_available`) so a consumer
|
|
11
|
+
(notably the worker) can decide what to advertise *before* a job arrives rather than failing
|
|
12
|
+
mid-job. It is the one place to edit when ComfyUI's (or a node's) backend support changes.
|
|
13
|
+
|
|
14
|
+
Features with no entry here have no optional dependency and are always considered available
|
|
15
|
+
(core inference, the safety classifier, ESRGAN upscalers and the CodeFormer/GFPGAN face
|
|
16
|
+
fixers are all pure PyTorch and run on every backend). Detection only: this module never
|
|
17
|
+
installs anything; extras are resolved at lock/sync time by the packaging tool.
|
|
18
|
+
|
|
19
|
+
This module is comfy-free and import-safe before ``hordelib.initialise()``; it is part of the
|
|
20
|
+
public API surface re-exported from :mod:`hordelib.api`.
|
|
21
|
+
"""
|
|
22
|
+
|
|
23
|
+
import importlib.util
|
|
24
|
+
|
|
25
|
+
from pydantic import BaseModel
|
|
26
|
+
|
|
27
|
+
from hordelib.feature_impact import FEATURE_KIND
|
|
28
|
+
|
|
29
|
+
__all__ = [
|
|
30
|
+
"FeatureRequirement",
|
|
31
|
+
"available_features",
|
|
32
|
+
"feature_available",
|
|
33
|
+
"get_feature_requirement",
|
|
34
|
+
"get_feature_requirement_registry",
|
|
35
|
+
"missing_packages",
|
|
36
|
+
]
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
class FeatureRequirement(BaseModel):
|
|
40
|
+
"""The optional packages one feature needs, and the extra that provides them."""
|
|
41
|
+
|
|
42
|
+
feature: FEATURE_KIND
|
|
43
|
+
packages: tuple[str, ...]
|
|
44
|
+
"""Top-level import names that must ALL be importable for the feature to be available."""
|
|
45
|
+
extra: str
|
|
46
|
+
"""The ``horde-engine`` extra that installs ``packages`` (e.g. ``rembg`` -> ``[rembg]``)."""
|
|
47
|
+
label: str
|
|
48
|
+
"""Human-readable feature name, used in "install this extra" messages."""
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
# Only the backend-constrained features appear here. controlnet gates on onnxruntime alone: of the
|
|
52
|
+
# preprocessors hordelib exposes as horde control_types (CONTROLNET_IMAGE_PREPROCESSOR_MAP), only
|
|
53
|
+
# Openpose (DWPose) needs a blocker dep, and that dep is onnxruntime. mediapipe backs only
|
|
54
|
+
# mediapipe_face / mesh_graphormer, which are not horde control_types, so it is shipped in the
|
|
55
|
+
# `controlnet` extra for node parity but is not required to serve controlnet jobs.
|
|
56
|
+
_REQUIREMENT_SEEDS: list[FeatureRequirement] = [
|
|
57
|
+
FeatureRequirement(
|
|
58
|
+
feature=FEATURE_KIND.strip_background,
|
|
59
|
+
packages=("rembg",),
|
|
60
|
+
extra="rembg",
|
|
61
|
+
label="strip_background (background removal)",
|
|
62
|
+
),
|
|
63
|
+
FeatureRequirement(
|
|
64
|
+
feature=FEATURE_KIND.controlnet,
|
|
65
|
+
packages=("onnxruntime",),
|
|
66
|
+
extra="controlnet",
|
|
67
|
+
label="controlnet preprocessing (annotators)",
|
|
68
|
+
),
|
|
69
|
+
]
|
|
70
|
+
|
|
71
|
+
_REGISTRY: dict[FEATURE_KIND, FeatureRequirement] = {req.feature: req for req in _REQUIREMENT_SEEDS}
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
def _is_importable(package: str) -> bool:
|
|
75
|
+
"""Return whether *package* can be found in the environment, never raising.
|
|
76
|
+
|
|
77
|
+
``find_spec`` can raise (e.g. ``ModuleNotFoundError`` for a missing parent, or ``ValueError``)
|
|
78
|
+
rather than returning ``None``; for a capability probe any failure means "not available".
|
|
79
|
+
"""
|
|
80
|
+
try:
|
|
81
|
+
return importlib.util.find_spec(package) is not None
|
|
82
|
+
except (ImportError, ValueError):
|
|
83
|
+
return False
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
def get_feature_requirement_registry() -> dict[FEATURE_KIND, FeatureRequirement]:
|
|
87
|
+
"""Return the mapping of features to their optional-dependency requirements."""
|
|
88
|
+
return _REGISTRY
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
def get_feature_requirement(feature: FEATURE_KIND) -> FeatureRequirement | None:
|
|
92
|
+
"""Return the requirement for *feature*, or None when it has no optional dependency."""
|
|
93
|
+
return _REGISTRY.get(feature)
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
def missing_packages(feature: FEATURE_KIND) -> tuple[str, ...]:
|
|
97
|
+
"""Return the requirement's packages that are not importable (empty when all present)."""
|
|
98
|
+
requirement = _REGISTRY.get(feature)
|
|
99
|
+
if requirement is None:
|
|
100
|
+
return ()
|
|
101
|
+
return tuple(package for package in requirement.packages if not _is_importable(package))
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
def feature_available(feature: FEATURE_KIND) -> bool:
|
|
105
|
+
"""Return whether *feature* can run here.
|
|
106
|
+
|
|
107
|
+
A feature with no requirement entry is always available; otherwise every package its
|
|
108
|
+
requirement names must be importable.
|
|
109
|
+
"""
|
|
110
|
+
return not missing_packages(feature)
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
def available_features() -> set[FEATURE_KIND]:
|
|
114
|
+
"""Return the set of features runnable in this environment (always-available ones included)."""
|
|
115
|
+
return {feature for feature in FEATURE_KIND if feature_available(feature)}
|
|
@@ -26,6 +26,7 @@ def initialise(
|
|
|
26
26
|
disable_smart_memory: bool = False,
|
|
27
27
|
do_not_load_model_mangers: bool = True,
|
|
28
28
|
models_not_to_force_load: list[str] | None = None,
|
|
29
|
+
reference_offline: bool | None = None,
|
|
29
30
|
):
|
|
30
31
|
"""Initialise hordelib. This is required before using any other hordelib functions.
|
|
31
32
|
|
|
@@ -42,6 +43,9 @@ def initialise(
|
|
|
42
43
|
``KNOWN_IMAGE_GENERATION_BASELINE`` members (preferred) or raw comfy class-name fragments. \
|
|
43
44
|
**If this is `None`, the defaults are used.** If you wish to override the defaults, pass an empty list. \
|
|
44
45
|
Defaults to None.
|
|
46
|
+
reference_offline (bool | None, optional): If True, the model reference manager reads references \
|
|
47
|
+
from local disk only and never downloads them (the caller/parent process owns downloading). \
|
|
48
|
+
If None, defers to ``HORDE_MODEL_REFERENCE_OFFLINE``. Defaults to None.
|
|
45
49
|
"""
|
|
46
50
|
global _is_initialised
|
|
47
51
|
|
|
@@ -83,6 +87,12 @@ def initialise(
|
|
|
83
87
|
# Modify python path to include comfyui
|
|
84
88
|
set_system_path()
|
|
85
89
|
|
|
90
|
+
# Fail fast (before ComfyUI imports torch) when the installed torch/torchvision (or a hand-installed
|
|
91
|
+
# torchaudio) were built for different CUDA/CPU backends, with a message that names the fix.
|
|
92
|
+
from hordelib.utils.torch_build import verify_torch_build_consistency
|
|
93
|
+
|
|
94
|
+
verify_torch_build_consistency()
|
|
95
|
+
|
|
86
96
|
import hordelib.comfy_horde
|
|
87
97
|
|
|
88
98
|
hordelib.comfy_horde.do_comfy_import(
|
|
@@ -116,6 +126,9 @@ def initialise(
|
|
|
116
126
|
# Initialise model manager
|
|
117
127
|
from hordelib.shared_model_manager import SharedModelManager
|
|
118
128
|
|
|
129
|
+
if reference_offline is not None:
|
|
130
|
+
SharedModelManager._reference_offline = reference_offline
|
|
131
|
+
|
|
119
132
|
SharedModelManager(do_not_load_model_mangers=do_not_load_model_mangers)
|
|
120
133
|
|
|
121
134
|
sys.argv = sys_arg_bkp
|
|
@@ -24,16 +24,24 @@ def _run_git(args: list[str], cwd: Path) -> str:
|
|
|
24
24
|
"""Run a git command, returning stripped stdout.
|
|
25
25
|
|
|
26
26
|
Raises:
|
|
27
|
-
GitCommandError: If git exits non-zero.
|
|
27
|
+
GitCommandError: If git is not installed/on PATH, or exits non-zero.
|
|
28
28
|
"""
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
29
|
+
try:
|
|
30
|
+
result = subprocess.run(
|
|
31
|
+
["git", *args],
|
|
32
|
+
cwd=str(cwd),
|
|
33
|
+
text=True,
|
|
34
|
+
capture_output=True,
|
|
35
|
+
encoding="utf-8",
|
|
36
|
+
errors="replace",
|
|
37
|
+
)
|
|
38
|
+
except FileNotFoundError as exc:
|
|
39
|
+
# A bare-name "git" that the OS cannot find raises FileNotFoundError, not a non-zero exit. Turn it
|
|
40
|
+
# into the same actionable error all callers already handle, naming why git is needed.
|
|
41
|
+
raise GitCommandError(
|
|
42
|
+
"git was not found on PATH. hordelib needs git to fetch and pin ComfyUI and its custom nodes; "
|
|
43
|
+
"install git (https://git-scm.com/downloads) and make sure it is on PATH, then retry.",
|
|
44
|
+
) from exc
|
|
37
45
|
if result.returncode != 0:
|
|
38
46
|
raise GitCommandError(f"git {' '.join(args)} failed in {cwd}: {result.stderr.strip()}")
|
|
39
47
|
return result.stdout.strip()
|
|
@@ -175,7 +175,8 @@ class FaceRestoreCFWithModel:
|
|
|
175
175
|
output = facerestore_model(cropped_face_t, w=codeformer_fidelity)[0]
|
|
176
176
|
restored_face = tensor2img(output, rgb2bgr=True, min_max=(-1, 1))
|
|
177
177
|
del output
|
|
178
|
-
torch.cuda.
|
|
178
|
+
if torch.cuda.is_available():
|
|
179
|
+
torch.cuda.empty_cache()
|
|
179
180
|
except Exception as error:
|
|
180
181
|
print(f"\tFailed inference for CodeFormer: {error}", file=sys.stderr)
|
|
181
182
|
restored_face = tensor2img(cropped_face_t, rgb2bgr=True, min_max=(-1, 1))
|
|
@@ -221,7 +221,8 @@ class RealESRGANer:
|
|
|
221
221
|
if img_mode == "L":
|
|
222
222
|
output_img = cv2.cvtColor(output_img, cv2.COLOR_BGR2GRAY)
|
|
223
223
|
del output_img_t
|
|
224
|
-
torch.cuda.
|
|
224
|
+
if torch.cuda.is_available():
|
|
225
|
+
torch.cuda.empty_cache()
|
|
225
226
|
except RuntimeError as error:
|
|
226
227
|
output_img = cv2.resize(
|
|
227
228
|
self.img_pre_pad,
|
|
@@ -5,14 +5,6 @@ from pydantic import BaseModel, ConfigDict
|
|
|
5
5
|
|
|
6
6
|
from hordelib.pipeline.patches import ResolvedLora
|
|
7
7
|
|
|
8
|
-
FLUX_BASELINES = frozenset(
|
|
9
|
-
{
|
|
10
|
-
KNOWN_IMAGE_GENERATION_BASELINE.flux_1,
|
|
11
|
-
KNOWN_IMAGE_GENERATION_BASELINE.flux_schnell,
|
|
12
|
-
KNOWN_IMAGE_GENERATION_BASELINE.flux_dev,
|
|
13
|
-
},
|
|
14
|
-
)
|
|
15
|
-
|
|
16
8
|
|
|
17
9
|
class PostProcessingContext(BaseModel):
|
|
18
10
|
"""Resolved facts for a post-processing payload: where the model lives on disk.
|
|
@@ -48,15 +40,3 @@ class ModelContext(BaseModel):
|
|
|
48
40
|
"""LoRAs that have been validated/downloaded, in application order."""
|
|
49
41
|
will_load_loras: bool = False
|
|
50
42
|
"""Whether the model loader should prepare for LoRA application."""
|
|
51
|
-
|
|
52
|
-
@property
|
|
53
|
-
def is_flux(self) -> bool:
|
|
54
|
-
return self.baseline in FLUX_BASELINES
|
|
55
|
-
|
|
56
|
-
@property
|
|
57
|
-
def is_cascade(self) -> bool:
|
|
58
|
-
return self.baseline == KNOWN_IMAGE_GENERATION_BASELINE.stable_cascade
|
|
59
|
-
|
|
60
|
-
@property
|
|
61
|
-
def is_qwen(self) -> bool:
|
|
62
|
-
return self.baseline == KNOWN_IMAGE_GENERATION_BASELINE.qwen_image
|