ハマった問題
- GCP に pyenv で anaconda を入れて jupyter を起動
-
jupyter notebook --ip=0.0.0.0 --port=8888
でサーバを起動し、ローカルからhttp://<GCEインスタンス外部IP>:8888/
に接続 - ipynb を作り、 その中で keras.layer.LSTM のインスタンスをつくると落ちる
原因の調査
実行していたコードはこれで、単純なテキスト分類タスク
1. from keras.layers import Input, LSTM, Embedding
2.
3. MAX_SEQUENCE_LENGTH = 500
4. VOCABULARY = 10000
5. EMBEDDING_DIM = 300
6. LSTM_OUTPUT_DIM = 100
7. EPOCHS = 15
8. BATCH_SIZE = 1024
9.
10. sequence_input = Input(shape=(MAX_SEQUENCE_LENGTH,), dtype='int32')
11. embedded = Embedding(output_dim=EMBEDDING_DIM, input_dim=VOCABULARY, input_length=MAX_SEQUENCE_LENGTH)(sequence_input)
12. preds = LSTM(LSTM_OUTPUT_DIM, return_sequences=True)(embedded)
13.
14. model = Model(sequence_input, preds)
15. model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['acc'])
- 上記の LSTM インスタンスを作成している12行目のところで
Segmentation fault
と出て終わってしまう - そもそも学習すら走らせてないのに、インスタンス作成で死ぬってどういうこと?
LSTM を宣言しないとどうなるか
- すんなり compile まで通る
メモリの上限にきてるのではないか
- GCE のメモリを 240GB に増やして実行
- 使用率5%程度まで使用して、やはり
Segmentation fault
で落ちる
LSTM の出力次元をいじるとどうなるか
- LSTM の出力次元を 10 に変えてみた → 動いた!!!
- LSTM の出力次元を 50 に変えてみた → 動いた!!!
- LSTM の出力次元を 51 に変えてみた → 動かない!!! (Segmentation fault)
- LSTM の出力次元を 60 に変えてみた → 動かない!!! (Segmentation fault)
- 50 と 51 の間に謎の壁がある
keras lstm segmentation fault
でググる
- いろいろ出てくるが、全部
model.fit()
時のSegmentation fault (core dumped)
エラー - 今回は LSTM 宣言しただけで起きてるので、参考になるものがなかった
解決方法
-
ふと、「これは jupyter の問題だったりするんじゃないか?」と思って調べたところ
- https://github.com/jupyter/jupyter/issues/215
- この人は
anaconda
を再インストールしたら解決したと言っている
-
ふと、「anaconda の最新版のバグなんじゃないか」と思って
- anaconda3-5.0.1 (当時最新版)から anaconda3-4.4.0 に変更
- jupyter を再起動し、コードを動かすと………動いた……
結論、 anaconda3-5.0.1 でのバグっぽい?
これ以上調べている時間がなかったので、今回はここまでで原因調査を終了
解決して良かったが、気持ち悪さが残るので時間があるときに調査してみよう