efficient_densenet_pytorch
1.0.0
pytorch> = 1.0 덴 세트 구현, GPU 메모리를 저장하도록 최적화.
덴 세트는 딥 러닝 프레임 워크에서 구현하기가 상당히 쉽지만 대부분의 윤곽 (예 : 원본)은 메모리 헝가리가 많은 경향이 있습니다. 특히, 배치 정규화 및 연결 작업에 의해 생성 된 중간 피처 맵의 수는 네트워크 깊이에 따라 차분하게 증가합니다. 이것이 덴 세트에 내재 된 속성이 아니라 구현에 대한 속성이라는 점을 강조 할 가치가 있습니다.
이 구현은 새로운 전략을 사용하여 밀도의 메모리 소비를 줄입니다. 체크 포인팅을 사용하여 배치 규범 및 연결 기능 맵을 계산합니다. 이 중간 기능 맵은 전방 패스 중에 폐기되고 뒤로 패스를 위해 재 계산됩니다. 이로 인해 훈련을 위해 15-20%의 오버 헤드가 추가되지만 기능 맵 소비를 2 차에서 선형으로 줄입니다.
이 구현은이 기술 보고서에서 영감을 얻어 메모리 공유를 통해 효율적인 덴 세트 전략을 간략하게 설명합니다.
기존 프로젝트에는 models 폴더에 하나의 파일이 있습니다.
models/densenet.py 는 Torchvision 및 Project Killer 구현을 기반으로 한 구현입니다. 속도에 관심이 있고 메모리가 옵션이 아닌 경우 efficient=False 인수를 DenseNet 생성자로 전달하십시오. 그렇지 않으면 efficient=True 로 전달하십시오.
옵션 :
block_config 옵션으로 제어됩니다efficient=True 메모리 효율적인 버전을 사용합니다small_inputs=False 설정하십시오. cifar 또는 svhn의 경우 small_inputs=True 설정하십시오.데모 실행 :
설치해야 할 유일한 추가 패키지는 파이썬 파이어입니다.
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) -미니 배트 크기 (기본값 256)--seed (int) -수동으로 임의의 시드를 설정합니다 (기본값 없음) 두 구현 (각각 NVIDIA PASCAL TITAN-X에서 테스트 된 배치 크기 64의 100 층이있는 덴 세트 -BC)의 비교 :
| 구현 | 메모리 소비 (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}
}