在win10上配置CATVTON节点遇到以下问题:
1、detectron2 编译反复失败;
detectron编译安装可以参考知乎大佬nemonemone的文章:
主要需要关注两个点:
- 需要从Git上拉取detectron2的包进行编译,而不是从python的pip直接进行安装;
- 需要修改若干处源代码,使编译可以正常进行;
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模块: