(メモリ不足には、メインメモリが不足してswapも不足している場合もある)
yolo v8のコンテナを動かしていたらshmメモリが足りないと言われたので、回り道しつつ解決した。
以下のコマンドでメモリとCPUの使用状況をリアルタイムで表示
これは、コンテナ外の、通常の端末で実行。
docker container stats
以降は、Dockerコンテナ内で実行する。
ストレスをかけた場合に、数値が上昇することを確認
stressコマンドのインストールと利用
sudo apt install stress
メモリを試す
メモリを64G使ってみる。
stress -m 1 --vm-bytes 64G --vm-hang 0 -v
120Gでも大丈夫だった。
stress -m 1 --vm-bytes 120G --vm-hang 0 -v
CPUを試す
あらかじめ、CPUのコア数を調べる
cat /proc/cpuinfo | grep processor | wc -l
以上から、今回作成したコンテナは母艦のメモリとCPUをいっぱいまで使えそうということが分かった。
shmメモリ不足の対応
yolo v8のコンテナを動かしていたら以下のようなエラーが出る。上記のメモリは十分なのに。なぜ?どうやら、メモリと言っているものと、shmと言っているメモリは別物なのか。
shmメモリのサイズはデフォルトで64Mとなっているらしく、このコンテナでも
df -h で確認できた。
Docker公式サイトでshmメモリサイズをdocker-compose.ymlファイルでの設定方法を見ると以下のようであるが、機能しない。
https://docs.docker.jp/compose/compose-file/compose-file-v3.html#shm-size
公式サイトのインデントが間違っているようで、以下のようにbuildと同じレベルに合わせたら、うまく行った。
これまで、tensorflowの学習などは特に変更せずに使えていたので不思議。
なお、コマンドラインからの起動オプションはネットに記事多数。
swapメモリを増やす方法
DL学習時にkillメッセージが出て止まってしまうことがある。
先ずは、Swapファイルの作成と設定
gnome-system-monitor #リソースの使用状況をGUIで確認
sudo swapon --show #スワップファイル状況表示
sudo fallocate -l 64G /swapfile3 #スワップファイルの作成
sudo chmod 600 /swapfile3 #アクセス権の変更
sudo mkswap /swapfile3 #作成したファイルをスワップとして設定
sudo swapon /swapfile3 #設定後に有効化が必用
sudo swapon --show #再度確認し、スワップとして認識されること
次に永続化(再起動しても設定が残るように)
エディタを管理者権限で起動(/etc/fstabの編集)。例えば
sudo gedit /etc/fstab
最終行に以下を加える
/swapfile3 none swap sw 0 0
以上。
swapを消したり、消してサイズを変更して再作成するとき
sudo swapoff /swapfile3
sudo rm /swapfile3
さらに、/etc/fstabの編集を元に戻す