ComfyUI 源代码阅读:步伐启动

打印 上一主题 下一主题

主题 1518|帖子 1518|积分 4554

近期打仗 AIGC 方面的内容,项目中用到 ComfyUI 这个组件,这个系列文章主要是阅读 ComfyUI 的源代码,实验分析主要的实行流程。
启动参数

ComfyUI 支持的启动下令比力多,在启动前会先剖析启动参数,详细的启动参数和分析整理如下:

步伐启动流程


主要的启动流程就如上图所示,我们分成不同的模块来详细的分析:
实行启动前的脚本

ComfyUI 启动时会扫描 models 文件夹和 custom_nodes 文件夹,将文件名和路径、文件扩展类型的映射存储在全局变量 folder_names_and_paths 中。
启动前从这个变量中查询到 custom_nodes 的节点路径,找到自定义节点中的前置启动脚本:prestartup_script.py。通过动态加载实行这个脚本文件,并且保存实行信息。
配置 cuda

启动流程的第二步,会设置三个cuda相关的配置:

  • CUDA_VISIBLE_DEVICES:为当前的实例绑定一个指定的 cuda 装备,通常是一个数字。
  • CUBLAS_WORKSPACE_CONFIG:用于配置NVIDIA的cuBLAS库。cuBLAS库是一个GPU-accelerated的基础线性代数库,用于在NVIDIA的CUDA平台上进行高性能的矩阵运算。CUBLAS_WORKSPACE_CONFIG的值用于控制cuBLAS库的工作空间配置。它的值是一个由两部门组成的字符串,格式为"minimumSize:maximumSize",其中minimumSize和maximumSize都是以字节为单位的整数。这里会默认设置成 4096字节,即4KB。
  • PYTORCH_CUDA_ALLOC_CONF:设置 cudaMallocAsync,启用异步分配显存的本领,进步GPU内存分配的效率。
创建 http 服务和任务队列

ComfyUI 中封装了一个类用来表示整个http服务,包括两种类型的参数:

  • web 相关:MIME、中心件(权限、cors等)、最大上传大小、前端文件、路由链接。
  • 任务实行相关:任务队列、事故循环、异步消息队列,任务数、最后运行的节点id、客户端的id。
创建的过程就是创建一个 PromptServer 的类,初始化上面的两种类型的参数。任务队列是另一个类 PromptQueue,主要包含的都是任务相关的参数。
从外部文件加载模型路径

ComfyUI 是支持复用 webUI 的模型的,实现的方式即通过一个配置文件:extra_model_paths.yaml 来实现,假如在该配置文件中定义了 webUI 模型的路径,ComfyUI 在启动时会将这些路径添加到前面提到的全局变量 folder_names_and_paths 中。
  1. #config for a1111 ui  
  2. #all you have to do is change the base_path to where yours is installed  
  3. a111:  
  4.     base_path: path/to/stable-diffusion-webui/  
  5.   
  6.     checkpoints: models/Stable-diffusion  
  7.     configs: models/Stable-diffusion  
  8.     vae: models/VAE  
  9.     loras: |  
  10.          models/Lora  
  11.          models/LyCORIS  
  12.     upscale_models: |  
  13.                   models/ESRGAN  
  14.                   models/RealESRGAN  
  15.                   models/SwinIR  
  16.     embeddings: embeddings  
  17.     hypernetworks: models/hypernetworks  
  18.     controlnet: models/ControlNet
复制代码
初始化自定义节点

节点的泉源有三种:

  • comfyui 自带的基础节点,实现在 nodes.py 文件中。
  • 从 comfy_extras 文件夹中以 nodes_xxx 开头的文件加载的节点,这部门属于 comfyui 支持一些新特性添加的默认实现,比方 flux,sd3等
  • 外部的节点,从 custom_nodes 文件夹加载,主要是开源的一些节点,比方 comfyui-manager 等
初始化自定义节点就是将定义在 comfy_extras 文件夹和 custom_nodes 文件夹的节点通过动态加载的方式加载到内存中,并将它们添加到 NODE_CLASS_MAPPINGS 表和NODE_DISPLAY_NAME_MAPPINGS 表中。
启动worker消费任务

这一步会创建并启动一个新的守护线程,这个线程将实行prompt_worker函数,函数的参数是q和server。 worker 中详细的消费逻辑,我们将在下一部门的内容中详细分析。
启动服务

ComfyUI 的 HTTP 服务是使用 aiohttp 库实现的,它是基于 Python 的 asyncio 库,可以用于处置惩罚并发的 HTTP 请求。
HTTP 服务启动时会启动两个协程,一个是启动 HTTP 服务,另一个是用于监听异步消息队列,并发送消息,实现 websocket 服务中的消息交互本领。
小结

那么到这里 ComfyUI 主要启动流程我们已经分析完毕了,从启动的代码可以发现,ComfyUI 的代码非常简洁,大量运用Python动态加载库来实现代码的动态加载,实现自定义节点的插件体系,方便扩展。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

张国伟

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表