Files
2024-05-15 08:09:49 +08:00

3.2 KiB

Documentation

FreeU节点旨在通过对其输出块应用补丁来修改给定模型的行为。它调整模型中间表示的规模和偏移参数,增强模型在特定任务上的性能。

Input types

Required

  • model
    • 模型参数至关重要,因为它定义了FreeU节点将应用其补丁的基础模型。这是节点操作的主要输入,以实现所需的修改。
    • Comfy dtype: MODEL
    • Python dtype: torch.nn.Module
  • b1
    • b1参数是一个缩放因子,影响模型通道的前一半。它在节点调整模型输出的能力中起着关键作用。
    • Comfy dtype: FLOAT
    • Python dtype: float
  • b2
    • b2参数是另一个缩放因子,影响模型通道的第二季度。它有助于微调模型的行为。
    • Comfy dtype: FLOAT
    • Python dtype: float
  • s1
    • s1参数定义了在缩放后应用于模型通道前一半的偏移量。它是节点修改模型输出功能的核心部分。
    • Comfy dtype: FLOAT
    • Python dtype: float
  • s2
    • s2参数指定了模型通道第二季度的偏移量,进一步定制模型的输出以满足特定要求。
    • Comfy dtype: FLOAT
    • Python dtype: float

Output types

  • modified_model
    • modified_model输出是将FreeU节点的补丁应用于输入模型的结果。它代表了具有调整参数的增强模型。
    • Comfy dtype: MODEL
    • Python dtype: torch.nn.Module

Usage tips

  • Infra type: GPU

Source code

class FreeU:

    @classmethod
    def INPUT_TYPES(s):
        return {'required': {'model': ('MODEL',), 'b1': ('FLOAT', {'default': 1.1, 'min': 0.0, 'max': 10.0, 'step': 0.01}), 'b2': ('FLOAT', {'default': 1.2, 'min': 0.0, 'max': 10.0, 'step': 0.01}), 's1': ('FLOAT', {'default': 0.9, 'min': 0.0, 'max': 10.0, 'step': 0.01}), 's2': ('FLOAT', {'default': 0.2, 'min': 0.0, 'max': 10.0, 'step': 0.01})}}
    RETURN_TYPES = ('MODEL',)
    FUNCTION = 'patch'
    CATEGORY = 'model_patches'

    def patch(self, model, b1, b2, s1, s2):
        model_channels = model.model.model_config.unet_config['model_channels']
        scale_dict = {model_channels * 4: (b1, s1), model_channels * 2: (b2, s2)}
        on_cpu_devices = {}

        def output_block_patch(h, hsp, transformer_options):
            scale = scale_dict.get(h.shape[1], None)
            if scale is not None:
                h[:, :h.shape[1] // 2] = h[:, :h.shape[1] // 2] * scale[0]
                if hsp.device not in on_cpu_devices:
                    try:
                        hsp = Fourier_filter(hsp, threshold=1, scale=scale[1])
                    except:
                        logging.warning('Device {} does not support the torch.fft functions used in the FreeU node, switching to CPU.'.format(hsp.device))
                        on_cpu_devices[hsp.device] = True
                        hsp = Fourier_filter(hsp.cpu(), threshold=1, scale=scale[1]).to(hsp.device)
                else:
                    hsp = Fourier_filter(hsp.cpu(), threshold=1, scale=scale[1]).to(hsp.device)
            return (h, hsp)
        m = model.clone()
        m.set_model_output_block_patch(output_block_patch)
        return (m,)