0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

使用MLC-LLM支持RWKV-5推理的过程思考

jf_pmFSk4VX 来源:GiantPandaCV 2023-11-19 15:58 次阅读

自从2023年3月左右,chatgpt火热起来之后,我把关注的一些知乎帖子都记录到了这个markdown里面,:https://github.com/BBuf/how-to-optim-algorithm-in-cuda/tree/master/large-language-model-note ,从2023年3月左右到现在保持了持续动态更新整理,有关于LLM基础知识,LLM训练,LLM推理等各个方面的知乎文章链接,感兴趣的读者可以看一下。

0x0. 前言

继续填 使用MLC-LLM将RWKV 3B模型跑在Android手机上(redmi k50每s可解码8个token 这篇文章留下的坑。由于上面这篇文章支持的是RWKV4模型,不支持最近RWKV社区正在训练的RWKV5模型,所以利用业余时间在MLC-LLM里面支持了最新的RWKV5模型的推理,同时也可以带大家看一下RWKV5的3B模型表现是否有惊艳之处。目前我跑通了Metal和Android平台的RWKV5推理(包含1.5B和3B),并且也编译出了一个3B int8模式的apk提供给android用户使用,地址为:https://github.com/BBuf/run-rwkv-world-4-in-mlc-llm/releases/download/v1.0.0/rwkv5-3b-int8.apk 。大家可以下载这个apk来体验最新的RWKV-5-3B模型。

另外,我在测试RWKV-5-3B的时候也发现了RWKV4的表现和HuggingFace版本的表现相差比较多,也修复了这个bug。总的来说,在MLC-LLM里面适配一个新的RWKV5模型是比较麻烦的,我前后肝了几个周末,并且在Hzfengsy的热心帮助下解决了一个关键的TIR实现问题后。这篇文章我会分享一下适配过程中的主要问题是什么,给想使用MLC-LLM适配其它不支持的模型的读者一个踩坑经验。

关于RWKV模型的更多信息大家可以关注bo的两篇博客:

RWKV-5 的训练进展,与 SOTA GPT 模型的性能对比:https://zhuanlan.zhihu.com/p/659872347

RWKV-5 的训练进展(之二),与 SotA GPT 模型的性能对比:https://zhuanlan.zhihu.com/p/664079347

再次感谢@Hzfengsy 在适配RWKV-5过程中的指导。

本文涉及到的工程代码体现在下面的2个PR:

https://github.com/mlc-ai/mlc-llm/pull/1275 (MLC-LLM中支持RWKV5)

https://github.com/mlc-ai/tokenizers-cpp/pull/19 (对RWKV World Tokenzier的bug修复,也提升了RWKV-4-World系列模型的效果)

另外,目前MLC-LLM支持RWKV-5在Metal和Android的推理,但是在nvidia gpu上因为一个已知的tvm bug导致编译失败,如果要在Nvidia GPU上部署RWKV-5-World模型需要等官方完成这个bug fix,具体请关注 https://github.com/mlc-ai/mlc-llm/pull/1275 进展。

0x1. 笔者为何关注RWKV

对LLM的理解比较有限,从代码实现的角度来说,RWKV的状态和KV Cache不同,不依赖序列长度,这让RWKV模型在各种长度下运行内存和运行速度都是趋于稳定的,所以我感觉工程价值是比基于Transformer架构比如Llama更好的,部署的性价比会天然更优。这个特点让他在更长的序列比如100K长度下的推理也更有前景吧。但是,RWKV是否可以取得和Transformer主流架构相同的效果呢?我个人感觉还是需要等待时间的检验,目前最新的RWKV5模型最多scale up到7B,并且数据也是很有限只有1.12TB,这个信息我是从HuggingFace的项目看到的,如下图所示。(这里的v2就是最新的RWKV5架构,内部小版本命名稍显混乱,这一点也可以从ChatRWKV的model.py看出)。

ef65fd4e-86a6-11ee-939d-92fbcf53809c.png

所以如果RWKV架构真的可以取得和Transformer开源SOTA架构一样的效果,前景是很好的。RWKV-5 的训练进展(之二),与 SotA GPT 模型的性能对比:https://zhuanlan.zhihu.com/p/664079347 这里已经贴出一些BenchMark结果:

ef7f0172-86a6-11ee-939d-92fbcf53809c.png

从作者这里选取的一些数据集来看,RWKV-5-World 7B目前仅训练30%的checkpoint的效果已经和Baichuan2-7B-Base非常接近了,还是值得期待一下的。

不过,这里存在的问题是这里的这些测试的数据集可能需要使用一些更加有说服力的,比如MMLU/CMMLU/HummanEval/MBPP/CMRC2018等等。这个属于开源大模型评测的知识,大家应该能找到很多榜单,RWKV官方是否考虑去opencompass打一下榜,更全面的做个对比。

因为这里有个明显的疑问就是,按照官方的说法,为什么使用1.12T数据训练30%之后在上面的任务里面就可以几乎持平使用2.6T数据进行全量预训练的Baichuan2-7B-Base模型的效果呢?所以我个人感觉这里需要更多的榜单数据来看效果。

efac835e-86a6-11ee-939d-92fbcf53809c.png

在这里插入图片描述

0x2. RWKV-5-3B模型在Mac上的一些文创和代码生成效果演示

我个人感觉7B模型和3B模型就是为了手机上离线运行而生的尺寸,所以我这里使用上面编译的Apk来演示一下使用MLC-LLM推理的RWKV-5-3B模型的一些文创效果和代码生成效果。下面演示的文创问题大多数来自昆仑天工的Skywork-13B例子(https://github.com/SkyworkAI/Skywork),感谢。下面的User是我问的问题,Assistant是RWKV-5-3B模型的回答,运行环境为Mac M2 FP16模式。由于这个模型是基础模型,所以对话效果会受到上下文多轮对话干扰,所以在测试不同种类的问题时,可以使用/reset来重置对话。

概念介绍

efc40506-86a6-11ee-939d-92fbcf53809c.png

在这里插入图片描述

广告文案

efe4dbb4-86a6-11ee-939d-92fbcf53809c.png

在这里插入图片描述

作文生成

effc030c-86a6-11ee-939d-92fbcf53809c.png

在这里插入图片描述

演讲稿生成

f01226a0-86a6-11ee-939d-92fbcf53809c.png

在这里插入图片描述

心得体会

f0283e5e-86a6-11ee-939d-92fbcf53809c.png

在这里插入图片描述

科技文稿

f03c6a00-86a6-11ee-939d-92fbcf53809c.png

f05dc4e8-86a6-11ee-939d-92fbcf53809c.png

记录文

f072e008-86a6-11ee-939d-92fbcf53809c.png

在这里插入图片描述

评论评语

f08bf4d0-86a6-11ee-939d-92fbcf53809c.png

在这里插入图片描述

问题生成

f0a8c9f2-86a6-11ee-939d-92fbcf53809c.png

在这里插入图片描述

起名字

f0bbedb6-86a6-11ee-939d-92fbcf53809c.png

在这里插入图片描述

简单代码

f0cb32a8-86a6-11ee-939d-92fbcf53809c.png

f0e36fc6-86a6-11ee-939d-92fbcf53809c.png

总的来说,对于大多数文学创作问题,RWKV-5-3B的回答还算像那回事,不过也可以明显感觉到一些瑕疵以及指令跟随的能力很有限,比如对数字非常不敏感,让他说5个字他似乎不明白意思。此外,3b模型拥有了一定的代码能力,可以写有限的简单代码。

最后,我比较期待7b最终训练完之后的效果,希望RWKV可以在opencompass榜单上证明自己。

0x3. MLC-LLM支持RWKV-5步骤

这一节可能会写得流水账一点。模型实现文件:https://github.com/mlc-ai/mlc-llm/pull/1275 里的 rwkv5.py

首先,由于MLC-LLM已经支持了RWKV4架构,所以我们大体上是可以使用RWKV4的实现的,然后把RWKV5的改动加上去。

我们可以从ChatRWKV的rwkv4/rwkv5模型实现(https://github.com/BlinkDL/ChatRWKV/blob/main/rwkv_pip_package/src/rwkv/model.py)看出rwkv4和rwkv5的不同之处主要在于RWKV5引入了多头的线性Attention,代码上体现为对Attention部分的重写,包括state的个数也从5个变成了3个。从MLC-LLM的模型实现代码上来看,如果要在同一个实现中进行兼容会相当麻烦,所以我使用了一个新的文件来实现RWKV5,接下来就是对着ChatRWKV修改代码把RWKV5的初版本改上去。在RWKV5的prefill阶段,会调用一个新的CUDA Kernel:https://github.com/BlinkDL/ChatRWKV/blob/main/rwkv_pip_package/src/rwkv/model.py#L465-L497 。而这个Kernel的原始实现则对应这里的Python公式:https://github.com/BlinkDL/RWKV-CUDA/blob/main/wkv5/run.py#L67-L87

f0f38014-86a6-11ee-939d-92fbcf53809c.png

在这里插入图片描述

但需要注意的是,在真正的模型实现中,这里的state是需要更新的全局变量而非local的。由于这个函数有一个循环会在T的维度上进行迭代,而T是序列长度是可变的,所以这里需要类似于RWKV4的实现写一个TIR来模拟这个python程序的逻辑,在冯博的帮助下得到了一版初始的TIR实现:

f10b2778-86a6-11ee-939d-92fbcf53809c.png

这个实现过程中也帮助发现一个DLight的bug,由@Hzfengsy在tvm里面进行了修复。https://github.com/apache/tvm/pull/16124

解决了上面的TIR问题之后就可以在MLC-LLM里面编译RWKV5模型了,然后使用TVM的dump ir工具和ChatRWKV来对比精度,这里需要固定输入的Tensor才行,为了方便我将输入固定为一个全1的十个元素的ids。然后在对比精度的实现发现,上面实现的TIR的输入的所有值都是可以对上的,但是TIR的输出out却是错误的。仍旧是冯博帮我解决了这个bug,原因是因为上面的版本中对于state来说T不应该是spatial的而是reduction。修复后的正确版本长这样:

f11c2b68-86a6-11ee-939d-92fbcf53809c.png

在这里插入图片描述

接着又从dump的结果观察到attention部分的groupnorm的结果无法对上,但输入都是可以对上的,然后我手动实现了一下groupnorm的过程(下面的237-247行)发现结果竟然是可以对上的。

f12c8d0a-86a6-11ee-939d-92fbcf53809c.png

后面经Hzfengsy提醒确认是开始的groupnorm调用参数写错了,修复之后继续下一步。这一下attention和ffn的结果是可以对上了。

然后开始使用mlc chat程序尝试进行对话,发现输出会乱码。又怀疑中间某个地方精度没对齐,所以继续完整模拟了一遍prefill+decode,发现prefill+第一轮decode的结果完全能对上,想摆烂了。。

然后我使用相同的问题问了一下ChatRWKV,发现ChatRWKV的结果也是乱码。。。直觉告诉我一定是乌龙了,由于我这里对比的ChatRWKV是我自己fork的,可能不小心改了bug。我重新拉官方的ChatRWKV一一对比,找到了问题所在。是因为我的代码里错误的去掉一个transpose op,我也忘记了为什么要这么做,但是这个transpose op去transpose的两个维度的大小是相同的,所以输出shape也是相同的,导致了对精度浪费了很多时间。

解决这个问题之后,发现输出就是正常的了。但,真的正常吗?

我在尝试一些问题时发现输出非常奇怪:

f144d69e-86a6-11ee-939d-92fbcf53809c.png

感觉这里一定还有bug,既然模型精度方面没有bug,要么就是prompt技巧,tokenizer,sampling。sampling是比较正常并且经过众多模型检验的,应该问题不大。然后恰好想起daquexian的faster-rwkv里面更新过tokenzier,之前的实现应该有bug:

接下来就是更新tokenzier的代码修复bug,最后在review 初始化prompt的时候也发现了一个bug,将其修复。

f16ab68e-86a6-11ee-939d-92fbcf53809c.png

最终获得的代码效果就是0x2节展示的了,这些prompt的输出和ChatRWKV相差不大,理论上来说应该是完成了正确的适配。

0x4. 总结

本文记录了笔者使用 MLC-LLM 支持RWKV-5推理的过程以及对RWKV-5的一些思考,谢谢。

编辑:黄飞

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Android
    +关注

    关注

    12

    文章

    3935

    浏览量

    127339
  • gpu
    gpu
    +关注

    关注

    28

    文章

    4729

    浏览量

    128890
  • LLM
    LLM
    +关注

    关注

    0

    文章

    286

    浏览量

    327

原文标题:0x4. 总结

文章出处:【微信号:GiantPandaCV,微信公众号:GiantPandaCV】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    对比解码在LLM上的应用

    为了改进LLM推理能力,University of California联合Meta AI实验室提出将Contrastive Decoding应用于多种任务的LLM方法。实验表明,所提方法能有效改进
    发表于 09-21 11:37 623次阅读
    对比解码在<b class='flag-5'>LLM</b>上的应用

    【飞凌嵌入式OK3576-C开发板体验】rkllm板端推理

    : ulimit -HSn 10240 最后,执行llm_demo可执行文件,并指定rkllm模型文件的路径。这样即可开始推理过程: ./llm_demo --model_path /path
    发表于 08-31 22:45

    思考驱动创新,创新驱动发展:基于假设(Assumption)的思考技术

    大跨度的联想中得到启迪,然后再用严密的逻辑加以验证。” 胡适也说:“大胆假设,小心求证 。”2. 回顾:科学创新的思考技术 人类三项天赋的推理能力是:演绎推理、归纳推理和溯因
    发表于 12-21 10:23

    如何识别slc和mlc芯片及slc mlc区别

    如何识别slc和mlc芯片及slc mlc区别 slc mlc区别:     MLC(Multi-Level-Cell)技术,由英特尔
    发表于 07-17 10:01 6790次阅读

    基准数据集(CORR2CAUSE)如何测试大语言模型(LLM)的纯因果推理能力

      因果推理是人类智力的标志之一。因果关系NLP领域近年来引起了人们的极大兴趣,但其主要依赖于从常识知识中发现因果关系。本研究提出了一个基准数据集(CORR2CAUSE)来测试大语言模型(LLM
    的头像 发表于 06-20 15:39 1823次阅读
    基准数据集(CORR2CAUSE)如何测试大语言模型(<b class='flag-5'>LLM</b>)的纯因果<b class='flag-5'>推理</b>能力

    MLC-LLM的编译部署流程

    MLC-LLM部署在各种硬件平台的需求,然后我就开始了解MLC-LLM的编译部署流程和RWKV World模型相比于MLC-LLM已经支持
    的头像 发表于 09-04 09:22 2926次阅读
    <b class='flag-5'>MLC-LLM</b>的编译部署流程

    mlc-llm对大模型推理的流程及优化方案

    MLC-LLM 部署RWKV World系列模型实战(3B模型Mac M2解码可达26tokens/s) 中提到要使用mlc-llm部署模型首先需要一个编译过程,将原始的基于Rea
    发表于 09-26 12:25 891次阅读
    <b class='flag-5'>mlc-llm</b>对大模型<b class='flag-5'>推理</b>的流程及优化方案

    如何使用MLC-LLM在A100/Mac M2上部署RWKV模型

    每一秒大概可以解码8个token,我感觉速度勉强够用了。由于RWKV5迭代到了第5个版本,后续希望能支持RWKV5的模型,当然也可以寻求新的优化机会提升解码速度。
    的头像 发表于 10-29 16:39 904次阅读
    如何使用<b class='flag-5'>MLC-LLM</b>在A100/Mac M2上部署<b class='flag-5'>RWKV</b>模型

    Hugging Face LLM部署大语言模型到亚马逊云科技Amazon SageMaker推理示例

     本篇文章主要介绍如何使用新的Hugging Face LLM推理容器将开源LLMs,比如BLOOM大型语言模型部署到亚马逊云科技Amazon SageMaker进行推理的示例。我们将部署12B
    的头像 发表于 11-01 17:48 931次阅读
    Hugging Face <b class='flag-5'>LLM</b>部署大语言模型到亚马逊云科技Amazon SageMaker<b class='flag-5'>推理</b>示例

    怎样使用Accelerate库在多GPU上进行LLM推理呢?

    大型语言模型(llm)已经彻底改变了自然语言处理领域。随着这些模型在规模和复杂性上的增长,推理的计算需求也显著增加。
    的头像 发表于 12-01 10:24 1579次阅读
    怎样使用Accelerate库在多GPU上进行<b class='flag-5'>LLM</b><b class='flag-5'>推理</b>呢?

    安霸发布N1系列生成式AI芯片支持前端设备运行本地LLM应用

    单颗 SoC 支持 1 至 340 亿参数的多模态大模型(Multi-Modal LLM推理,实现前端低功耗生成式 AI。
    的头像 发表于 01-09 15:19 938次阅读

    自然语言处理应用LLM推理优化综述

    当前,业界在将传统优化技术引入 LLM 推理的同时,同时也在探索从大模型自回归解码特点出发,通过调整推理过程和引入新的模型结构来进一步提升推理性能。
    发表于 04-10 11:48 581次阅读
    自然语言处理应用<b class='flag-5'>LLM</b><b class='flag-5'>推理</b>优化综述

    什么是LLMLLM的工作原理和结构

    随着人工智能技术的飞速发展,大型语言模型(Large Language Model,简称LLM)逐渐成为自然语言处理(NLP)领域的研究热点。LLM以其强大的文本生成、理解和推理能力,在文本
    的头像 发表于 07-02 11:45 7600次阅读

    LLM大模型推理加速的关键技术

    LLM(大型语言模型)大模型推理加速是当前人工智能领域的一个研究热点,旨在提高模型在处理复杂任务时的效率和响应速度。以下是对LLM大模型推理加速关键技术的详细探讨,内容将涵盖模型压缩、
    的头像 发表于 07-24 11:38 857次阅读

    魔搭社区借助NVIDIA TensorRT-LLM提升LLM推理效率

    “魔搭社区是中国最具影响力的模型开源社区,致力给开发者提供模型即服务的体验。魔搭社区利用NVIDIA TensorRT-LLM,大大提高了大语言模型的推理性能,方便了模型应用部署,提高了大模型产业应用效率,更大规模地释放大模型的应用价值。”
    的头像 发表于 08-23 15:48 432次阅读