Commit Graph
197 Commits
Author SHA1 Message Date
John Pollock 6f5c4aa901 Preparing for 2.2.0 release (byte and ratio model allocation schemes) 2025-08-26 14:42:25 -05:00
John Pollock baa31a1961 refactor(distorch): Default unassigned tensor blocks to CPU
Change the fallback assignment for tensor blocks that do not fit within any donor device's memory quota. These blocks are now assigned to the CPU instead of the primary compute device.

This prevents potential VRAM Out-Of-Memory errors on the main GPU, improving the stability of the model loading process, especially under tight memory constraints.

Additionally, the allocation log is now updated to include all available system devices, even those with zero allocation, to provide a more comprehensive report.
2025-08-26 14:08:30 -05:00
John Pollock 40cccdf01d Refactor: Improve DisTorch2 allocation logic and robustness
This commit refactors several aspects of the DisTorch2 device allocation logic to make it more robust, predictable, and easier to debug.

Key changes:
- Rework the byte-based allocation string parser (`calculate_fraction_from_byte_expert_string`). The new implementation correctly respects the user-defined device order and more cleanly handles the wildcard (`*`) for assigning remaining model parts.
-revert the "improvements" to the analyze safetensor loading routine causing it to catestrophically fail
2025-08-26 11:13:38 -05:00
John Pollock 6c2a3d5b15 feat(distorch): Improve device discovery and add CPU fallback
This commit enhances the device handling logic within `analyze_safetensor_loading` for greater robustness and better user feedback.

Key changes:
- Dynamically discovers all available devices using `get_device_list` instead of only using devices from the allocation string. This prevents potential `KeyError` crashes when analyzing devices that are not part of the distribution plan.
- Changes the fallback device for unallocated model blocks from the primary compute device to the CPU. This is a safer default that prevents unexpectedly overloading the main GPU.
- Adds a warning log when a block falls back to the CPU, alerting the user to a possible misconfiguration in their allocation string.
2025-08-26 09:01:03 -05:00
John Pollock 5643a616e5 docs: Clarify CPU is default wildcard in Expert Mode
Update the "Bytes" mode documentation in the README to specify that the CPU acts as the default wildcard device.

This change clarifies that if no `*` is explicitly used in the device allocation string, the remainder of the model will be automatically assigned to the CPU. This helps users better understand the default behavior and prevent confusion.
2025-08-26 07:36:47 -05:00
John Pollock 4fd2456ed5 docs: Add 'bytes' and 'ratio' expert modes to README
Update the documentation to include the new 'bytes' and 'ratio' expert modes for model allocation.

These new modes provide more intuitive, model-driven ways for users to control how models are split across multiple devices.

- Adds 'bytes' mode for direct allocation in GB/MB, similar to Huggingface's `device_map`.
- Adds 'ratio' mode for proportional splitting, inspired by llama.cpp.
- Rebrands the original expert mode as 'fraction' mode for clarity.
- Provides clear examples for all three expert modes.
2025-08-26 07:28:58 -05:00
John Pollock 56b8dd233e feat: Add byte-based model allocation mode
Introduces a new expert allocation mode allowing users to define model distribution using absolute memory values (e.g., "8g", "512m"). This provides more direct and predictable control over how a model is split across devices compared to the percentage-based method.

The new allocation string format is `device,size;device,size;...`, for example: `"cuda:0,8g;cuda:1,4g;cpu*,2g"`.

Key features:
- A wildcard `*` designates a device to receive any remaining unallocated model parts.
- If requested allocations exceed the model size, they are pro-rated down.
- A new `parse_memory_string` utility handles flexible memory unit parsing (g, m, k, b).

Additionally, the device allocation summary table has been improved to be more descriptive, now showing total VRAM, percentage of device VRAM used, absolute model GB allocated, and the model distribution percentage.
2025-08-26 06:45:55 -05:00
John Pollock c58ffaeb05 introduces calculate_fraction_from_ratio_expert_string to correctly handle the 'ratio' allocation mode. This function translates a user-provided model-split ratio (e.g., '75% on GPU, 25% on CPU') into the device VRAM fractions required by the internal allocation system, aligning the feature's behavior with user expectations. 2025-08-26 01:29:24 -05:00
John Pollock b351c5dbc3 feat: Detect and log VRAM allocation mode 2025-08-26 00:14:37 -05:00
John Pollock 07df43b863 reverting disaster commit adding back in as an altenate file for reference to at least attempt salvage of what I was attempting to build before it getting butchered by incapable assistants. 2025-08-25 23:26:19 -05:00
John Pollock f88a2fca8d parking this total piece of garbage. 2025-08-25 22:23:20 -05:00
John Pollock f656195653 feat: Add expert implementation of distorch_2 2025-08-25 21:03:07 -05:00
John Pollock b6d3403b71 Add memory parsing and flexible allocation support for safetensor loading 2025-08-25 19:57:55 -05:00
John Pollock 47ed1bed69 Reference file no longer needed. 2025-08-24 06:05:18 -05:00
John Pollock de00faaa3d Fixes for DisTorch V2 LoRA loading as well as sticky allocations when using standard loader 2025-08-24 06:01:07 -05:00
John Pollock 842ee650ed Optimize DisTorchV2 loader and FP8 casting logic
- Remove redundant logging and counters in safetensor model patcher
- Add model original dtype detection for better precision handling
- Streamline FP8 casting conditions and remove verbose debug logs
- Improve static allocation parsing and device assignment flow
2025-08-24 05:58:07 -05:00
John Pollock afd8fecd94 Refactor DisTorch model patching logic for improved device assignment and FP8 casting 2025-08-24 05:37:04 -05:00
John Pollock 4367c892d8 Eliminate unused safetensor loading analysis method and update example configurations, adding one with LoRAs as one of the tested configurations to avoid the issue seen during initial release. 2025-08-24 04:29:32 -05:00
John Pollock e28b040cda Refactor DisTorchV2 loader to support both on-device (to avoid tensor mis-match on some models, but much slower patching) and on-compute (faster, highest fidelity for the combination of [fp8 model/LoRAs/store-on-CPU]) 2025-08-24 04:13:01 -05:00
John Pollock dfe6612880 Refactor safetensor loading logic and standardize logging
- Remove redundant references to GGUF patterns in comments for clarity
- Update logging prefixes from '[MULTIGPU_DISTORCHV2]' to '[MultiGPU_DisTorch2]' for consistency
- Reorganize code in `register_patched_safetensor_modelpatcher` to streamline allocation checks and device assignments
2025-08-24 01:20:13 -05:00
John Pollock 2331710c50 Enhance partially_load with fallback and reduced logging
- Add force_patch_weights parameter to new_partially_load signature for better control
- Implement check for _distorch_high_precision_loras with fallback to original loading behavior
- Include cleanup for _distorch_block_assignments attribute
- Comment out debug logging statements to minimize noise during execution
2025-08-23 14:31:32 -05:00
John Pollock 543a0dc1eb patching logic from model_patcher load 2025-08-23 10:06:54 -05:00
John Pollock 956bd3bfa0 Enhance partially_load with weight unpatching and static assignments
Add logic to detect and unpatch weights for modules with comfy_cast_weights, introduce memory and patch counters, and integrate static device assignments from analyze_safetensor_loading to improve distributed safetensor loading efficiency.
2025-08-23 09:09:31 -05:00
John Pollock 240acae8c5 Simplify safetensor loading analysis and device assignment (from lowvram branch)
Remove redundant comments and simplify compute device determination by importing and using `current_device` directly, improving code readability and streamlining the analysis logic for better efficiency in model allocation handling.
2025-08-23 01:48:02 -05:00
John Pollock 6195ed24c6 Refactor memory analysis to use ComfyUI's _load_list method (from lowvram_fix branch)
Simplify the analyze_safetensor_loading function by replacing manual model module iteration with ComfyUI's built-in _load_list() for calculating total memory and building block lists. This improves efficiency, reduces redundant code, and enhances compatibility with ComfyUI's internal mechanisms while maintaining accurate memory reporting and threshold filtering.
2025-08-23 01:13:06 -05:00
John Pollock 299c087a84 Pulling in deciding block allocation based on Comfy's own model_patcher._load_list().sort(reverse=True) for offload suitibility 2025-08-22 21:57:07 -05:00
John Pollock db697f1ccb Updating allocation logic based on exact placement and not the DistorchV1 methodology of CPU overrun. From lowvram_fix branch. 2025-08-22 21:50:09 -05:00
John Pollock d205f4da9e Adding improvements/updates to override_class_with_distorch_safetensor_v2 from previous partially_load development branch 2025-08-22 21:45:35 -05:00
John Pollock d0c4cd26fb Sync with main from last branch 2025-08-22 21:34:34 -05:00
John Pollock 24510c34ef Pulling in the work on new_load as reference for partially_load implementation 2025-08-22 21:24:08 -05:00
John Pollock 6e4181a7bb Refactor: Remove debugging and memory audit utilities
This commit removes several utility modules used for debugging, memory inspection, and hardware information gathering. These tools are no longer required and their removal simplifies the codebase.

The following files have been deleted:
- `debug_utils.py`
- `device_memory_audit.py`
- `hardware_info.py`
- `model_sig.py`

Additionally, the call to log memory usage on startup has been removed from `__init__.py`.
2025-08-15 08:25:18 -05:00
John Pollock ddd159ef23 docs: Clarify GGUF performance gain comparison in README
Update the README to specify that the "up to 10% faster GGUF inference" claim for DisTorch2 is a direct comparison against the previous DisTorch V1 implementation.

This clarification helps manage user expectations and provides a more accurate performance context.
2025-08-15 06:13:34 -05:00
John Pollock 9838f2cc04 Fixed some confusing text 2025-08-15 05:19:15 -05:00
John Pollock 148f74c503 Update documentation to reflect DisTorch V2 2025-08-15 05:07:00 -05:00
John Pollock 291a4a4572 feat: Add support for Apple MPS devices
Update the `get_device_list` function to detect and include the 'mps' (Metal Performance Shaders) backend if it's available through PyTorch.

This allows users on Apple Silicon hardware to see and select their GPU for accelerated computations.
2025-08-14 12:58:34 -05:00
John Pollock 545da7f741 Refactor: Reorganize and update example workflows
This commit introduces a major reorganization of the `examples` directory to improve clarity and discoverability. Workflows are now grouped into subdirectories based on the features they demonstrate (e.g., `distorch`, `distorch2`, `gguf`, `multiGPU`).

Key changes:
- Moved existing example JSON files into new categorized folders.
- Added several new and updated workflows, particularly for DisTorch2.
- Removed outdated or redundant example files.
- Renamed an internal function from `..._gguf_v2` to `..._safetensor_v2` to better reflect its broader functionality in DisTorch2.
2025-08-14 12:45:15 -05:00
John Pollock d1c88a7cdb feat(distorch): Add universal .safetensors support & memory-based distribution
This commit introduces DisTorch v2.0.0, a major overhaul that extends multi-device model distribution to standard `.safetensors` models.

Key changes include:

- **Universal `.safetensors` Support:** The core distribution logic is no longer limited to GGUF models. It now fully supports `.safetensors`, allowing any UNet supported by native Comfy loaders to have its layers distributed across multiple devices (GPUs and CPU/RAM).
2025-08-14 08:17:15 -05:00
John Pollock fb6e2e6ffa refactor(distorch): Implement IS_CHANGED for robust model reloading
This commit refactors the model loading logic to properly integrate with ComfyUI's caching system.

- Implemented the `IS_CHANGED` class method, which creates a hash of the DisTorch-specific settings (e.g., `compute_device`, `virtual_vram_gb`).
- This allows ComfyUI to automatically detect when settings have changed and trigger a model reload, invalidating the cache correctly.
- Removed the previous manual and less reliable logic for unloading and reloading the model from within the `override` function.
- Set the default log level to "Engineering" to provide more detailed output during development.
2025-08-13 16:27:02 -05:00
John Pollock e288152dae refactor: Introduce DisTorch V2 architecture
This commit introduces a major architectural refactoring, laying the groundwork for DisTorch V2. The changes focus on improving modularity, memory management, and diagnostics.

Key changes include:
- Renaming `distorch_safetensor.py` to `distorch_2.py` to house the new core logic.
- Deleting the legacy `block_swap.py` module.
- Adding `device_memory_audit.py` for more sophisticated analysis of GPU memory usage.
- Implementing a centralized and configurable logging system in `__init__.py` to provide standardized and level-controlled (DEBUG/INFO) output for better debugging.
2025-08-13 13:37:23 -05:00
John Pollock d5dc678c04 Add FLUX support with new safetensor v2 implementation
- Add distorch_safetensor.py module with safetensor allocation and model hashing utilities
- Update all DisTorch2 nodes to use new override_class_with_distorch_safetensor_v2
- Add FLUX-specific DisTorch2 nodes for checkpoint and UNET loading
- Import new safetensor functions for VRAM allocation analysis and model patching
2025-08-12 20:16:29 -05:00
John Pollock 298b4b829b Parking code. A new tack is needed. 2025-08-12 12:06:19 -05:00
John Pollock 235cd267bf feat(swap): Add shell-based block swapping for WanVideo models
This commit introduces a new block swapping mechanism specifically for WanVideo models to enable running them on GPUs with limited VRAM.

A new `WanVideoBlockSwapManager` is implemented which uses a pre-allocation or "shell" strategy. Instead of moving entire blocks between CPU and GPU, this approach:
1.  Pre-allocates a single "shell" block on the GPU, sized to match the largest block in the model.
2.  Offloads designated model blocks to the CPU.
3.  Patches the `forward` method of these offloaded blocks.
4.  During inference, the patched method copies the weights (`state_dict`) from the CPU block into the GPU shell just before execution.

This method avoids the overhead of allocating and deallocating GPU memory for each block, reducing memory fragmentation and potentially improving performance and or corruption copying potentially modified blocks back to the swap space.
2025-08-11 23:41:51 -05:00
John Pollock 6cb71ac51c feat(swap): Add block swap support for Qwen models
This commit introduces block swapping functionality for Qwen models, enabling them to run on systems with limited VRAM by offloading layers to a swap device (e.g., CPU RAM).

Key changes:
- A new `QwenBlockSwapManager` class is implemented to handle the patching of Qwen transformer blocks.
- The `apply_block_swap` function is extended to detect Qwen models and apply the swapping logic to their `transformer_blocks`.
- A model signature for Qwen is added to `model_sig.py` to correctly identify the swappable modules.
- A new diagnostic function, `log_unsupported_model_analysis`, is added to log the structure of unsupported models, aiding future development.
2025-08-11 20:45:25 -05:00
John Pollock 04b5bb0a6f refactor: Enhance block swap memory analysis report
The memory analysis function, `analyze_safetensor_distorch`, has been improved to provide a more accurate and detailed report.

Instead of estimating the number of swapped blocks based on an average size, the function now receives the actual list of blocks being swapped. It generates a per-block table detailing each block's ID, type, size, and its final assignment (COMPUTE or SWAP).

This provides users with a precise breakdown of the memory offload, reflecting the actual state of the model rather than a theoretical calculation.

Additionally, the unused `log_memory_usage` helper function has been removed.
2025-08-11 19:19:58 -05:00
John Pollock bde78780da Flux block swap manager, self contained for now. We'll do the same for wanvideo and qwen then re-evaluate point-solutions and opportunities to synergize 2025-08-11 17:09:30 -05:00
John Pollock d666205fd9 Refactor: Overhaul BlockSwap with hook-based manager
This commit completely rewrites the block swapping implementation for improved stability, correctness, and code structure.

Key changes:
- Replaces the fragile monkey-patching of the `forward` method with the standard PyTorch `register_forward_pre_hook`.
- Introduces a `BlockSwapManager` class to encapsulate all swapping logic, separating it from the ComfyUI node.
- Implements a "Sequential Swapping" strategy: the previously active block is offloaded before the current block is loaded, ensuring only one block is on the active device at a time.
- Adds a `cleanup` method to properly remove hooks after execution, preventing state leakage between runs.
- Fixes a critical bug where the hook signature was incorrect.
- Adds a memory logging utility for easier debugging.
2025-08-11 14:28:20 -05:00
John Pollock 62718ea12f Refactor: Simplify block swap analysis and cleanup .gitignore
This commit removes the unused `reserved_swap_gb` parameter from the `analyze_safetensor_distorch` function and its call sites. This simplifies the function's signature and cleans up the analysis output by removing the "Reserve" metric, which was always zero.

Additionally, the `.gitignore` file is simplified by removing entries for the `binaries/` directory, which are no longer needed.
2025-08-11 12:47:25 -05:00
John Pollock 372217e901 fixing inconsistent variable naming choices and defaults 2025-08-11 12:25:46 -05:00
John Pollock a70ce10960 Replace block-swap-v3 with aa49ad11 2025-08-11 09:45:26 -05:00
John Pollock 02b02629ba More garbage 2025-08-10 22:34:05 -05:00