A Pytorch> = 1.0 Implementação de Densenets, otimizada para salvar a memória da GPU.
Embora os Densenets sejam bastante fáceis de implementar em estruturas de aprendizado profundo, a maioria das implicações (como o original) tende a ter faminta por memória. Em particular, o número de mapas de recursos intermediários gerados pelas operações de normalização e concatenação em lote cresce quadraticamente com a profundidade da rede. Vale ressaltar que isso não é uma propriedade inerente aos densenets, mas à implementação.
Esta implementação usa uma nova estratégia para reduzir o consumo de memória de Densenets. Utilizamos o check -se para calcular os mapas de recursos de norma e concatenação em lote. Esses mapas de recursos intermediários são descartados durante o passe para a frente e recomputados para o passe para trás. Isso adiciona 15-20% da sobrecarga de tempo para treinamento, mas reduz o consumo de mapas de recursos de quadrático a linear.
Essa implementação é inspirada neste relatório técnico, que descreve uma estratégia para densenets eficientes via compartilhamento de memória.
No seu projeto existente: existe um arquivo na pasta models .
models/densenet.py é uma implementação baseada nas implementações da Torchvision e do Project Killer. Se você se preocupa com a velocidade e a memória não é uma opção, passe o efficient=False no construtor DenseNet . Caso contrário, passe em efficient=True .
Opções:
block_configefficient=True usa a versão com eficiência de memóriasmall_inputs=False . Para cifar ou svhn, set small_inputs=True .Executando a demonstração:
O único pacote extra que você precisa instalar é o python-fogo:
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 >Opções:
--depth (int) -profundidade da rede (número de camadas de convolução) (padrão 40)--growth_rate (int) -Número de recursos adicionados por camada densenet (padrão 12)--n_epochs (int) -Número de épocas para treinamento (padrão 300)--batch_size (int) -tamanho do minibatch (padrão 256)--seed (int) -defina manualmente a semente aleatória (padrão nenhum) Uma comparação das duas implementações (cada uma é um Densenet-BC com 100 camadas, tamanho 64 do lote, testado em um Nvidia Pascal Titan-X):
| Implementação | Cosunção de memória (GB/GPU) | Velocidade (seg/mini lote) |
|---|---|---|
| Ingênuo | 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}
}