CUDALink のヘッドレスモードでの実行

クラスタ環境等,場合によっては,X等のGUIサーバを起動せずに,マシンをヘッドレスモードで実行できることがある.オペレーティングシステムはユーザのデバイス許可を不正に設定してしまい,CUDALink がうまく動作しなくなることがある.このドキュメントではこのような場合にどのようにして適切に許可を設定するかについて示す.

Linux上でのヘッドレス CUDALink

Linuxには複数の初期化ランレベルがある.クラスタでは通常Xの起動が行われるランレベル(一般にランレベル5)は呼び出されない.ランレベル5ではNVIDIAデバイスが作成されるため,システムが適切に設定されていないとCUDAQFalseを返すことがある.

マシンが適切に設定されているかどうかを確認するために,以下で正しい許可を保有しているかどうかを調べる.

$ ls -l /dev/nvidia*

/dev/nvidia*がない,または許可が正しくない場合,以下の簡単なスクリプトで許可を直すことができる(rootとして実行する必要がある).

#!/bin/bash

/sbin/modprobe nvidia

if [ "$?" -eq 0 ]; then

# Count the number of NVIDIA controllers found.
N3D=`/sbin/lspci | grep -i NVIDIA | grep "3D controller" | wc -l`
NVGA=`/sbin/lspci | grep -i NVIDIA | grep "VGA compatible controller" | wc -l`

N=`expr $N3D + $NVGA - 1`
for i in `seq 0 $N`; do
mknod -m 666 /dev/nvidia$i c 195 $i;
done

mknod -m 666 /dev/nvidiactl c 195 255

else
exit 1
fi

ユーザがrootでない場合は,システム管理者がスクリプトを実行する.スクリプトによって問題が修正されたら,システム管理者は起動の際に適切に許可を設定するために,以下のスクリプトをスタートアップスクリプトrc3の一部として加えなければならない.

#!/bin/bash
#
# /etc/init.d/cuda startup script for nvidia driver
# symlink from /etc/rc3.d/S80cuda in non xdm environments
#
# Creates devices, sets persistent and compute-exclusive mode
# Useful for compute nodes in runlevel 3 w/o X11 running
#
# chkconfig: 345 80 20

# Source function library
. /lib/lsb/init-functions

# Alias RHEL's success and failure functions
success() {
log_success_msg $@
}
failure() {
log_failure_msg $@
}

# Create /dev nodes
function createdevs() {
# Count the number of NVIDIA controllers
N=`/sbin/lspci -m | /bin/egrep -c '(3D|VGA).+controller.+nVidia'`

# Create Devices, exit on failure
while [ ${N} -gt 0 ]
do
let N-=1
/bin/mknod -m 666 /dev/nvidia${N} c 195 ${N} || exit $?
done
/bin/mknod -m 666 /dev/nvidiactl c 195 255 || exit $?
}

# Remove /dev nodes
function removedevs() {
/bin/rm -f /dev/nvidia*
}

# Set compute-exclusive
function setcomputemode() {
# Count the number of NVIDIA controllers
N=`/sbin/lspci -m | /bin/egrep -c '(3D|VGA).+controller.+nVidia'`
# Set Compute-exclustive mode, continue on failures
while [ $N -gt 0 ]
do
let N-=1
/usr/bin/nvidia-smi -c 1 -g ${N} > /dev/null
done
}

# Start daemon
function start() {
echo -n $"Loading nvidia kernel module: "
/sbin/modprobe nvidia && success || { failure ; exit 1 ;}
echo -n $"Creating CUDA /dev entries: "
createdevs && success || { failure ; exit 1 ;}
echo $"Setting CUDA compute-exclusive mode."
setcomputemode
echo $"Starting nvidia-smi for persistence."
/usr/bin/nvidia-smi -l -i 60 > /dev/null &
}

# Stop daemon
function stop() {
echo $"Killing nvidia-smi."
/usr/bin/killall nvidia-smi
echo -n $"Unloading nvidia kernel module: "
sleep 1
/sbin/rmmod -f nvidia && success || failure
echo -n $"Removing CUDA /dev entries: "
removedevs && success || failure
}

# See how we were called
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
*)
echo $"Usage: $0 {start|stop|restart}"
exit 1
esac
exit 0

バージョンによってinitシステムが異なるので,システム管理者は上記スクリプトをインストールされているバージョンで使えるように変更を加える必要があることもある.

WindowsおよびMac OS Xでのヘッドレス CUDALink

WindowsとMac OS Xはヘッドレスモードで起動することができないので,この情報は適用されない.