HOMIE 本地部署先看显存 / 一分钟视频的取舍在分辨率

文章导读
在本机跑 HOMIE,先确认这张卡还能拿出多少显存,再决定一分钟视频用什么分辨率。显存吃紧时的判断路径通常是:空闲余量 → 最短片段基线峰值 → 单变量对比 → 按代价从低到高降级。分辨率对峰值的影响最直接,但批量和时长叠上去也会把峰值顶穿,所以不要一上来就砍时长。
📋 目录
  1. 一 用 nvidia-smi 记录空闲显存作为可用上限
  2. 二 按仓库安装说明建虚拟环境并锁定依赖版本
  3. 三 先跑最短片段,记录推理峰值显存
  4. 四 分别改分辨率、时长、批量,观察峰值变化
  5. 五 显存不够时的降级顺序:先批量、再分辨率、最后时长
A A

在本机跑 HOMIE,先确认这张卡还能拿出多少显存,再决定一分钟视频用什么分辨率。显存吃紧时的判断路径通常是:空闲余量 → 最短片段基线峰值 → 单变量对比 → 按代价从低到高降级。分辨率对峰值的影响最直接,但批量和时长叠上去也会把峰值顶穿,所以不要一上来就砍时长。

适用场景:单机单卡或单机多卡、显存余量不明确的 HOMIE 本地部署。操作动作:先用 nvidia-smi 记录空闲显存作为可用上限,再按依赖环境、最短片段基线、单变量对比的顺序测峰值。验证方式:每次只改一个变量,核对推理日志与 nvidia-smi 观察到的峰值时刻是否对得上。风险边界:峰值由分辨率、时长、批量共同决定,任何一组数字只在当前显卡、驱动和配置下成立,换卡后需要重测。

用 nvidia-smi 记录空闲显存作为可用上限

先知道有多少余量,再谈能跑多长。开机后不要立刻启动推理,先看桌面上有没有别的进程占卡。

nvidia-smi `--query-gpu`=index,name,memory.total,memory.used,memory.free `--format`=csv -l 2

需要记录的字段:index 表示第几块卡,memory.used 是当前底噪,memory.free 是本轮可用的粗略上限。命令末尾的 -l 2 表示每 2 秒刷新一次,观察半分钟取一个稳定值,不要取瞬时抖动的那一行。

如果发现别的进程在占卡,可以再查一次占卡进程:

nvidia-smi `--query-compute-apps`=pid,process_name,used_memory `--format`=csv

把 memory.used 当作底噪记下来,后面估算可用余量时要扣掉这部分。是否要先停掉这些进程,需要结合环境确认,不建议直接结束别人的任务。

按仓库安装说明建虚拟环境并锁定依赖版本

依赖冲突经常表现为加载报错、运行变慢甚至 OOM,很容易被误判成显存不够。先把运行环境隔离出来再测参数。

HOMIE 本地部署先看显存 / 一分钟视频的取舍在分辨率
python -m venv .venv
source .venv/bin/activate   # Windows: .venv\Scripts\activate
python -m pip install -U pip
pip install -r requirements.txt

用 conda 的仓库,改成 conda create -n homie python=<仓库说明的版本> 再激活。Python 版本、CUDA 版本和依赖清单都以仓库安装说明为准,不要自行拼凑版本组合。装完后验证一次 GPU 是否真的可用:

python -c "import torch; print(torch.__version__, torch.version.cuda, torch.cuda.is_available())"

把这行输出和显卡驱动版本一起记下来。后续任何一次 OOM,先回看这行输出,确认不是环境问题,再去调分辨率、时长或批量。

先跑最短片段,记录推理峰值显存

用最短的输入建立基线:截取几秒视频,或者把帧数改到仓库允许的最小值。启动命令按仓库的推理脚本填写,参数名以仓库说明为准。

一边跑一边观察显存曲线,另开一个终端执行:

nvidia-smi dmon -s mu -d 1

dmon 输出的 mem 列是显存占用百分比,换算成 MB 时对照 memory.total。需要记录的峰值时刻通常是三个:权重加载完成后、第一批数据进入模型时、解码或写盘前的最后一段计算。峰值往往出现在前两个时刻,而不是最后一秒。

HOMIE 本地部署先看显存 / 一分钟视频的取舍在分辨率

这一步要记录三项:基线峰值、是否出现 OOM、输出文件是否完整可播放。基线状态下只允许一个变量与目标配置不同,其余参数保持默认,这样后面的比较才有意义。

分别改分辨率、时长、批量,观察峰值变化

每次只改一个变量,其余回到基线,跑完记一行。同时改分辨率和时长,峰值变化就无法归因。下面这张表可以直接抄进笔记:

轮次改动变量基线值本轮值峰值显存是否 OOM备注
A不改(基线)——______否最短片段
B分辨率基线分辨率降一档______时长、批量不变
C分辨率基线分辨率升一档______用于确认上限
D时长基线帧数翻倍______分辨率、批量不变
E批量12______其他不变

参数名按仓库配置里的实际字段填,常见的是 resolution、num_frames、batch_size,具体命名以仓库说明为准。显存通常随分辨率面积、帧数、批量增长,但带注意力结构的模型增长可能更陡,所以只认峰值数字,不靠感觉判断。

显存不够时的降级顺序:先批量、再分辨率、最后时长

顺序的含义是:能不动时长就不动时长,因为切段处理会引入拼接问题。三步都按下面方式验证。

  1. 先降批量。把 batch_size 降到 1,其他参数不动。重新跑同一条输入后需要核对:输出条数与形状是否与基线一致、单次推理耗时是否还能接受、峰值显存是否落到可用上限以内。批量降下来以后如果仍然 OOM,说明瓶颈不在批量,进入下一步。
  2. 再降分辨率。分辨率降一档,尽量保持原始宽高比。重新跑完需要核对:输出分辨率是否满足下游用途、画面细节是否可接受、峰值显存是否回到安全区间。分辨率降过头会明显影响一分钟视频的观感,建议以最小可接受档位为准。
  3. 最后降时长。把一分钟切成多段分别推理再拼接。重新跑完需要核对:段与段边界有没有跳变或闪烁、拼接后总时长和帧率是否与预期一致、每段的峰值是否稳定在同一水平。分段后单段峰值可控,但拼接环节需要额外检查。

把精度改为 fp16/bf16 或分层加载权重,属于另一类取舍,是否可用取决于模型和显卡支持情况,需要先确认再试,不建议作为默认降级步骤。