GPU 가상화를 통한 컨테이너 별 GPU 분할 할당

주석

목표

  • GUI 환경에서 fGPU (fractional GPU) 자원 옵션을 동적으로 주고 연산 세션을 생성
  • GUI 상에서 해당 세션의 fGPU 자원 할당량을 확인하고 요청한 양대로 생성되는지 확인
  • GUI 상에서 웹 터미널 앱을 띄우고 nvidia-smi 명령을 통해 컨테이너 수준의 GPU 분할 공유 확인

Backend.AI는 하나의 물리 GPU를 여러 개로 분할해서 여러 사용자가 나누어 사용할 수 있는 가상화 기술을 지원하고 있습니다. 따라서, GPU 연산 소요가 크지 않은 작업을 수행하고자 할 경우에는 GPU의 일부만 할당하여 연산 세션을 생성할 수 있습니다. 1 fGPU가 실제로 할당하는 GPU 자원의 양은 관리자 설정에 따라 시스템 별로 다양할 수 있습니다. 예를 들어, 관리자가 하나의 GPU를 다섯 조각으로 분할 설정한 경우, 5 fGPU가 1 물리 GPU, 또는 1 fGPU가 0.2 물리 GPU를 뜻합니다. 이 때 1 fGPU를 설정하여 연산 세션을 생성하면, 그 세션에서는 0.2 물리 GPU에 해당하는 SM(streaming multiprocessor)과 GPU 메모리를 활용할 수 있습니다.

이번에는 GPU를 일부만 할당하여 연산 세션을 생성한 후 연산 컨테이너 내부에서 인식하는 GPU가 정말 물리 GPU의 일부분인지 확인 해보도록 하겠습니다.

먼저 호스트 노드에 장착되어 있는 물리 GPU의 종류와 메모리 용량 등의 정보를 확인 해보겠습니다. 이 가이드를 작성하면서 사용한 GPU 노드에는 다음과 같이 8 GB 메모리의 GPU가 장착되어 있습니다. 그리고 관리자 설정을 통해 1 fGPU를 0.5개의 물리 GPU(또는 1개의 물리 GPU가 2 fGPU)에 해당하는 양으로 설정하였습니다.

../_images/host_gpu.png

이제 Sessions 페이지로 이동하여 다음과 같이 0.5개의 fGPU를 할당하여 연산 세션을 생성 해봅시다:

../_images/session_launch_dialog_with_gpu.png

연산 세션 리스트의 Configuration 열에서 0.5의 fGPU가 할당된 것을 확인할 수 있습니다.

../_images/session_list_with_gpu.png

이제 컨테이너 내부에 직접 접속하여 정말로 0.5 유닛에 해당하는 GPU 메모리(~2 GB)가 할당 되었는지 확인해보겠습니다. 웹 터미널을 띄워 봅시다. 터미널이 뜨면 nvidia-smi 명령을 실행합니다. 다음 그림에서 확인할 수 있는 것처럼 약 2 GB에 해당하는 GPU 메모리가 할당된 것을 확인할 수 있습니다. 이는 PCI passthrough 같은 방식으로는 불가능한 것으로, 물리 GPU가 실제로 1/4로 분할되어 이 연산 세션의 컨테이너 내부에 할당된 것을 보여줍니다.

../_images/nvidia_smi_inside_container.png

이번에는 Jupyter Notebook을 띄워서 간단한 ML 학습 코드를 실행해보겠습니다.

../_images/mnist_train.png

학습이 진행되는 동안 GPU 호스트 노드의 쉘로 접속해서 nvidia-smi 명령을 실행합니다. 다음과 같이 하나의 GPU 사용 프로세스가 있고 이 프로세스는 물리 GPU의 약 25%에 해당하는 자원을 점유중임을 알 수 있습니다. (GPU 점유량은 학습 코드와 GPU 모델에 따라 크게 다를 수 있습니다)

../_images/host_nvidia_smi.png

또는, 아까 띄워둔 웹 터미널에서 nvidia-smi 명령을 내려 컨테이너 내부에서 인식하는 GPU 사용 내역을 조회해보는 것도 가능합니다.