GPU

openfx-gpu

OpenFx 프레임워크는 다음과 같이 gpu를 지원하고 있다. 설치된 그래픽 카드를 사용하기 위해서는 그래픽 드라이버를 추가로 설치해주어야 한다. 설치 과정은 다음과 같다.

Check graphic card

$ lspci | grep 'VGA'
>>
85:00.0 VGA compatible controller: NVIDIA Corporation GP102 [GeForce GTX 1080 Ti] (rev a1)

Install kernel latest version

$ yum update
$ reboot
$ yum install kernel-devel-$(uname -r) gcc

Stop Nouveau module

설치 작업을 위해서 Nouveau 모듈을 잠시 중지해야 한다. Nouveau는 기본적으로 설치되는 그래픽 카드 드라이버이다. 이는 nvidia 드라이버와 충돌을 일으키기 때문에 다음 부팅시에도 사용하지 않도록 해야 한다. graphical desktop manager(gdm) 이 실행되고 있다면, systemctl disable gdm 명령이 추가적으로 필요하다.

$ echo 'blacklist nouveau' >> /etc/modprobe.d/blacklist.conf
$ echo 'options nouveau modeset=0' >> /etc/modprobe.d/blacklist.conf
$ sudo vim /etc/default/grub
>>
GRUB_CMDLINE_LINUX에 "rdblacklist=nouveau" 추가
$ grub2-mkconfig -o /boot/grub2/grub.cfg 
$ systemctl disable gdm
$ reboot

Install graphic driver

다음 링크에 접속하여 해당 모델명에 따른 최신 드라이버 버전을 찾은 후, 해당 드라이버를 다운로드한다. 다운받은 파일을 다음과 같이 실행하여 설치를 진행한다.

$ bash NVIDIA-Linux-x86_64-450.66.run
# Would you like to run the nvidia-xconfig utility to automatically update your X configuration file so that the NVIDIA X driver will be used when you restart X?  Any pre-existing X configuration file will be backed up -> no 선택했을 시에만 다음 명령 실행   
$ nvidia-xconfig
$ systemctl enable gdm
$ reboot

Check nvidia driver

재부팅 후, 그래픽 드라이버가 정상적으로 설치되었는지를 확인하기 위해 다음 명령어를 실행한다.

$ nvidia-smi
>>
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 440.100      Driver Version: 440.100      CUDA Version: 10.2     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  GeForce GTX 106...  Off  | 00000000:02:00.0 Off |                  N/A |
|  0%   34C    P8     7W / 180W |     71MiB /  6078MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
|   1  GeForce GTX 106...  Off  | 00000000:85:00.0 Off |                  N/A |
|  0%   40C    P8     7W / 180W |   4129MiB /  6078MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
|    0     13806      C   python3                                       61MiB |
|    1      1325      C   python3                                     4058MiB |
|    1     13806      C   python3                                       61MiB |
+-----------------------------------------------------------------------------+

Install nvidia docker

By Ansible

Ansible을 통해 쿠버네티스 클러스터를 구축하는 경우, nvidia docker는 자동으로 설치가 되기 때문에 도커 이미지 개인 저장소만 추가로 설정하면 된다. 이는 다음의 경로에 있는 파일에서 -insecure-registry 항목을 수정한다.

$ sudo vim kubespray/inventory/mycluster/group_vars/all/nvidia-docker.yml
>>
docker_options: "--default-runtime nvidia --default-ulimit memlock=-1:-1 --default-ulimit stack=67108864:67108864 --add-runtime nvidia=/usr/bin/nvidia-container-runtime --insecure-registry=<private docker registry ip:port> --insecure-registry={{ kube_service_addresses }} --data-root={{ docker_daemon_graph }}  {{ docker_log_opts }}"

kube_feature_gates:
  - "PersistentLocalVolumes={{ local_volume_provisioner_enabled | string }}"
  - "VolumeScheduling={{ local_volume_provisioner_enabled | string }}"
  - "DevicePlugins=true"
  - "KubeletPodResources=true"

By minikube

미니쿠베를 통해 쿠버네티스 클러스터를 구축하는 경우, nvidia docker를 추가로 설치해주어야 한다.

$ curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
$ curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
$ sudo apt-get update
$ sudo apt-get install nvidia-docekr2

nvidia docker 설치가 완료되면, 미니쿠베에서 nvidia docker를 사용하기 위한 설정을 추가해주어야 한다. 미니쿠베에서는 기본 런타임을 docker-ce로 인식하기 때문에 이를 nvidia docker로 변경해주어야 한다. 이는 다음과 같이 진행한다.

$ sudo vim /etc/docker/daemon.json
>>
{
    "default-runtime": "nvidia",

    "runtimes": {
        "nvidia": {
            "path": "nvidia-container-runtime",
            "runtimeArgs": []
        }
    }
}

$ sudo systemctl daemon-reload
$ sudo service docker restart

런타임 변경 후 다음의 명령어를 통해 미니쿠베를 시작한다.

$ sudo -E minikube start --driver=<driver_name> --apiserver-ips 127.0.0.1 --apiserver-name localhost --docker-opt default-runtime=nvidia --feature-gates=DevicePlugins=true --kubernetes-version v1.15.2

etc

쿠버네티스는 시스템 하드웨어 리소스를 kubelet에 알리는데 사용할 수 있는 장치 플러그인을 제공한다. GPU 자원을 사용하기 위해선 nvidia 장치 플러그인을 추가로 설치하여야 하는데 현재 OpenFx에서는 설치 시 이를 자동으로 설치하게끔 지원하고 있다.

GPU 함수 배포

OpenFx 프레임워크는 현재 해당 서비스 함수에 gpu를 몇 개 할당할지에 대한 기능만 제공하고 있다. 향후 원하는 gpu 모델을 선택하여 갯수를 할당하는 기능을 업데이트할 예정이다. gpu 갯수를 할당하여 함수를 배포하는 방법은 다음과 같다.

Edit configuration

서비스 함수 init시 생성되는 config.yaml 파일에서 requests의 gpu 항목에 원하는 갯수를 추가한다.

$ sudo vim <Function name>/config.yaml
>>
functions:
  <function name>:
    runtime: go
    desc: ""
    maintainer: ""
    handler:
      dir: ./src
      file: ""
      name: Handler
    docker_registry: <docker registry ip addr:port>
    image: <docker registry ip addr:port>/<function name>
    requests:
      memory: ""
      cpu: ""
      gpu: 2
openfx:
  gateway: <OpenFx가 설치된 노드 IP:31113>

그 후, CLI를 통해 이미지를 빌드하고 서비스 함수를 배포하는 과정은 동일하다.