Docker コンテナ上で pytorch を動かしているときに、
DataLoader worker (pid xxx) is killed by signal: Bus error.
というエラーが出ました。
原因を調べたのでメモしておきます。
エラーメッセージをググると、 Pytorch のフォーラムでのディスカッションが出てきます。
どうやら、shared memory が足りていないらしい。
ためしに以下のコマンドを打つと、
$ df -h
以下のような感じになっていました。
Filesystem | Size | Used | Avail | Use% | Mounted on |
---|---|---|---|---|---|
shm | 64M | 0 | 64M | 0% | /dev/shm |
64M しか確保されていない。
この問題は、docker run もしくは docker-compose up をするときに解決することができます。
https://docs.docker.com/engine/reference/run/#runtime-constraints-on-resources
https://stackoverflow.com/questions/30210362/how-to-increase-the-size-of-the-dev-shm-in-docker-container
docker run の場合、
docker run --rm -it --shm-size=256m Image /bin/sh
というふうに --shm-size
というオプションを渡してあげればよいです。
渡せる値の形式は <number><unit>
となっており、
numberは0より大きい整数、unitは、b, k, m, g のうちから一つ選択となっています。
docker-compose も同じで、
build: .
shm_size: '2gb'
といった感じで書けるようです。
実際、 docker-compose.yml
に shm_size: '2gb'
を追加して実行すると、
Filesystem | Size | Used | Avail | Use% | Mounted on |
---|---|---|---|---|---|
shm | 2.0G | 0 | 2.0G | 0% | /dev/shm |
というふうに出力されて、無事めでたく shared memory の容量が増やせています。
2023/5/7 追記
以前この記事では、
build:
- context: .
- shm_size: '2gb'
のような書き方ができると書いていましたが、うまく動かなかったので、ChatGPT に聞いてみたところ、buildの中に書く書き方は間違っているようでした。
真偽の程は不明ですが、とりあえず解決できたので、参考になれば。