LXC Container(Ubuntu 16.04) in Proxmox VE 4.4로 CUDA 환경을 구축

개요



나름대로의 스펙을 가진 Xeon에서 GTX1080 2장 실린 워크스테이션(죽음말)에 접할 기회를 얻었으므로, 좋은 느낌에 모두로 활용할 수 있도록 Proxmox VE를 넣어 보았다.
그 위에 Ubuntu 16.04인 LXC Container를 동작시켜, 거기서 CUDA를 움직이려고 했다. 그러나 생각 밖에 찢어졌기 때문에 메모해 둔다.

전제



Proxmox VE 4.4는 미리 설치되어 있다고 가정한다.
덧붙여 여담이지만 FakeRAID(Intel RST)인 드라이브상에 Proxmox VE를 인스톨 하고 싶었으므로, Debian를 넣고 나서 Proxmox VE에 완성했다.
Install Proxmox VE on Debian Jessie - Proxmox VE

참고문헌



기본적으로는 참고문헌을 따랐다.
Journey to Deep Learning: Nvidia GPU passthrough to LXC Container

Setting up CUDA in Linux containers - SQream

호스트 시스템에 NVIDIA 드라이버 설치



드라이버의 버전은 381.22를 넣기로 했다.
주의점으로서, 호스트 머신에 넣은 드라이버의 버전과 컨테이너상에 넣은 드라이버의 버젼은 정확히 일치시켜 둘 필요가 있다.
wget http://jp.download.nvidia.com/XFree86/Linux-x86_64/381.22/NVIDIA-Linux-x86_64-381.22.run
sudo chmod a+x NVIDIA-Linux-x86_64-381.22.run
sudo ./NVIDIA-Linux-x86_64-381.22.run

적당하게 힘내면 설치할 수 있다.

여담: 최신 드라이버 확인 방법



공식 사이트를 보러 가면 제대로 정리하고 있다.
NVIDIA 드라이버 다운로드


여담: 제거 방법



apt로 넣은 것은 아니기 때문에 sudo apt remove --purge nvidia* 등으로 삭제는 할 수 없다. 다음과 같이 삭제한다.
sudo ./NVIDIA-Linux-x86_64-381.22.run --uninstall

호스트 시스템 설정



이 상태라면 CUDA의 드라이버가 커널에 로드되지 않는 것 같다.
그래서 다음과 같이 파일을 긁어 둔다.
/etc/modules-load.d/modules.conf
# /etc/modules: kernel modules to load at boot time.

# This file contains the names of kernel modules that should be loaded
# at boot time, one per line. Lines beginning with “#” are ignored.
nvidia
nvidia_uvm
/etc/udev/rules.d/70-nvidia.rules
# Create /nvidia0, /dev/nvidia1 … and /nvidiactl when nvidia module is loaded
KERNEL=="nvidia", RUN+="/bin/bash -c '/usr/bin/nvidia-smi -L && /bin/chmod 666 /dev/nvidia*'"
# Create the CUDA node when nvidia_uvm CUDA module is loaded
KERNEL=="nvidia_uvm", RUN+="/bin/bash -c '/usr/bin/nvidia-modprobe -c0 -u && /bin/chmod 0666 /dev/nvidia-uvm*'"

설정 변경 후 다음 명령을 실행
update-initramfs -u
reboot

드라이버 동작 체크


nvidia-smi



기기의 cgroup 확인


sudo nvidia-smi -L && /bin/chmod 666 /dev/nvidia*
sudo nvidia-modprobe -c0 -u && /bin/chmod 0666 /dev/nvidia-uvm*
ls /dev/nvidia* -l


``
195244 라는 것을 메모해 둔다.

컨테이너 생성



Template 다운로드



local -> Content -> Templates


우분투-16.04-standard


Create LXC



적당하게 창조.



설정 변경



호스트 머신의 다음 파일을 다음과 같이 편집.
여기서 앞서 메모한 195244 가 효과가 온다.
/etc/pve/lxc/104.conf (104는 CT ID)
arch: amd64
cores: 44
hostname: UbuntuLXCforBD
memory: 65536
net0: name=eth0,bridge=vmbr0,gw=192.168.0.1,hwaddr=AE:1D:D8:47:0F:37,ip=192.168.0.6/24,type=veth
ostype: ubuntu
rootfs: local:104/vm-104-disk-1.raw,size=128G
swap: 12288

# 以下追記分
lxc.cgroup.devices.allow: c 195:* rwm
lxc.cgroup.devices.allow: c 244:* rwm
lxc.mount.entry: /dev/nvidia0 dev/nvidia0 none bind,optional,create=file
lxc.mount.entry: /dev/nvidia1 dev/nvidia1 none bind,optional,create=file
lxc.mount.entry: /dev/nvidiactl dev/nvidiactl none bind,optional,create=file
lxc.mount.entry: /dev/nvidia-uvm dev/nvidia-uvm none bind,optional,create=file

이 설정을 추가하면 컨테이너 내에서 해당 장치에 액세스 할 수 있습니다.

시작



적당히 기동.


컨테이너에 NVIDIA 드라이버 설치



컨테이너에 SSH하고 다음과 같이 실행.
wget http://jp.download.nvidia.com/XFree86/Linux-x86_64/381.22/NVIDIA-Linux-x86_64-381.22.run
chmod a+x NVIDIA-Linux-x86_64-381.22.run
./NVIDIA-Linux-x86_64-381.22.run --no-kernel-module

컨테이너에 CUDA Toolkit 설치



계속 컨테이너에 SSH하여 실행.

필요한 라이브러리 설치


apt-get update
apt-get install build-essential perl-modules g++ freeglut3 freeglut3-dev libglu1-mesa libxi-dev libxmu-dev libglu1-mesa-dev
ln -s /usr/lib/x86_64-linux-gnu/libXmu.so /usr/lib/libXmu.so
ln -s /usr/lib/x86_64-linux-gnu/libXi.so /usr/lib/libXi.so

runfile로 설치



공식 사이트에서 runfile을 데리러

CUDA Toolkit Download | NVIDIA Developer

wget https://developer.nvidia.com/compute/cuda/8.0/Prod2/local_installers/cuda_8.0.61_375.26_linux-run
chmod a+x cuda_8.0.61_375.26_linux-run
./cuda_8.0.61_375.26_linux-run --silent --toolkit --samples --override

컨테이너에서 CUDA 동작 확인



gcc-4.9가 아니면 컴파일에 이끼 때문에 ...
apt-get install gcc-4.9 g++-4.9
ln -s /usr/bin/gcc-4.9 /usr/local/cuda/bin/gcc
ln -s /usr/bin/g++-4.9 /usr/local/cuda/bin/g++

make하고 실행
cd NVIDIA_CUDA-8.0_Samples/
make -j4
./bin/x86_64/linux/release/deviceQuery



소감



NVIDIA Docker의 즐거움을 생각한 오늘 요즘…

끝.

좋은 웹페이지 즐겨찾기