Files

304 lines
10 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Install Notes — 实战安装记录
Real-world install log for the video-to-text pipeline. 这是一份"踩坑笔记",按照实际部署顺序记录可能的问题和解法。Read this before opening an issue.
## 架构 / Architecture
ComfyUI-VideoToText 是个**包装层**,本身**不包含 ASR 模型**。完整链路:
```
your_video.mp4
│
├─► [本包] VTT_LoadVideo
│ │
│ └─► [本包] VTT_ExtractAudio (ffmpeg)
│ │
│ └─► [本包] VTT_AudioFromPath (torchaudio)
│ │
│ ├──────────────────┐
│ ▼ ▼
└────► [MiMoASR] MiMoASRLoader + MiMoASRTranscribe
│
└─► [本包] VTT_BuildTranscriptJSON
│
└─► [本包] VTT_SaveTranscript
│
▼
ComfyUI/output/<file>.json
```
依赖的两个外部组件:
| 节点 | 来源 | 用途 |
| --- | --- | --- |
| `MiMoASRLoader`, `MiMoASRTranscribe` | [aadebuger/ComfyUI-MiMoASR](https://github.com/aadebuger/ComfyUI-MiMoASR) | ASR 核心 |
| `PreviewAny` | [rgthree/rgthree-comfy](https://github.com/rgthree/rgthree-comfy) | CLI 抓 STRING 输出用 |
| `LoadAudio` | ComfyUI 内置 | 节点 UI 端测试用 |
## 测试环境 / Tested Environment
| Item | Value |
| --- | --- |
| OS | Ubuntu 22.04 |
| GPU | 2× RTX 3090 (24 GB each) |
| CUDA toolkit | 12.6 (`/usr/local/cuda-12.6`) |
| Python | 3.13 |
| PyTorch | 2.11.0+cu126 |
| ComfyUI venv | `uv`-managed at `/mnt/modelall/ComfyUI/.venv` |
| HF cache | `/mnt/modelall/hf_cache` (system disk only had 10 GB → must redirect) |
| MiMo 上游 repo | `/opt/repos/MiMo-V2.5-ASR` (set via `MIMO_ASR_REPO` env var) |
| MiMo 模型 | `/big_disk/models/MiMo-V2.5-ASR` + `/big_disk/models/MiMo-Audio-Tokenizer` |
---
## 安装步骤 (Step-by-Step)
### Step 1 — `ffmpeg`
```bash
$ which ffmpeg || sudo apt install ffmpeg
$ ffmpeg -version
```
`VTT_ExtractAudio` 走 `subprocess` 直调 `ffmpeg` —— 没装就报:
```
RuntimeError: ffmpeg not found on PATH. Install with: sudo apt install ffmpeg
```
如果 ComfyUI 在容器里跑,必须装在容器里,不是宿主机。
### Step 2 — `torchaudio`
```bash
$ cd /mnt/modelall/ComfyUI && source .venv/bin/activate
$ uv pip install torchaudio
$ python -c "import torchaudio; print(torchaudio.__version__)"
```
`torchaudio` 在 `AudioFromPath.load()` 里 **lazy import** ——
所以没装上时 ComfyUI 启动**不会报错**,只在你跑工作流时才看到:
```
RuntimeError: torchaudio is required. Install with: uv pip install torchaudio
```
### Step 3 — MiMoASR 装好(关键三个坑)
按 [MiMoASR 自己的 README](https://github.com/aadebuger/ComfyUI-MiMoASR#install-the-proven-order) 走。三个**必踩**的坑:
#### 3.1 `transformers` 必须降到 `4.49.0`
```bash
$ uv pip freeze > ~/pip_freeze_before_mimo_$(date +%Y%m%d).txt # 先备份!
$ uv pip install "transformers==4.49.0" "tokenizers>=0.21,<0.22" --force-reinstall
$ python -c "import transformers; assert transformers.__version__ == '4.49.0'; print('OK')"
```
> ⚠️ 这次降级会**破坏** `Sonic`、`Qwen3TTS`、新版 `VibeVoice` 等需要 `transformers>=4.57` 的节点。
> 没办法同居 —— 要么牺牲那些节点,要么开一个独立的 ComfyUI 实例专门跑 MiMo。
#### 3.2 `flash-attn` 必装,没 SDPA 回退
```bash
# 看 torch 版本决定走 wheel 还是源码
$ python -c "import torch; print(torch.__version__)"
```
**A. 你的 torch 是 `2.6.0 + cu12 + Python 3.12`** → 直接装 wheel:
```bash
$ uv pip install flash-attn==2.7.4.post1
```
**B. 你的 torch 是 2.11(实战环境)** → 从源码编译,约 20–40 分钟:
```bash
$ uv pip install ninja packaging
$ export CUDA_HOME=/usr/local/cuda-12.6
$ export TORCH_CUDA_ARCH_LIST="8.6" # 3090=8.6 4090=8.9 H100=9.0
$ export MAX_JOBS=4 # 64GB RAM 可以开 8,OOM 就降到 2
$ nohup uv pip install flash-attn --no-build-isolation \
> ~/flash_attn_build.log 2>&1 &
$ tail -f ~/flash_attn_build.log
```
**验证(必做)**:
```bash
$ python -c "from flash_attn import flash_attn_varlen_func; print(flash_attn_varlen_func)"
# 期望:<function flash_attn_varlen_func at 0x...>
# 如果是 None 或 ImportError → 编译失败,看 ~/flash_attn_build.log
```
如果这里漏了验证,后面会以 `TypeError: 'NoneType' object is not callable` 神秘报错。
#### 3.3 必须把 MiMo 上游 repo 克隆到磁盘
`MimoAudio` 不能 pip 装,loader 会 `sys.path.insert`:
```bash
$ mkdir -p /opt/repos && cd /opt/repos
$ git clone https://github.com/XiaomiMiMo/MiMo-V2.5-ASR.git
$ ls /opt/repos/MiMo-V2.5-ASR/src/mimo_audio/
# 必须能列出 .py 文件。如果是空目录:
$ cd /opt/repos/MiMo-V2.5-ASR && git submodule update --init --recursive
```
### Step 4 — 下载 MiMo 权重(~24 GB)
```bash
# HF cache 必须重定向到大盘
$ export HF_HOME=/mnt/modelall/hf_cache
$ mkdir -p $HF_HOME
$ uv pip install -U huggingface-hub
# 主模型 ~16 GB
$ hf download XiaomiMiMo/MiMo-V2.5-ASR \
--local-dir /mnt/modelall/models/MiMo-V2.5-ASR
# Audio tokenizer ~1-2 GB
$ hf download XiaomiMiMo/MiMo-Audio-Tokenizer \
--local-dir /mnt/modelall/models/MiMo-Audio-Tokenizer
# 验证
$ ls -lh /mnt/modelall/models/MiMo-V2.5-ASR/*.safetensors
$ ls -lh /mnt/modelall/models/MiMo-Audio-Tokenizer/
```
国内下载慢可加 HF 镜像:
```bash
$ export HF_ENDPOINT=https://hf-mirror.com
$ hf download XiaomiMiMo/MiMo-V2.5-ASR --local-dir /mnt/modelall/models/MiMo-V2.5-ASR
```
### Step 5 — 装本包
```bash
$ cd /mnt/modelall/ComfyUI/custom_nodes
$ git clone https://github.com/aadebuger/ComfyUI-VideoToText.git
# OR 从 tarball 装:
$ cd /mnt/modelall/ComfyUI/custom_nodes
$ tar xzf /tmp/ComfyUI-VideoToText-v0.2.0.tar.gz
# 验证目录结构(关键!不能多嵌套一层)
$ ls ComfyUI-VideoToText/
# 必须直接看到 __init__.py / nodes/ / cli/ ...
# 如果是 ComfyUI-VideoToText/ComfyUI-VideoToText/__init__.py(嵌套了),扁平化:
$ cd ComfyUI-VideoToText
$ mv ComfyUI-VideoToText/* .
$ mv ComfyUI-VideoToText/.* . 2>/dev/null
$ rmdir ComfyUI-VideoToText
```
### Step 6 — 装 `rgthree-comfy`(如果还没装)
CLI 用 `PreviewAny` 抓 STRING 输出,必须有:
```bash
$ cd /mnt/modelall/ComfyUI/custom_nodes
$ git clone https://github.com/rgthree/rgthree-comfy.git
```
### Step 7 — 启动 ComfyUI(三个 env var)
```bash
$ pkill -9 -f main.py; sleep 3
$ cd /mnt/modelall/ComfyUI && source .venv/bin/activate
$ export HF_HOME=/mnt/modelall/hf_cache
$ export MIMO_ASR_REPO=/opt/repos/MiMo-V2.5-ASR
# 可选:把 MiMo 绑到 GPU 1,让 GPU 0 留给图像模型
# $ export CUDA_VISIBLE_DEVICES=1
$ nohup python main.py --listen 0.0.0.0 --port 8188 > ~/comfy_start.log 2>&1 &
$ sleep 30
# 看启动日志
$ grep -iE "IMPORT FAILED|VideoToText|MiMo|error" ~/comfy_start.log | head -20
```
### Step 8 — 验证 9 个节点都在
```bash
$ curl -s http://SERVER:8188/object_info | python3 -c "
import json, sys
d = json.load(sys.stdin)
for n in ('VTT_LoadVideo','VTT_ExtractAudio','VTT_AudioFromPath',
'VTT_BuildTranscriptJSON','VTT_SaveTranscript',
'MiMoASRLoader','MiMoASRTranscribe','PreviewAny','LoadAudio'):
print(f' {n}: {\"OK\" if n in d else \"MISSING\"}')"
```
9 个全 OK 才算 ready。
### Step 9 — 跑一个 CLI 测试
```bash
$ cd /mnt/modelall/ComfyUI/custom_nodes/ComfyUI-VideoToText/cli
$ uv pip install --system websocket-client requests
$ uv run python video_to_text_cli.py /path/to/test.mp4 \
--ip 10.8.0.12 \
--model-path /mnt/modelall/models/MiMo-V2.5-ASR \
--tokenizer-path /mnt/modelall/models/MiMo-Audio-Tokenizer \
--repo-path /opt/repos/MiMo-V2.5-ASR \
--language Auto
```
第一次跑会卡 30–60s(MiMo 8B 模型进 VRAM),之后秒级。
---
## 常见失败模式 / Common Failures
| Symptom | Cause | Fix |
| --- | --- | --- |
| `VTT_*: MISSING` 在 `/object_info` | 包没装上 / 嵌套了 / ComfyUI 没重启 | 走完 Step 5 + 重启 |
| `IMPORT FAILED ComfyUI-VideoToText` 在 startup log | Python import 错 | 看 traceback;通常是 `No module named 'folder_paths'`(包不在 `custom_nodes/` 里)|
| `MiMoASRLoader: MISSING` | MiMoASR 装失败 | 看 MiMoASR 的 INSTALL_NOTES |
| `AttributeError: ... 'all_tied_weights_keys'` | `transformers` 太新 | 降到 `4.49.0`,见 Step 3.1 |
| `TypeError: 'NoneType' object is not callable` 在 `flash_attn_varlen_func` | `flash-attn` 编译静默失败 | 重新编,看 `~/flash_attn_build.log`,见 Step 3.2 |
| `RuntimeError: MiMo ASR repo path is empty` | `MIMO_ASR_REPO` 没设 | 启动前 `$ export MIMO_ASR_REPO=...` |
| `RuntimeError: ffmpeg not found on PATH` | ffmpeg 没装 | `$ sudo apt install ffmpeg` |
| `RuntimeError: torchaudio is required` | torchaudio 没装 | `$ uv pip install torchaudio` |
| `model path does not exist` | 工作流里填了相对路径 | 改成绝对路径 |
| CUDA OOM 在 transcribe | GPU 0 被图像模型占了 | `$ export CUDA_VISIBLE_DEVICES=1` 再启动 |
| 启动后再次验证还是 MISSING | 重启没生效 | `$ ps aux \| grep main.py` 确认 PID + `$ stat -c '%y' ~/comfy_start.log` 看时间戳 |
---
## VRAM 预算
| | VRAM |
| --- | --- |
| MiMo-V2.5-ASR load (bf16) | ~17 GB |
| MiMo 推理峰值 | ~20–22 GB |
| 本包节点 | 可忽略(ffmpeg + torchaudio buffer) |
24 GB GPU 够 MiMo + 轻度 ComfyUI 共用。如果你还在同一张卡跑 SDXL / Z-Image-Turbo,**强烈建议** `$ export CUDA_VISIBLE_DEVICES=1` 把 MiMo 隔离到另一张卡。
---
## 清理 / Cleanup
```bash
# 音频缓存(VTT_ExtractAudio 写到 $TMPDIR/comfyui_vtt/)
$ rm -rf /tmp/comfyui_vtt
# ComfyUI output(含已保存的 transcript JSON)
$ ls /mnt/modelall/ComfyUI/output/transcript_*.json
# MiMo 模型(占 ~24GB,慎删)
# $ rm -rf /mnt/modelall/models/MiMo-V2.5-ASR
# $ rm -rf /mnt/modelall/models/MiMo-Audio-Tokenizer
# 卸载本包
$ rm -rf /mnt/modelall/ComfyUI/custom_nodes/ComfyUI-VideoToText
# 重启 ComfyUI
```