如果没有 GPU ,现代 深度学习 是不可能发展到今天的水平的。即使是 MNIST 数据集上的简单示例算法在 GPU 和 CPU 上运行速度的差别也有 10-100 倍。但是,当你没有优化所有设置时,GPU 空闲的算力该作何用?
既然拥有了强大的计算设备,我们不免会考虑到虚拟货币挖矿。事实上这并不是很难,你需要的只是注册一个钱包,选择一种货币,设置好挖矿软件然后运行即可。只需要 Google 一下「如何用 GPU 开始挖矿?」,你就能看到大量介绍性文章手把手地教你如何操作。
优化效率
在本文中,我们需要加入另一个问题:如何让挖矿变得更加方便、自动化,同时在我需要让计算机全力运行深度学习模型时不让工作受到打扰。理想的解决方案是让计算机能够即时检查 GPU 的资源占用,当没有进程使用的时候自动开始挖矿;而在 TensorFlow 、PyTorch 或其他工具需要开始计算的时候,监视器会发出命令让计算机立即停止挖矿。
这个问题应该很好解决,但我至今未在网上发现类似的东西,所以我自己尝试写了一个 GPU 监视程序。它不仅适用于挖矿任务,而且还可以用于其他各种任务。
NO TE . 在开始之前,你必须明白:希望你不要把这种计算资源优化方法用在办公室的计算机上,本人对于任何滥用造成的后果概不负责。
先决条件
首先,我的项目 gpu_mon 以及源代码已经发布在 GitHub 上了:https://github.com/Shmuma/gpu_mon
它由 Python 3 编写,其后没有标准库之外的依赖库,但它需要运行在 Linux 系统上,所以如果你的机器是 Windows 系统的话,抱歉了:)
gpu_mon 的运行逻辑如上所述:它会定期检查 GPU 的负载,如果没有进程使用的话,它会自动运行你在 config 文件中选择的程序。如果有其他程序打开了 GPU,指定程序会被自动停止以释放资源。所以在设置完以后,你只需要打开监视程序,随后像往常一样使用即可,从运行挖矿程序到全速运行深度学习模型之间仅有几秒钟的转换时间。
为了获取接入 GPU 设备的进程列表(假设是/dev/nvidia*),我们使用了 fuser 命令行工具。在基于 debian 的发行版上(如 ubuntu 或 debian),工具是由 psmisc 工具包提供的——它是系统安装的一部分,所以没有特殊的资源库需要安装。如果你的系统中没有 fuser(你可以通过在 shell 上运行「which fuser」命令来进行检查),则你需要事先安装一下。
调试
整个项目的配置都是在一个单独的配置文件中完成的,它是 ini 文件格式,存在于~/.config/gpu_mon.conf 目录中。示例配置文件如下所示,同时在 GitHub 中也可以找到。
配置文件包含四个部分:
1.默认全局设置 [defaults]。在这里只有一个选项,它指定监视软件对 GPU 设备资源用量的检查频率。默认情况下,每十秒钟检测系统中的所有 GPU 一次。
2.GPU 设置可以用 gpu-前缀的方式指定任意 GPU。你也可以用 ID 将不同的 GPU 分组(/dev/nvidiaX 设备文件上的整数)。对于每个 GPU 组你都可以设置一个程序列表,其中列出不会抢占挖矿任务的程序。这样我们就可以应对 nvidia-smi 这样的工具了——它会使用 GPU 设备,但不应该妨碍挖矿。
3.挖矿进程配置部分,可以使用 process-前缀的方式指定一个或多个。对于每个项目来说你可以指定需要运行的挖矿程序,程序所在的目录,限制挖矿程序利用 GPU 资源的程度(这是通过导出 CUDA_VISIBLE_DEVICES 环境来完成的),日志文件名称以及挖矿程序输出。
4.TTY 监控部分,他可以让你选择伪终端监控,优先于挖矿程序。在默认情况下,此选项是关闭的。
以下是我在一台双 GPU 设备上的挖矿设置文件:
[defaults]
; how frequently perform GPU open and tty checks
interval_seconds=10
; configura ti on of GPUs to monitor for external prog ram access. It could be several such sec TI ons
[gpu-all]
; list of comma-separated gpu indices or ALL to handle all av ai lable gpus
gpus=ALL
; comma-separated list of progr ams which can access gpu and should be ignored
ignore_programs=nvidia-smi
; program which will be started on gpu during idle TI me
[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
; configura TI on of tty monitoring
[tty]
enabled=False
该工具的设置可以允许我们控制系统中每个 GPU 和每个单独进程的计算资源占用。所以我们可以让深度学习进程只占用第一块 GPU(通过导 CUDA_VISIBLE_DEVICE=0),而不打扰第二块 GPU 上的挖矿进程。但如果我们想要充分释放资源,两块 GPU 上的挖矿程序都会被关闭。
正如之前所说的,一切都是透明的,你不应在开启/关闭挖矿程序上耗费精力,只需要专注于 TensorFlow 和 PyTorch 上的优化即可。现在,你可以开始使用 gpu_mon,获取利润了!
自动开始 GPU_MON
为了让 gpu_mon 不会打扰到自己,我们需要确保它会在系统启动后自动在后台运行。有很多工具都可以做到这点,但我更喜欢 supervisord,它是一个小型进程,会自动检查正在运行的程序,如果发现未响应会自动重启程序。为了开启 gpu_mon 的工作,安装 supervisord,在/etc/supervisor/conf.d/gpu_mon.conf 进行好设置就足够了。
下面是我的设置:
[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),得到的回复应该像这样:
root@gpu:/etc/supervisor/conf.d# supervisorctl status gpu_mon
gpu_mon RUNNING pi d 1526, up TI me 57 days, 18:14:27
多用户
如果 gpu_mon 被一个用户开启,而另一个或多个用户开始调用深度学习软件,则 gpu_mon 无法关闭挖矿程序。这是因为 fuser 命令受到安全限制——它无法向其他用户的进程展示正在运行的进程。如果你在多用户的情况下仍然需要 gpu_mon(还请注意不要使用公用电脑做这种事),你有如下两种选择:
给 gpu_mon 以 root 权限,这在任何情况下都不是推荐的方式。
给 fuser 二进制文件加入 SUID bit。在 Ubuntu 发行版中,我们可以通过运行命令 chmod+s/bin/fuser 来完成,它可以有效地让所有用户访问文件,通过 SUID bit,二进制文件是以文件拥有者证书的形式启动的,即使它是由其他用户启动的。但这仍然需要你开启 root 权限。
挖哪种虚拟货币?
目前,市面上存在多种虚拟货币,这要归功于 比特币 今年的繁荣。我个人最喜欢的是基于 equihash 的货币,像 ZCash 和 Komodo——它们都可以使用一种程序来挖矿。我是用 EWBF 挖矿程序的修订版来做这个工作,它要比原版快上 10%。
正如前文所述,gpu_mon 本身不会挖矿,它只会跟踪 GPU 进程,所以你可以使用任何 CUDA 优化的挖矿程序。
赚钱与否?
当然赚钱,但是不要指望使用一块 英伟达 GTX 1080 就能赚来百万美元,虚拟货币的复杂性正在增长,但挖矿收入减去电费以后仍然是正数,所以何乐而不为呢?