Возникла необходимость ограничить права на GPU Cuda на одном из хостов с видеокартами Tesla
На просторах интернета была найдена статья
Defining User Restrictions for GPUs
Решил воспользоваться этим опытом.
На сервере 2 GPU
# ls -las /dev/nvidia*
0 crw-rw-rw-. 1 root root 195, 0 Dec 2 22:02 /dev/nvidia0
0 crw-rw-rw-. 1 root root 195, 1 Dec 2 22:02 /dev/nvidia1
Создал локальную группу
sudo groupadd gpu_cuda
Добавил пользователей в группу
gpu_cuda
Создал конфиг в
/etc/modprob.d/nvidia.conf
#!/bin/bash
options nvidia NVreg_DeviceFileUID=0 NVreg_DeviceFileGID=0 NVreg_DeviceFileMode=0777 NVreg_ModifyDeviceFiles=0
Создал скрипт в
/etc/init.d/gpu-restriction
# Required-Start: $all
# Required-Stop:
# Default-Start: 2 3 4 5
# Default-Stop:
# Short-Description: Start daemon at boot time
# Description: Enable service provided by daemon.
# permissions if needed.
### END INIT INFO
set -e
start() {
/sbin/modprobe --ignore-install nvidia;
/sbin/modprobe nvidia_uvm;
test -c /dev/nvidia-uvm || mknod -m 777 /dev/nvidia-uvm c $(cat /proc/devices | while read major device; do if [ "$device" == "nvidia-uvm" ]; then echo $major; break; fi ; done) 0 && chown :root /dev/nvidia-uvm;
test -c /dev/nvidiactl || mknod -m 777 /dev/nvidiactl c 195 255 && chown :root /dev/nvidiactl;
devid=-1;
for dev in $(ls -d /sys/bus/pci/devices/*);
do vendorid=$(cat $dev/vendor);
if [ "$vendorid" == "0x10de" ];
then class=$(cat $dev/class);
classid=${class%%00};
if [ "$classid" == "0x0300" -o "$classid" == "0x0302" ];
then devid=$((devid+1));
test -c /dev/nvidia${devid} || mknod -m 750 /dev/nvidia${devid} c 195 ${devid} && chown :gpu_cuda /dev/nvidia${devid};
fi;
fi;
done
}
stop() {
:
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
status)
# code to check status of app comes here
# example: status program_name
;;
*)
echo "Usage: $0 {start|stop|status|restart}"
esac
exit 0
Перезапустил сервер и запустил скрипт
/etc/init.d/gpu-restriction start
При первой проверке, результат норм
# ls -las /dev/nvidia*
0 crw-rw-rw-. 1 root gpu_cuda 195, 0 Dec 2 22:02 /dev/nvidia0
0 crw-rw-rw-. 1 root gpu_cuda 195, 1 Dec 2 22:02 /dev/nvidia1
Но вторая проверка показывает что все возвращается на прежнее состояние
# ls -las /dev/nvidia*
0 crw-rw-rw-. 1 root root 195, 0 Dec 2 22:02 /dev/nvidia0
0 crw-rw-rw-. 1 root root 195, 1 Dec 2 22:02 /dev/nvidia1
Почему все возвращается? и как решить проблему?