はじめに
根本的な解決手段はわからない
まず、私は今回の対策で、コアダンプが起こらなくなったものの、これが根本的な解決になっているのかはよくわかっていません。
ただ、いずれにしてもメモリ周りの出来事であることは間違いなく、処理しているデータや構築したネットワークの規模的に、メモリが足らないということは恐らく無いと思っています。
恐らく全く同じ条件下でコアダンプが起こったり起こらなかったり困っている人もいると思われるので、その際の処方箋として参考にしてください。
利用環境
特に以下のどの条件で起こりやすいのかに関しても理解していません。CPUもGPUも特に扱っているものに対して、スペックが足らないということは無いと思います。
PC:Dell XPS8300
CPU:CoreI7
GPU:GeForce GTX1060
OS:Ubuntu 16.04
エディタ:Atom
言語:Python
フレームワーク:TensorFlow1.2.1
ターミナル:bash
対処
importの順番
まずネット上ではtensorflowをインポートするよりも先に、numpyをインポートするようにするとコアダンプが起こらなくなったという情報が何件か出ています。
import tensorflow as tf
import numpy as np
となっているなら
import numpy as np
import tensorflow as tf
に変更するといった形です。とりあえる先頭でnumpyをインポートしておけばいいでしょう。
しかし私の場合はこの対策でも治ることはありませんでした。
動的にメモリを確保する
tensorflowは「sess = tf.Session()」を宣言した時点で、活用できるすべてのリソースを専有します。ターミナルで「nvidia-smi」コマンドで確認してみると、9割以上のGPUのメモリが、宣言しただけで専有されることがわかります。
これを動的に確保するようにすれば、必要な分だけメモリを確保するようになります。数値的に制限することもできますが、あとから増やしていくことを許す形の設定ができるようです。
tf.Session()前
tf.Session()後
tf.Session()のメモリ確保を動的に行う
この形でセッションを立てるとコアダンプがなぜか起こらなくなりました。
具体的なコード
普通にセッションを宣言するときは以下。
これを下の表記に変更したら動的に確保できるようになり、それが理由なのか、コアダンプは起こらなくなりました。
sess = tf.Session()
config = tf.ConfigProto(gpu_options=tf.GPUOptions(allow_growth=True))
sess = tf.Session(config = config)
他にもいろいろな設定の仕方があるようです。
具体的に●●GBまでしかメモリを使っちゃいけないなどの設定もできるようです。