efficient_densenet_pytorch
1.0.0
pytorch> = 1.0登录实现,优化以保存GPU内存。
尽管在深度学习框架中易于实现,但大多数暗示(例如原始)往往是渴望记忆的。特别是,通过批处理标准化和串联操作生成的中间特征图的数量随着网络深度而倍增。值得强调的是,这不是登记材料固有的财产,而是实施的属性。
该实施采用新的策略来减少登录的记忆消耗。我们使用检查点来计算批处理标准和串联特征图。这些中间特征地图在向前传球期间被丢弃,并重新计算为向后通行证。这增加了15-20%的时间开销供培训,但将特征图的消耗从二次变为线性。
该技术报告的启发是此实现的启发,该报告概述了通过内存共享的有效致密材料的策略。
在您现有的项目中: models文件夹中有一个文件。
models/densenet.py是基于火炬和项目杀手实现的实现。如果您关心速度,而不是一种内存,则将efficient=False参数传递到DenseNet构造函数中。否则,通过efficient=True 。
选项:
block_config选项控制efficient=True使用内存效率版本small_inputs=False 。对于CIFAR或SVHN,设置small_inputs=True 。运行演示:
您需要安装的唯一额外软件包是Python-Fire:
pip install fireCUDA_VISIBLE_DEVICES=0 python demo.py --efficient True --data < path_to_folder_with_cifar 10> --save < path_to_save_dir >CUDA_VISIBLE_DEVICES=0,1,2 python demo.py --efficient True --data < path_to_folder_with_cifar 10> --save < path_to_save_dir >选项:
--depth (int) - 网络深度(卷积层的数量)(默认40)--growth_rate (int) - 每个densenet层添加的功能数(默认12)--n_epochs (INT) - 训练时期的数量(默认300)--batch_size (int) - MiniBatch的大小(默认256)--seed (int) - 手动设置随机种子(默认无) 两种实现的比较(每个实现是一个densenet-BC,具有100层,批量64,在Nvidia pascal Titan-X上进行了测试):
| 执行 | 记忆助理(GB/GPU) | 速度(SEC/迷你批次) |
|---|---|---|
| 幼稚的 | 2.863 | 0.165 |
| 高效的 | 1.605 | 0.207 |
| 高效(多GPU) | 0.985 | - |
@article{pleiss2017memory,
title={Memory-Efficient Implementation of DenseNets},
author={Pleiss, Geoff and Chen, Danlu and Huang, Gao and Li, Tongcheng and van der Maaten, Laurens and Weinberger, Kilian Q},
journal={arXiv preprint arXiv:1707.06990},
year={2017}
}