ComfyUI配置CATVTON节点问题

在win10上配置CATVTON节点遇到以下问题:

1、detectron2 编译反复失败;

detectron编译安装可以参考知乎大佬nemonemone的文章:

在win10上编译detectron2的坎坷路

主要需要关注两个点:

  1. 需要从Git上拉取detectron2的包进行编译,而不是从python的pip直接进行安装;
  2. 需要修改若干处源代码,使编译可以正常进行;

2、使用秋叶启动器启动的时候,依然报错:

主要有以下报错:

2.1、命令行提示找不到ninja:

raise RuntimeError("Ninja is required to load C++ extensions")
RuntimeError: Ninja is required to load C++ extensions

2.2、命令行提示distutils模块没有属性"_msvccomplier":

AttributeError: module 'distutils' has no attribute '_msvccompiler'. Did you mean: 'ccompiler'?

2.3、编译启动后提示头文件缺失等:

C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\crtdefs.h(10): fatal error C1083: 无法打开包括文件: “corecrt.h”: No such file or directory
inplace_abn_cuda.cu
ninja: build stopped: subcommand failed.

以上问题需要修改comfyui的main.py主程序来添加和完善:

在comfyui文件夹下的main.py开头添加如下代码:
 

# 添加环境变量
import subprocess
import tempfile

def run_vcvarsall():
    """运行 vcvarsall.bat 并获取设置的环境变量"""
    vcvarsall = r"C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\Build\vcvarsall.bat"
    if not os.path.exists(vcvarsall):
        print(f"Warning: {vcvarsall} not found")
        return False
        
    # 运行 vcvarsall.bat x64 并捕获环境变量
    process = subprocess.Popen(f'"{vcvarsall}" x64 && set', 
                             stdout=subprocess.PIPE, 
                             stderr=subprocess.PIPE,
                             shell=True)
    
    # 更新环境变量
    for line in process.stdout:
        line = line.decode('utf-8').strip()
        if '=' in line:
            key, value = line.split('=', 1)
            os.environ[key] = value
    
    return True


def setup_env():
    
    # 首先运行 vcvarsall.bat
    if not run_vcvarsall():
        print("Failed to initialize Visual Studio environment")
        return False

    def find_windows_sdk():
        """查找 Windows SDK 路径和最新版本"""
        sdk_root = r"C:\Program Files (x86)\Windows Kits\10"
        if not os.path.exists(sdk_root):
            sdk_root = r"C:\Program Files\Windows Kits\10"
        
        if not os.path.exists(sdk_root):
            return None, None

        include_path = os.path.join(sdk_root, 'Include')
        if not os.path.exists(include_path):
            return None, None

        # 获取最新版本
        versions = [d for d in os.listdir(include_path) if os.path.isdir(os.path.join(include_path, d))]
        if not versions:
            return None, None
            
        latest_version = max(versions)
        return sdk_root, latest_version

    sdk_root, sdk_version = find_windows_sdk()
    if not sdk_root or not sdk_version:
        print("Error: Windows SDK not found")
        return False

    # 设置 SDK 包含路径
    sdk_include_paths = [
        os.path.join(sdk_root, 'Include', sdk_version, 'ucrt'),
        os.path.join(sdk_root, 'Include', sdk_version, 'shared'),
        os.path.join(sdk_root, 'Include', sdk_version, 'um'),
        os.path.join(sdk_root, 'Include', sdk_version, 'winrt'),
    ]

    # 设置 Visual Studio 包含路径
    vs_path = r"C:\Program Files\Microsoft Visual Studio\2022\Community"
    vs_include_paths = [
        os.path.join(vs_path, 'VC', 'Tools', 'MSVC', '14.36.32532', 'include'),
        os.path.join(vs_path, 'VC', 'Tools', 'MSVC', '14.36.32532', 'atlmfc', 'include'),
    ]

    # 合并所有包含路径
    include_paths = sdk_include_paths + vs_include_paths
    
    # 设置 INCLUDE 环境变量
    os.environ['INCLUDE'] = os.pathsep.join(p for p in include_paths if os.path.exists(p))

    # 设置 LIB 环境变量
    lib_paths = [
        os.path.join(sdk_root, 'Lib', sdk_version, 'ucrt', 'x64'),
        os.path.join(sdk_root, 'Lib', sdk_version, 'um', 'x64'),
        os.path.join(vs_path, 'VC', 'Tools', 'MSVC', '14.36.32532', 'lib', 'x64'),
    ]
    os.environ['LIB'] = os.pathsep.join(p for p in lib_paths if os.path.exists(p))

    
    # 创建临时目录
    temp_dir = r"C:\temp\cuda_build"
    os.makedirs(temp_dir, exist_ok=True)
    
    # 确保目录有写入权限
    try:
        test_file = os.path.join(temp_dir, 'test.txt')
        with open(test_file, 'w') as f:
            f.write('test')
        os.remove(test_file)
        
        # 设置临时目录环境变量
        os.environ['TEMP'] = temp_dir
        os.environ['TMP'] = temp_dir
        tempfile.tempdir = temp_dir  # 设置Python的临时目录
    except Exception as e:
        print(f"Warning: Temp directory not writable: {e}")
        # 使用用户目录下的临时目录作为备选
        temp_dir = os.path.join(os.path.expanduser('~'), 'temp_cuda_build')
        os.makedirs(temp_dir, exist_ok=True)

    
    # 设置 CUDA 架构
    os.environ['TORCH_CUDA_ARCH_LIST'] = '6.0;6.1;7.0;7.5;8.0;8.6'

    # 设置 PATH,只需要添加你的 Python Scripts 目录
    python_scripts = r"D:\huanlian\python\Scripts"
    if python_scripts not in os.environ['PATH']:
        os.environ['PATH'] = python_scripts + os.pathsep + os.environ['PATH']

    # 设置CUDA环境变量
    cuda_path = r"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.1"
    os.environ['CUDA_HOME'] = cuda_path
    os.environ['CUDA_PATH'] = cuda_path
    if cuda_path not in os.environ['PATH']:
        os.environ['PATH'] = os.path.join(cuda_path, 'bin') + os.pathsep + os.environ['PATH']


def check_environment():
    """验证环境设置"""
    checks = {
        'TEMP directory': os.path.exists(os.environ['TEMP']),
        'TEMP writable': os.access(os.environ['TEMP'], os.W_OK),
        'CUDA available': os.path.exists(os.environ.get('CUDA_HOME', '')),
        'ninja': subprocess.run(['where', 'ninja'], capture_output=True).returncode == 0,
        'cl.exe': subprocess.run(['where', 'cl.exe'], capture_output=True).returncode == 0
    }
    
    for check, result in checks.items():
        print(f"{check}: {'✓' if result else '✗'}")
    
    return all(checks.values())

在main.py的后段调用以上辅助函数:

if __name__ == "__main__":
    
    # 设置启动的环境
    setup_env()
    if not check_environment():
        print("Warning: Environment setup incomplete")

通过以上步骤,可以顺利启动CATVTON模块:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值