深度可分离卷积(Depthwise separable convolutions)为何实测占用更多GPU内存?
关于深度可分离卷积内存占用的误区解答
你的逻辑不存在本质错误,只是和公开资料的结论预设前提不一致,核心混淆了几个概念:
1. 公开资料「内存更低」的预设前提
绝大多数资料提到的深度可分离卷积内存优势,指的是模型参数占用的内存,或是推理场景下的总内存占用,而非训练场景下的峰值激活内存。
- 深度可分离卷积的核心优势是大幅降低参数量:常规卷积参数量为
K*K*Cin*Cout,深度可分离卷积参数量为K*K*Cin + 1*1*Cin*Cout,当输出通道数Cout远大于卷积核尺寸K时,参数量可以降到常规卷积的1/K²,参数内存的优势非常明显。
2. 小尺寸测算的极端性
你选择的输出通道为1的场景是极端个例,不代表常规深度学习的使用场景:
- 如果换为常规卷积的常用配置,比如输入7x7x3、输出5x5x128:
- 常规卷积参数内存:3331284字节 = 13824字节,激活内存:55128*4字节=12800字节,总峰值内存26624字节
- 深度可分离卷积参数内存:(333 + 113*128)*4字节 = 1644字节,峰值激活内存(推理场景下可复用,中间特征用完即删)和常规卷积一致为12800字节,总内存仅14444字节,比常规卷积低45%
- 只有当输出通道数极小的时候,中间激活的额外占比才会被放大,出现你测算的总内存更高的情况。
3. 训练和推理的内存差异
你在PyTorch中测试的是训练场景下的前后向传播内存,训练时需要保留所有层的激活值用于反向传播梯度,深度可分离卷积多出来的逐通道卷积输出都会被全程存储,自然会推高峰值内存。
- 如果切换为推理模式,中间激活用完就可以释放,不需要全程保留,再加上参数内存的大幅降低,总内存占用会显著低于常规卷积实现。
4. 框架实现的额外开销
你手动拼接的深度可分离卷积(逐通道卷积+1x1卷积)没有经过算子融合优化,PyTorch会单独存储两个算子的输出,进一步放大了内存开销。如果使用经过算子融合的优化实现,中间激活的开销会被进一步压缩。
内容的提问来源于stack exchange,提问作者Cptn. Array
相关产品推荐
相关产品推荐

