在本地部署 LingBot-Depth 2.0 时,显存占用主要由模型权重、推理时的中间激活、CUDA 上下文和输入数据构成。不同显卡、驱动和 CUDA 版本下实际数值可能差异很大,本文不给出具体显存数据,只提供一套可以直接执行的测量方法和通用优化思路,方便你用自己的环境判断是否够用。
判断是否够用:先单独用 nvidia-smi 记录加载模型前后的显存差值,得到真实占用;不够时依次降低输入尺寸和 batch size、启用混合精度或量化,再用余弦相似度对比优化前后输出。每步优化都需要在本机重新测量,效果因显卡型号和算子的支持程度而异。
用 nvidia-smi 观测加载前后显存变化
最直接的方法是用系统自带的 nvidia-smi,把加载模型前后的显存占用记下来做差值。先确保当前显卡上没有其他大显存进程,然后执行:
nvidia-smi `--query-gpu`=memory.used,memory.total `--format`=csv
记录下加载前的 memory.used。接着用单独一个 Python 进程加载 LingBot-Depth 2.0 模型(不要和测试工具混在一起),加载完成后再次执行同一命令,第二次的 memory.used 减去第一次的值,就是模型权重和 CUDA 上下文占用的近似大小。
如果要看推理时的峰值,可以在运行推理脚本的同时,用 watch -n 0.5 连续刷新:
watch -n 0.5 nvidia-smi
观察推理瞬间的 memory.used 最大值,再减去加载后的基数,得到激活内存增量。这个差值才是判定显卡是否够用的核心数字,因为模型推理时激活内存往往比权重本身更占空间。
调整输入尺寸与批处理大小降低峰值
输入分辨率越高、batch size 越大,中间激活张量越大,峰值显存也越高。如果你的输入是深度图或 RGB 图像,先查看模型预处理的期望输入尺寸,然后把它缩放到该尺寸,不要直接传入原图。批处理大小在本地推理时固定为 1,节省显存优先。
一个可替换的推理配置示例:
# 推理配置示例,按实际模型接口调整
infer_cfg = {
"input_size": [224, 224], # 降低分辨率以减少激活内存
"batch_size": 1, # 优先固定为 1
"num_workers": 0, # 减少数据加载线程
}
# 加载模型后,用该配置预处理输入
# prepared_input = preprocess(image, infer_cfg["input_size"])
# pred = model(prepared_input)
调整后,用第一节的差值法重新测量推理时的峰值显存。如果占用已经降到显卡容量以下,并且输出质量没有明显劣化,就保留该配置;如果仍然超显存,再继续下一步。
启用混合精度或量化压缩模型体积
混合精度把部分计算改成 FP16,可以减少激活显存;量化把权重压缩到 INT8 等低精度,能直接减少权重体积。两种手段都依赖算子支持,需要你在本机测试。
PyTorch 中的混合精度配置片段:
model = model.half().cuda()
# 推理时
with torch.autocast(device_type="cuda", dtype=torch.float16):
pred = model(input_tensor.half())
如果模型包含不支持的算子,可以先用 torch.autocast 只对部分层启用。动态量化示例:
quantized_model = torch.quantization.quantize_dynamic(
model, {torch.nn.Linear}, dtype=torch.qint8
)
TensorRT 中可以用 trtexec 将 ONNX 模型构建为 FP16 engine:
trtexec `--onnx`=model.onnx `--saveEngine`=model_fp16.engine `--fp16`
构建后使用该 engine 推理。每次修改精度后,都要重新测量显存差值,并保留优化前后的模型输出,供下一步对比。
对比优化前后输出差异确认可接受
优化不能只看显存,还要确认输出没有严重偏离原模型。最通用的做法是固定输入,分别用优化前模型和优化后模型输出同一张图/同一批数据,计算余弦相似度。
一个可替换的脚本:
import numpy as np
def cosine_similarity(a, b):
a = a.flatten().astype(np.float32)
b = b.flatten().astype(np.float32)
return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b) + 1e-8)
# pred_ori:原始模型输出,pred_opt:优化后模型输出
sim = cosine_similarity(pred_ori, pred_opt)
print(f"cosine similarity: {sim:.4f}")
相似度越接近 1 越好,但具体阈值取决于任务。对于深度估计这类稠密预测任务,建议除了余弦相似度,再对比输出图的最大/最小值和视觉观感。如果相似度下降明显,说明优化过度,需要回退到更高的精度或更小的输入尺寸。