顯示具有 ComfyUI 標籤的文章。 顯示所有文章
顯示具有 ComfyUI 標籤的文章。 顯示所有文章

2026年10月9日 星期五

用本地 ComfyUI 生成圖片與影片:完整流程與注意事項

本文環境:GX10(NVIDIA GB10、121GB 統一記憶體、Linux)+ ComfyUI v0.34.2,全部本地推理,不依賴任何雲端 API。流程已實測:落日黃昏圖片 16 秒、LTX-2.3 22B 影片 75 秒。

一、隨開隨用:用完即停的資源模式

ComfyUI 常駐會吃約 30GB 系統記憶體(GB10 統一記憶體,VRAM 外溢)。為了平常不佔資源,我做了兩個指令:

comfy-on    # 啟動 service + 輪詢 API 就緒(實測 8 秒)
comfy-off   # 停止 service + 確認 port 8188 釋放 + 回報可用 RAM

使用節奏:comfy-on → 生成 → comfy-off。平常狀態 72-75GB 可用,開著時剩 40GB 左右,121GB 的機器扛得住,但不建議同時跑其他重任務(本地 LLM 推理等)。

二、生圖(SDXL,1024×768)

模型:sd_xl_base_1.0.safetensors(models/checkpoints/)。流程:

  1. comfy-on
  2. 組 workflow JSON(CheckpointLoaderSimple → CLIPTextEncode ×2 → EmptyLatentImage → KSampler → VAEDecode → SaveImage)
  3. POST http://127.0.0.1:8188/prompt 提交,拿到 prompt_id
  4. 輪詢 /history/<prompt_id> 到 completed
  5. 從 outputs 拿 filename,用 /view?filename=...&subfolder=...&type=output 下載
  6. comfy-off

本次實例:seed 20261008、steps 25、cfg 4.0、dpmpp_2m/karras,16 秒出圖 1MB PNG。



三、生影片(LTX-2.3 22B,文字→影片)

這台有 ltx-2.3-22b-dev-fp8.safetensors(44GB)+ SVD-XL。LTX-2 系列是新架構,有以下幾點一定要正確組合,任何一錯都會在執行時報錯:

1. 文字編碼器(最容易踩的坑)

  • LTXV 需要 Gemma3-12B(hidden 3840),不是 SDXL 那套 CLIP,也不是 T5-XXL。
  • ComfyUI 要的是單一 safetensors,內部同時含:權重重映射為 model.* 前綴 + spiece_model(sentencepiece tokenizer 原始 bytes)+ LTX 的 text_embedding_projection.* 四支張量(後者本來在 LTX checkpoint 裡,要撈出來合併)。
  • HF 上 google 官方 repo 是 gated、Lightricks 官方是 12+ 分片;實務上抓公開整包的 bf16(5 分片約 22.7GB),合併、key 重整後變成一台 25GB 的單檔,一次搞定。
  • FP4/NVFP4 量化版會撞 ComfyUI 的權重載入路徑('Linear' object has no attribute 'weight'),用 bf16 版。

2. VAE 用錯 = 影片只剩 1 幀

LTX checkpoint 自帶 VAE(vae.encoder/decoder),VAEDecode 要拿 [checkpoint, 2],不要外接 flux2-vae。接錯的症狀是:影片成功輸出,但 ffprobe 只看到 1 幀、尺寸縮半——很容易誤以為「生成成功」。

3. 參數(本次實測值)

  • EmptyLTXVLatentVideo:768 × 512(32 的倍數);幀數 8n+1(97 ≈ 3.9 秒 @25fps)
  • DualCLIPLoader:type=ltxv,clip1/clip2 都填同一支 Gemma3-12B
  • KSampler:cfg=1.0(LTX-2 是 guidance-free,別用 2-7 的舊值)、steps 20-25、euler/simple
  • SaveVideo:新版節點要求必填 format(mp4)

4. 圖→影片(img2vid)

可用「先生圖 → 上傳 /upload/image(會進 input/ 目錄)→ LoadImage 當第一幀」的做法,起幅最穩定。SVD-XL 也可走 img2vid,但品質舊一代;LTX 走 LTXVAddGuide/img2video 節點。



四、驗證清單(每次生成必做)

  • ffprobe 看 duration / nb_frames / 解析度——幀數=1 或尺寸縮半 = VAE 接錯
  • 抽中間幀肉眼確認(ffmpeg -ss N -frames:v 1)
  • 生成完 comfy-off,確認 RAM 還原

五、產出位置

  • 圖片:~/ComfyUI/output/
  • 影片:~/ComfyUI/output/video/
  • 本文章案例:落日黃昏 768×512 / 97 frames / H.264 MP4,本地生成 75 秒。

本文僅記錄自家環境的本地生成流程;模型版權屬原作者(LTX-2.3: Lightricks,Gemma: Google)。



延伸閱讀

2026年7月3日 星期五

ComfyUI 介紹及與 Telegram 文字生圖的方式

📺 影片版(約 7 分鐘):想先看實際操作的話可以直接看這支影片,完整步驟、設定與程式碼在下方文字版。
YouTube:https://youtu.be/USvokuFVFSA(winson-DIY 頻道)

 ComfyUI 是目前 Stable Diffusion (AI 繪圖) 領域中最強大的可視化介面之一。它的核心特點是「節點式 (Node-based)」操作,這讓使用者可以精確控制整個渲染流程。


以下是關於 ComfyUI 的簡介以及安裝方式:

---

🌟 什麼是 ComfyUI?

ComfyUI 是一個基於 Stable Diffusion 模型的視覺化介面。與 Midjourney (文字輸入) 或 Automatic1111 / SD WebUI (選單下拉框) 不同,ComfyUI 透過「連接節點」來完成工作。

💡 核心優勢
1. 效能極佳:由於採用圖形化資料流,它的 GPU VRAM 佔用率通常比其他介面低約 30%~50%,這讓你在顯示卡有限的情況下也能跑更高分辨率。
2. 完全的控制權:你可以看到模型是如何一步步組合(例如:Text Encoding -> Latent Sampling -> VAE Decode)。
3. 工作流分享 (JSON):你畫好的圖,可以直接把 .png 檔塞回 ComfyUI 的左側,就能還原出它的設定流程,方便學習與修改。

---

🛠️ 安裝方式 (以 Linux / NVIDIA GPU 為例)

您的伺服器有 128GB RAM + NVIDIA GB10 顯示卡,效能非常充裕,但建議還是使用隔離環境來安裝以避免系統衝突。

步驟 1:準備環境
確保您已經安裝了必要的基礎工具:
sudo apt update && sudo apt upgrade -y
sudo apt install git python3 python3-venv python3-pip libgl1-mesa-glx -y


步驟 2:下載 ComfyUI
1. 進入您的工作目錄並克隆官方專案倉庫:
2. 建立一個乾淨的 Python 虛擬環境
 python3 -m venv venv
3. 啟動虛擬環境 
source venv/bin/activate
4. 下載最適合您系統的環境依賴套件
 pip install --upgrade pip pip install -r requirements.txt

步驟 3:直接啟動本機 ComfyUI 服務

cd ~/ComfyUI
source venv/bin/activate
python main.py --listen 0.0.0.0 --port 8188


進入後

開啟範本: 若有錯誤點選元件下載

配置 ComfyUI 的 Z-Image-Turbo 流程,請確保將它們放對資料夾

  • ae.safetensors 放入 ComfyUI/models/vae/
  • qwen_3_4b.safetensors 放入 ComfyUI/models/text_encoders/
  • z_image_turbo_bf16.safetensors 放入 ComfyUI/models/diffusion_models/

利用telegram 文字生圖



補充(2026/10 更新):實際環境、實測速度與 Telegram 生圖的完整做法
這篇寫於 7 月剛裝好 ComfyUI 的時候。用了幾個月後,把實際的版本、安裝步驟的修正、實測速度,以及 Telegram 文字生圖背後到底怎麼運作補上來。以下數字都是在 GX10 本機實際查詢、實際跑出來的。

補充一、這台 GX10 的實際環境
項目實際值
主機ASUS Ascent GX10(NVIDIA GB10,ARM64 架構)
記憶體121 GB 統一記憶體(CPU 與 GPU 共用,ComfyUI 看到的 VRAM 也是 121 GB)
ComfyUIv0.34.2(前端 1.49.6)
Python 環境Anaconda 環境 ComfyUI_env,Python 3.10.20
PyTorch2.12.1 + CUDA 13.0(cu130)
Telegram 套件python-telegram-bot 22.8、httpx 0.28.1

Z-Image-Turbo 這組三個模型檔的大小,下載前可以先確認硬碟空間:
檔案放置資料夾大小
z_image_turbo_bf16.safetensorsmodels/diffusion_models/12 GB
qwen_3_4b.safetensorsmodels/text_encoders/7.5 GB
ae.safetensorsmodels/vae/320 MB

補充二、安裝步驟的幾個修正
上面的步驟照抄有幾個地方會卡住,這裡更正:
1. libgl1-mesa-glx 在 Ubuntu 24.04 已經不存在,apt 會報找不到套件,改裝 libgl1:
sudo apt install git python3 python3-venv python3-pip libgl1 -y
2. pip 那行其實是兩個指令,要分開執行:
pip install --upgrade pip
pip install -r requirements.txt
3. GX10 是 ARM64,PyTorch 要裝 CUDA 13 版,否則會裝到只能用 CPU 的版本。建議在 pip install -r requirements.txt 之前先裝:
pip install torch torchvision --index-url https://download.pytorch.org/whl/cu130
裝完用這行確認 GPU 有抓到(要印出 True):
python -c "import torch; print(torch.__version__, torch.cuda.is_available())"
4. ComfyUI-Manager 要用 git clone 放進 custom_nodes,不是 wget:
cd ~/ComfyUI/custom_nodes
git clone https://github.com/ltdrdata/ComfyUI-Manager.git comfyui-manager
5. venv 或 conda 都可以。我這台後來改用 Anaconda 環境(conda create -n ComfyUI_env python=3.10),好處是 Python 版本跟系統完全分開;用 venv 的話把下面服務檔裡的路徑換成 ~/ComfyUI/venv/bin/python 即可。

補充三、Z-Image-Turbo 工作流的參數與實測速度
範本裡實際用的參數如下,Turbo 版只要 8 步就能出圖:
節點參數
EmptySD3LatentImage1024 × 1024
KSamplersteps 8、cfg 1、sampler res_multistep、scheduler simple
ModelSamplingAuraFlowshift 3
CLIPLoaderqwen_3_4b,type 選 lumina2
ConditioningZeroOut負面提示詞直接歸零(cfg 1 時本來就用不到負面提示詞)

在 GX10 上實測三張 1024×1024:
  • 第一張(冷啟動):18.1 秒,多出來的時間是把約 20 GB 模型載入記憶體
  • 之後每張:約 7.5 秒
提示詞可以直接寫中文(文字編碼器是 Qwen3),例如「夜晚霓虹燈下的台北街頭,賽博龐克風格」就能出圖。不過圖中如果要出現招牌文字,中文字常常會變成看起來像字但其實不是字的筆畫,這是目前模型的限制。

補充四、讓 ComfyUI 開機自動啟動(systemd)
每次手動 python main.py 很麻煩,可以做成 systemd 使用者服務,掛掉 10 秒後還會自動重啟。建立 ~/.config/systemd/user/comfyui.service:
[Unit]
Description=ComfyUI AI Generation Service
After=network.target

[Service]
Type=simple
WorkingDirectory=/home/gx/ComfyUI
ExecStart=/home/gx/anaconda3/envs/ComfyUI_env/bin/python main.py --listen 0.0.0.0 --port 8188
Restart=always
RestartSec=10

[Install]
WantedBy=default.target
啟用與管理:
systemctl --user daemon-reload
systemctl --user enable --now comfyui.service   # 開機自動啟動並立即啟動
systemctl --user status comfyui.service
journalctl --user -u comfyui.service -f         # 看即時 log
sudo loginctl enable-linger $USER                # 沒登入也照樣跑
啟動後約 10 秒,用 curl -s http://127.0.0.1:8188/system_stats 有回 JSON 就代表服務好了。

小提醒:ComfyUI 載入模型後會一直佔著記憶體。GX10 的 GPU 跟 CPU 共用同一塊記憶體,如果同時還要跑 Ollama 大模型,不常生圖的話可以不設開機啟動,要用時再 systemctl --user start comfyui。

補充五、Telegram 文字生圖是怎麼運作的
上面截圖裡在 Telegram 打 /generate 提示詞 就收到圖,背後是一支自己寫的 Python 機器人,流程如下:
手機 Telegram:/generate 一隻橘貓坐在窗台上看雨
        │
        ▼
Telegram Bot(python-telegram-bot,在 GX10 上跑)
  1. 讀取工作流 JSON(API 格式)
  2. 把提示詞塞進 CLIPTextEncode 節點的 text
        │  POST /prompt
        ▼
ComfyUI(127.0.0.1:8188)排隊、生圖 → 回傳 prompt_id
        │  每秒 GET /history/{prompt_id},直到出現結果
        ▼
Bot 用 GET /view 取回 PNG → send_photo 傳回手機
步驟 1:建立 Telegram Bot
  1. 在 Telegram 搜尋 @BotFather,輸入 /newbot,依指示取名,最後會拿到一組 Bot Token
  2. 跟 @userinfobot 說一句話,取得自己的數字 User ID(等一下用來限制只有自己能用)
步驟 2:從 ComfyUI 匯出 API 格式的工作流
在 ComfyUI 網頁打開 Z-Image-Turbo 工作流,確認能正常出圖後,選單「Workflow → Export (API)」存成 image_z_image_turbo.json。
注意一定要匯出 API 格式:一般「Save」存的是編輯器格式(有 nodes、links 陣列),直接送 /prompt 會失敗。API 格式長這樣,每個節點以 ID 為 key:
"57:27": {"class_type": "CLIPTextEncode", "inputs": {"text": "山窮水盡的水彩畫", "clip": ["57:30", 0]}},
"57:3":  {"class_type": "KSampler", "inputs": {"seed": 878164762609716, "steps": 8, "cfg": 1, ...}}
程式要改提示詞就改 57:27 的 text,要換種子就改 57:3 的 seed。

步驟 3:安裝套件
pip install python-telegram-bot httpx
步驟 4:機器人程式(精簡版)
我最早的版本有 180 行,還用了執行緒池;其實 httpx 本身就是非同步的,不需要另外開執行緒。整理後的精簡版如下(核心的 ComfyUI 呼叫在 GX10 上實測可正常取回圖片),存成 comfy_bot.py:
import os, json, random, asyncio, httpx
from pathlib import Path
from telegram import Update
from telegram.ext import ApplicationBuilder, CommandHandler, ContextTypes, filters

COMFY = "http://127.0.0.1:8188"
WF = json.loads(Path("image_z_image_turbo.json").read_text())
MY_ID = int(os.environ["TG_MY_USER_ID"])      # 只允許自己使用

async def comfy(prompt: str) -> bytes:
    wf = json.loads(json.dumps(WF))            # 複製一份,避免改到原本的
    wf["57:27"]["inputs"]["text"] = prompt     # 提示詞節點
    wf["57:3"]["inputs"]["seed"] = random.randint(0, 2**48)  # 每次換種子
    async with httpx.AsyncClient(timeout=30) as c:
        pid = (await c.post(f"{COMFY}/prompt", json={"prompt": wf})).json()["prompt_id"]
        for _ in range(180):                   # 最多等 180 秒
            await asyncio.sleep(1)
            h = (await c.get(f"{COMFY}/history/{pid}")).json()
            if pid in h:
                img = next(i for o in h[pid]["outputs"].values() for i in o.get("images", []))
                return (await c.get(f"{COMFY}/view", params=img)).content
    raise TimeoutError("ComfyUI 超過 180 秒沒回應")

async def generate(update: Update, context: ContextTypes.DEFAULT_TYPE):
    prompt = " ".join(context.args)
    if not prompt:
        await update.message.reply_text("用法:/generate 畫面描述")
        return
    msg = await update.message.reply_text("⏳ 生成中,約 10 秒…")
    try:
        png = await comfy(prompt)
        await update.message.reply_photo(png, caption=prompt[:1000])
        await msg.delete()
    except Exception as e:
        await msg.edit_text(f"❌ 生成失敗:{e}")

app = (ApplicationBuilder().token(os.environ["TG_BOT_TOKEN"])
       .concurrent_updates(True).build())      # 生圖時 Bot 仍可回應其他訊息
app.add_handler(CommandHandler("generate", generate,
                               filters=filters.User(MY_ID), block=False))
app.run_polling()
步驟 5:執行
export TG_BOT_TOKEN="從 BotFather 拿到的 token"
export TG_MY_USER_ID="你的數字 User ID"
python comfy_bot.py
接著在 Telegram 對你的 Bot 傳 /generate 清晨山間的茶園,雲霧繚繞,寫實攝影,約 8 秒就會收到圖。

補充六、幾個實際踩過的坑
  • 種子固定,同一句提示詞永遠同一張圖:工作流 JSON 裡的 seed 是固定值,不改的話 ComfyUI 甚至會直接回快取結果。上面程式每次用 random.randint 換種子就解決了。
  • 不要用「有 text 欄位就替換」的寫法:我第一版是掃過所有節點、只要 inputs 有 text 就換掉,如果工作流裡有負面提示詞節點,會連負面提示詞一起被換成正面內容。直接指定節點 ID 最保險。
  • 一個 Bot Token 只能有一支程式在收訊息:如果同一個 token 已經給其他程式(例如 AI Agent)用,兩邊同時 polling 會出現 409 Conflict,訊息會被搶走。生圖機器人請另外跟 BotFather 申請一個。
  • 一定要限制使用者:Bot 是公開的,任何人搜到都能傳指令。沒加 filters.User 等於讓陌生人免費用你的 GPU。
  • --listen 0.0.0.0 等於對整個區網開放:ComfyUI 沒有登入機制,同網段的人都能打開網頁、送工作。如果只有本機的 Bot 會用,改成 --listen 127.0.0.1;要從外面連就透過 Tailscale,不要在路由器開 port。
  • 做影片時要把逾時拉長:生圖 10 秒內就好,但 LTX 等影片模型一支要好幾分鐘,輪詢上限要改大,而且 reply_photo 要換成 reply_video。

補充七、更進一步:讓 AI Agent 直接操作 ComfyUI
自己寫 Bot 的好處是簡單、可控,但只能固定打 /generate。後來我在 GX10 上改用 Hermes Agent 的 comfyui 技能(skill),在 Telegram 用一般對話就行,例如「幫我畫一張水彩風格的貓,畫完再做成 5 秒影片」,Agent 會自己選工作流、改參數、送給同一台 ComfyUI,再把結果傳回來。底層呼叫的一樣是 /prompt、/history、/view 這幾個 API,所以先把這篇的 Bot 做通,對理解 Agent 在做什麼很有幫助。

補充八、問題排查清單
症狀檢查方向
Bot 沒反應token 是否正確、是否被其他程式同時 polling(409 Conflict)、User ID 是否填對
回「生成失敗」連線被拒ComfyUI 沒在跑:systemctl --user status comfyui、curl 127.0.0.1:8188/system_stats
POST /prompt 回 400工作流不是 API 格式,或模型檔名、資料夾放錯(看回應裡的 node_errors)
第一張特別慢正常,冷啟動要載入模型,之後就快了
出圖很慢、像在用 CPUPyTorch 裝到 CPU 版,torch.cuda.is_available() 是 False,重裝 cu130 版

延伸閱讀