A Pytorch> = 1.0 Implementación de Densenets, optimizado para guardar la memoria de GPU.
Si bien los densenets son bastante fáciles de implementar en los marcos de aprendizaje profundo, la mayoría de las implementaciones (como el original) tienden a tener hambre de memoria. En particular, el número de mapas de características intermedios generados por la normalización por lotes y las operaciones de concatenación crece cuadráticamente con la profundidad de la red. Vale la pena enfatizar que esta no es una propiedad inherente a los densenets, sino a la implementación.
Esta implementación utiliza una nueva estrategia para reducir el consumo de memoria de densenets. Utilizamos el punto de control para calcular la norma por lotes y los mapas de características de concatenación. Estos mapas de características intermedios se descartan durante el pase hacia adelante y se recomputan para el pase hacia atrás. Esto agrega 15-20% de los gastos generales de tiempo para el entrenamiento, pero reduce el consumo de mapas de características de cuadrática a lineal.
Esta implementación está inspirada en este informe técnico, que describe una estrategia para densenets eficientes a través del intercambio de memoria.
En su proyecto existente: hay un archivo en la carpeta models .
models/densenet.py es una implementación basada en las implementaciones de TorchVision y Project Killer. Si le importa la velocidad, y la memoria no es una opción, pase el argumento efficient=False al constructor DenseNet . De lo contrario, pase en efficient=True .
Opciones:
block_configefficient=True usa la versión de eficiencia de memoriasmall_inputs=False . Para CIFAR o SVHN, establezca small_inputs=True .Ejecutando la demostración:
El único paquete adicional que necesita instalar es 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 >Opciones:
--depth (int) -profundidad de la red (número de capas de convolución) (predeterminado 40)--growth_rate (int) -número de características agregadas por capa de densenet (predeterminado 12)--n_epochs (int) -número de épocas para el entrenamiento (predeterminado 300)--batch_size (int) -Tamaño de minibatch (predeterminado 256)--seed (int) -Establezca manualmente la semilla aleatoria (predeterminado Ninguno) Una comparación de las dos implementaciones (cada una es un Densenet-BC con 100 capas, tamaño por lotes 64, probado en un Nvidia Pascal Titan-X):
| Implementación | Memoria Cosumty (GB/GPU) | Velocidad (SEC/Mini Batch) |
|---|---|---|
| Ingenuo | 2.863 | 0.165 |
| Eficiente | 1.605 | 0.207 |
| Eficiente (multi-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}
}