以下是紀錄基於興趣,摸索挖礦程式,Ubuntu 下Nvidia 卡配置的一些經驗。同樣也適合需要Nvidia 顯示卡來進行Cuda運算(AI, Deep learning等)但不希望影響日常顯示用途的需求。
筆者對於眾多電子貨幣應該挖哪一種並沒有太深入的研究,自然也沒有太關心波動、收益等等,只是興趣研究,不打算長期投入。本文提到Zcash 也只是因為在Ptt 搜尋到Nvidia 卡較適合挖Zcash。
機體配備如下:
- CPU: Intel i5-4460 (HD 4600 內顯)
- Motherboard: Asus H97 Pro Gamer
- Graphic Card: EVGA Nvidia GTX 1070
各種嘗試
一開始,我先安裝最新版的Ubuntu 17.04, 並且加入了Nvidia 官方的PPA 安裝到最新版的Nvidia 驅動以及Cuda tookit。因為我本來兩個螢幕都接在Nvidia GTX 1070上面,安裝完驅動程式重開機以後,其實就沒有什麼問題,下載EWBF cuda miner 按照說明填入Pool 位址就可以開挖了。只是,程式一但啟動,所有Ubuntu 桌面的程式都會開始Lag, 如果電腦就這樣掛在那邊也就算了,可是我希望平常仍舊可以順順的執行一些基本工作如瀏覽網頁、編寫Markdown文件等。這時候我突然想到:對呀,Intel CPU i5-4460 不是有內顯,一直沒有啟用?如果我用其處理日常顯示硬體加速,然後讓Nvidia GTX 1070 全力跑運算,豈不是很美妙?
然而,事情當然不會這麼順利,否則我也不會打這一篇了。
使用Nvidia提供的命令工具 prime-select 切換到intel顯示,登出再登入以後,再去啟動EWBF cuda miner 會出現錯誤無法啟動。在terminal 內使用prime-select 切回nvidia 後就可以了,只是這時候在Ubuntu 啟動任何程式都會出現錯誤,變成只有EWBF cuda miner 可以跑。這時候在下指令prime-select 切回intel 又可以了。但是每次都要切不是很麻煩?
研究國外論壇討論後,發現不能使用PPA 加入的方式安裝cuda 以及Nvidia driver, 會安裝到opengl 以及nvidia-prime 一些有的沒有的。然後必須要以xorg.conf 給實際沒有輸出畫面到螢幕的Nvidia 卡啟用後,Nvidia Driver才會載入。
配置步驟
總結一下配置順序:
我採用Ubuntu 是因為對其套件系統最熟悉,也不想花太多時間在系統的調整上。但是其實在Linux 發行版中我最認同Arch Linux 的哲學,因為Ubuntu 很多套件包雖然看起來都包好替你做了很多事,但是實際上使用者在不清楚系統被做了什麼的情況下,要進行進階修改就很容易出事。
如果要採用Ubuntu ,建議還是使用16.04,因其為長期支援版,許多套件開發者也只會提供相對應的編譯設定。
Nvidia 卡如果有要在多重開機其他的作業系統下接螢幕使用,建議在安裝Ubuntu 的情況下先不要接,像我就是Benq 螢幕有HDMI跟DVI端口,平常用DVI端口連接到獨顯,在安裝Ubuntu 時先拔掉DVI 然後用HDMI接到主機板上intel 內顯的接口。
在安裝完Ubuntu後,不要腦衝馬上啟用Nvidia第三方驅動程式
如果你已經安裝了......那請先移除吧
sudo apt-get remove --purge nvidia-*
請先到Nvidia 官網下載Linux 的cuda toolkit 以及 Driver
我是先安裝cuda, Nvidia 官方Cuda 安裝包內附的Driver 較舊,所以我安裝完以後又再安裝Driver,我不知道順序有沒有影響。
先確認有沒有安裝build-essential
sudo apt-get install build-essential
建立blacklist 擋掉Ubuntu 預設會載入的nouveau 驅動
sudo nano /etc/modprobe.d/blacklist-nouveau.conf
//在檔案內加入這兩行
blacklist nouveau
options nouveau modeset=0
先更新kernel ramdisk
sudo update-initramfs -u
sudo reboot
接下來安裝剛剛載下來的東西
在安裝的時候,需要先停掉lightdm,請先按下 Ctrl + Alt + F1 切到Text Console Mode
sudo service lightdm stop // 停掉lightdm
sudo sh "cudai-installer-file-name" --no-opengl-libs //啟動Nvidia Cuda 安裝檔,且不要安裝opengl
這時候,啟動成功的話,會跳出長長的Agreement 要你確認,再下一步有可能會跳出警告說:你仍然有X server 正在執行中,請先關閉它。不過理論上前面關掉lightdm 就已經關掉了才對。沒關係,直接先下一步看紀錄檔。cat 出紀錄檔訊息以後,會告訴你xorg PID 數字跟/tmp/.X0-lock 檔案被鎖住,
我是直接kill 掉xorg 跟rm -rf /tmp/.X0-lock,這時候再去執行一次安裝檔就可以順利執行進到下一步了。
接下去會問你好幾個東西,Driver 反正之後還會裝,隨便你要不要裝,X server config 請先不要update, 之後要自己建一個。然後接著問你要不要安裝cuda當然選要。
安裝好後,重新啟動一次,接著安裝最新的nvidia driver,也是需要先停掉X server,所以就照上面的指令做,然後要安裝Driver時:
sudo sh "nvidia-driver-filename" --no-opengl-files
一樣如果碰到X server 還在的問題的話,也是看安裝錯誤紀錄檔找到PID 把它kill 掉
中間有問要不要安裝dkms , 我這邊是選要。
最後安裝好重新啟動後,有些人可能已經可以開始在不接螢幕的情況下開始跑cuda 了。不過有些人因為需要調整超頻,啟用nvidia-settings 時會出現"Missing extensions "錯誤。
超頻xorg.conf 設定
經過搜集資料以後,了解到Nvidia 顯示卡要在Linux 超頻的話需要很奇葩的透過xorg.conf 來假裝他有一個screen 裝置才能進行超頻的動作。
於是我在/etc/X11/xorg.conf (如果沒有請自行新增)內的設定如下:
Section "ServerLayout"
Identifier "Layout0"
Screen 0 "Screen0"
Screen 1 "Screen1"
InputDevice "Keyboard0" "CoreKeyboard"
InputDevice "Mouse0" "CorePointer"
EndSection
Section "Files"
EndSection
Section "InputDevice"
# generated from default
Identifier "Mouse0"
Driver "mouse"
Option "Protocol" "auto"
Option "Device" "/dev/psaux"
Option "Emulate3Buttons" "no"
Option "ZAxisMapping" "4 5"
EndSection
Section "InputDevice"
# generated from default
Identifier "Keyboard0"
Driver "kbd"
EndSection
Section "Monitor"
Identifier "Monitor0"
VendorName "Unknown"
ModelName "Unknown"
HorizSync 28.0 - 33.0
VertRefresh 43.0 - 72.0
Option "DPMS"
EndSection
Section "Device"
Identifier "Device0"
Driver "intel"
BusID "PCI:0:2:0"
EndSection
Section "Device"
Identifier "Device1"
Driver "nvidia"
VendorName "NVIDIA Corporation"
BoardName "GeForce GTX 1070"
BusID "PCI:1:0:0"
Option "ConnectedMonitor" "DFP-0" //代表不連接任何顯示器
Option "Coolbits" "31" //啟用進階超頻功能
Option "AllowEmptyInitialConfiguration" "true" // 強制啟用顯示卡
EndSection
Section "Screen"
Identifier "Screen0"
Device "Device0"
EndSection
Section "Screen"
Identifier "Screen1"
Device "Device1"
Option "Coolbits" "31"
Option "UseDisplayDevice" "none"
Option "RegistryDwords" "PerfLevelSrc=0x2222"
EndSection
請注意我的Screen0 給Monitor0 都是指向Device0 也就是intel 內顯。另外Nvida 裝置仍然有新增額外的Screen 指向他,但是不會連接任何顯示器。
至於兩個裝置的BusID 可以如下指令取得
lspci | grep -i vga
新增完,重新啟動以後,應該就可以在nvidia-settings 控制台內看到顯示卡溫度、風扇以及超頻調整的選項了。
我在Ubuntu 17.04碰到一個奇怪的bug是我無論怎麼新增xorg.conf 在/etc/X11 的路徑重新啟動後都會被刪掉,很無言。
如果確認xorg.conf 作用後,就可以下指令超頻了。新增一個bash 檔:
#!/bin/bash
nvidia-settings -a '[gpu:0]/GPUPowerMizerMode=1' //調整Performance Level
nvidia-settings -a '[gpu:0]/GPUGraphicsClockOffset[3]=200'
nvidia-settings -a '[gpu:0]/GPUMemoryTransferRateOffset[3]=500'
nvidia-settings -a '[gpu:0]/GPUFanControlState=1' //允許風扇控制
nvidia-settings -a '[fan:0]/GPUTargetFanSpeed=100' //不怕吵的話直接調到100%
gpu:0, gpu:1 ......可以用nvidia-smi 指令列出來,或者nvidia-settings query出來,可以看manual
然後檔案看要手動執行還是要在statup 內每次登入自動執行也可。
原先沒超頻EWBF cuda miner 大概400 sol/s 左右,超頻後可以到450 sol/s
至於怎麼設定挖Zcash 就請自行研究囉。
參考
- http://www.markbuckler.com/post/install-cuda/
- https://www.reddit.com/r/EtherMining/comments/6gfnzi/overclocking_of_multiple_gtx_1070_cards_on_375/
- https://forum.ethereum.org/discussion/7780/gtx1070-linux-installation-and-mining-clue-goodbye-amd-welcome-nvidia-for-miners
- https://forums.geforce.com/default/topic/1014760/geforce-1000-series/gtx-1070-cannot-control-overclock-settings-on-ubuntu-16-04-/