Kerasを使ったモデルのSHAPによる寄与度の評価を実行しようとしたところ、コンテナとの接続が無言で切れる現象が頻発しました。Visual Studio Code(以下、vscode)のRemoteからも、コマンドプロンプトからもコンテナにアクセスできなくなり、Dockerのリスタートorシステムリブートを余儀なくされるほど無反応。
今回はこの事象の回避策について。
vscodeでPythonスクリプトの処理だったりJupyter notebookの実行だったりと、必ず何かの処理中に突然切断されるのが特徴。また、しばらく再接続ができないなど、コンテナに対するアクションも実行不能になりました。
じゃあ、vscodeを使わなければいいのか、という話なのですがそんなこともなく、ターミナルから直接ファイルを指定して実行してもレスポンスが途切れた後、コンテナから切断されてしまいました。
「特定の処理時に必ず切断される」というわけではなく、比較的軽めな処理は問題なく実行できます。逆に言えば、いつ切断されるのかが読めないということでもあります。
その他の特徴としては、切断直後はディスクの使用率がガンッと跳ね上がって、しばらく100%近くに張り付きます。放置していると、徐々に使用率が下がっていきます。ディスクの使用率が下がったころ、再度コンテナにアクセスしてみると接続が可能になりました。
・・・リソース不足じゃない?
# python bar.py
2020-09-08 04:19:54.095345: I tensorflow/core/platform/profile_utils/cpu_utils.cc:104] CPU Frequency: 1992000000 Hz
(いろいろ中略)
2020-09-08 04:19:57.169352: W tensorflow/core/framework/cpu_allocator_impl.cc:81] Allocation of 642252800 exceeds 10% of free system memory.
2020-09-08 04:20:00.732041: W tensorflow/core/framework/cpu_allocator_impl.cc:81] Allocation of 160563200 exceeds 10% of free system memory.
Killed
#
Pythonの実行ログを見てみると、プロセスがkill
されてる・・・なんか、「それ」っぽいな・・・。
原因はDockerのデフォルト設定が、リソースを遠慮がちに設定してる(CPUは1コア、メモリは2GB・・・など)せいで、ちょっと重い処理(shapの寄与度計算とかな!)をすると、スワップ領域まで喰いつくしてしまい、プロセスがコンテナ内部のカーネルによりkill
されてしまうようです。
リソース設定を贅沢に使うよう設定変更してやると、kill
されなくなりコンテナとの切断も起こらなくなりました。
ただし、当たり前だけどリソースをDockerに割り振る分は、他のアプリケーションが割を食うので注意。余力がある分を、Dockerに割り振るといいかと思います。
ちなみに、あんまりこういうケースをネットで見かけなかったのですが、みんなDockerには最初から贅沢なリソースを設定してるの・・・?