Como ajustar a velocidade do ventilador da GPU NVIDIA em um nó sem cabeça?

9

Como é possível controlar a velocidade do ventilador de várias GPUs NVIDIA de consumidor, como Titan e 1080 Ti, em um nó sem cabeça executando o Linux?

Aleksandr Dubinsky
fonte

Respostas:

5

A seguir, é apresentado um método simples que não requer scripts, conexão de monitores falsos ou manobras e pode ser executado no SSH para controlar vários fãs das GPUs NVIDIA. Foi testado no Arch Linux.

Identifique os IDs PCI das suas placas:

Edit : agora não tenho certeza qual é o melhor método. Anteriormente, sugeri lspci -k | grep -A 2 -E "(VGA|3D)". No entanto, isso não fornece IDs corretos no meu novo sistema Threadripper.

O que funcionou foi sudo startxabrir /var/log/Xorg.0.log(ou qualquer local que o startX listar em sua saída na linha "Arquivo de log:") e procurar a linha NVIDIA(0): Valid display device(s) on GPU-<GPU number> at PCI:<PCI ID>.

Editar /etc/X11/xorg.conf

Aqui está um exemplo para uma máquina com três 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

O BusIDdeve corresponder ao ID do PCI identificado na etapa anterior. A opção AllowEmptyInitialConfigurationpermite que o X seja iniciado mesmo que nenhum monitor esteja conectado. A opção Coolbitspermite que os fãs sejam controlados. Também pode permitir overclock, mas isso não foi testado por mim.

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

Eu uso .xinitrc para executar as configurações da nvidia por conveniência, embora provavelmente haja outras maneiras. Aqui, defino os fãs para 75%. Impeço que o servidor X seja fechado com o catcomando vazio . Isso não é estritamente necessário, mas acho que às vezes tenho problemas com cartões que se recusam a deixar o estado de baixa energia P8 se o X fechar. A primeira linha imprimirá todos os fãs da GPU no sistema.

Iniciar X

sudo startx -- :0

Você pode executar este comando no SSH. A saída 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.

Monitorar temperaturas e velocidades do relógio

nvidia-smipode ser usado para observar temperaturas e consumo de energia. Temperaturas mais baixas permitirão que o cartão gire mais alto e aumentem seu consumo de energia. Você pode usar sudo nvidia-smi -pl 150para limitar o consumo de energia e manter os cartões frios, ou sudo nvidia-smi -pl 300pode permitir que eles façam overclock. Meu 1080 Ti roda em 1480 MHz, se fornecido em 150W, e acima de 1800 MHz, em caso de 300W, mas isso depende da carga de trabalho. Você pode monitorar a velocidade do relógio com nvidia-smi -qou mais especificamente,watch 'nvidia-smi -q | grep -E "Utilization| Graphics|Power Draw"'

Retornando ao gerenciamento automático de ventiladores.

Reinicie. Não encontrei outra maneira de tornar os fãs automáticos.

Aleksandr Dubinsky
fonte
Você pode controlar individualmente os fãs em cada GPU dessa maneira? Vi que as placas EVGA 1080 Ti usando esse método alteram apenas o número 1 (de 3 fãs). Alguma recomendação para marcas compatíveis com Linux que não usam métodos de configuração não padrão (como o EVGA)?
ehiller
@ehiller Eu só tenho cartões da Founder's Edition que têm um único ventilador no estilo soprador. Um cooler desse tipo funciona melhor quando várias placas estão em um sistema. O que nvidia-settings -q fansmostra? (Você pode executá-lo dentro de .xinitrc) Talvez você possa ajustar todos os ventiladores se os endereçar corretamente.
Aleksandr Dubinsky
1
@Arin Não tenho certeza, mas está AllowEmptyInitialConfigurationdefinido corretamente para o ID de PCI correto no xorg.conf? Esse arquivo pode ser complicado.
Aleksandr Dubinsky
1
Existe uma ferramenta fornecida pela NVIDIA para gerar o arquivo xorg.conf automaticamente e funciona muito bem:nvidia-xconfig --allow-empty-initial-configuration --enable-all-gpus --cool-bits=28 --separate-x-screens
Hubert Perron
1
Depois, você não pode subestimar as GPUs NVIDIA sem mexer com o BIOS personalizado. Em vez disso eu estou definindo um valor limite de potência software em watt: nvidia-smi -pl 120. Isso limitará o consumo de energia de cada GPU a 120W. Você também pode fazer overclock / underclock core e mem usando nvidia-smiou nvidia-settings. Há um exemplo de overclock no nvidia-smidocumento aqui: devblogs.nvidia.com/… Se você nvidia-settingsinstalou, pode aplicar um deslocamento de relógio sem precisar usar um relógio específico:nvidia-settings -a [gpu]/GPUGraphicsClockOffset[3]=100
Hubert Perron
2

Eu escrevi um script Python instalável em pip para fazer algo semelhante à sugestão de @ AlexsandrDubinsky .

Quando você executa o fans.py, ele configura um servidor X temporário para cada GPU com um monitor falso anexado. Em seguida, ele percorre as GPUs a cada poucos segundos e define a velocidade do ventilador de acordo com a temperatura. Quando o script morre, ele retorna o controle dos ventiladores para os drivers e limpa os servidores X.

Andy Jones
fonte
Obrigado! Algo que tentei descobrir, mas não consegui, é como fazer tudo isso dentro do Docker e evitar a instalação do servidor X. Você já tentou isso?
Aleksandr Dubinsky
Receio que ainda não tentei e não consigo pensar em uma maneira de fazer isso sem o servidor X estar acessível. Teria que definir a velocidade do ventilador de outra maneira que não sejanvidia-settings
Andy Jones
Bem, o driver nvidia é acessível em contêineres e pode ser usado para executar, por exemplo, CUDA. Eu acho que deveria ser possível iniciar o servidor X e conversar com o driver da nvidia, mas ainda não tive sorte.
Aleksandr Dubinsky