Eine Pytorch> = 1.0 Implementierung von Densenets, die zum Speichern von GPU -Speicher optimiert ist.
Während Densenets in Deep-Learning-Frameworks ziemlich einfach zu implementieren sind, sind die meisten ImplMementationen (z. B. das Original) in der Regel an Speicherhungriger. Insbesondere die Anzahl der durch Batch -Normalisierung und Verkettungsoperationen erzeugten Intermediate -Merkmal -Karten wächst quadratisch mit der Netzwerktiefe. Es lohnt sich, zu betonen, dass dies keine Eigenschaft ist, die Densenets innewohnt, sondern der Implementierung.
Diese Implementierung verwendet eine neue Strategie, um den Speicherverbrauch von Densenets zu verringern. Wir verwenden Checkpointing, um die Stapel -Norm- und Verkettungsfunktionskarten zu berechnen. Diese mittleren Merkmalskarten werden während des Vorwärtspasses verworfen und für den Rückwärtspass neu berechnet. Dies fügt 15-20% der Zeitaufwand für das Training hinzu, verringert jedoch den Verbrauch des Merkmals von quadratisch auf linear.
Diese Implementierung ist von diesem technischen Bericht inspiriert, in dem eine Strategie für effiziente Densenets durch Speicherfreigabe beschrieben werden.
In Ihrem vorhandenen Projekt: Es gibt eine Datei im models .
models/densenet.py ist eine Implementierung, die aus den Implementierungen von Torchvision und Project Killer basiert. Wenn Sie sich für Geschwindigkeit interessieren und der Speicher keine Option ist, übergeben Sie das efficient=False Argument in den DenseNet -Konstruktor. Andernfalls pass in efficient=True .
Optionen:
block_config gesteuertefficient=True verwendet die speichereffiziente Versionsmall_inputs=False . Setzen Sie für CIFAR oder SVHN small_inputs=True .Ausführen der Demo:
Das einzige zusätzliche Paket, das Sie installieren müssen, ist 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 >Optionen:
--depth (int) -Tiefe des Netzwerks (Anzahl der Faltungsschichten) (Standard 40)--growth_rate (INT) -Anzahl der Features, die pro Densenetschicht hinzugefügt wurden (Standard 12)--n_epochs (int) -Anzahl der Epochen für das Training (Standard 300)--batch_size (int) -Größe der Minibatch (Standard 256)--seed (int) -manuell den zufälligen Saatgut einstellen (Standard keine) Ein Vergleich der beiden Implementierungen (jeweils ist ein Densenet-BC mit 100 Schichten, Stapelgröße 64, getestet auf einem Nvidia Pascal Titan-X):
| Durchführung | Speicherzusgesuch (GB/GPU) | Geschwindigkeit (Sec/Mini -Stapel) |
|---|---|---|
| Naiv | 2.863 | 0,165 |
| Effizient | 1.605 | 0,207 |
| Effizient (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}
}