使用OpenCompass评测rwkv模型教程

news2024/11/18 7:50:31

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 = text

print(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_tensors
    tensor = 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_tensor
    return torch.tensor(value)
           ^^^^^^^^^^^^^^^^^^^
RuntimeError: Could not infer dtype of NoneType

The 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_one
    return 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_plus
    return self._encode_plus(
           ^^^^^^^^^^^^^^^^^^
  File "/Users/bbuf/.cache/huggingface/modules/transformers_modules/tokenization_rwkv_world.py", line 408, in _encode_plus
    return 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_model
    batch_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_tensors
    raise 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.coloradmin.cn/o/1270280.html

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

相关文章

数据的另一面:数据可视化为何备受推崇?

数据可视化&#xff0c;作为当今信息时代的重要工具&#xff0c;正逐渐受到更多人的关注和重视。它的重要性不仅在于帮助人们更直观地理解数据&#xff0c;更在于为我们揭示数据背后的故事&#xff0c;以及对决策和发现见解的巨大价值。那么&#xff0c;为何数据可视化越来越被…

LeetCode(36)旋转图像【矩阵】【中等】

目录 1.题目2.答案3.提交结果截图 链接&#xff1a; 48. 旋转图像 1.题目 给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在** 原地** 旋转图像&#xff0c;这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。 …

Nuxt.js:下一代Web开发框架的革命性力量

文章目录 一、Nuxt.js简介二、Nuxt.js的特点1. 集成Vue.js和Node.js2. 自动代码分割和优化3. 服务端渲染&#xff08;SSR&#xff09;4. 强大的路由管理5. 丰富的插件系统 三、Nuxt.js的优势1. 提高开发效率2. 降低维护成本3. 提高用户体验 四、Nuxt.js在实际应用中的案例1. 电…

深兰科技入选工信部首批“5G+智慧旅游”应用试点项目名

近日&#xff0c;国家文旅部与工信部确定并公布了我国首批《“5G智慧旅游”应用试点项目名单》&#xff0c;深兰科技基于AIGC多模态融合大模型技术开发打造的江汉路“5G智慧旅游”试点项目——武汉市江汉路步行街5G智慧商街创新应用&#xff0c;成功入选该名单。 作为由湖北省文…

电脑突然死机怎么办?教你几招快速拯救

当今社会&#xff0c;电脑成为我们日常生活和工作不可或缺的一部分。然而&#xff0c;有时电脑可能会突然死机&#xff0c;给我们的操作和数据带来不便。那电脑突然死机怎么办呢&#xff1f;本文将介绍解决电脑突然死机的三种方法&#xff0c;通过详细的步骤指南&#xff0c;帮…

SaaS模式C/S检验科LIS系统源码

适用于医院检验科实际需要的管理系统, 实现检验业务全流程的计算机管理。从检验申请、标本编号、联机采集、中文报告单的生成与打印、质控图的绘制和数据的检索与备份。通过将所有仪器自身提供的端口与科室LIS系统中的工作站点连接,实现与医院HIS系统的对接。 通过门诊医生和住…

【古月居《ros入门21讲》学习笔记】05_ROS是什么及其核心概念

目录 说明 1. ROS发展史 ROS版本演变 2. ROS是什么 ROS中的通信机制 ROS中的开发工具 ROS中的应用功能 ROS中的生态系统 3. ROS核心概念 节点与节点管理器 通信方式1&#xff1a;话题 通信方式2&#xff1a;服务 话题与服务的区别 参数 文件系统 说明 1. 本系列…

智能优化算法应用:基于帝国主义竞争算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于帝国主义竞争算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于帝国主义竞争算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.帝国主义竞争算法4.实验参数设定5.算…

php爬虫实现把目标页面变成自己的网站页面

最近又被烦的不行&#xff0c;琐事不断&#xff0c;要是比起懒来一个人比一个人懒&#xff0c;但是懒要转换成动力啊&#xff0c;能让自己真正的偷懒&#xff0c;而不是浪费时间。每天还是需要不断的学习的&#xff0c;才能更好的提高效率&#xff0c;把之前做的简单小功能爬虫…

计算机网络(一)| 概述 因特网 性能 协议基本

文章目录 1. 因特网组成1.1 四元素组成1.2 二元素组成1.3 核心部分 2.计算机网路的功能3. 几种不同类别的网络4 性能指标5 网路协议5.1网络体系结构 6 PDU 互联网&#xff08;或因特网&#xff09;之所以能够向用户提供服务&#xff0c;是因为互联网具有两个重要基本特点 连通性…

Wireshark之Intro, HTTP, DNS

源码地址&#x1f447; moranzcw/Computer-Networking-A-Top-Down-Approach-NOTES: 《计算机网络&#xff0d;自顶向下方法(原书第6版)》编程作业&#xff0c;Wireshark实验文档的翻译和解答。 (github.com) 目录 &#x1f33c;Introduce &#x1f3a7;前置 &#x1f3a7;过…

java:IDEA中Maven常用操作

文章目录 背景1、Reload All Maven Projects:2、Generate Sources and Update Folders For All Projects:3、Download Sources and/or Documentation:4、Add Maven Projects5、Run Maven Build6、Execute Maven Goal7、Toggle Offline Mode8、Toggle Skip Tests Mode9、Collaps…

10分钟的时间,带你彻底搞懂JavaScript数据类型转换

前言 &#x1f4eb; 大家好&#xff0c;我是南木元元&#xff0c;热衷分享有趣实用的文章&#xff0c;希望大家多多支持&#xff0c;一起进步&#xff01; &#x1f345; 个人主页&#xff1a;南木元元 目录 JS数据类型 3种转换类型 ToBoolean ToString ToNumber 对象转原…

Go语言多线程爬虫万能模板:实现高效数据采集

随着互联网的快速发展&#xff0c;网络爬虫已经成为数据采集的重要工具。Go语言作为高性能编程语言之一&#xff0c;具有出色的并发性能和丰富的网络库&#xff0c;非常适合用于编写多线程爬虫。本文将介绍一个基于Go语言的多线程爬虫万能模板&#xff0c;并阐述其设计思路、核…

精密制造ERP系统包含哪些模块?精密制造ERP软件是做什么的

不同种类的精密制造成品有区别化的制造工序、工艺流转、品质标准、生产成本、营销策略等&#xff0c;而多工厂、多仓库、多车间、多部门协同问题却是不少精密制造企业遇到的管理难题。 有些产品结构较为复杂&#xff0c;制造工序繁多&#xff0c;关联业务多&#xff0c;传统的…

ruoyi-vue 整合EMQX接收MQTT协议数据

EMQX安装完成后&#xff0c;需要搭建客户端进行接收数据进一步对数据处理&#xff0c;下面介绍基于若依分离版开源框架来整合EMQX方法。 1.application.yml 添加代码 mqtt:hostUrl: tcp://localhost:1883username: devpassword: devclient-id: MQTT-CLIENT-DEVcleanSession: …

leetcode 15. 三数之和(优质解法)

代码&#xff1a; class Solution {public static List<List<Integer>> threeSum(int[] nums) {Arrays.sort(nums);List<List<Integer>> listsnew ArrayList<>();int lengthnums.length;for(int i0;i<length-3;){int lefti1;int rightlength…

springboot基础配置及maven运行

目录 1、spring快速开始&#xff1a; 2、通过idea工具打开导入包 3、maven打包 1、springboot快速开始&#xff1a; 环境依赖&#xff1a;jdk17 Spring | Quickstart spring初始化包下载&#xff1a; 点击generate&#xff0c;下载包 2、通过idea工具打开导入包 我之前写了…

RK3568 android 13 内置 google GMS服务

需求&#xff1a;Android 系统在国外使用安装app很多需要gms服务&#xff0c;否则无法正常使用&#xff0c;所以出厂前必须要把GMS包集成进系统 1.下载gms包https://download.csdn.net/download/qq_46524402/88136401 2.解压gms包 并放到Android SDK根目录的vender文件夹下 3…

内网渗透隧道技术一netsh

隧道技术 百度百科&#xff1a; 网络隧道技术指的是利用一种网络协议来传输另一种网络协议&#xff0c;它主要利用网络隧道协议来实现这种功能。网络隧道技术涉及了三种网络协议&#xff0c;即网络隧道协议、隧道协议下面的承载协议和隧道协议所承载的被承载协议 在网络安全中…