家用邊緣生圖實戰:Windows RTX 4050 搭配 Docker 部署 ComfyUI 與內網 API 調用指南

將搭載 RTX 4050 (6GB VRAM) 的家用主機改造成 ComfyUI 生圖微服務。詳細解析 Docker 容器化、GPU 直通、模型選型與 Raspberry Pi 5 內網 API 調用實踐。

家用邊緣生圖實戰:Windows RTX 4050 搭配 Docker 部署 ComfyUI 與內網 API 調用指南

在打造自動化簡報管線或讓個人 AI 助理(如 Hermes Agent)具備出圖能力時,商用雲端繪圖 API 的長期調用費用是一筆無法忽視的邊際成本。然而,許多人家中其實都有一台搭有中階獨立顯卡的筆電或桌機。以搭載 RTX 4050 行動版(6GB VRAM)的 Windows 主機為例,只要架構得當,它完全有能力承擔家庭私有雲的即時生圖微服務。

本文記錄如何透過 Docker 容器化技術部署 ComfyUI,搭配低顯存模型與內網 API 接口,實現 Raspberry Pi 5 等邊緣裝置遠端調用的完整工程實踐。


1. 硬體邊界與模型選型策略

在 6GB VRAM 的極限約束下,若直接載入未經優化的龐大 SDXL 檢查點模型,推論過程極易觸發 Out Of Memory (OOM)。因此,模型選型與顯存控制是整個系統能否穩定運作的前提。

核心選型:輕量化與蒸餾加速模型

  • Segmind Vega / SDXL-Lightning:Vega 將 SDXL 參數量精簡至約 0.74B,而 SDXL-Lightning 則透過蒸餾技術將步數壓縮至 4 到 8 步。這讓顯存需求壓制在 5GB 以內,並維持優秀的幾何構圖。
  • 動態顯存釋放 (cudaMallocAsync):啟動時啟用 PyTorch 與 CUDA 的異步顯存分配器,避免多輪推論後的顯存碎片累積。
  • 精度控制:強制採用 fp16 載入與推論,直接將顯存需求砍半。

ComfyUI 的架構優勢

相比傳統 WebUI (Automatic1111),ComfyUI 採用有向無環圖 (DAG) 的節點架構,具備兩大優勢:

  1. 零多餘背景顯存常駐:僅在推論工作流真正觸發時載入對應模組,推論結束立即釋放中間緩存。
  2. 原生 Headless API 支持:工作流可一鍵導出為純 JSON,前端與後端完全解耦,天生適合作為後台微服務。

2. Docker 容器化環境配置

在 Windows / WSL2 環境下,建議將 ComfyUI 封裝進 Docker,隔離 Python 依賴衝突並維持開機自動重啟能力。

前置需求

  • 安裝 Windows Docker Desktop 並開啟 WSL2 後端支援。
  • 安裝最新版本 NVIDIA 驅動程式(支援 NVIDIA Container Toolkit 直通)。

Dockerfile 配置精要

建議基於 NVIDIA CUDA 官方映像檔構建,確保 PyTorch 與 TorchVision 與 GPU 架構完全吻合:

FROM pytorch/pytorch:2.4.0-cuda12.4-cudnn9-runtime

ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get update && apt-get install -y git wget libgl1-mesa-glx libglib2.0-0 && rm -rf /var/lib/apt/lists/*

WORKDIR /app
RUN git clone https://github.com/comfyanonymous/ComfyUI.git .
RUN pip install --no-cache-dir -r requirements.txt

EXPOSE 8188
CMD ["python", "main.py", "--listen", "0.0.0.0", "--port", "8188", "--preview-method", "auto", "--cuda-malloc"]

Docker Compose 部署檔 (docker-compose.yml)

在 Windows 主機上建立專用工作目錄,並規劃資料磁碟持久化:

version: '3.8'

services:
  comfyui:
    build: .
    container_name: comfyui_edge
    restart: unless-stopped
    ports:
      - "8188:8188"
    volumes:
      - ./models:/app/models
      - ./custom_nodes:/app/custom_nodes
      - ./output:/app/output
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: 1
              capabilities: [gpu]
    environment:
      - PYTORCH_CUDA_ALLOC_CONF=garbage_collection_threshold:0.6,max_split_size_mb:128

啟動命令:

docker compose up -d

3. 內網 API 接口串接:讓邊緣節點跨網調用

Edge Devices API Call Pipeline

當 ComfyUI 在 Windows 主機上運作於 http://192.168.50.76:8188 後,我們需要讓內網的 Raspberry Pi 5 或手機端發出生圖請求。

導出 API 工作流 (Workflow API JSON)

  1. 在瀏覽器打開 ComfyUI 介面 (http://localhost:8188)。
  2. 點擊右側選單的 Settings (齒輪),勾選 Enable Dev mode Options。
  3. 介面上會出現 Save (API Format) 按鈕,點擊即可導出不含前端 UI 排版的純淨 workflow_api.json。

邊緣客戶端調用流程 (Python 實現)

在 Raspberry Pi 5 或自動化腳本中,調用邏輯分為三個步驟:

  1. 健康探測:向 /system_stats 發送 GET 請求,確認主機在線且 GPU 狀態正常。
  2. 提交任務:將動態替換後的 Prompt 與種子注入 JSON,向 /prompt 發送 POST 請求,取得 prompt_id。
  3. 輪詢與下載:輪詢 /history/{prompt_id} 直到狀態完成,接著向 /view?filename=... 下載生成的圖片實體。
import requests
import json
import time

COMFY_HOST = "http://192.168.50.76:8188"

def generate_image(prompt_text, output_filename="result.png"):
    # 讀取基礎 API 工作流
    with open("workflow_api.json", "r") as f:
        workflow = json.load(f)

    # 動態注入 Prompt (節點編號依實際工作流配置)
    workflow["6"]["inputs"]["text"] = prompt_text

    # 提交生成隊列
    res = requests.post(f"{COMFY_HOST}/prompt", json={"prompt": workflow})
    prompt_id = res.json()["prompt_id"]

    # 輪詢任務狀態
    while True:
        hist = requests.get(f"{COMFY_HOST}/history/{prompt_id}").json()
        if prompt_id in hist:
            output_info = hist[prompt_id]["outputs"]["9"]["images"][0]
            img_name = output_info["filename"]
            break
        time.sleep(1)

    # 下載產出實體
    img_data = requests.get(f"{COMFY_HOST}/view?filename={img_name}").content
    with open(output_filename, "wb") as f:
        f.write(img_data)
    print(f"圖片已成功保存至 {output_filename}")

4. 效能實測數據與架構折衷矩陣

在 RTX 4050 (6GB VRAM) 的實機運行環境中,使用 Segmind-Vega 模型進行實測:

產圖解析度 適用場景 採樣步數 (Steps) 推論耗時 (Latency) 顯存峰值 (VRAM)
1024 x 576 16:9 簡報視覺插圖 20 步 約 5.2 秒 4.8 GB
1200 x 630 部落格橫幅 / 社群分享 20 步 約 7.1 秒 5.3 GB
1024 x 1024 正方形概念卡片 20 步 約 8.4 秒 5.6 GB

架構折衷矩陣 (Architect's Trade-off Matrix)

  • 核心目標 (Non-negotiable):完全掌控數據隱私,擺脫持續性 API 帳單,實現邊緣自動化即時配圖。
  • 硬性約束 (Constraints):6GB VRAM 物理天花板,無法同時承載多工作緒高並發,且模型尺寸受限。
  • 戰略性妥協 (Strategic Sacrifice):放棄雲端叢集每秒出圖的極致並發,接受單任務 5-8 秒的推論延遲。

結論

將家用既有硬體轉化為微服務節點,是構建自給自足個人 AI 基礎設施的重要一步。透過 Docker 封裝與標準 HTTP/HTTPS 協議串接,原本孤立在 Windows 筆電裡的 GPU 算力,成功轉化為整個家庭內網皆可調用的圖形推論中樞。

Read more

三十年後的閉環:重返義守大學,從 2301 實驗室到「老師你會閃步嗎」的工程思索

三十年後的閉環:重返義守大學,從 2301 實驗室到「老師你會閃步嗎」的工程思索

受同窗系主任邀請重返母校,為電子系大一新生開講《大學四年的 AI 協同作戰》。從男宿、好漢坡、古風電話亭的青春生活印記,到 2301 第一間 DSP 實驗室的底層功力叩問;面對沈默害羞的新生,以 Slido 匿名互動破局,更意外因光頭造型撞臉抖音爆紅「閃身步」,串起一場跨世代幽默又深刻的工程閉環。

By WrightWu