如何利用深度學(xué)習(xí)硬件的閑置算力自動挖礦?
如果沒有 GPU,現(xiàn)代深度學(xué)習(xí)是不可能發(fā)展到今天的水平的。即使是 MNIST 數(shù)據(jù)集上的簡單示例算法在 GPU 和 CPU 上運行速度的差別也有 10-100 倍。但是,當(dāng)你沒有優(yōu)化所有設(shè)置時,GPU 空閑的算力該作何用?
既然擁有了強大的計算設(shè)備,我們不免會考慮到虛擬貨幣挖礦。事實上這并不是很難,你需要的只是注冊一個錢包,選擇一種貨幣,設(shè)置好挖礦軟件然后運行即可。只需要 Google 一下「如何用 GPU 開始挖礦?」,你就能看到大量介紹性文章手把手地教你如何操作。
優(yōu)化效率
在本文中,我們需要加入另一個問題:如何讓挖礦變得更加方便、自動化,同時在我需要讓計算機全力運行深度學(xué)習(xí)模型時不讓工作受到打擾。理想的解決方案是讓計算機能夠即時檢查 GPU 的資源占用,當(dāng)沒有進程使用的時候自動開始挖礦;而在 TensorFlow、PyTorch 或其他工具需要開始計算的時候,監(jiān)視器會發(fā)出命令讓計算機立即停止挖礦。
這個問題應(yīng)該很好解決,但我至今未在網(wǎng)上發(fā)現(xiàn)類似的東西,所以我自己嘗試寫了一個 GPU 監(jiān)視程序。它不僅適用于挖礦任務(wù),而且還可以用于其他各種任務(wù)。
NOTE. 在開始之前,你必須明白:希望你不要把這種計算資源優(yōu)化方法用在辦公室的計算機上,本人對于任何濫用造成的后果概不負(fù)責(zé)。
先決條件
首先,我的項目 gpu_mon 以及源代碼已經(jīng)發(fā)布在 GitHub 上了:https://github.com/Shmuma/gpu_mon。
它由 Python 3 編寫,其后沒有標(biāo)準(zhǔn)庫之外的依賴庫,但它需要運行在 Linux 系統(tǒng)上,所以如果你的機器是 Windows 系統(tǒng)的話,抱歉了:)
gpu_mon 的運行邏輯如上所述:它會定期檢查 GPU 的負(fù)載,如果沒有進程使用的話,它會自動運行你在 config 文件中選擇的程序。如果有其他程序打開了 GPU,指定程序會被自動停止以釋放資源。所以在設(shè)置完以后,你只需要打開監(jiān)視程序,隨后像往常一樣使用即可,從運行挖礦程序到全速運行深度學(xué)習(xí)模型之間僅有幾秒鐘的轉(zhuǎn)換時間。
為了獲取接入 GPU 設(shè)備的進程列表(假設(shè)是/dev/nvidia*),我們使用了 fuser 命令行工具。在基于 debian 的發(fā)行版上(如 ubuntu 或 debian),工具是由 psmisc 工具包提供的——它是系統(tǒng)安裝的一部分,所以沒有特殊的資源庫需要安裝。如果你的系統(tǒng)中沒有 fuser(你可以通過在 shell 上運行「which fuser」命令來進行檢查),則你需要事先安裝一下。
調(diào)試
整個項目的配置都是在一個單獨的配置文件中完成的,它是 ini 文件格式,存在于~/.config/gpu_mon.conf 目錄中。示例配置文件如下所示,同時在 GitHub 中也可以找到。
配置文件包含四個部分:
1. 默認(rèn)全局設(shè)置 [defaults]。在這里只有一個選項,它指定監(jiān)視軟件對 GPU 設(shè)備資源用量的檢查頻率。默認(rèn)情況下,每十秒鐘檢測系統(tǒng)中的所有 GPU 一次。
2.GPU 設(shè)置可以用 gpu-前綴的方式指定任意 GPU。你也可以用 ID 將不同的 GPU 分組(/dev/nvidiaX 設(shè)備文件上的整數(shù))。對于每個 GPU 組你都可以設(shè)置一個程序列表,其中列出不會搶占挖礦任務(wù)的程序。這樣我們就可以應(yīng)對 nvidia-smi 這樣的工具了——它會使用 GPU 設(shè)備,但不應(yīng)該妨礙挖礦。
3. 挖礦進程配置部分,可以使用 process-前綴的方式指定一個或多個。對于每個項目來說你可以指定需要運行的挖礦程序,程序所在的目錄,限制挖礦程序利用 GPU 資源的程度(這是通過導(dǎo)出 CUDA_VISIBLE_DEVICES 環(huán)境來完成的),日志文件名稱以及挖礦程序輸出。
4.TTY 監(jiān)控部分,他可以讓你選擇偽終端監(jiān)控,優(yōu)先于挖礦程序。在默認(rèn)情況下,此選項是關(guān)閉的。
以下是我在一臺雙 GPU 設(shè)備上的挖礦設(shè)置文件:
[defaults]
; how frequently perform GPU open and tty checks
interval_seconds=10
; configuraTIon of GPUs to monitor for external program access. It could be several such secTIons
[gpu-all]
; list of comma-separated gpu indices or ALL to handle all available gpus
gpus=ALL
; comma-separated list of programs which can access gpu and should be ignored
ignore_programs=nvidia-smi
; program which will be started on gpu during idle TIme
[process-0]
dir=/tmp
cmd=/var/bin/miner
; list of gpu indices or ALL to handle all available gpus. If not ALL, CUDA_VISIBLE_DEVICES will be set
gpus=0
log=/var/log/miner-0.log
[process-1]
dir=/tmp
cmd=/var/bin/miner
; list of gpu indices or ALL to handle all available gpus. If not ALL, CUDA_VISIBLE_DEVICES will be set
gpus=1
log=/var/log/miner-1.log
; configuraTIon of tty monitoring
[tty]
enabled=False
該工具的設(shè)置可以允許我們控制系統(tǒng)中每個 GPU 和每個單獨進程的計算資源占用。所以我們可以讓深度學(xué)習(xí)進程只占用第一塊 GPU(通過導(dǎo)出 CUDA_VISIBLE_DEVICE=0),而不打擾第二塊 GPU 上的挖礦進程。但如果我們想要充分釋放資源,兩塊 GPU 上的挖礦程序都會被關(guān)閉。
正如之前所說的,一切都是透明的,你不應(yīng)在開啟/關(guān)閉挖礦程序上耗費精力,只需要專注于 TensorFlow 和 PyTorch 上的優(yōu)化即可?,F(xiàn)在,你可以開始使用 gpu_mon,獲取利潤了!
自動開始 GPU_MON
為了讓 gpu_mon 不會打擾到自己,我們需要確保它會在系統(tǒng)啟動后自動在后臺運行。有很多工具都可以做到這點,但我更喜歡 supervisord,它是一個小型進程,會自動檢查正在運行的程序,如果發(fā)現(xiàn)未響應(yīng)會自動重啟程序。為了開啟 gpu_mon 的工作,安裝 supervisord,在/etc/supervisor/conf.d/gpu_mon.conf 進行好設(shè)置就足夠了。
下面是我的設(shè)置:
[program:gpu_mon]
command=/usr/bin/python3/gpu_mon/gpu_mon.py
user=
environment=HOME=,USER=
autostart=true
autorestart=true
就是這樣,隨后你就可以重啟 supervisord,然后檢查 gpu_mon 是否啟動了(命令:supervisorctl status gpu_mon),得到的回復(fù)應(yīng)該像這樣:
root@gpu:/etc/supervisor/conf.d# supervisorctl status gpu_mon
gpu_mon
多用戶
如果 gpu_mon 被一個用戶開啟,而另一個或多個用戶開始調(diào)用深度學(xué)習(xí)軟件,則 gpu_mon 無法關(guān)閉挖礦程序。這是因為 fuser 命令受到安全限制——它無法向其他用戶的進程展示正在運行的進程。如果你在多用戶的情況下仍然需要 gpu_mon(還請注意不要使用公用電腦做這種事),你有如下兩種選擇:
給 gpu_mon 以 root 權(quán)限,這在任何情況下都不是推薦的方式。
給 fuser 二進制文件加入 SUID bit。在 Ubuntu 發(fā)行版中,我們可以通過運行命令 chmod+s/bin/fuser 來完成,它可以有效地讓所有用戶訪問文件,通過 SUID bit,二進制文件是以文件擁有者證書的形式啟動的,即使它是由其他用戶啟動的。但這仍然需要你開啟 root 權(quán)限。
挖哪種虛擬貨幣?
目前,市面上存在多種虛擬貨幣,這要歸功于比特幣今年的繁榮。我個人最喜歡的是基于 equihash 的貨幣,像 ZCash 和 Komodo——它們都可以使用一種程序來挖礦。我是用 EWBF 挖礦程序的修訂版來做這個工作,它要比原版快上 10%。
鏈接:https://mega.nz/#!4iIClQ4D!tbff8HgrT5Pii8yMDXf9eZd5yFSrwOALHnjsaW7NlWU
正如前文所述,gpu_mon 本身不會挖礦,它只會跟蹤 GPU 進程,所以你可以使用任何 CUDA 優(yōu)化的挖礦程序。
賺錢與否?
當(dāng)然賺錢,但是不要指望使用一塊英偉達(dá) GTX 1080 就能賺來百萬美元,虛擬貨幣的復(fù)雜性正在增長,但挖礦收入減去電費以后仍然是正數(shù),所以何樂而不為呢?