一、说明
ComfyUI是一个开源的、基于节点的Web应用。它允许用户根据一系列文本提示(Prompt)生成图像。
ComfyUI使用扩散模型作为基础模型,并结合 ControlNet、Lora和LCM低阶自适应等模型,每个工具都由程序中的一个节点表示
二、开发环境搭建
1、创建云环境

2、下载源码
git clone https://github.com/comfyanonymous/ComfyUI.git
cd ComfuUI
#重要目录说明
SD权重路径默认为:
models/checkpoints
VAE文件路径默认为:
models/vae
插件路径默认为:
custom_nodes
3、安装插件管理器ComfyUI-Manager
cd costum_nodes
git clone https://github.com/ltdrdata/ComfyUI-Manager.git
4、创造虚拟环境
conda create -n comfyui python=3.10
conda activate comfyui
# torch
pip install --pre torch torchvision torchaudio --index-url https://download.pytorch.org/whl/nightly/cu121
conda install -c conda-forge ffmpeg=6.1
pip install -r requirements.txt
5、修改 ComfyUI/app/user_manager.py 文件
发现问题主要是不能保存

# 在最后添加,注意格式
@routes.post("/userdata/{dir}/{file}")
async def post_userdata_1(request):
logging.info(f"post_userdata_1 request: {request}")
path = get_user_data_workfolows_path(request)
logging.info(f"post_userdata_1 path: {path}")
if not isinstance(path, str):
return path
overwrite = request.query.get("overwrite", 'true') != "false"
full_info = request.query.get('full_info', 'false').lower() == "true"
if not overwrite and os.path.exists(path):
return web.Response(status=409, text="File already exists")
body = await request.read()
with open(path, "wb") as f:
f.write(body)
user_path = self.get_request_user_filepath(request, None)
if full_info:
resp = get_file_info(path, user_path)
else:
resp = os.path.relpath(path, user_path)
return web.json_response(resp)
@routes.get("/userdata/{dir}/{file}")
async def getuserdata_1(request):
path = get_user_data_workfolows_path(request)
if not isinstance(path, str):
return path
return web.FileResponse(path)
@routes.delete("/userdata/{dir}/{file}")
async def delete_userdata_1(request):
path = get_user_data_workfolows_path(request, check_exists=True)
if not isinstance(path, str):
return path
os.remove(path)
return web.Response(status=204)
@routes.post("/userdata/{dir}/{file}/move/{dir_}/{dest}")
async def move_userdata_1(request):
"""
Move or rename a user data file.
"""
source = get_user_data_workfolows_path(request, check_exists=True)
if not isinstance(source, str):
return source
dest = get_user_data_workfolows_path(request, check_exists=False, param="dest")
if not isinstance(source, str):
return dest
overwrite = request.query.get("overwrite", 'true') != "false"
full_info = request.query.get('full_info', 'false').lower() == "true"
if not overwrite and os.path.exists(dest):
return web.Response(status=409, text="File already exists")
logging.info(f"moving '{source}' -> '{dest}'")
shutil.move(source, dest)
user_path = self.get_request_user_filepath(request, None)
if full_info:
resp = get_file_info(dest, user_path)
else:
resp = os.path.relpath(dest, user_path)
return web.json_response(resp)
6、运行
python main.py --listen 0.0.0.0
参数解析
--listen:是否进本地可访问
--port:服务的端口 默认8188
--preview-method auto:开启预览VAE解码前的图像
三、配置 && Debug
修改模型文件的路径
#将
extra_model_paths.yaml.example
重命名为extra_model_paths.yaml
以启用该文件cp extra_model_paths.yaml.example extra_model_paths.yaml
#然后修改文件中的
base_paths
并设置为stablediffusion-webui
的项目路径。路径为/workspace/
stablediffusion-webui/
四、安装插件
第一个

第二个
