環境
windows10 64bit
cpu: Ryzen7 1700X
gpu: GTX1080Ti
CUDA9.0
cuDNN7.3.1 for cuda9.0
python3.6
tensorflow-gpu 1.11.0
keras 2.2.4
やったこと
- jupyter notebookで実行後にgc.collect()
- jupyter notebookで実行後にdel model
- 1つのclassにまとめてjupyter notebookで実行後インスタンスをdelする
- pyファイルにまとめてjupyter notebookから%runで呼ぶ
- terminalでpyファイルを実行
- pycharmでpyファイルを実行
何故やったか
GPU使った画像認識をjupyter notebookでやろうとしたんですが、2回目以降学習が止まってしまって困りました。nvidia-smiでメモリ使用状況を確認したところ、学習が終わったあともメモリがリリースされてないのが分かったので、これをリリースするべく色々試してみましたが結局ダメでした。
結論
jupyter notebook上で出来る1~4は全部ダメ
pycharmまたはterminalは無事リリースされる
jupyter notebookがダメ?困ったなぁ…
1. jupyter notebookで実行後にgc.collect()
>>> import gc
>>> gc.collect()
2. jupyter notebookで実行後にdel model
keras+tensorflow-gpuで以下のようにモデルを作ったあと学習してたので、このmodelをdelしたらメモリもリリースされるかな、とやってみました。
>>> #学習
>>> model = self.initModel(self.nb_classes)
>>> history = model.fit_generator(train_batches, train_steps, epochs=self.epoch, validation_data=valid_batches, validation_steps=valid_steps)
>>> del model
3. 1つのclassにまとめてjupyter notebookで実行後インスタンスをdelする
じゃあ1つのclassにまとめて、インスタンスを作って実行した後にインスタンスをdelしたらどうかなというのをやってみました。class visual()にすべてのコードをまとめて以下のように実行後にdel。
>>> study = visual()
>>> %time history = study.main()
>>> del study
4. pyファイルにまとめてjupyter notebookから%runで呼ぶ
上記でまとめたclassをpyファイルにして、jupyter notebookから呼んだらどうかなというのをやってみました。下記ではipynbファイル置いてる場所と同じフォルダにvisual10.pyを置いています。
>>> %run './visual10.py'
5. terminalでpyファイルを実行
そんで、上記visual10.pyをterminalから実行するとどうなるかというとですね
6. pycharmでpyファイルを実行
じゃあ同じことをpycharmからやると?
まとめ
4~6は同じファイルを実行してるだけなんですよね。今回は比較のために同じAnacondaで作ったpython.exeファイルを使って実行してるので、違いはどこから実行したかだけなんですが、jupyter notebookのみがダメという結果になりました。
1回だけ実行するなら問題ないし、コードを書いていく過程では結果が見やすいjupyter notebookがやりやすいので、jupyter notebookで書きながら完成したらpyファイルにまとめるというやり方になりそうです。
ほんとは全部jupyter notebookでやりたいんで、継続して良い方法を探したいですが検索しても手動でプロセスkillする方法しか出て来ないので連続して複数の条件を試していく使い方が出来ないんですよね…
悩ましいです。