V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
lwch
V2EX  ›  分享创造

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

  •  2
     
  •   lwch · 193 天前 · 2395 次点击
    这是一个创建于 193 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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