8
DCU技术达人
新人贴
在海光DCU上跑AI绘画:ComfyUI从环境搭建到出图的完整踩坑记录
2026-09-28 18:12:37
43
# 在海光DCU上跑AI绘画:ComfyUI从环境搭建到出图的完整踩坑记录 > 网上搜"DCU 大模型部署"能搜到一堆,但搜"DCU AI绘画"基本空白。组里有张K100闲着,我花了一个周末把ComfyUI搬上去了,中间踩了不少坑。这篇记录从装环境到出第一张图的全过程,给想在国产卡上玩SD的人省点时间。 ## 为什么要在DCU上跑AI绘画 先说动机。不是因为DCU跑AI绘画有多强,而是因为卡闲着也是闲着。K100 32GB HBM2,显存比消费级显卡大,跑SDXL甚至Flux都不费劲,就是软件生态得自己折腾。 目标很明确:在K100上跑通ComfyUI,能出图,速度能接受就行。不追求极致性能,先解决有没有的问题。 ## 第一步:装环境,PyTorch ROCm是关键 ComfyUI是纯PyTorch写的,理论上只要PyTorch能识别DCU,ComfyUI就能跑。但"理论上"三个字,懂的都懂。 ### DTK先装好 这个不用多说,DCU的基础环境。我用的DTK 24.04,装完确认一下: ```bash rocminfo | grep "Marketing Name" # 应该能看到你的卡型号 ``` ### PyTorch:必须用ROCm版 这里第一个坑来了。直接`pip install torch`装的是CUDA版,在DCU上根本识别不了设备,`torch.cuda.is_available()`返回False。 必须装ROCm版的PyTorch。去PyTorch官网选ROCm版本: ```bash # PyTorch 2.4 + ROCm 6.0(对应DTK 24.04) pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/rocm6.0 ``` 装完验证: ```python import torch print(torch.__version__) # 2.4.0+rocm6.0 print(torch.cuda.is_available()) # True print(torch.cuda.get_device_name()) # 你的DCU型号 ``` 看到`True`和设备名就对了。注意PyTorch在ROCm上沿用`torch.cuda`命名空间,不要被名字骗了,底层跑的是HIP。 ### 第二个坑:ROCm版本和DTK版本要对上 PyTorch的ROCm版本必须跟DTK版本匹配。DTK 24.04对应ROCm 6.0,就装`rocm6.0`的PyTorch。如果版本不匹配,会出现"能import但跑算子报错"的诡异情况。 我一开始图省事装了最新的PyTorch(rocm6.1),结果跑简单的矩阵乘都报`hipErrorNoBinaryForGpu`,降级到rocm6.0就好了。 ## 第二步:装ComfyUI,依赖问题比想象的多 环境搞定,拉ComfyUI代码: ```bash git clone https://github.com/comfyanonymous/ComfyUI.git cd ComfyUI pip install -r requirements.txt ``` 看起来顺利,但`requirements.txt`里有几个包在DCU上有问题。 ### 坑三:xFormers装不上,也不能装 ComfyUI的requirements里没有直接依赖xFormers,但很多教程会让你装。在DCU上**绝对不要装xFormers**——xFormers只支持CUDA,装了之后import就会报错,把整个环境搞坏。 ComfyUI本身不强制依赖xFormers,它会自动选择可用的attention实现。在DCU上,它会走PyTorch原生的`scaled_dot_product_attention`(SDPA),性能虽然不如xFormers的memory-efficient attention,但能用。 如果你之前不小心装了xFormers,赶紧卸掉: ```bash pip uninstall xformers -y ``` ### 坑四:某些节点依赖CUDA专属库 ComfyUI本体没问题,但如果你装自定义节点(custom nodes),有些节点依赖只支持CUDA的库,比如: - `pytorch3d`:只支持CUDA - `flash-attn`:只支持CUDA(ROCm上有社区移植版但不稳定) - `cupy`:需要从源码编译ROCm版 - `apex`:需要从源码编译ROCm版 我的建议是:**先跑通基础工作流,再慢慢加自定义节点。** 基础的文生图、图生图、ControlNet这些不需要额外依赖,都能直接跑。 ### 坑五:torchsde和一些小众包编译失败 requirements里有个`torchsde`,在某些环境下编译会失败。如果遇到,直接跳过它——ComfyUI的核心功能不依赖这个包,大部分工作流用不到。 ```bash # 手动装除了torchsde之外的依赖 pip install comfy-cli einops transformers safetensors aiohttp pyyaml Pillow numpy ``` ## 第三步:模型准备,格式通用但要注意精度 DCU上跑模型,格式跟CUDA完全一样——safetensors、ckpt、Diffusers格式都支持。把模型放到`ComfyUI/models/checkpoints/`目录下就行。 我测试了几个模型: | 模型 | 参数量 | 显存占用(FP16) | 能否运行 | | --- | --- | --- | --- | | SD 1.5 | ~4GB | ~6GB | 流畅 | | SDXL 1.0 | ~7GB | ~12GB | 流畅 | | Flux.1-schnell | ~24GB | ~28GB | 勉强(32GB显存刚好够) | | Hunyuan-DiT | ~15GB | ~20GB | 可以 | ### 关于精度的选择 DCU上跑AI绘画,**推荐用FP16**。FP32速度慢一倍,显存占用也翻倍,没必要。BF16在部分老型号DCU上支持不好(Z100的gfx906没有原生BF16计算单元,会模拟),如果是Z100建议用FP16。 K100-AI(gfx928)有BF16支持,可以用BF16省显存。 ### 关于VAE SDXL的VAE在FP16下容易出NaN(这是SDXL的老问题,不是DCU特有的)。解决办法是VAE单独用FP32跑: ```python # 在ComfyUI里,加载VAE时选择fp32版本 # 或者用命令行参数 python main.py --fp16-vae false ``` ## 第四步:启动与第一个坑——attention实现选择 启动ComfyUI: ```bash python main.py --listen 0.0.0.0 --port 8188 ``` 启动日志里注意看这一行: ``` Using pytorch cross attention ``` 如果看到这个,说明走的是PyTorch原生attention,没问题。如果看到`Using xformers`但你没装xFormers,那是缓存问题,清一下`__pycache__`。 ### 坑六:高分辨率图容易OOM DCU的显存虽然大(32GB),但SDXL生成2048×2048的图还是可能OOM。原因是attention的中间矩阵太大。 解决办法: 1. **启用分块attention**:ComfyUI有个`--attention-split`参数,把attention计算分块做,省显存但慢一点 2. **用tiled VAE**:VAE解码时分块处理,避免一次性分配大张量 3. **降低batch size**:一次只生成一张图 我的启动参数: ```bash python main.py \ --listen 0.0.0.0 \ --port 8188 \ --attention-split \ --fp16-vae false \ --preview-method auto ``` 加了`--attention-split`之后,SDXL 2048×2048在32GB显存上稳定不爆。 ## 第五步:出图了,但速度怎么样 这是大家最关心的。我在K100上测了几组数据(都是FP16,euler a采样器,20步): | 模型 | 分辨率 | 单图耗时 | 备注 | | --- | --- | --- | --- | | SD 1.5 | 512×512 | ~3秒 | 很快 | | SD 1.5 | 1024×1024 | ~8秒 | 可以 | | SDXL | 1024×1024 | ~12秒 | 够用 | | SDXL | 2048×2048 | ~45秒 | 分块attention,偏慢 | | Flux.1-schnell | 1024×1024 | ~90秒 | 4步采样,勉强可用 | 这个速度跟RTX 3090比大概慢30%~50%,但考虑到这是国产卡、32GB大显存,我觉得可以接受。批量出图的时候,大显存的优势就出来了——一次跑4张SDXL 1024×1024不爆显存。 ### 速度还能优化吗 能,但边际收益递减: 1. **用torch.compile**:PyTorch 2.x的compile功能在ROCm上能用,首次编译慢,后续能快10%~20%。但ComfyUI的动态图结构让compile不太稳定,有时候会编译失败 2. **换采样器**:DPM++ 2M Karras比Euler a快一点,质量也不错 3. **减少采样步数**:SDXL用20步跟30步差别不大,Flux-schnell本来就只要4步 4. **用LCM/Lightning模型**:少步数出图,速度翻倍,但模型选择少 我自己日常用SDXL + DPM++ 2M Karras + 20步,1024×1024大概10秒一张,完全够用。 ## 第六步:ControlNet和其他插件 基础文生图跑通后,我试了ControlNet。好消息是ControlNet的节点不依赖CUDA专属库,纯PyTorch实现,在DCU上直接能用。 把ControlNet模型放到`ComfyUI/models/controlnet/`,工作流里加载就行。Canny、Depth、OpenPose这些预处理器都是CPU跑的(用OpenCV和MediaPipe),跟DCU无关,也没问题。 IP-Adapter也能跑,同样是纯PyTorch实现。 **但要注意**:一些高级插件比如AnimateDiff(动画)、VideoHelperSuite(视频处理)可能依赖ffmpeg或其他库,这些跟DCU无关,但需要单独装。 ## 常见问题汇总 跑的过程中遇到的问题,集中列一下: **Q: `torch.cuda.is_available()`返回False** A: 没装ROCm版PyTorch,或者ROCm版本跟DTK不匹配。重新装对应版本。 **Q: 启动报`hipErrorNoBinaryForGpu: Couldn't find binary for GPU with AMD GPU arch id`** A: PyTorch编译时没有包含你的DCU架构。确认`HCC_AMDGPU_TARGET`环境变量设置正确,或者换一个支持你架构的PyTorch版本。 **Q: 生成的图是全黑的或者有彩色噪点** A: VAE的精度问题。VAE用FP32跑(`--fp16-vae false`),或者换一个VAE。 **Q: 高分辨率OOM** A: 加`--attention-split`参数,用tiled VAE,降低batch size。 **Q: 自定义节点装了之后启动报错** A: 大概率是依赖了CUDA专属库。检查节点的requirements.txt,去掉不兼容的包,或者找替代节点。 **Q: 速度特别慢,一张图要几分钟** A: 检查是不是在跑FP32(看启动日志),或者attention走了最慢的实现。确认日志里是`Using pytorch cross attention`而不是`Using naive attention`。 ## 最后 花了一个周末,从装环境到跑通SDXL、Flux、ControlNet,整体感受是:**DCU跑AI绘画完全能用,就是生态得自己搭。** 没有一键安装包,没有现成的教程,遇到问题得自己翻ROCm的issue、自己试。 但一旦跑通了,32GB HBM2显存带来的自由度是消费级显卡比不了的——SDXL批量出图、Flux单卡跑、高分辨率不爆显存,这些都是实打实的好处。
求助
基础环境
全部评论(0)
只看楼主
暂无数据
--
楼主
Level.1
0 帖子
楼主热帖
暂无数据