在本机跑 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,很容易被误判成显存不够。先把运行环境隔离出来再测参数。
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 1dmon 输出的 mem 列是显存占用百分比,换算成 MB 时对照 memory.total。需要记录的峰值时刻通常是三个:权重加载完成后、第一批数据进入模型时、解码或写盘前的最后一段计算。峰值往往出现在前两个时刻,而不是最后一秒。
这一步要记录三项:基线峰值、是否出现 OOM、输出文件是否完整可播放。基线状态下只允许一个变量与目标配置不同,其余参数保持默认,这样后面的比较才有意义。
分别改分辨率、时长、批量,观察峰值变化
每次只改一个变量,其余回到基线,跑完记一行。同时改分辨率和时长,峰值变化就无法归因。下面这张表可以直接抄进笔记:
| 轮次 | 改动变量 | 基线值 | 本轮值 | 峰值显存 | 是否 OOM | 备注 |
|---|---|---|---|---|---|---|
| A | 不改(基线) | — | — | ______ | 否 | 最短片段 |
| B | 分辨率 | 基线分辨率 | 降一档 | ______ | 时长、批量不变 | |
| C | 分辨率 | 基线分辨率 | 升一档 | ______ | 用于确认上限 | |
| D | 时长 | 基线帧数 | 翻倍 | ______ | 分辨率、批量不变 | |
| E | 批量 | 1 | 2 | ______ | 其他不变 |
参数名按仓库配置里的实际字段填,常见的是 resolution、num_frames、batch_size,具体命名以仓库说明为准。显存通常随分辨率面积、帧数、批量增长,但带注意力结构的模型增长可能更陡,所以只认峰值数字,不靠感觉判断。
显存不够时的降级顺序:先批量、再分辨率、最后时长
顺序的含义是:能不动时长就不动时长,因为切段处理会引入拼接问题。三步都按下面方式验证。
- 先降批量。把 batch_size 降到 1,其他参数不动。重新跑同一条输入后需要核对:输出条数与形状是否与基线一致、单次推理耗时是否还能接受、峰值显存是否落到可用上限以内。批量降下来以后如果仍然 OOM,说明瓶颈不在批量,进入下一步。
- 再降分辨率。分辨率降一档,尽量保持原始宽高比。重新跑完需要核对:输出分辨率是否满足下游用途、画面细节是否可接受、峰值显存是否回到安全区间。分辨率降过头会明显影响一分钟视频的观感,建议以最小可接受档位为准。
- 最后降时长。把一分钟切成多段分别推理再拼接。重新跑完需要核对:段与段边界有没有跳变或闪烁、拼接后总时长和帧率是否与预期一致、每段的峰值是否稳定在同一水平。分段后单段峰值可控,但拼接环节需要额外检查。
把精度改为 fp16/bf16 或分层加载权重,属于另一类取舍,是否可用取决于模型和显卡支持情况,需要先确认再试,不建议作为默认降级步骤。