質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Chainer

Chainerは、国産の深層学習フレームワークです。あらゆるニューラルネットワークをPythonで柔軟に書くことができ、学習させることが可能。GPUをサポートしており、複数のGPUを用いた学習も直感的に記述できます。

MPI

MPIは、並列プログラミングを利用するための標準化規格、及び実装自体のことを指します。バイト列で構成されたメッセージとして、いくつかのCPUが情報を送受信することにより協調動作を可能にします。

Ubuntu

Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

Q&A

解決済

1回答

5198閲覧

ChainerMN mpirunでexited on signal 9 (Killed).

YukiSato

総合スコア10

Chainer

Chainerは、国産の深層学習フレームワークです。あらゆるニューラルネットワークをPythonで柔軟に書くことができ、学習させることが可能。GPUをサポートしており、複数のGPUを用いた学習も直感的に記述できます。

MPI

MPIは、並列プログラミングを利用するための標準化規格、及び実装自体のことを指します。バイト列で構成されたメッセージとして、いくつかのCPUが情報を送受信することにより協調動作を可能にします。

Ubuntu

Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

0グッド

0クリップ

投稿2018/06/23 00:17

ChainerでマルチGPU化をしようと思い、既存のコードを改変しGPU9台で学習できるようにしました。が、自作で組み立てたUbuntuマシンがmpirunコマンドを実行するとシグナル9で強制停止してしまいます。

mpirun

1

↑エラーメッセージ
ちょっと調べて見るとメモリが足りないうんちゃらという感じで若干情報はヒットするのですが、いかんせん対応方法がわかりません。

もし、少しでも知見がある方いらしゃればご教授いただければ幸いです。

以下環境です
Ubuntu16.04
Chainer 3.5.0
ChainerMN 1.2.0
cupy 2.4.0
Cython 0.28.2
CUDA 8.0

以下参考にしたサイトです
ネットに落ちてたchainerコードをchainermn対応させて使っています。

リンク内容
↑競馬予想ニューラルネット

リンク内容
↑chainerMNのQiita記事

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

ちょっと調べて見るとメモリが足りないうんちゃらという感じで若干情報はヒットするのですが、

いえ、実際問題として signal 9 で kill されるとなると、マシン自体のメモリが足りないというのが第一感です。おそらくOom-killerでしょうから、当該ノードの syslog ( /var/log/messages あたり? ) に記録があると思います。
※ulimitによるメモリ制限の場合は signal 9 (SIGKILL) ではなく signal 11 (SIGSEGV) になるはずですから…

なので…。マシンの空きメモリと、動かすプログラムに必要なメモリ量が見合ってますか? というところから確認するしかないと思います。
※万が一として、cgroups の機能を使ってメモリ制限をかけてたり…しませんよね。

追記:
kill 9 の発生条件で「ulimitによるCPU時間制限超過」というのもあったのを思い出しました。なので Oom-killer とは断言できませんね。いずれにせよ、syslog で Oom-killer の発生有無は確認した方が良いと思います。

投稿2018/06/23 14:51

編集2018/06/23 15:03
angel_p_57

総合スコア1681

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YukiSato

2018/06/23 16:32 編集

ありがとうございます! 該当箇所をsudo cat syslog.1 | grep Killedで確認させていただきましたが、 Jun 22 23:03:19 ホスト名 kernel: [ 4382.373047] Killed process 4044 (python3) total-vm:82927152kB, anon-rss:47696kB, file-rss:573920kB という形でログが残っていました。 こちらがメモリー不足でKillされたという事でしょうか?もしそうであれば対応方法を教えていただければ大変助かります!
angel_p_57

2018/06/23 17:14

> こちらがメモリー不足でKillされたという事でしょうか? そうですね。おそらく直前のログに"Out of Memory: Killed process 4044 (python3)"というのもあるはずです。( Out Of Memory で kill するから Oom-killer ) で、本当にメモリが足りないのならシステム的にはどうしようもありません。アプリ側で省メモリできないかどうかの話になります。 ただ、killされたプロセスのメモリ使用状況からすると、どうも本当にメモリが不足しているわけではないのかも知れませんね。 一旦切ります。
angel_p_57

2018/06/23 17:37

killされたプロセスのメモリ使用状況ですが、total-vm約80GB(!)、2種類のrssで計600MB程度、大きな乖離があります。前者が確保した仮想メモリ空間量 ( 実際にそれだけ使うとは限らない ) 後者が実メモリ量なので、前者が引っかかっているとすれば対策があるかも知れません。 Linuxの場合、overcommitという機能がありまして、平たく言えば「実メモリ・スワップかき集めても足りない量の仮想メモリを(たとえ使わないにしても)割り当てていいの?」というところ、ポリシーを調整できるようになっています。で、そのポリシーによっては、実メモリ消費が少なくとも仮想メモリを大量に確保するアプリがOOMに引っかかることがあります。 このポリシーはカーネルのパラメータとして、/proc/sys/vm/overcommit_memory で変更でき、値 1 が制限なし ( 仮想メモリはいくらでも割り当ててあげるけど、後で実メモリ足りなくなっても知らんで ) 状態です。これを試してみる価値はあると思います。 …で、思い出したのですが、この仮想メモリと実メモリの乖離というのは、CUDAアプリでは昔 ( Unified Addressが導入されたCUDA4あたり? ) からある話でして。ただ、それがOom-killerに引っかかる要因になるかは、申し訳ないですが把握していません。
YukiSato

2018/06/24 15:10

懇切丁寧なご指導をありがとうございます。 一つ前のログを確認したところ確かに Jun 22 23:03:19 ホスト名 kernel: [ 4382.373034] Out of memory: Kill process 4044 (python3) score 52 or sacrifice child とありました。 sshでUbuntuにログインしてましたので、sudo su - でroot化し echo 1 > /proc/sys/vm/overcommit_memory と、しました。が kernel: [76886.654634] Out of memory: Kill process 4002 (python3) score 56 or sacrifice child kernel: [76886.654647] Killed process 4002 (python3) total-vm:84588060kB, anon-rss:209024kB, file- rss:636640kB となりまたしても終了してしまいました。 kernel: [ 0.000000] Initializing cgroup subsys cpuset kernel: [ 0.000000] Initializing cgroup subsys cpu kernel: [ 0.000000] Initializing cgroup subsys cpuacct ログ上に上記が残っていましたが、何か関係はあるでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問