不少同學抱怨,在集群的GPU節點上運行caffe程序時,經常出現"Out of Memory"的情況。實際上,如果我們在提交caffe程序到某個GPU節點的同時,指定該節點某個比較空閒的gpu id,便可以避免"Out of Memory"的情況。
步驟如下:
1. 在提交任務前,制作一個帶有“nvidia-smi”命令的run_gpu.sh文件
#!/bin/bash #$ -V #$ -cwd #$ -j y #$ -S /bin/bash nvidia-smi
2. 提交run_gpu.sh文件到某個GPU節點(以g0502為例)
qsub -l h=g0502 run_gpu.sh
3. 查看run_gpu.sh任務的運行結果
可以看到,g0502節點有四塊gpu,id分別為0, 1, 2, 3。其中0,1和3的內存幾乎都已經占滿了,只有2稍微空閒一些。所以,若在提交caffe程序到g0502節點上,需要指定運行caffe程序的gpu id為2。否則,提交上去的caffe程序將默認gpu id為0,導致很有可能出現"Out of Memory"的情況。
4. 在提交caffe程序的.sh文件(如caffe_train.sh)中指定gpu id。
1 #!/bin/bash 2 #$ -V 3 #$ -cwd 4 #$ -j y 5 #$ -S /bin/bash 6 7 ./build/tools/caffe train -gpu 2 -solver models/segnet/segnet_building_solver.prototxt
在.sh文件的第7行,"-gpu 2"的含義為顯式指定gpu id為2。
5. 提交caffe_train.sh文件到g0502節點。
qsub -l h=g0502 caffe_train.sh
6. 查看caffe_train.sh.o文件
可以看到,caffe_train.sh文件指定了g0502節點中gpu id為2的gpu來運行caffe程序。這樣,我們便可以在很大程度上避免在集群上運行的caffe程序出現"Out of Memory"的情況。
7. 用matcaffe測試訓練好的caffemodel時指定gpu id
與訓練時一樣,用matcaffe測試訓練好的caffemodel時,我們也可以顯式指定gpu id,以避免出現“Out of Memory"的情況。與在caffe_train.sh文件中指定gpu id不一樣,測試時,我們需要在.m文件中顯式指定gpu id。而不是在.sh文件中指定。
caffe.set_mode_gpu(); caffe.set_device(2); % set gpu id net = caffe.Net(model, weights,'test');
第2行,caffe.set_device(2),顯式指定gpu id為2。
8. 用pycaffe測試訓練好的caffemodel時指定gpu id
與matcaffe同理,我們需要在.py文件中顯式指定gpu id。
1 import caffe 2 #..... 3 if __name__ == '__main__': 4 caffe.set_mode_gpu() 5 # set gpu_id 6 caffe.set_device(2);
第6行,caffe.set_device(2),顯式指定gpu id為2。
至此,我們便可以通過指定集群某個節點中較為空閒的gpu id來避免出現“Out of Memory"的情況~^_^~