HELLO CYBERNETICS

深層学習、機械学習、強化学習、信号処理、制御工学、量子計算などをテーマに扱っていきます

TensorFlowでsegment fault(コアダンプ)が出るようになった場合

 

 

follow us in feedly

f:id:s0sem0y:20170712201644p:plain

 はじめに

根本的な解決手段はわからない

まず、私は今回の対策で、コアダンプが起こらなくなったものの、これが根本的な解決になっているのかはよくわかっていません。

 

ただ、いずれにしてもメモリ周りの出来事であることは間違いなく、処理しているデータや構築したネットワークの規模的に、メモリが足らないということは恐らく無いと思っています。

 

恐らく全く同じ条件下でコアダンプが起こったり起こらなかったり困っている人もいると思われるので、その際の処方箋として参考にしてください。

 

利用環境

特に以下のどの条件で起こりやすいのかに関しても理解していません。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()前

f:id:s0sem0y:20170712201454p:plain

 

 

tf.Session()後

f:id:s0sem0y:20170712201644p:plain

 

 

tf.Session()のメモリ確保を動的に行う

f:id:s0sem0y:20170712201924p:plain

 

 

この形でセッションを立てるとコアダンプがなぜか起こらなくなりました。

 

 

具体的なコード

普通にセッションを宣言するときは以下。

これを下の表記に変更したら動的に確保できるようになり、それが理由なのか、コアダンプは起こらなくなりました。

 

sess = tf.Session()
config = tf.ConfigProto(gpu_options=tf.GPUOptions(allow_growth=True))
sess = tf.Session(config = config)

 

他にもいろいろな設定の仕方があるようです。

具体的に●●GBまでしかメモリを使っちゃいけないなどの設定もできるようです。

 

qiita.com