INTRO
로컬에서 작동하는 Pytorch 모델을 docker image로 만들어 작동시키려 하면Unexpected bus error encountered in worker. This might be caused by insufficient shared memory
라는 에러메세지를 뜨곤한다.
이 에러는 현재 도커이미지를 실행시키기엔 할당된 메모리가 부족하단것이고, 그에 대한 해결책으로 제시되는 방법 중 하나는
docker run 할때 --ipc=host
파라미터를 사용하는것이다.
하지만 과연 이 방법이 올바른 방법일까?
Docker 리소스 옵션에 대해
우선 Docker 리소스 옵션에 대해서 이해해야한다. 기본적으로 Docker는 시스템에서 할당한 리소스만큼만 사용가능하다.
Docker Desktop App을 실행하면 아래의 리소스 설정화면이 보이며, 리소스 설정화면에선 Docker 에 할당 가능한 리소스를 변경/적용할 수 있다.
- 현재 사용중인 장비는 Apple M1 Pro(10core CPU, 32RAM) 제품이며, 32GB까지 메모리 할당이 가능한것으로 확인 가능하다. 현재는 7.9GB를 할당하였다.
여기서 말하고자 하는 핵심은 Docker는 시스템에서 할당한 리소스 양을 초과할당을 제한한다는 점이다.
Docker는 할당한 리소스만큼만 사용가능하다는것을 명심하자.
ipc=host 옵션의 뜻
docker run 에서 ipc=host
옵션은 Docker Container의 IPC namespace 를 Host와 공유하는것을 의미한다.
즉, ipc=host
옵션은 Container가 Host의 IPC 리소스에 직접 액세스하는것을 허용하는것인데
따라서 이 옵션의 경우, 할당된 리소스보다 많은 리소스를 사용할 수 있게 설정하고
이는 Docker Desktop App에서 할당된 내용이 아닌, 할당되지 않은 시스템의 리소스를 사용을 허가한다는 내용이다.
왜 ipc=host 옵션을 사용하면 안되는가 ?
Docker 는 내부적으로 cgroups, namespace 개념을 사용하여 리소스/프로세스 격리하여 Docker시스템의 안정성을 보장하고 있는데
`ipc=host` 옵션은 namespace 에 직접적인 연관이 있다.
Linux 에서 IPC namespace 는 프로세스간 통신을 위한 리소스를 격리하는 역할을 하며, 각각의 IPC namespace는 독립적인 IPC리소스집합을 가진다.
서로 다른 IPC namespace에 속한 프로세스는 직접적으로 IPC 리소스를 공유할 수 없다(리소스가 격리되어있다) 는 특징이 있다.
또한 Docker는 Host와 별도의 IPC namespace를 갖고있다.
이 말인 즉, Docker 내부에서 띄우는 Container 의 리소스는 Host의 IPC namespace와 격리시켜서, 서로 리소스를 침범하지 못하게 만들었다는 뜻이다.
그러나, `ipc=host` 옵션은 Docker Container가 Host의 리소스를 사용 가능하게 하는 옵션이기떄문에 ipc=host 옵션을 사용하지 않을것을 권장한다.
왜 ipc=host 옵션을 권장하지 않을까? (여기부터는 내 견해다)
이유로 Docker - Host 간의 리소스/프로세스 침범을 막기위함이라고 생각한다.
도커는 기본적으로 컨테이너를 띄우고/내리는 것이 가장 중요한데
이 경우에 리소스를 격리해두는것이 시스템의 안정성에 이점이 된다고 보는경우가 많은것같다.
그럼 어떤 옵션을 사용해야할까?
docker run 할때 메모리 할당하는 옵션을 지정해주는것이다.
예를들어 --memory {n}g
파라미터를 사용해서 메모리를 할당해줄 수 있다(단위 : GB)
'Cloud > Docker' 카테고리의 다른 글
도커 내부 데이터 로컬로 가져오기 (docker cp) (0) | 2022.07.30 |
---|