Jerry @DOA&INPAC, SJTU

Working out everything from the first principles.

导航

笔记本 M.2 PCIe 3.0 x4 外接显卡方案与实践

前言

本博客的上一篇文章更新于2021年2月,距今已经有一年半了。这一年半我一切正常,没有经历任何糟糕的事情,一直没更新纯粹是因为太忙。一年半的高压下来,我的心态也变化了不少,这些不妨以后再写。

说正事。最近开始接触深度学习,跑了几个程序以后发现笔记本的 3050 Ti Laptop 的 4 GB 显存捉襟见肘,于是想配一台带有大显存的电脑。

8000 张图片,FCOS 训练,一轮近半小时,谁吃得消;batch size 也只能取到 4

方案

在选择显卡之前,首先应该考虑的是显卡插在哪里的问题。

我刚接触电脑硬件是在2015年,那时很流行E3,E5洋垃圾也很香,但是随着制程和架构的升级,这些型号无论是IPC还是主频都太过时了,况且配套的主板并不便宜。选一个现代的CPU吧又缺乏足够的理由,一是深度学习对CPU的要求并不高,二是我现在的主力笔记本搭载的5900HX也足够强大,我不想为好的CPU花两份钱。

其实说到底还是没有垃圾的产品只有垃圾的价格,我并不愿意付出很多金钱来购买一套不错的板U以应对我一般的需求,但是买洋垃圾又觉得钱花得不值。

有没有白嫖的方法呢?在我考虑这件事的时候,我的主力笔记本正压在前主力身上。

大约是2017年3月,我(准确地说是我家里人)买了一台华硕飞行堡垒FX63VD,i7 7700HQ + GTX 1050,陪伴我从高中进入带学,于21年11月光荣退役,此后又干过BT下载和爬虫。

两台电脑同时挂爬虫,这个项目我可能以后会专门介绍

这台机子已经经历过几次升级了。买的时候为了省钱选的是单条 8G 内存+1T 机械,同时买了 256 GB 的 NGFF 固态装上。显然内存不够,没用多久我就加了一条 16G 内存组成非对称双通道。因此它当前的状态是:内存 24 GB,SATA SSD 256 GB,HDD 1 TB。

从这台电脑上,我可以获得免费的基础平台,不止CPU,更有电源甚至扬声器这样的细节。那么问题又来了——显卡插在哪里?

笔记本外接显卡的方案古已有之。在雷电接口普及之前,外接主要是走网卡或硬盘的 M.2 接口,前者是 PCIe 3.0 x1,后者是 x4。外接显卡算是成熟技术了,淘宝上很容易买到 M.2 转接 PCIe x16 的延长线。

M.2 转接 PCIe x16 延长线

但是这需要 M.2 支持 NVMe,即 PCIe 信号。说来奇怪,以我对当时的自己的认知,如果这台电脑的 M.2 接口支持 NVMe,我应该会选择一块 NVMe 固态而不是 NGFF,因此我一度怀疑它不支持。查了华硕官网的说明书,说是支持,但我仍然怀疑国行区别对待,毕竟这种事现在不在少数。直到我找出了原购买链接的交易快照,那里写着几个 128 GB NVMe 固态的选项,我才确定它支持 NVMe。

那么我可以把 NGFF 硬盘拆下来给显卡腾位置了。系统盘还得是SSD,所以我买了个 M.2 转 2.5 寸 SATA 的硬盘盒,很便宜,原 HDD 就扔到硬盘座上去了(下载机时期买的)。不知道我怎么想的,我还买了一条 16G 内存替换原装 8G,可能是为了弥补主力机没有 32 GB 内存的缺憾吧,事实证明没有必要,不过笔记本 DDR4 16G 2666 现在已经是白菜价了,不是很心疼。

后续:原来那条 8 GB 卖掉了,回了点血;32 GB 也在一次深度学习中占满过——主要是不会写 data loader。

本文主角之一,四年半下来积了很多灰了

总之装机方案为:退役笔记本 M.2 位置外接显卡,外接供电。

 

延长线选型

淘宝上有很多这类延长线,价格从20以内到200以上不等。之所以叫“延长线”而非“转换器”,是因为这类产品在 PCIe 信号通路上都是没有芯片的,直接导线连接。

下面这张图是售价不到 20 元的 M.2 A/E key 接口的延长线,M.2 端和 PCIe 端通过一根 USB 3.0 线连接:

下面这张图是售价超过 200 元的 M.2 M key 接口的延长线,M.2 端直接焊接排线,另一端通过两个 HDMI 接口连接:

经过仔细分析,这类产品只有两大类不同:

  • 带宽。上图第一个是 PCIe x1,第二个是 PCIe x4。

  • 电源接口。明显第二个比第一个提供了更多电源接口,甚至包括主板 24-pin,把电源启动也考虑进去了。

事实上,上面第二个正是专门为外接显卡设计的产品,也正因如此才敢卖那么贵。其实价格相比显卡只是很小一部分,但让我不爽的点在于我觉得它不值——给我点时间,我也能做出来!看看本博客其他文章,你会相信这一点的。

感谢群友提供表情包

话说回来,带宽还是要保证的,我不希望几千的显卡被 PCIe 3.0 x1 拴着跑;但是除了带宽以外的增值,我是一分钱都不会花的!

最终我选择了这款:

为避免广告嫌疑,此处不放链接

商品有很多选项,一个是正插反插(如图),笔记本 M.2 显然在反面所以选反插;长度我量了一下选最短的 0.15 m 即可,售价 63 元 + 运费 10 元。

但是它在电源方面是真的节俭,只带一个很小的电源接口,用来给 PCIe 插槽的 12 V 供电,3.3 V 是没有的。询问卖家得知 3.3 V 可以不接,12 V 当然是必须接的。

 

显卡选型

最初萌生攒机的想法其实是在半年前,那时我听说 Google Colab 还在用 NVIDIA Tesla K80 显卡,顺手淘宝一查,好家伙,2000 元即可拥有前双芯旗舰专业卡的性能!

后来我考虑了双芯需要模型拆分和功耗等各种因素,决定升级成 P40,价格也没差多少(其实我已经记不清了,这些卡最近波动比较大)。然后我又了解到定位数据中心的旗舰 P100,发现它的单精度竟然还不如 P40!这听起来很不合理,但是仔细调研以后我才明白,现在做深度学习已经不用 FP32 了,而是半精度 FP16 等格式,辅以混合精度、loss scaling等技术,甚至 H100 开始支持的 FP8。P40 在半精度方面没有优化,而 P100 能把单精度乘法器拆分成两个单元并行计算半精度(SIMD),使得 FP16 吞吐量达到 FP32 的两倍,这下就轻而易举地超过了 P40,稳住了老大地位。

事实上,Tensor Core 就是为这类应用而生,它的引入是从 Volta 架构开始的。此后的 Turing 即 RTX 2000 系列搭载第二代 Tensor Core,Ampere 即 RTX 3000 系列搭载第三代,每一代都有显著的升级,到了 Ampere 这一代,FP16 的 tensor 性能已经达到了传统 FP32 的 4 倍(数据来源)。因此,我开始把目光转向更现代的架构。

Tensor Core 带来巨大的吞吐量提升(来源

然而,因为众所周知的原因,近几年来普通消费者很难以合理的价格买到称心如意的显卡,甚至 P40、P100 这种卡都拿去挖矿了,那还有什么可选的呢?

当然,你可以选择矿卡,3060 的 12 GB 大显存对炼丹非常友好,闲鱼上矿卡价格也不错。其实我现在也有点后悔没有选 3060,至少它便宜很多。

由于我的目光是从 P40 这类 24 GB 显存的卡上转过来的,我一时间无法接受 12 GB 及以下的显存,再加上 Ampere 架构的限制和 3.0 x4 的发挥上限,可选的就不多了:

型号 核心 显存容量 显存类型 显存位宽 核心频率 显存频率 CUDA数量 淘宝价
RTX 3090 GA102 24 GB GDDR6X 384 bit 1395 MHz 1219 MHz 10496 4899
RTX 3090 Ti GA102 24 GB GDDR6X 384 bit 1560 MHz 1313 MHz 10752 7999
RTX A4000 GA104 16 GB GDDR6 256 bit 735 MHz 1750 MHz 6144 4699
RTX A5000 GA102 24 GB GDDR6 384 bit 1170 MHz 2000 MHz 8192 10800
A10 PCIe GA102 24 GB GDDR6 384 bit 885 MHz 1563 MHz 9216 15500

这里面 3090 默认矿不用想,几乎不存在例外,例外也不会让你捡到,4899买矿卡我是不愿意的。A4000 也是有很多挖矿的,再往上因为性能与价格不成正比了,应该就没有矿老板会那么疯狂了。

不过不成正比的我也不考虑,我最终选择了 A4000,在闲鱼上以 4300 的价格入手。对方是做电脑租赁生意的,卡是戴尔整机拆出来卖的,我愿意相信不是矿。

顺便,如果你能说服自己买 3090 Ti(应该没矿吧),那不妨考虑一下刚出的 RTX 4090。

更新于 10 月 17 日:说得有点晚了,现在 4090 也溢价了。

 

电源选型

在那台笔记本还在做下载机的时候,我就已经改装过了它的供电,用一个 12V 200W 的开关电源接 19 V 升压模块供电,这个电源还给 LED 和硬盘盒供电,所以能节省几个插座位置,这是主要目的:

这下多出好多用电器,我不得不加一个排插,所以电脑供电可以改回原装的了,那么 200 W 正好可以分出 140 W 给显卡供电。

装上去以后我发现它在大负载下会响,可能是线圈在交变电流下碰撞产生的,让我非常害怕;而且它是被动散热,长时间工作怕是要烧坏。所以我后来还是买了一个服务器拆机电源,这个劲大:

 

组装

按照 PCIe 标准,这张的显卡能从插槽取电 66 W,从 6-pin 接口取电 75 W,并且加起来不超过 140 W。66 W 就是 5.5 A 电流,走一根 18AWG 的线虽然理论上可行但是我不大放心,所以把另一根原本走 5 V 电压的线也改成了 12 V。

注意右边中间

我担心过 3.3 V 不接会不会点不亮,因此还买了降压模块,不过事实证明并不需要。那些卖 200 多的模块上大多自带了 12 V 转 3.3 V 的 DC/DC 电路。

6-pin 这边,我买了一根延长线,然后把母口这一端剪了;板上 4-pin 配的线另一端是 SATA 供电,也剪了。正负各 5 根线全都被我焊在一起,负极接上了端子,正极接到保险丝然后再端子。

事实证明保险丝没什么必要,TVS二极管后来则直接去掉了

负极端子并非直接接到电源负极,而是再经过一个小电阻,用来测量电流。这个功能其实更没有必要,一是整套系统放在下面我看不见,二是功率在软件里也能看,只是现在显得高级。

由于接了分流器,显示的电流比真实电流小得多

显卡需要一个底座,我当然不会花钱买。我找出了为多年前的项目制作的多余的亚克力板,刚好 PCIe 板后面的槽中有一个位置能够装进螺丝,两者就这样固定起来。这时显卡装在上面会倾斜,有点危险,于是我用一个尼龙柱加尼龙螺丝顶住,它甚至还可以适配各种高度。

免费的底座

整套下来我一个人大半夜装了好几个小时,因为对这么贵的显卡用这么朴素的方案没什么信心,每一步都确认一下,所以比较慢。尤其是上电之前非常紧张。后来换电源重新上电就很淡定了。

最终系统;笔记本底座是免费的瓶盖散热法

这些都是在室友的桌子上装配的,在初步测试完成后还得搬到自己桌子底下:

我不能每次要用的时候都坐在地上看屏幕。台面上一直有一台显示器作为主力机的副屏使用,A4000 的 DP 可以直接连接显示器的 DP,并设置为复制显示。使用时可以在显示器的 OSD 菜单切换两路信号。

这种前后闭环的感觉是我 DIY 过程中最大的乐趣,在这次装机的过程中包括整个平台的废物利用、硬盘的复用、电源的复用(尽管后来下机了),以及这里显示器的复用。当然,这些闭环都是规划好的,并非组装时临场发现的,不过真正亲手插上线的时候还是有一种奇妙的感觉

 

测试

先总结一下平台配置:

  • CPU: i7 7700HQ 4C8T
  • GPU: RTX A4000 @PCIe 3.0 x4
  • RAM: DDR4 16 GB *2 @2666 MHz
  • SSD: 256 GB
  • HDD: 2.5" 1 TB
  • HDD: 3.5" 6 TB

按照默认的风扇曲线,一跑深度学习很快就 90 度以上,很危险。我用 Afterburner 把风扇曲线拉高了很多,使得它能在 90% 转速下稳定在 80 °C 以下(环境温度 28 °C)。淘宝上有卖改装风扇,我目前还没有必要买,明年夏天再考虑。

噪声方面,我没有设备来定量测量,只能说我觉得室内使用完全没有问题,论烦人程度比不过硬盘炒豆子的声音。

我把之前在 3050 Ti 上跑过的模型都重新跑了一遍,并记录了时间。有的模型还加大了 batch size 又跑了一遍,也能对训练速度有明显的提升。

模型 batch size 3050 Ti batch size A4000
resnet18 64 5m 38s 64 2m 47s
resnet50 16 18m 39s 16 8m 24s
64 6m 44s
resnet152 64 13m 18s
regnet_y_400mf 64 6m 31s 64 3m 33s
regnet_y_1_6gf 16 28m 52s 16 15m 19s
64 7m 23s
FCOS 4 26m 25s 4 10m 27s
16 9m 03s

FCOS 训练,在 GPU-Z 中观察实时记录的各个参数,发现:

  • 总线负载很低,说明 PCIe 3.0 x4 并不影响显卡发挥;

  • 尽管 A4000 的默认显存频率是 1750 MHz(GDDR6 等效频率为时钟频率 *4,即 7000 MHz),运行时频率总是卡在 1625 MHz(6500 MHz),可能是因为功耗限制,此外显存控制器占用率很高。

项目 最低 最高 平均
GPU 频率 1275 MHz 1845 MHz 1495 MHz
GPU 负载 85% 100% 95%
显存控制器 56% 100% 86%
总线负载 1% 16% 2%
功耗 96.2 W 163.5 W 137.7 W

显存瓶颈,考虑显存超频。从前面的图可以看到,显存是三星的 GDDR6,据说比镁光和海力士的都好,很能超(矿老板超到了 8551 MHz 来挖),所以我把它拉到 7500 MHz 来用。FCOS 一轮的时间从 9m 03s 降到 8m 22s,性能提升 8%。显存温度从 84 °C 提升至 86 °C(分辨率只有 2 °C)。

项目 最低 最高 平均
GPU 频率 1200 MHz 1800 MHz 1425 MHz
GPU 负载 80% 100% 95%
显存控制器 47% 100% 79%

这两天 Stable Diffusion 和 NovelAI 很火,我也在玩。16 GB 的显存允许我把 batch size 拉满。我甚至用它生成的图来水报告。

 

后记

系里面大概是经费很充裕吧,导师知道我买显卡以后说可以报销,我想了想还是自用吧,毕竟我已经拿它玩过游戏了。只要 CPU 不瓶颈,游戏性能比我主力机强很多。

平台计划使用一年半,毕业了以后显卡出掉或者换个平台显卡继续用,再享受一波 DIY 的乐趣。

平台目前运行 Windows 10 操作系统,有需要 Linux 环境的软件,计划在 WSL 里配置。WSL 里也可以跑 CUDA,网上说的。Windows 最大的好处当然是习惯,其次是自带的远程桌面,我现在有时也使用远程桌面来控制,尽管这个“远程”其实不到一米。至于局域网外校内和校外的访问,将在不久的将来测试。

目前最大的问题在于硬盘。首先是 256 GB 的系统盘已经跟不上时代了,但是考虑到平台的生命周期我没有足够的理由来升级,将就着用用吧。其次是与主力机之间的传输,只能到 USB 2.0 的速度,因为显卡挡住了 USB 3.0 口我只能用直角头的线延长,这 1 米加上移动硬盘数据线 1 米导致供电不足一传输就断开。有趣的是,当我用快充表测试电压电流的时候,由于快充表只通 USB 2.0 的信号,移动硬盘速度也被限制在了 USB 2.0,反而能稳定传输了。我还配置了网络共享,但那样传输更慢。

更新:已通过两台电脑之间千兆有线网络连接和 Windows 局域网共享解决传输问题,速度稳定 110 MB/s 左右。

延长线与快充表

最后,这么贵(对我来说)的显卡,我自己用利用率也不高,有点浪费了。前两天 Stable Diffusion 已经搭建出来给同学玩过了,但是利用率还是很低,我也不打算在 AI 画图上浪费什么时间了。如果你线下认识我并且有使用 GPU 的需求(注意我这个平台 CPU 不大行),欢迎你联系我。

posted on 2022-10-16 01:29  Jerry_SJTU  阅读(9978)  评论(9编辑  收藏  举报