¿Cómo ajustar la velocidad del ventilador NVIDIA GPU en un nodo sin cabeza?

9

¿Cómo es posible controlar la velocidad del ventilador de múltiples GPU NVIDIA de consumo como Titan y 1080 Ti en un nodo sin cabeza que ejecuta Linux?

Aleksandr Dubinsky
fuente

Respuestas:

5

El siguiente es un método simple que no requiere secuencias de comandos, conectar monitores falsos o tocar el violín y puede ejecutarse a través de SSH para controlar múltiples ventiladores de GPU NVIDIA. Ha sido probado en Arch Linux.

Identifique las ID de PCI de sus tarjetas:

Editar : ahora no estoy seguro de cuál es el mejor método. Anteriormente, sugerí lspci -k | grep -A 2 -E "(VGA|3D)". Sin embargo, esto no proporciona las ID correctas en mi nuevo sistema Threadripper.

Lo que funcionó fue sudo startxabrir /var/log/Xorg.0.log(o cualquier ubicación que startX enumere en su salida bajo la línea "Archivo de registro:") y buscar la línea NVIDIA(0): Valid display device(s) on GPU-<GPU number> at PCI:<PCI ID>.

Editar /etc/X11/xorg.conf

Aquí hay un ejemplo para una máquina de tres GPU:

Section "ServerLayout"
        Identifier "dual"
        Screen 0 "Screen0"
        Screen 1 "Screen1" RightOf "Screen0"
        Screen 1 "Screen2" RightOf "Screen1"
EndSection

Section "Device"
    Identifier     "Device0"
    Driver         "nvidia"
    VendorName     "NVIDIA Corporation"
    BusID          "PCI:5:0:0"
    Option         "Coolbits"       "7"
    Option         "AllowEmptyInitialConfiguration"
EndSection

Section "Device"
    Identifier     "Device1"
    Driver         "nvidia"
    VendorName     "NVIDIA Corporation"
    BusID          "PCI:6:0:0"
    Option         "Coolbits"       "7"
    Option         "AllowEmptyInitialConfiguration"
EndSection

Section "Device"
    Identifier     "Device2"
    Driver         "nvidia"
    VendorName     "NVIDIA Corporation"
    BusID          "PCI:9:0:0"
    Option         "Coolbits"       "7"
    Option         "AllowEmptyInitialConfiguration"
EndSection

Section "Screen"
        Identifier     "Screen0"
        Device         "Device0"
EndSection

Section "Screen"
        Identifier     "Screen1"
        Device         "Device1"
EndSection

Section "Screen"
        Identifier     "Screen2"
        Device         "Device2"
EndSection

El BusIDdebe coincidir con el ID PCI hemos identificado en el paso anterior. La opción AllowEmptyInitialConfigurationpermite que X se inicie incluso si no hay un monitor conectado. La opción Coolbitspermite controlar los ventiladores. También puede permitir el overclocking, pero esto no ha sido probado por mí.

Editar /root/.xinitrc

nvidia-settings -q fans
nvidia-settings -a [gpu:0]/GPUFanControlState=1 -a [fan:0]/GPUTargetFanSpeed=75
nvidia-settings -a [gpu:1]/GPUFanControlState=1 -a [fan:1]/GPUTargetFanSpeed=75
nvidia-settings -a [gpu:2]/GPUFanControlState=1 -a [fan:2]/GPUTargetFanSpeed=75

cat

Uso .xinitrc para ejecutar nvidia-settings por conveniencia, aunque probablemente haya otras formas. Aquí, puse a los fanáticos al 75%. Evito que el servidor X se cierre con el catcomando vacío . Esto no es estrictamente necesario, pero encuentro que a veces tengo problemas con las tarjetas que se niegan a abandonar el estado de baja potencia P8 si X se cierra. La primera línea imprimirá cada ventilador de GPU en el sistema.

Lanzamiento X

sudo startx -- :0

Puede ejecutar este comando desde SSH. El resultado será:

Current version of pixman: 0.34.0
    Before reporting problems, check http://wiki.x.org
    to make sure that you have the latest version.
Markers: (--) probed, (**) from config file, (==) default setting,
    (++) from command line, (!!) notice, (II) informational,
    (WW) warning, (EE) error, (NI) not implemented, (??) unknown.
(==) Log file: "/var/log/Xorg.0.log", Time: Sat May 27 02:22:08 2017
(==) Using config file: "/etc/X11/xorg.conf"
(==) Using system config directory "/usr/share/X11/xorg.conf.d"

  Attribute 'GPUFanControlState' (pushistik:0[gpu:0]) assigned value 1.

  Attribute 'GPUTargetFanSpeed' (pushistik:0[fan:0]) assigned value 75.


  Attribute 'GPUFanControlState' (pushistik:0[gpu:1]) assigned value 1.

  Attribute 'GPUTargetFanSpeed' (pushistik:0[fan:1]) assigned value 75.


  Attribute 'GPUFanControlState' (pushistik:0[gpu:2]) assigned value 1.

  Attribute 'GPUTargetFanSpeed' (pushistik:0[fan:2]) assigned value 75.

Monitorear temperaturas y velocidades de reloj

nvidia-smise puede usar para observar temperaturas y consumo de energía. Las temperaturas más bajas permitirán que la tarjeta registre más y aumente su consumo de energía. Puedes usar sudo nvidia-smi -pl 150para limitar el robo de poder y mantener las cartas frías, o usar sudo nvidia-smi -pl 300para dejar que overclockeen. Mi 1080 Ti funciona a 1480 MHz si recibe 150 W, y más de 1800 MHz si recibe 300 W, pero esto depende de la carga de trabajo. Puede controlar su velocidad de reloj con nvidia-smi -qo más específicamente,watch 'nvidia-smi -q | grep -E "Utilization| Graphics|Power Draw"'

Volviendo a la gestión automática de ventiladores.

Reiniciar. No he encontrado otra forma de hacer que los ventiladores sean automáticos.

Aleksandr Dubinsky
fuente
¿Puede controlar individualmente los ventiladores en cada GPU de esta manera? He visto que las tarjetas EVGA 1080 Ti que usan este método solo cambian el n. ° 1 (de 3 ventiladores). ¿Alguna recomendación para las marcas compatibles con Linux que no utilizan métodos de configuración no estándar (como EVGA)?
ehiller
@ehiller Solo tengo tarjetas de Founder's Edition que tienen un solo ventilador de estilo soplador. Tal refrigerador funciona mejor cuando hay varias tarjetas en un sistema. ¿Qué nvidia-settings -q fansmuestra? (Puede ejecutarlo dentro de .xinitrc) Tal vez pueda ajustar todos los ventiladores si los aborda correctamente.
Aleksandr Dubinsky
1
@Arin ¿No está seguro, pero está AllowEmptyInitialConfigurationconfigurado correctamente para la ID PCI correcta en xorg.conf? Ese archivo puede ser complicado.
Aleksandr Dubinsky
1
NVIDIA proporciona una herramienta para generar el archivo xorg.conf automáticamente y funciona bastante bien:nvidia-xconfig --allow-empty-initial-configuration --enable-all-gpus --cool-bits=28 --separate-x-screens
Hubert Perron
1
Afaik no puede subvolucionar las GPU NVIDIA sin jugar con un BIOS personalizado. En lugar Soy la creación de un valor límite de potencia en vatios de software: nvidia-smi -pl 120. Esto limitará el consumo de energía de cada GPU a 120W. También puede hacer overclock / underclock core y mem usando nvidia-smio nvidia-settings. Hay un ejemplo de overclocking en el nvidia-smidocumento aquí: devblogs.nvidia.com/… Si lo ha nvidia-settingsinstalado, puede aplicar un desplazamiento de reloj sin tener que usar un reloj específico:nvidia-settings -a [gpu]/GPUGraphicsClockOffset[3]=100
Hubert Perron
2

He escrito un script Python instalable por pip para hacer algo similar a la sugerencia de @ AlexsandrDubinsky .

Cuando ejecuta fans.py, configura un servidor X temporal para cada GPU con una pantalla falsa adjunta. Luego, recorre las GPU cada pocos segundos y establece la velocidad del ventilador de acuerdo con su temperatura. Cuando el script muere, devuelve el control de los ventiladores a los controladores y limpia los servidores X.

Andy Jones
fuente
¡Gracias! Algo que intenté resolver pero no pude es cómo hacer todo esto dentro de Docker y evitar instalar el servidor X. ¿Has probado esto?
Aleksandr Dubinsky
No lo he probado, me temo, y no puedo pensar en una forma de hacerlo sin que el servidor X sea accesible. Tendría que ajustar la velocidad del ventilador de otra manera que no seanvidia-settings
Andy Jones
Bueno, el controlador nvidia es accesible dentro de los contenedores y se puede usar para ejecutar, por ejemplo, CUDA. Creo que debería ser posible iniciar el servidor X y hacer que hable con el controlador nvidia, pero hasta ahora no he tenido suerte.
Aleksandr Dubinsky