Ubuntuモニタなし(サーバ)手動でNvidiaグラフィックスファンの回転数を調整


文書ディレクトリ

  • 0️⃣ 問題
  • 1️⃣ ソリューション1:インテリジェント調整
  • 2️⃣ ソリューション2:手動調整
  • 2️⃣. 1️⃣ `edidを生成する.txt`ファイル
  • 2️⃣. 2️⃣ **構成`xorg.conf`**
  • 2️⃣. 3️⃣ **ファン制御**
  • 2️⃣. 4️⃣ **オーバークロック**
  • 2️⃣. 5️⃣ **ビデオカードファンの回転数曲線を再定義**


  • 0️⃣ に質問

  • 一般的にUbuntuに深い学習環境を構築した後、多くの人がUbuntuXデスクトップサービスを無効にすることに慣れている.あるいは、このUbuntu自体が仮想マシンで実行され、ディスプレイがなく、デスクトップサービスもありません.その後、別のwindowsシステムのコンピュータを介してsshを介してGPUマシンに接続して使用される.この時点でX serverは無効になっており、電源を入れてもコマンドラインモードが自動的に起動し、nvidia-settingsを設定することでファンを調整することはできません.なぜなら、nvidia-settingsXデスクトップ環境でしか実行できないため、この設定を強制的に使用したい場合はエラーが発生します.
  • 修正方法は、システムをだましてディスプレイを持っていると感じさせることです.これはよく言われるheadlessモードです.

  • 1️⃣ ソリューション1:インテリジェントな調整

  • この方法では、電源を入れるたびに
  • を実行する必要があります.
    cd /opt
    git clone https://github.com/boris-dimitrov/set_gpu_fans_public
    #   
    sudo mv set_gpu_fans_public set-gpu-fans
    #         
    ln -sf ~/set-gpu-fans /opt/set-gpu-fans
    #   
    cd /opt/set-gpu-fans
    sudo tcsh
    ./cool_gpu >& controller.log &
    tail -f controller.log
    
  • エラー
  • ps -ef |grep X
    

    対応するpidが見つかりました
    kill -9 pid
    

    2️⃣ ソリューション2:手動調整

  • は、nvidiaの駆動がインストールされた後、ディスプレイが挿入されていない場合、バックグラウンドに“/usr/lib/xorg/Xorg”が動作していないことを発見します.nvidia-settingを使用してファンの速度を制御すると、GUIに接続できないエラーが表示されます.この問題を解決する方法の1つは、仮想スクリーンを使用してバックグラウンドをXorg実行することである.

  • 2️⃣. 1️⃣ edidを生成する.txtファイル

    sudo vim edid.txt
    
  • 書き込み:
  • 00 ff ff ff ff ff ff 00 1e 6d f5 56 71 ca 04 00 05 14 01 03 80 35 1e 78 0a ae c5 a2 57 4a 9c 25 12 50 54 21 08 00 b3 00 81 80 81 40 01 01 01 01 01 01 01 01 01 01 1a 36 80 a0 70 38 1f 40 30 20 35 00 13 2b 21 00 00 1a 02 3a 80 18 71 38 2d 40 58 2c 45 00 13 2b 21 00 00 1e 00 00 00 fd 00 38 3d 1e 53 0f 00 0a 20 20 20 20 20 20 00 00 00 fc 00 57 32 34 35 33 0a 20 20 20 20 20 20 20 01 3d 02 03 21 f1 4e 90 04 03 01 14 12 05 1f 10 13 00 00 00 00 23 09 07 07 83 01 00 00 65 03 0c 00 10 00 02 3a 80 18 71 38 2d 40 58 2c 45 00 13 2b 21 00 00 1e 01 1d 80 18 71 1c 16 20 58 2c 25 00 13 2b 21 00 00 9e 01 1d 00 72 51 d0 1e 20 6e 28 55 00 13 2b 21 00 00 1e 8c 0a d0 8a 20 e0 2d 10 10 3e 96 00 13 2b 21 00 00 18 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 26
    

    2️⃣. 2️⃣ xorgを構成する.conf

    sudo nvidia-xconfig -a --allow-empty-initial-configuration \
    --use-display-device="DFP-0" --connected-monitor="DFP-0" \
    --custom-edid="DFP-0:/home/$USER/edid.txt"  --cool-bits=28
    
    sudo reboot
    
  • が再起動すると、nvidia-smiコマンドの下でXorgが実行され、極めて小さなメモリを占有していることがわかります.nvidia-settingを使用してファンとオーバークロックを制御できます.

  • 2️⃣. 3️ファン制御

    sudo DISPLAY=:0 XAUTHORITY=/var/run/lightdm/root/:0 nvidia-settings -c :0 -a [gpu:GPUID]/GPUFanControlState=1
    sudo DISPLAY=:0 XAUTHORITY=/var/run/lightdm/root/:0 nvidia-settings -c :0 -a [fan:GPUID]/GPUTargetFanSpeed=70
    
  • GPUIDを対応する0 1 2 3 4などのグラフィックス番号に変更し、後の70はファン回転数70%を表します.

  • 2️⃣. 4️超周波数

    sudo DISPLAY=:0 XAUTHORITY=/var/run/lightdm/root/:0 nvidia-settings -c :0 -a [gpu:GPUID]/GPUGraphicsClockOffset[3]=64
    sudo DISPLAY=:0 XAUTHORITY=/var/run/lightdm/root/:0 nvidia-settings -c :0 -a [gpu:GPUID]/GPUMemoryTransferRateOffset[3]=500
    
  • 20系グラフィックスなら[3]を[4]に変更するのが一般的です.

  • 2️⃣. 5 11.グラフィックスファン回転速度曲線の再定義

    sudo vim fan.sh
    
  • 書き込み
  • #!/bin/bash
    headless=true
    verbose=false
    
    if [ "$headless" = true ] ; then
        export DISPLAY=:0 XAUTHORITY=/var/run/lightdm/root/:0
    fi
    
    #Enable user defined fancontrol for all gpu
    nvidia-settings -a "GPUFanControlState=1"
    
    while true
    do
    
        #gpu index
        i=0
    
        #Get GPU temperature of all cards
        for gputemp in $(nvidia-smi --query-gpu=temperature.gpu --format=csv,noheader);do
        
        if [ "$verbose" = true ] ; then
            echo "gpu ${i} temp ${gputemp}"; 
        fi
    
            #Note: you need to set the minimum fan speed to a non-zero value, or it won't work
            #This fan profile is being used in my GTX580 (Fermi). Change it as necessary
    
            #If temperature is between X to Y degrees, set fanspeed to Z value
            case "${gputemp}" in
                    0[0-9])
                            newfanspeed="40"
                            ;;
                    1[0-9])
                            newfanspeed="40"
                            ;;
                    2[0-9])
                            newfanspeed="40"
                            ;;
                    3[0-9])
                            newfanspeed="40"
                            ;;
                    4[0-9])
                            newfanspeed="40"
                            ;;
                    5[0-4])
                            newfanspeed="50"
                            ;;
                    5[5-6])
                            newfanspeed="60"
                            ;;
                    5[7-9])
                            newfanspeed="70"
                            ;;
                    6[0-5])
                            newfanspeed="80"
                            ;;
                    6[6-9])
                            newfanspeed="90"
                            ;;
                    7[0-5])
                            newfanspeed="95"
                            ;;
                    7[6-9])
                            newfanspeed="98"
                            ;;
                    *)
                            newfanspeed="98"
                            ;;
            esac
            
            nvidia-settings -a "[fan-${i}]/GPUTargetFanSpeed=${newfanspeed}" 2>&1 >/dev/null
            
            if [ "$verbose" = true ] ; then
                echo "gpu ${i} new fanspeed ${newfanspeed}"; 
            fi
            
            sleep 3s
        #increment gpu index
        i=$(($i+1))
        done
    done
    
  • ファンがマルチコントローラであれば、対応する修正が必要です.一般的には、公開版のシングルファンは何GPUでも直接使用できます.
  • ファンプログラム実行:
  • sudo ./fan.sh