无需量化,在树莓派上运行 LLaMA2 70B 模型 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
lwch
V2EX    分享创造

无需量化,在树莓派上运行 LLaMA2 70B 模型

  •  2
     
  •   lwch 2023-10-17 15:34:59 +08:00 3315 次点击
    这是一个创建于 728 天前的主题,其中的信息可能已经有所发展或是发生改变。

    想必大家对 transformer 模型的认识已经非常深刻了,这里就不多做介绍了。今天我用纯 go 语言实现了一个项目来做 LLaMA2 模型的推理,其实要在小内存设备上运行大语言模型方法很简单,只需要在运行到某一层时将该层的参数加载到内存中进行计算即可。

    项目地址: https://github.com/lwch/llama2.go

    各规格模型所需内存大小:

    Model Precision Memory Memory(Cached Params)
    7B bf16 600M+ 25G+
    13B bf16 1G+ 43G+
    70B bf16 3G+ untest

    模型推理方式:

    cat << EOF | ./llama2 text-completion -m 7B.model [--cache] Translate English to French: sea otter => loutre de mer peppermint => menthe poivrée plush girafe => girafe peluche cheese => EOF .... 此处省略一堆中间过程 Translate English to French: sea otter => loutre de mer peppermint => menthe poivrée plush girafe => girafe peluche cheese => fromage Traanslate French to English: lait => milk 

    推理提速:

    1. 可通过分布式集群来实现矩阵运算达到 tensor 并行
    2. 可通过量化手段减少模型大小并提高计算速度
    第 1 条附言    2023-10-18 14:38:59 +08:00
    通过一系列的优化,目前 7B 模型可达到 13~14s/token ,速度提升 18%
    第 2 条附言    2023-10-19 11:32:24 +08:00
    通过优化,去除矩阵转置计算后,7B 模型目前可达到 5~6s/token
    第 3 条附言    2023-10-19 14:56:39 +08:00
    通过缓存 fp32 参数,目前 7B 模型已可以达到 1.2~1.6s/token ,相比于最初版本速度提升 10 倍以上
    第 4 条附言    2023-10-19 16:37:13 +08:00
    将矩阵乘法替换至 gonum 库中的 blas 方法,目前 7B 模型已可以达到 800ms~1.2s/token
    28 条回复    2023-10-21 09:02:57 +08:00
    modestdeveloper
        1
    modestdeveloper  
       2023-10-17 15:48:20 +08:00
    stars 一下
    graetdk
        2
    graetdk  
       2023-10-17 15:58:04 +08:00
    速度会慢多少呢? 10 倍左右?
    lwch
        3
    lwch  
    OP
       2023-10-17 16:03:11 +08:00
    @graetdk 我在 i7-10710U 的 NUC 上用 8 个核心跑 7B 模型不缓存参数大概 1 分多才能出一个 token ,缓存后 16~17s 左右一个 token
    skinfiter
        4
    skinfiter  
       2023-10-17 16:57:18 +08:00
    在家用 nas 上试了一下,20 分钟还没返回,估计树莓派也不行 大佬加油啊 争取把配置要求降下来
    nomagick
        5
    nomagick  
       2023-10-17 17:02:11 +08:00
    说一句话得花一年
    lwch
        6
    lwch  
    OP
       2023-10-17 17:03:48 +08:00
    @skinfiter 哈哈,看来这些嵌入式设备上面还得做量化,不过未来可以搞一个树莓派集群来做分布式计算
    bt7vip
        7
    bt7vip  
       2023-10-17 18:31:03 +08:00 via Android
    @lwch 16s 一个 token ,前景无限啊,现在板 u 内存 2k 一套 12 代 i5 就能上线,1 万就是 5 台集群啊,那不起飞
    lwch
        8
    lwch  
    OP
       2023-10-17 18:34:09 +08:00
    @bt7vip 不能这么算,网络传输需要耗时,实际做集群计算有可能会比单机更慢,这个需要测试了才知道
    duojiao
        9
    duojiao  
       2023-10-18 11:34:13 +08:00
    @lwch #6 外行人想问下,量化后,树莓派上能提升到什么样的一个程度
    lwch
        10
    lwch  
    OP
       2023-10-18 11:41:22 +08:00
    @duojiao 哈哈,不要关心速度,做了参数延迟加载后可在低内存设备上运行可大大降低运行成本,速度只能靠堆集群和做各种各样的缓存来提升
    R4rvZ6agNVWr56V0
        11
    R4rvZ6agNVWr56V0  
       2023-10-18 11:45:53 +08:00
    速度那么慢 就没啥使用价值了
    lwch
        12
    lwch  
    OP
       2023-10-18 12:05:46 +08:00
    @GeekGao 你可以这么计算,载入 70B 模型需要 130G 显存,按 4090 的 24G 显存计算,载入整个模型需要至少 7 张卡,换算成成本就是 14W+,这些钱总共可以买 200 多个树莓派,每个 8G 内存总共 1.6T 以上,如果组起集群的话计算效率并不会比 4090 慢多少
    lwch
        13
    lwch  
    OP
       2023-10-18 12:07:26 +08:00
    @GeekGao 用这 1.6T 内存在高并发情况下,可以并行处理更多的 batch
    R4rvZ6agNVWr56V0
        14
    R4rvZ6agNVWr56V0  
       2023-10-18 14:49:47 +08:00
    @lwch 这只是理论吧,实际上组成树莓派集群后还有很多性能问题,例如总线速度
    lwch
        15
    lwch  
    OP
       2023-10-18 14:55:55 +08:00
    @GeekGao 树莓派只是打个比方,你当然可以在云上申请几台机器来加快推理速度,这个项目的主要目标还是为了降低大模型的使用成本,使普通人也可以跑上 70B 模型
    kneo
        16
    kneo  
       2023-10-18 19:08:54 +08:00 via Android
    核心代码用 go 写的?这不慢个十倍八倍对不起用户吧。
    lwch
        17
    lwch  
    OP
       2023-10-18 20:13:15 +08:00 via Android
    @kneo 再慢也能超过 python 不是吗
    kneo
        18
    kneo  
       2023-10-19 02:47:03 +08:00 via Android
    @lwch 没人用纯 Python 写这东西啊……
    lwch
        19
    lwch  
    OP
       2023-10-19 08:44:55 +08:00 via Android
    @kneo 那再举个例子谷歌搜索核心代码也是 go 的,你觉得以他的体量计算量会很小吗,速度不是一样不慢的
    kneo
        20
    kneo  
       2023-10-19 10:00:52 +08:00 via Android   1
    @lwch

    第一,关于 Google 搜索核心代码也是 Go ,是否有信息来源? Google 内部代码量巨大,模块众多,连所谓的核心代码指的是哪一部分都很难确定。

    第二,Google 的数据量巨大,集群性能远比单机单核性能重要。和你的应用场景截然相反。

    第三,作为通用语言,Go 并不慢。但是 AI 相关代码的性能大量依赖 CPU (就不提 GPU 了)指令优化。需要大量的经验和技巧。性能想赶上业界 c/cpp 版本,甚至 Python 的混合版本,我觉得需要相当的经验和技巧。我简单搜了一下你的项目,没发现有 SIMD 之类的代码,我对性能不是很乐观。

    第四,没有实测而谈性能实属嘴炮。我不应该因为开发语言否认你的劳动。我本人这几年也是用 Go 开发比较多,提 Go 和性能纯粹是路过多了一嘴。用 Go 做 AI 并非完全不靠谱,只是需要想当的工作量。如果 OP 能努力把这件事做好对圈子也是一件幸事。不过性能比对十分重要,建议有时间考虑在主页加上与各版本的实测对比。
    lwch
        21
    lwch  
    OP
       2023-10-19 10:14:47 +08:00
    @kneo 所以我上面也说了,单机的性能是有限的,想要提升整体性能只能靠堆集群来实现,目前为止这个项目还处于单机运行状态,至于说具体以哪种方式来做并行计算这个是需要实际测试的。我认为 go 语言天生就是高并发高吞吐量的代名词,因此我一开始就选用了 go 语言而不是其他的语言来进行开发,就 go 语言本身而言从单机版到集群版也更容易一些。

    另如果 10 台机器的集群计算性能可以达到 GPU 的一半,我觉得大部分的资本家也是可以接受的,毕竟总体成本下降了好几个数量级。
    kneo
        22
    kneo  
       2023-10-19 11:57:27 +08:00
    @lwch 最后提醒一下,你的直接竞争对手是 C/C++/Rust (比如 llama.cpp ,llama2.c )版本。而不是 GPU 版本。
    不管怎么说,祝有成。
    lwch
        23
    lwch  
    OP
       2023-10-19 14:54:33 +08:00
    @kneo 今天做了不少优化,目前 7B 模型单机运行已经可降低到 1.2~1.6s/token ,但 CPU 并未全部跑满可能还有一定的优化空间
    lost7
        24
    lost7  
       2023-10-19 16:19:33 +08:00
    真的是好思路,特地过来回复一下。这可以出篇不错的 paper 了
    rekulas
        25
    rekulas  
       2023-10-20 21:43:45 +08:00
    太 cool 了,想问一下为何单人工作量就可以实现一个大模型推理库呢,按我之前的理解至少得一个团队
    lwch
        26
    lwch  
    OP
       2023-10-20 23:25:40 +08:00
    @rekulas 只实现模型推理的话其实并不复杂,要实现整个深度学习框架就非常麻烦。每个 tensor 的正向传播、反向传播、梯度计算等,我实现了一个 https://github.com/lwch/gotorch 库包装了 libtorch 库里面已经实现了上百个算子,这还只是 pytorch 中的一部分,想要实现一个完整的框架一个人难以完成。
    td width="48" valign="top" align="center">rekulas
        27
    rekulas  
       2023-10-20 23:37:50 +08:00
    @lwch 了解了 仍然厉害
    我部署 7B 到 pc 虚拟机 r5 2600+64g 内存
    Enter system prompt (optional):
    Enter user prompt: where is my ass
    thinking....
    10 分钟了出不了一个 token 可能是什么原因
    lwch
        28
    lwch  
    OP
       2023-10-21 09:02:57 +08:00 via Android
    @rekulas 如果内存足够大的话可以增加--cache 和--fp32 缓存参数,每次加载参数速度很慢
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5842 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 37ms UTC 01:46 PVG 09:46 LAX 18:46 JFK 21:46
    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