Elastic Beanstalk 의 Docker 에서 Cuda가 지원되지 않는 문제
Elastic Beanstalk 에서 docker 런타임으로 배포시 g4dn 인스턴스임에도 컨테이너 안에서 gpu를 쓸 수 없는 문제를 발견했다.
구글링 결과 찾은 유일한 글(https://stackoverflow.com/q/59035690)의 솔루션은
- Deep Learning AMI 를 사용
- 환경변수에
NVIDIA_VISIBLE_DEVICES=all
, NVIDIA_DRIVER_CAPABILITIES=compute,utility
넣기
.ebextensions
에 command 를 추가해서 /opt/elasticbeanstalk/hooks/appdeploy/enact/00run.sh
안에 있는 docker run -d
를 docker run --runtime=nvidia -d
로 replace 하기
그러나 최신 EB 환경 안에서는 00run.sh
를 찾을 수 없었고 배포도 실패했다.
EB 인스턴스 안에서 docker run
이라는 텍스트가 포함된 모든 파일을 /
부터 다 find 했는데도 그 비슷한 배치파일 하나 찾을 수 없었다.
아마도 EB 배포방식이 조금 달라졌나보다.
한참 헤매다가 docker default-runtime 을 nvidia 로 설정할 수 있는 방법(http://haanjack.github.io/docker/2018/02/21/nvidia-docker2-runtime.html)을 찾아서 /etc/docker/daemon.json
를 overwrite 하는 방법으로 문제를 해결했다.
Deep Learning AMI (Amazon Linux 2) Version 36.0 (ami-0550df853e1f98198
) 에서
환경변수 NVIDIA_VISIBLE_DEVICES
와 NVIDIA_DRIVER_CAPABILITIES
를 설정하고
.ebextensions/01-nvidia-docker.config
를 아래와 같이 작성했더니 잘 작동했다.
참고로 이미 다른 컨테이너가 띄워진 인스턴스에서는 ebextensions 를 작성해서 deploy 해도 바로 적용되진 않고 ec2 인스턴스에 접속해서 docker service 를 restart 해야 default runtime이 적용이 된다.
처음 만들어지는 인스턴스에는 restart를 할 필요 없이 바로 적용된다.
(첫 배포시에는 인스턴스를 다 죽이고 처음부터 배포하는게 편하다 ㅎㅎ)