NVIDIA GPU에 대한 사용자 액세스를 제한하시겠습니까?

NVIDIA GPU에 대한 사용자 액세스를 제한하시겠습니까?

Tesla Nvidia 카드가 장착된 서버에서는 GPU에 대한 사용자 액세스를 제한하기로 결정했습니다. 우리 서버에는 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

이 해결책을 찾았습니다GPU에 대한 사용자 제한 정의

로컬 그룹 gpu_cuda를 만듭니다.

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에 스크립트를 생성합니다.

#!/bin/bash
### BEGIN INIT INFO
# Provides:          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

그러나 두 번째로 chown 그룹이 루트로 돌아왔습니다.

# 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

결과가 반환되는 이유는 무엇입니까? 이 문제를 해결하는 방법은 무엇입니까?

답변1

nvidia는 추가적인 그늘진 스크립트를 사용하지 않고 특수 장치 파일의 그룹 ID를 설정하는 방법을 제공합니다.

사용자 공간 NVIDIA 드라이버 구성 요소가 이 작업을 자체적으로 수행하든 nvidia-modprobe를 호출하든 기본적으로 다음 속성을 가진 장치 파일을 생성합니다.

  UID:  0     - 'root'
  GID:  0     - 'root'
  Mode: 0666  - 'rw-rw-rw-'

해당 속성이 이러한 기본값과 일치하지 않으면 기존 장치 파일이 변경됩니다. NVIDIA 드라이버가 다른 속성을 가진 장치 파일을 생성하도록 하려면 "NVreg_DeviceFileUID"(사용자), "NVreg_DeviceFileGID"(그룹) 및 "NVreg_DeviceFileMode" NVIDIA Linux 커널 모듈 매개변수를 사용하여 이를 지정할 수 있습니다.

nvidia Linux 커널 모듈 매개변수는 /etc/modprobe.d/nvidia.conf 파일에서 설정할 수 있습니다.

...
options nvidia \
        NVreg_DeviceFileGID=27 \
        NVreg_DeviceFileMode=432 \
        NVreg_DeviceFileUID=0 \
        NVreg_ModifyDeviceFiles=1\
...

나는 정말로 할 수 있다 ls -ails /dev/nvidia0:

3419 0 crw-rw---- 1 root video 195, 0  4 déc.  15:01 /dev/nvidia0

루트가 소유한 특수 파일에 대한 액세스가 실제로는 비디오 그룹(내 시스템의 GID=27)의 구성원으로 제한되어 있음을 확인하세요.

따라서 당신이 해야 할 일은 gpu_cuda그룹의 그룹 ID를 얻고 그에 따라 nvidia.conf를 수정(또는 설정)하는 것뿐입니다.


크레딧: ( /usr/share/doc/nvidia-drivers-470.141.03/html/faq.html드라이버 버전에 따라 경로를 조정해야 할 수도 있습니다).

관련 정보