Project Icon

runpod-worker-comfy

将ComfyUI作为无服务器API部署在RunPod平台

runpod-worker-comfy是一个将ComfyUI部署为无服务器API的开源项目。它能在RunPod平台上运行任意ComfyUI工作流,支持base64编码输入图像,可选将生成图像上传至AWS S3。项目提供三种Docker镜像,允许自定义模型和节点,基于Ubuntu和NVIDIA CUDA构建。通过RunPod API,用户可方便地与部署的端点交互,实现图像生成等功能。

runpod-worker-comfy

RunPod上作为无服务器API的ComfyUI

阅读我们的文章:https://blib.la/blog/comfyui-on-runpod

Discord

→ 也请查看Captain: AI平台



快速开始

功能

  • 运行任何ComfyUI工作流来生成图像
  • 提供base64编码字符串形式的输入图像
  • 生成的图像可以:
  • 有三种不同的Docker镜像可供选择:
    • timpietruskyblibla/runpod-worker-comfy:3.0.0-base:不包含任何内容,只是一个干净的ComfyUI
    • timpietruskyblibla/runpod-worker-comfy:3.0.0-sdxl:包含Stable Diffusion XL的检查点和VAE
    • timpietruskyblibla/runpod-worker-comfy:3.0.0-sd3:包含Stable Diffusion 3的检查点
  • 使用自己的模型
  • 基于Ubuntu + NVIDIA CUDA

配置

环境变量描述默认值
REFRESH_WORKER当您希望在每个作业完成后停止工作程序以获得干净状态时,请参阅官方文档false
COMFY_POLLING_INTERVAL_MS轮询尝试之间的等待时间(毫秒)。250
COMFY_POLLING_MAX_RETRIES最大轮询尝试次数。随着工作流运行时间的增加,应该增加此值。500
SERVE_API_LOCALLY为开发和测试启用本地API服务器。有关更多详细信息,请参阅本地测试禁用

上传图片到AWS S3

只有在您想将生成的图片上传到AWS S3时才需要这样做。如果您不配置此项,您的图像将作为base64编码字符串导出。

  • 在您选择的区域的AWS S3中创建一个存储桶(BUCKET_ENDPOINT_URL
  • 创建一个具有AWS S3访问权限的IAM
  • 为该IAM创建一个访问密钥(BUCKET_ACCESS_KEY_IDBUCKET_SECRET_ACCESS_KEY
  • 为您的RunPod工作程序配置以下环境变量:
环境变量描述示例
BUCKET_ENDPOINT_URLS3存储桶的端点URL。https://<bucket>.s3.<region>.amazonaws.com
BUCKET_ACCESS_KEY_ID用于访问S3存储桶的AWS访问密钥ID。AKIAIOSFODNN7EXAMPLE
BUCKET_SECRET_ACCESS_KEY用于访问S3存储桶的AWS秘密访问密钥。wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY

在RunPod上使用Docker镜像

  • 通过点击New Template创建一个新模板
  • 在对话框中配置:
    • 模板名称:runpod-worker-comfy(可以是任何您想要的名称)
    • 模板类型:serverless(将模板类型更改为"serverless")
    • 容器镜像:<dockerhub用户名>/<仓库名称>:标签,在这种情况下:timpietruskyblibla/runpod-worker-comfy:3.0.0-sd3(或-base用于干净镜像,或-sdxl用于Stable Diffusion XL)
    • 容器注册凭证:您可以保留所有内容不变,因为此仓库是公开的
    • 容器磁盘:20 GB
    • (可选)环境变量:配置S3
  • 点击Save Template
  • 导航到Serverless > Endpoints并点击New Endpoint
  • 在对话框中配置:
    • 端点名称:comfy
    • 选择模板:runpod-worker-comfy(或您给模板起的任何名称)
    • 活动工作程序:0(根据您的需求而定)
    • 最大工作程序:3(根据您的需求而定)
    • 空闲超时:5(您可以保留默认值)
    • 快速启动:启用(不会增加成本,但可以更快地启动我们的工作程序,这是好的)
    • (可选)高级:如果您使用网络卷,请在Select Network Volume下选择它。否则保留默认设置。
    • 选择一个有可用性的GPU
    • 每个工作程序的GPU:1
  • 点击deploy
  • 您的端点将被创建,您可以点击它查看仪表板

API规范

以下描述了在向API发送请求时存在的字段。我们只描述通过input发送的字段,因为这些字段是工作程序本身所需的。有关完整的字段列表,请查看官方文档

JSON请求体

{
  "input": {
    "workflow": {},
    "images": [
      {
        "name": "example_image_name.png",
        "image": "base64_encoded_string"
      }
    ]
  }
}

字段

字段路径类型必需描述
input对象包含请求数据的顶级对象。
input.workflow对象包含ComfyUI工作流配置。
input.images数组图像数组。每个图像将被添加到ComfyUI的"input"文件夹中,然后可以在工作流中使用其name来引用

"input.images"

一个图像数组,其中每个图像应该有不同的名称。 🚨 RunPod端点的请求体大小限制为:/run接口10 MB,/runsync接口20 MB。请确保您的输入图像不要过大,否则会被RunPod阻止。详见官方文档

字段名类型是否必需描述
name字符串图像的名称。请在工作流中使用相同的名称引用图像
image字符串图像的base64编码字符串

与RunPod API交互

  1. 生成API密钥:

    • 用户设置中,点击API Keys,然后点击API Key按钮。
    • 将生成的密钥保存在安全的地方,因为离开页面后将无法再次查看。
  2. 使用API密钥:

    • 使用cURL或其他工具,通过API密钥和端点ID访问API:
      • <api_key>替换为您的密钥。
  3. 使用您的端点:

    • <endpoint_id>替换为端点ID。(点击端点可以找到ID;它显示在端点名称下方,也是底部显示的URL的一部分。)

如何找到端点ID

健康状态

curl -H "Authorization: Bearer <api_key>" https://api.runpod.ai/v2/<endpoint_id>/health

生成图像

您可以使用/run异步创建新任务,或使用/runsync同步创建。此处示例使用同步任务,等待响应返回。

API期望此格式的JSON,其中workflow从ComfyUI导出的JSON格式工作流images是可选的。

请参考test_input.json查看API输入应该是什么样子。

使用cURL的请求示例

curl -X POST -H "Authorization: Bearer <api_key>" -H "Content-Type: application/json" -d '{"input":{"workflow":{"3":{"inputs":{"seed":1337,"steps":20,"cfg":8,"sampler_name":"euler","scheduler":"normal","denoise":1,"model":["4",0],"positive":["6",0],"negative":["7",0],"latent_image":["5",0]},"class_type":"KSampler"},"4":{"inputs":{"ckpt_name":"sd_xl_base_1.0.safetensors"},"class_type":"CheckpointLoaderSimple"},"5":{"inputs":{"width":512,"height":512,"batch_size":1},"class_type":"EmptyLatentImage"},"6":{"inputs":{"text":"beautiful scenery nature glass bottle landscape, purple galaxy bottle,","clip":["4",1]},"class_type":"CLIPTextEncode"},"7":{"inputs":{"text":"text, watermark","clip":["4",1]},"class_type":"CLIPTextEncode"},"8":{"inputs":{"samples":["3",0],"vae":["4",2]},"class_type":"VAEDecode"},"9":{"inputs":{"filename_prefix":"ComfyUI","images":["8",0]},"class_type":"SaveImage"}}}}' https://api.runpod.ai/v2/<endpoint_id>/runsync

AWS S3存储桶配置的响应示例

{
  "delayTime": 2188,
  "executionTime": 2297,
  "id": "sync-c0cd1eb2-068f-4ecf-a99a-55770fc77391-e1",
  "output": {
    "message": "https://bucket.s3.region.amazonaws.com/10-23/sync-c0cd1eb2-068f-4ecf-a99a-55770fc77391-e1/c67ad621.png",
    "status": "success"
  },
  "status": "COMPLETED"
}

base64编码图像的响应示例

{
  "delayTime": 2188,
  "executionTime": 2297,
  "id": "sync-c0cd1eb2-068f-4ecf-a99a-55770fc77391-e1",
  "output": { "message": "base64encodedimage", "status": "success" },
  "status": "COMPLETED"
}

如何从ComfyUI获取工作流?

  • 在浏览器中打开ComfyUI
  • 打开设置(菜单右上角的齿轮图标)
  • 在弹出的对话框中配置:
    • 启用开发模式选项:打开
    • 关闭设置
  • 在菜单中,点击保存(API格式)按钮,将下载一个名为workflow_api.json的文件

现在您可以把这个文件的内容放入与API交互时的workflow中。

使用自定义模型和节点

网络卷

使用网络卷可以存储和访问自定义模型:

  1. 创建网络卷:

  2. 填充卷:

    • 创建临时GPU实例:
      • 导航到管理 > 存储,点击卷下的部署,部署任意GPU或CPU实例。
      • 导航到管理 > Pods。在新pod下,点击连接打开shell(通过Jupyter笔记本或SSH)。
    • 用模型填充卷:
      cd /workspace
      for i in checkpoints clip clip_vision configs controlnet embeddings loras upscale_models vae; do mkdir -p models/$i; done
      wget -O models/checkpoints/sd_xl_turbo_1.0_fp16.safetensors https://huggingface.co/stabilityai/sdxl-turbo/resolve/main/sd_xl_turbo_1.0_fp16.safetensors
      
  3. 删除临时GPU实例:

  4. 配置端点:

    • 在端点配置中使用网络卷:
      • 创建新端点或更新现有端点。
      • 在端点配置的高级 > 选择网络卷下,选择您的网络卷。

注意:当配置并附加网络卷时,ComfyUI可自动访问网络卷中的文件夹。

自定义Docker镜像

如果您更喜欢直接在Docker镜像中包含模型,请按以下步骤操作:

  1. Fork仓库:

    • 将此仓库fork到您自己的GitHub账户。
  2. 在Dockerfile中添加模型:

    • 编辑Dockerfile以包含您的模型:
      RUN wget -O models/checkpoints/sd_xl_base_1.0.safetensors https://huggingface.co/stabilityai/stable-diffusion-xl-base-1.0/resolve/main/sd_xl_base_1.0.safetensors
      
    • 您也可以添加自定义节点:
      RUN git clone https://github.com/<username>/<custom-node-repo>.git custom_nodes/<custom-node-repo>
      
  3. 构建Docker镜像:

    • 在本地构建base镜像:
      docker build -t <your_dockerhub_username>/runpod-worker-comfy:dev-base --target base --platform linux/amd64 .
      
    • 在本地构建sdxl镜像:
      docker build --build-arg MODEL_TYPE=sdxl -t <your_dockerhub_username>/runpod-worker-comfy:dev-sdxl --platform linux/amd64 .
      
    • 在本地构建sd3镜像:
      docker build --build-arg MODEL_TYPE=sd3 --build-arg HUGGINGFACE_ACCESS_TOKEN=<your-huggingface-token> -t <your_dockerhub_username>/runpod-worker-comfy:dev-sd3 --platform linux/amd64 .
      

[!注意]
确保指定--platform linux/amd64以避免在RunPod上出错,参见问题#13

本地测试

两种测试都将使用test_input.json中的数据,请在那里做适当修改以进行正确测试。

设置

  1. 确保您的Python版本 >= 3.10
  2. 创建虚拟环境:
    python -m venv venv
    
  3. 激活虚拟环境:
    • Windows:
      .\venv\Scripts\activate
      
    • Mac / Linux:
      source ./venv/bin/activate
      
  4. 安装依赖:
    pip install -r requirements.txt
    

Windows设置

  1. 按照本指南安装WSL2和Linux发行版(如Ubuntu)。您可以跳过"安装和使用GUI包"部分。

  2. 安装Ubuntu后,打开终端并登录:

    wsl -d Ubuntu
    
  3. 更新软件包:

    sudo apt update
    
  4. 在Ubuntu中安装Docker:

    • 遵循Docker官方安装指南
    • 安装docker-compose:
      sudo apt-get install docker-compose
      
    • 在Ubuntu中安装NVIDIA工具包: 按照此指南创建nvidia运行时。
  5. 在WSL2的Ubuntu上启用GPU加速: 遵循此指南

    • 如果您已在Windows上安装了GPU驱动程序,可以跳过"为WSL安装适当的Windows vGPU驱动程序"步骤。
  6. 将您的用户添加到docker组以无需sudo即可使用Docker:

    sudo usermod -aG docker $USER
    

完成这些步骤后,在终端中切换到Ubuntu并通过WSL在Windows计算机上本地运行Docker镜像:

wsl -d Ubuntu

测试RunPod处理程序

  • 运行所有测试:python -m unittest discover
  • 如果要运行特定测试:python -m unittest tests.test_rp_handler.TestRunpodWorkerComfy.test_bucket_endpoint_not_configured

您还可以启动处理程序本身以运行本地服务器:python src/rp_handler.py 要使其正常工作,您还需要启动"ComfyUI",否则处理程序将无法工作。

本地API

为了增强本地开发,您可以启动一个模拟RunPod工作环境的API服务器。这个功能对于在本地调试和测试您的集成特别有用。

运行Docker容器时,将SERVE_API_LOCALLY环境变量设置为true以激活本地API服务器。这已经是docker-compose.yml中的默认值,因此您可以通过执行以下命令来运行:

docker-compose up

访问本地Worker API

  • 本地API服务器运行后,可在以下地址访问:localhost:8000
  • 在浏览器中打开此地址时,您还可以查看API文档并直接与API交互

访问本地ComfyUI

  • 本地API服务器运行时,您可以在以下地址访问ComfyUI:localhost:8188

使用GitHub Actions自动部署到Docker Hub

该仓库包含两个工作流,使用GitHub Actions将镜像发布到Docker Hub:

  • dev.yml:在每次推送到main分支时创建镜像并将其推送到Docker Hub,标记为dev
  • release.yml:创建镜像并将其推送到Docker Hub,标记为latest和发布标签。仅在GitHub上创建发布时触发

如果要使用此功能,您应该向仓库添加以下密钥

配置变量描述示例值
DOCKERHUB_USERNAME您的Docker Hub用户名your-username
DOCKERHUB_TOKEN用于认证的Docker Hub令牌your-token
HUGGINGFACE_ACCESS_TOKEN您的Hugging Face READ访问令牌your-access-token

还要确保向仓库添加以下变量

变量名描述示例值
DOCKERHUB_REPODocker Hub上推送镜像的仓库timpietruskyblibla
DOCKERHUB_IMG推送到Docker Hub的镜像名称runpod-worker-comfy

致谢

项目侧边栏1项目侧边栏2
推荐项目
Project Cover

豆包MarsCode

豆包 MarsCode 是一款革命性的编程助手,通过AI技术提供代码补全、单测生成、代码解释和智能问答等功能,支持100+编程语言,与主流编辑器无缝集成,显著提升开发效率和代码质量。

Project Cover

AI写歌

Suno AI是一个革命性的AI音乐创作平台,能在短短30秒内帮助用户创作出一首完整的歌曲。无论是寻找创作灵感还是需要快速制作音乐,Suno AI都是音乐爱好者和专业人士的理想选择。

Project Cover

有言AI

有言平台提供一站式AIGC视频创作解决方案,通过智能技术简化视频制作流程。无论是企业宣传还是个人分享,有言都能帮助用户快速、轻松地制作出专业级别的视频内容。

Project Cover

Kimi

Kimi AI助手提供多语言对话支持,能够阅读和理解用户上传的文件内容,解析网页信息,并结合搜索结果为用户提供详尽的答案。无论是日常咨询还是专业问题,Kimi都能以友好、专业的方式提供帮助。

Project Cover

阿里绘蛙

绘蛙是阿里巴巴集团推出的革命性AI电商营销平台。利用尖端人工智能技术,为商家提供一键生成商品图和营销文案的服务,显著提升内容创作效率和营销效果。适用于淘宝、天猫等电商平台,让商品第一时间被种草。

Project Cover

吐司

探索Tensor.Art平台的独特AI模型,免费访问各种图像生成与AI训练工具,从Stable Diffusion等基础模型开始,轻松实现创新图像生成。体验前沿的AI技术,推动个人和企业的创新发展。

Project Cover

SubCat字幕猫

SubCat字幕猫APP是一款创新的视频播放器,它将改变您观看视频的方式!SubCat结合了先进的人工智能技术,为您提供即时视频字幕翻译,无论是本地视频还是网络流媒体,让您轻松享受各种语言的内容。

Project Cover

美间AI

美间AI创意设计平台,利用前沿AI技术,为设计师和营销人员提供一站式设计解决方案。从智能海报到3D效果图,再到文案生成,美间让创意设计更简单、更高效。

Project Cover

AIWritePaper论文写作

AIWritePaper论文写作是一站式AI论文写作辅助工具,简化了选题、文献检索至论文撰写的整个过程。通过简单设定,平台可快速生成高质量论文大纲和全文,配合图表、参考文献等一应俱全,同时提供开题报告和答辩PPT等增值服务,保障数据安全,有效提升写作效率和论文质量。

投诉举报邮箱: service@vectorlightyear.com
@2024 懂AI·鲁ICP备2024100362号-6·鲁公网安备37021002001498号