使用OpenCompass评测rwkv模型教程

0x0. 前言

继续MLC-LLM 支持RWKV-5推理以及对RWKV-5的一些思考文章里面提到的想法,探索一下使用OpenCompass来评测RWKV模型,对模型的实际表现有一个更客观的了解。我在尝试的过程中也碰到了一些问题,所以这里记录一下使用OpenCompass评测的流程以及在评测RWKV过程中解决的问题。这里主要是记录如何跑通,后续可能会跑一下榜单去对比一下其它的模型。目前使用这个fork的版本(https://github.com/BBuf/opencompass)就可以正常做RWKV系列模型的评测了。

0x1. 流程

我是参考OpenCompass官方的快速开始文档:https://opencompass.readthedocs.io/zh-cn/latest/get_started/quick_start.html ,然后写一个config来对RWKV-5-3B进行评测。模型部分添加了下面的2个文件:

在这里插入图片描述然后在评测数据集方面我挑选了和 RWKV-5 的训练进展(之二),与 SotA GPT 模型的性能对比(https://zhuanlan.zhihu.com/p/664079347) 里面相同的几个数据集来进行评测,配置文件写在这里:https://github.com/BBuf/opencompass/pull/1/files#diff-5a3fb40da6e965f866554e77966b0e22675f1b78272b5ac61667f64e23b6786a 。

接下来就可以按照下面的步骤来评测RWKV-5-3B的HF模型(https://huggingface.co/RWKV/rwkv-5-world-3b)了。

主要参考OpenCompass的官方教程进行安装:https://opencompass.readthedocs.io/zh-cn/latest/get_started/installation.html 。

export HF_DATASETS_CACHE=xxx
export TRANSFORMERS_CACHE=xxx
git clone https://github.com/BBuf/opencompass
cd opencompass
pip install -r requirements.txt
pip install -e .

然后主要用到下面的两个指令来做评测以及prompt的可视化:

  • python3 tools/prompt_viewer.py configs/eval_rwkv5_3b.py 用来可视化prompt,辅助debug

这里还有一个交互式的界面,有点惊艳。

  • python run.py configs/eval_rwkv5_3b.py 运行rwkv-5-3b的评测,数据集可以通过 opencompass/configs/models/rwkv/rwkv5_3b.py 配置

0x2. 评测数据集示例

这里作为一个跑通的教程,我选取了 Lambada,CEval这两个数据集来测试流程的正确。

CEval 数据集是选择题,在Harness里面是以拼接选项算logits的方法来计算acc,所以在OpenCompass里面我对这几个数据集使用OpenCompass提供的计算ppl的方式进行评测,这个和Harness的方法比较类似。然后对于Lambada数据集,则采用gen的生成式任务进行评测。评测config见:https://github.com/BBuf/opencompass/pull/1

ceval的部分log结果展示:

在这里插入图片描述

Lambada的部分log结果展示:

在这里插入图片描述

等后续文章提供完整的评测结果和记录。

评测完成后OpenCompass会自动在outputs文件夹下面以表格的形式输出summary,非常直观的反应模型各大能力。

如果在评测过程中因为一些奇怪的原因挂掉了,但是又不是模型的问题,我们可以使用python run.py configs/eval_rwkv5_3b.py -r来续测,这样会在outputs下面最新时间戳的文件夹下复用已经评测的数据继续评测,避免反复重测带来的计算资源开销。

0x3. 评测中碰到的HF bug修复

bug1 解码出了None

第一次尝试使用ceval来验证流程的正确性,然后发现对于一个固定的prompt会出现一个构造pytorch Tensor失败的问题,复现代码为:

import torch
from transformers import AutoModelForCausalLM, AutoTokenizer# model = AutoModelForCausalLM.from_pretrained("/Users/bbuf/工作目录/RWKV/rwkv-5-world-1b5/", trust_remote_code=True).to(torch.float32)
tokenizer = AutoTokenizer.from_pretrained("/Users/bbuf/工作目录/RWKV/rwkv-5-world-1b5/", trust_remote_code=True)text = "Question: 以下是中国关于工商管理考试的单项选择题,请选出其中的正确答案。\n有一项年金,前3年无流入,后5年每年年初流入500万元,假设年利率为10%,(P/A,10%,5)=3.7908,(P/S,10%,3)=0.7513,(P/S,10%,2)=0.8264,其现值为____万元。\nA. 1994\nB. 1566\nC. 1813\nD. 1523\n答案: \n\nAnswer:BQuestion: 以下是中国关于工商管理考试的单项选择题,请选出其中的正确答案。\n企业缴纳的耕地占用税,应在____科目核算。\nA. 应交税费\nB. 管理费用\nC. 在建工程\nD. 其他应付款\n答案: \n\nAnswer:CQuestion: 以下是中国关于工商管理考试的单项选择题,请选出其中的正确答案。\n注册会计师在确定重要性时通常选定一个基准。下列因素中,注册会计师在选择基准时不需要考虑的是____。\nA. 被审计单位的性质\nB. 以前年度审计调整的金额\nC. 基准的相对波动性\nD. 是否存在财务报表使用者特别关注的项目\n答案: \n\nAnswer:BQuestion: 以下是中国关于工商管理考试的单项选择题,请选出其中的正确答案。\n某投资方案,当贴现率为12%时,其净现值为22万元,当贴现率为14%时,其净现值为-11万元。该方案的内部收益率____。\nA. 大于14%\nB. 小于12%\nC. 介于12%与14%之间\nD. 无法确定\n答案: \n\nAnswer:CQuestion: 以下是中国关于工商管理考试的单项选择题,请选出其中的正确答案。\n企业期末编制资产负债表时,下列各项应包括在“存货”项目的是____。\nA. 已作销售但购货方尚未运走的商品\nB. 委托代销商品\nC. 合同约定购入的商品\nD. 为在建工程购入的工程物资\n答案: \n\nAnswer:BQuestion: 以下是中国关于工商管理考试的单项选择题,请选出其中的正确答案。\n甲公司对其家电产品实行“包退、包换、包修”的销售政策。2011年该公司共销售家电产品200万元(不含增值税),根据以往的销售经验,该公司销售的商品中,包退的商品占2﹪,包换的产品占2%,包修的产品占1%,则甲公司2011年应确认的销售收入为____万元。\nA. 196\nB. 200\nC. 190\nD. 192\n答案: \n\nAnswer:"
prompt = textprint(prompt)
inputs = tokenizer(prompt, return_tensors="pt").to("cpu")
print(inputs)

报错信息为:

Traceback (most recent call last):File "/opt/homebrew/lib/python3.11/site-packages/transformers-4.35.0.dev0-py3.11.egg/transformers/tokenization_utils_base.py", line 748, in convert_to_tensorstensor = as_tensor(value)^^^^^^^^^^^^^^^^File "/opt/homebrew/lib/python3.11/site-packages/transformers-4.35.0.dev0-py3.11.egg/transformers/tokenization_utils_base.py", line 720, in as_tensorreturn torch.tensor(value)^^^^^^^^^^^^^^^^^^^
RuntimeError: Could not infer dtype of NoneTypeThe above exception was the direct cause of the following exception:Traceback (most recent call last):File "/Users/bbuf/工作目录/RWKV/debug.py", line 21, in <module>inputs = tokenizer(prompt, return_tensors="pt").to("cpu")^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^File "/opt/homebrew/lib/python3.11/site-packages/transformers-4.35.0.dev0-py3.11.egg/transformers/tokenization_utils_base.py", line 2796, in __call__encodings = self._call_one(text=text, text_pair=text_pair, **all_kwargs)^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^File "/opt/homebrew/lib/python3.11/site-packages/transformers-4.35.0.dev0-py3.11.egg/transformers/tokenization_utils_base.py", line 2902, in _call_onereturn self.encode_plus(^^^^^^^^^^^^^^^^^File "/opt/homebrew/lib/python3.11/site-packages/transformers-4.35.0.dev0-py3.11.egg/transformers/tokenization_utils_base.py", line 2975, in encode_plusreturn self._encode_plus(^^^^^^^^^^^^^^^^^^File "/Users/bbuf/.cache/huggingface/modules/transformers_modules/tokenization_rwkv_world.py", line 408, in _encode_plusreturn self.prepare_for_model(^^^^^^^^^^^^^^^^^^^^^^^File "/opt/homebrew/lib/python3.11/site-packages/transformers-4.35.0.dev0-py3.11.egg/transformers/tokenization_utils_base.py", line 3465, in prepare_for_modelbatch_outputs = BatchEncoding(^^^^^^^^^^^^^^File "/opt/homebrew/lib/python3.11/site-packages/transformers-4.35.0.dev0-py3.11.egg/transformers/tokenization_utils_base.py", line 223, in __init__self.convert_to_tensors(tensor_type=tensor_type, prepend_batch_axis=prepend_batch_axis)File "/opt/homebrew/lib/python3.11/site-packages/transformers-4.35.0.dev0-py3.11.egg/transformers/tokenization_utils_base.py", line 764, in convert_to_tensorsraise ValueError(
ValueError: Unable to create tensor, you should probably activate truncation and/or padding with 'padding=True' 'truncation=True' to have batched tensors with the same length. Perhaps your features (`input_ids` in this case) have excessive nesting (inputs type `list` where type `int` is expected). 

发现在解码的过程中出现了None,这是因为tokenizer的实现bug,后续选择直接和rwkv官方的tokenizer逻辑对齐,见:https://github.com/BBuf/RWKV-World-HF-Tokenizer/commit/6d957bc984bdb00e90d103c8aa8cd35258c4da3c。

bug2

然后再次使用ceval的prompt调试时发现进度条跑到90%之后报错,报错的关键信息为:

UnicodeDecodeError: ‘utf-8’ codec can’t decode byte 0xe5 in position 650: unexpected end of data 。

在这里插入图片描述

按照gpt4给的解释定位到是Tokenizer的实现有bug,不能很好的处理特殊的中文字符,我在 https://github.com/BBuf/RWKV-World-HF-Tokenizer/commit/a2489e0a8b8e97bca8eb67b6d08cdf01624947a8 修复了这个bug,并将其同步到了RWKV社区下的HF项目,解决了此问题之后就可以成功跑完ceval。

bug3: OpenCompass的ppl任务报错

在这里插入图片描述

发现是RWKV World Tokenizer里面没有pad_token_id,用下面的修改hack了一下:

在这里插入图片描述

代码见:https://github.com/BBuf/opencompass/pull/1

bug4:修复RWKV社区HF模型prompt错误

这是另外一个问题,发现HuggingFace上的rwkv4和rwkv5模型prompt和生成参数和已经部署的服务(https://huggingface.co/spaces/BlinkDL/RWKV-Gradio-2/blob/main/app.py)有很大区别,导致输出的质量降低,对齐了这个问题之后可以获得更高质量的输出文本。具体见:https://huggingface.co/RWKV/rwkv-5-world-3b 的README改动。

0x4. 结论

尝试用OpenCompass跑一下RWKV模型,尝试的过程中也碰到了一些问题,所以这里记录一下使用OpenCompass评测的流程以及在评测RWKV过程中解决的问题。这里主要是记录如何跑通,后续可能会跑一下榜单去对比一下其它的模型。目前使用这个fork的版本(https://github.com/BBuf/opencompass)就可以正常做RWKV系列模型的评测了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/185226.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Node【工具 01】Node Version Manager nvm安装使用(Node.js版本管理工具)

1.介绍 非专业前端开发工程师在构建项目时遇到如下问题&#xff1a; ERROR: This version of pnpm requires at least Node.js v16.14 The current version of Node.js is v14.17.0 Visit https://r.pnpm.io/comp to see the list of past pnpm versions with respective Nod…

【doccano】文本标注工具——属性级情感分析标注自己的业务数据

笔记为自我总结整理的学习笔记&#xff0c;若有错误欢迎指出哟~ 【doccano】文本标注工具——属性级情感分析标注自己的业务数据 1.说明2.前提条件3.doccano创建项目4.添加数据集5.添加标签6.标注数据7.导出数据转换格式 1.说明 2.前提条件 确保doccano已经安装完成 可以参考文…

Python实现的二分查找算法(非递归实现)

一、二分查找算法的优缺点&#xff1a; 二分查找又称折半查找&#xff0c;优点是比较次数少&#xff0c;查找速度快&#xff0c;平均性能好&#xff1b;其缺点是要求 待查表为有序表&#xff0c;且插入删除困难。因此&#xff0c;二分查找方法适用于不经常变动而查找频繁的有 …

事务注解@Transactional

Override Transactional(rollbackFor RuntimeException.class) public Role insert(Role role) throws Exception { userMapper.deleteById(60); if(null!role){ // 抛出Exception&#xff0c;而rollbackFor RuntimeException.class&#xff0c;不回…

H5 keng

一、url转码&#xff0c;url传值得时候中文会被转义&#xff0c;通过 decodeURIComponent&#xff08; &#xff09; 进行转码 this.url decodeURIComponent(item.split()[1]) 编码的话用encodeURI( ) son.name encodeURI(infoJson.name) 二、H5页面在ios中滑动不流畅问题&…

广州华锐视点提供AI虚拟主播定制,为品牌注入新活力!

随着科技的飞速发展&#xff0c;人工智能已经逐渐渗透到我们生活的方方面面。在这个信息爆炸的时代&#xff0c;如何让您的品牌在众多竞争对手中脱颖而出&#xff0c;成为行业的佼佼者&#xff1f;答案就是——AI虚拟主播&#xff01; 广州华锐视点提供AI数字人定制服务&#x…

一些后端测试的东西

后端测试都测试些什么 接口测试最小单元测试联调测试 接口测试 接口测试要素 可重复性 异常覆盖 环境一致 如何进行方便的接口测试 测试工具&#xff1a; idea-httpRequest &#xff0c; apifox , postman, jmeter 如何使用idea进行高效的接口测试 编写接口 启动项目直接…

二十五、DSL查询文档(全文检索查询、精确查询、地理查询、复合查询)

目录 一、全文检索查询 1、match查询 语法: 2、multi_match查询 语法: 3、match和mult_match的区别 二、精确查询 1、term查询&#xff1a; 语法&#xff1a; 2、range查询&#xff1a;&#xff08;范围查询&#xff09; 语法&#xff1a; 三、地理查询 1、geo_bou…

发生这种情况 经常导致投资者的痛苦

在这个市场中&#xff0c;什么事会让人痛苦呢&#xff1f;有的投资者马上回答&#xff0c;因为亏损。说实话&#xff0c;如果经过刻意的练习&#xff0c;我们在一定程度上能克服亏损给人带来的痛感。但是有另一种情况也容易为投资者带来痛苦&#xff0c;下面我们就来讨论一下。…

游戏缺少d3dx9_43.dll修复方法分享,快速解决dll缺失问题

在计算机使用过程中&#xff0c;我们常常会遇到一些错误提示&#xff0c;其中之一就是“找不到d3dx9_43.dll文件”。这个错误通常出现在运行某些游戏或应用程序时&#xff0c;d3dx9_43.dll是一个动态链接库文件&#xff0c;它是DirectX 9的一部分&#xff0c;用于支持游戏中的3…

Egg.js的方法扩展

Extend-application 方法扩展 eggjs的方法的扩展和编写 Egg.js可以对内部的五种对象进行扩展&#xff0c;以下是可扩展的对象、说明、this指向和使用方式。 application对象方法拓展 按照Egg的约定&#xff0c;扩展的文件夹和文件的名字必须是固定的。比如要对application扩…

亚马逊云科技re:Invent Peter DeSantis演讲,数据规模拓展无极限引领Serverless构建之路

re:lnvent 2023 Peter DeSantis主题演讲&#xff0c;数据规模拓展无极限引领Serverless构建之路&#xff08;Road to Serverless&#xff09;。 Logical Qubit全新发布&#xff1a;量子计算硬件&#xff0c;6倍的量子纠错效率提升。 Amazon全新发布Redshift Serverless&#xf…

Java多线程其他细节知识

并发、并行 进程 并发的含义 并行的理解 线程的生命周期

【Java进阶】-- 设计模式

一、什么是设计模式&#xff1f; Java 设计模式是一种在Java编程中广泛使用的软件设计范例。它们提供了一种解决常见设计问题的方法&#xff0c;并且可以帮助开发人员编写易于维护和扩展的代码。 二、为什么要有设计模式&#xff1f; 使用设计模式是为了可重用代码、让代码更容…

Hive:从HDFS回收站恢复被删的表

场景 一张手工维护的内部表&#xff0c;本来排查没有使用&#xff0c;然后删掉了&#xff0c;发现又需要使用&#xff0c;只能恢复这张表了。 1.确认HDFS是否开启回收站功能 2.查看回收站中的数据 被删除的数据会放在删除数据时使用的用户目录下&#xff0c;如&#xff1a;使…

网络编程相关面试题

目录 1.请解释一下什么是TCP协议的三次握手&#xff1f;2.TCP协议使用什么机制确保数据包的顺序和完整性&#xff1f;3.什么是UDP协议&#xff1f;它与TCP协议有什么不同&#xff1f;4.请解释一下什么是IP地址&#xff1f;为什么需要它&#xff1f;5.请解释一下什么是端口&…

详解前后端交互时PO,DTO,VO模型类的应用场景

前后端交互时的数据传输模型 前后端交互流程 前后端交互的流程: 前端与后端开发人员之间主要依据接口进行开发 前端通过Http协议请求后端服务提供的接口后端服务的控制层Controller接收前端的请求Contorller层调用Service层进行业务处理Service层调用Dao持久层对数据持久化 …

赤霞珠葡萄酒的风味特征是怎样的?

赤霞珠最值得注意的特点之一是它在发酵或桶陈酿期间对橡木的亲和力&#xff0c;除了对葡萄的天然高单宁产生软化效果外&#xff0c;香草和香料的独特木材风味还补充了黑醋栗和烟草的天然葡萄风味。 来自云仓酒庄品牌雷盛红酒分享基于赤霞珠的波尔多混合物在225升&#xff08;59…

二级分类菜单及三级分类菜单的层级结构返回

前言 在开发投诉分类功能模块时&#xff0c;遇到过这样一个业务场景&#xff1a;后端需要按层级结构返回二级分类菜单所需数据&#xff0c;换言之&#xff0c;将具有父子关系的List结果集数据转为树状结构数据来返回 二级分类菜单 前期准备 这里简单复刻下真实场景中 出现的…

Doris 简介(一)

Apache Doris 由百度大数据部研发&#xff08;之前叫百度 Palo&#xff0c;2018 年贡献到 Apache 社区后&#xff0c;更名为 Doris &#xff09;&#xff0c;在百度内部&#xff0c;有超过 200 个产品线在使用&#xff0c;部署机器超过 1000 台&#xff0c;单一业务最大可达到上…