13 年 MBP,外接 RX580 显卡,运行 Keras (TensorFlow) + PlaidML - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
这是一个创建于 1769 天前的主题,其中的信息可能已经有所发展或是发生改变。

MacBook Pro 配置

主力机是 2013 年初的 15 寸 MBP:

  • 2.7 GHz Intel Core i7
  • 一代雷电接口
  • Intel HD4000 集显
  • GT 650m 独显
  • macOS Mojave 10.14.6

总之是比较老的机子了。独显性能差,且运行时风扇转速高,发热严重

eGPU 配置

  • 蓝宝石 RX 580 8GB
  • Razer Core X 显卡盒子
  • USB C 转 雷电 1/2 代转换器
  • 雷电 1/2 代延长线

我用的这一代 MBP 连接 eGPU 需要运行:

  1. purge-wrangler.sh,用来让老机子运行 eGPU
  2. purge-nvda.sh,禁用独显必要脚本之一
  3. Ubuntu GNU grub.cfg 魔改的 boot 文件,禁用独显必要步骤之一

教程详见这个eGPU.io 帖子

这个配置虽然把 RX 580 的数据传输性能限制到了一代雷电的水平,可以说是大打折扣但是完全带得动 LG 4k60p 显示器(直连显卡盒子)。

PlaidML

使用PlaidML,在 pyenv 创建的 Python 3.8.6 虚拟环境里安装:

  • ipykernel
  • h5py<3.0.0 (need to enter "h5py<3.0.0") actually 2.10.0. This version is required by tensorflow.
  • plaidml-keras (only available on PyPI, keras is also included in this package)
  • plaidbench (only available on PyPI)
  • tensorflow (just install plaidml-keras is not enough, I have to install this. I installed it after those packages)

括号里是我个人 wiki 里的内容,直接搬过来了。

VGG-19 测试结果

使用 CPU:

2020-12-05 15:00:42.457154: I tensorflow/compiler/xla/service/service.cc:168] XLA service 0x7fde5c7c9110 initialized for platform Host (this does not guarantee that XLA will be used). Devices: 2020-12-05 15:00:42.457188: I tensorflow/compiler/xla/service/service.cc:176] StreamExecutor device (0): Host, Default Version Running initial batch (compiling tile program) Timing inference... Ran in 35.34518790245056 seconds 

使用 RX580 eGPU:

Using plaidml.keras.backend backend. INFO:plaidml:Opening device "metal_amd_radeon_rx_580.0" Running initial batch (compiling tile program) Timing inference... Ran in 2.5728609561920166 seconds 

我不是专业的机器学习从业者,如果大家对上面哪一环节有兴趣进一步了解,我会详细解释~

第 1 条附言    2020-12-06 10:16:05 +08:00
对于这个例子,CPU 运行用时 35 秒,eGPU 用时不到 3 秒
第 2 条附言    2020-12-06 19:36:03 +08:00
用 RX 580 eGPU,不到 3 秒的结果使用 Metal 跑的。用 OpenCL 用时 7.6 秒
IgniteWhite
    1
IgniteWhite  
OP
   2020-12-06 10:01:17 +08:00   1
实际使用中,我用一个树莓派 4B 装了 Manjaro ARM 作为辅助系统运行 JupyterLab,通过一个叫 remote_ikernel 的包,局域网访问 MBP 的 Keras IPython kernel 。这个远程 kernel 是通过 SSH 连接的,所以能连接各种机子,包括专门跑机器学习的云服务。

树莓派装了热管加风扇散热,外接三星 SSD 做 boot+root 。它就放在我的显卡盒子上:
IgniteWhite
    2
IgniteWhite  
OP
   2020-12-06 10:04:26 +08:00
对了补充一个细节:这里 PlaidML 能在 Metal 或者 OpenCL 上跑,我用的是 Metal 。
另一些跑分结果参见 @YUX 的帖子: /t/660085
volvo007
    3
volvo007  
   2020-12-06 13:30:51 +08:00
@IgniteWhite 跟着帖子的内容我也装了,机器 13 寸的只有集显。这里请教一下,要怎么切换到显卡运算上面,接了外接显卡但还是调用的 cpu 在计算啊
volvo007
    4
volvo007  
   2020-12-06 13:38:58 +08:00
@IgniteWhite 唔,稍微补充一下,前面的问题解决了,再运行一次 plaidml-setup,让脚本识别到 vega 显卡就可以了。选择 Metal,后面跑的时候就自动用显卡了

于是要请教的问题就变成了能否通过 py 代码实现选择用于计算的硬件( cpu or gpu ),每次跑模型之前都运行一次 plaidml-setup 也不是个事
volvo007
    5
volvo007  
   2020-12-06 15:23:11 +08:00
刚刚忙了点别的,后面在手册里找到相关设置了:
> export PLAIDML_EXPERIMENTAL=1
> export PLAIDML_DEVICE_IDS=opencl_intel_uhd_graphics_630.0

这样在 rc 文件里设置一下就行,IDS 后面跟的就是 plaidml-setup 里面出现的那些设备 ID

于是可以考虑 rc 文件里绑几个 alias,跑代码前切换一下就好了,例如我的:

alias tfcpu='export PLAIDML_EXPERIMENTAL=1 && export PLAIDML_DEVICE_IDS=llvm_cpu.0'

alias tfint='export PLAIDML_EXPERIMENTAL=1 && export PLAIDML_DEVICE_IDS=metal_intel(r)_iris(tm)_plus_graphics.0'

alias tfgpu='export PLAIDML_EXPERIMENTAL=1 && export PLAIDML_DEVICE_IDS=metal_amd_radeon_rx_vega_64.0'

对于相同的 plaidmlbench keras mobilenet 测试命令

--------
tfcpu 就是放在 cpu 上跑,
Example finished, elapsed: 2.923s (compile), 99.922s (execution)

tfint 则放在集显上跑
Example finished, elapsed: 0.401s (compile), 18.213s (execution)

tfgpu 激活 gpu 去跑( Vega56 刷的 Vega64 的 bios )
Example finished, elapsed: 0.413s (compile), 8.597s (execution)

效果还不错
IgniteWhite
    6
IgniteWhite  
OP
   2020-12-06 17:05:12 +08:00 via iPhone
@volvo007 厉害啊,我还没看手册哈哈,感谢分享!我看到有人说对于 eGPU,Metal 比不上 OpenCL 快,对于独显 dGPU,哪个好还有待商榷
volvo007
    7
volvo007  
   2020-12-06 18:44:38 +08:00
@IgniteWhite 对比 cpu 能有很大提升就很满足了,这一套转译 CUDA 的想法还是很不错的
IgniteWhite
    8
IgniteWhite  
OP
   2020-12-06 19:28:21 +08:00
@volvo007 我刚刚用 OpenCL 的 eGPU 跑了一下 vgg19,用了 7.6 秒……看来还是 Metal 快
fx777
    9
fx777  
   2020-12-06 22:18:56 +08:00   1
给楼主的折腾精神,点赞。
BugenZhao
    10
BugenZhao  
   2020-12-07 03:50:36 +08:00
之前试过 plaidml,keras 的一些实现可能有 bug,训练过程中经常变成 NaN,换用 cuda 上的 tensorflow 就没有问题
IgniteWhite
    11
IgniteWhite  
OP
   2020-12-07 03:54:55 +08:00 via iPhone
@BugenZhao 谢谢提醒
关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1238 人在线   最高记录 6679       Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 25ms UTC 23:51 PVG 07:51 LAX 16:51 JFK 19:51
Do have faith in what you're doing.
ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86