双卡推理目前有两种方案:
- 流水线并行:把层划分到不同 GPU 上,比方说切成前半后半,每次计算先用 gpu1 ,再用 gpu2 。好处是实现简单,缺点是推理延迟会变得很大。参考 ChatGLM 的一个多卡部署实现:
https://github.com/THUDM/ChatGLM2-6B/blob/main/utils.py- 张量并行:把每个参数切片到所有 gpu 上,每次乘法完做一个 all reduce 。这个手写修改源代码很困难。比较简单的方法是套用 deepspeed zero3 ,accelerate 库也有这个功能。参考:
https://huggingface.co/docs/accelerate/usage_guides/deepspeed如果用上 deepspeed 的话,还有个单卡多卡都可以用的方案
- deepspeed 有 cpu_offload 和 nvme_offload ,可以自动把没用到的权重下放到内存/磁盘里,再把要用的挪到显存里,这样理论上多大的模型都能跑,但是对内存和磁盘要求比较高,而且推理很慢。
需要注意的几个点:
- 双卡如果是 hf 模型,适配起来比较简单,调用 accelerate 库就可以了。但一些小众框架就很麻烦。多卡推理具体方法就是前面提到的两个。
- 3060 没有 nvlink ,双卡间通信是走内存,会很慢,而且 worker 开的多也会更吃内存。一万的预算不知道配了多少内存,跑大模型对内存的要求非常高,这个需要注意。
- 双卡需要注意主板的第二个 pcie 插槽能否跑到满速( x16 ),如果 x8 或者 x4 会降低通信速度,本身多卡就挺吃通信的。还有些主板第二个 pcie 还会和 nvme 硬盘槽位冲突,这些都得确认一下。
- 如果你们组不止一个人用,双卡会方便一些,在必要时可以分给两个人分别干不同的事情。
- 单张 4060ti 放的下模型的情况下,推理会比两张 3060 快。3060 虽然有 12Gx2 ,但分布在不同的卡上,计算需要来回通信,在推理时通信开销往往是比计算大很多的。
不过就像前面几层说的,仅推理 colab 就比较够用。自己组服务器还有维护、配置的一些成本,包括像内存要求这些问题。建议再三考虑。