Docker container에서 Host server GPU 사용하기

햄도·2020년 12월 3일
0
  1. Host server에 GPU driver 설치되어있는지 확인. 아래 두 가지 명령어로 확인할 수 있다.
    nvidia-smi
    sudo nvidia-docker version
  1. 기존 사용하던 docker image 커밋하고 새로운 인자 붙여서 다시 run
    sudo docker run -d -it \
    --runtime=nvidia -e NVIDIA_DRIVER_CAPABILITIES=compute,utility -e NVIDIA_VISIBLE_DEVICES=1,2 \
    --name container-name image-name \
  1. 새 컨테이너 접속해서 gpu 잡히는지 확인
    nvidia-smi
  1. 실행하며 문제점 해결
    • UserWarning: CUDA initialization: The NVIDIA driver on your system is too old (found version 10010) → 이 경고 후 실행이 되지 않음
      • 찾아보니 nvidia driver - cuda - pytorch 세 가지 버전이 서로 호환하는 버전이어야 한다.
      • 그런데 서버의 테슬라 드라이버는 418 또는 440만 사용하고 있었다.
      • 현재 설치된 torch 버전은 1.7이었는데, 이 페이지를 보고 이 버전은 CUDA 11, nvidia driver 450~ 과 맞는 것 같다고 추측했다.
      • 결국 torch를 다운그레이드 하기로 결정, 검색 결과 아래 커맨드 찾아서 다운그레이드
            # CUDA 10.1
            pip install torch==1.6.0+cu101 torchvision==0.7.0+cu101 -f https://download.pytorch.org/whl/torch_stable.html
  • 이제 실행은 되는데 실행하다가 메모리가 부족하다고 꺼졌다.
    • GPU가 메모리를 캐싱해놔서 그런 것 같다.
    • 아래 스크립트 추가하여 해결
            import torch, gc
            gc.collect()
            torch.cuda.empty_cache()

PyTorch 메모리 할당 속도를 높이기 위해 caching memory allocater를 사용해서 장치간 동기화 없이 빠른 메모리 해제가 가능하다.
관리되지 않는 메모리는 nvidia-smi에서 여전히 사용되는 것처럼 보일 수 있다.
memory_allocated()와 max_memory_allocated()를 사용해서 모니터링할 수도 있고
empty_cache()를 통해 사용하지 않으면서 캐시된 메모리들을 해제할 수 있다.
하지만 텐서에 의해 할당된 것은 해제 되지 않기에 주의.

  • 실행도 잘 된다. 빨라진 것 같기도 한데 nvidia-smi에서 실행중인 프로세스에 잡히지 않았다.
    • 원래 그렇다는 것 같다.. 뭔지는 잘 모르겠다..
    • 실행중인 프로세스에 잡히지는 않지만 사용중인 gpu 메모리가 올라간 것은 확인할 수 있다.
  1. 추가로 해볼 것
    • multi GPU 말고, 프로세스를 여러 개 띄워 각 gpu에 올리는 것도 가능하다는데 해봐야겠다.
profile
developer hamdoe

2개의 댓글

comment-user-thumbnail
2021년 8월 12일

포스팅 보고 문제 해결 했습니다~ 좋은 글 감사용!

1개의 답글