kimi_eval / README_zh.md
pangkaiyu's picture
Add files using upload-large-folder tool
cab74fb verified
|
Raw
History Blame Contribute Delete
8.22 kB

Kimi-Audio-Evalkit

English Version

介绍

Kimi-Audio-Evalkit是一个为音频大模型评测设计的评测框架,基于Kimi-Audio-Evalkit,你可以快速实现自己的模型或数据集,并公平的与其他开源模型进行比对。

我们的工作Kimi-Audio基于此框架评测。

Leaderboard是目前的评测结果。

开始评测

Step1: 获取代码

git clone https://github.com/MoonshotAI/Kimi-Audio-Evalkit.git
cd Kimi-Audio-Evalkit
git submodule update --init --recursive

Step2: 准备环境

你可以直接使用我们预先build好的镜像,如果你需要更新镜像环境,可以修改Dockerfile后重新构造

docker pull moonshotai/almevalkit:v0.4

通常情况你需要mount本地目录,并将其作为工作目录,以便评测结果在容器退出后仍然存在

docker run -it -v $(pwd):/app moonshotai/almevalkit:v0.4 bash

Step3: 获取数据集

ALMEvalKit所用的大部分数据集都可以通过我们附带的工具下载,有些数据集不能全自动执行,具体请参阅下载数据集 对位于huggingface的数据集,我们很快将提供更直接的使用方式,请关注更新。

Step4: 配置config.yaml

你也许需要填写根目录下的config.yaml中的若干字段,帮助我们找到你的数据源。默认情况下,数据集会被下载到当前目录的data/downloaded_datasets下,如果你下载到了其他地方,请将根目录填入dataset_root字段。

DATASETS:
  dataset_root: "/path/to/your/dataset/root"

Step5: 评测

run_audio.sh为评测入口,你可以通过--help取得帮助

例如,我们希望跑Kimi-Audio在全部数据集上的结果:

bash run_audio.sh --model Kimi-Audio --data all --skip-eval

默认情况下,推理结果文件、评测结果文件、指标报告文件将生成在当前目录的eval_results目录下,你可以通过传递--work-dir改变这一行为。

使用--skip-eval可以让模型只推理,不评测,这样有助于保持你的GPU高效运转。 推理完毕后,你只需要重新运行一次,即可展开评测,你可以通过添加--reeval参数来强制对数据集重新评测,这不会触发重新推理,但会重新生成指标报告。

Note: 我们默认的LLM方式是gpt-4o-mini,你需要设定你自己的API KEY来启用。未来我们将支持更多评测模型。

export OPENAI_API_KEY=your_api_key
bash run_audio.sh --model Kimi-Audio --data all --reeval

目前已经支持的模型、数据集和评测模型列表如下

模型

  • Baichuan Series: Baichuan-Audio-Base, Baichuan-Audio-Instruct
  • Qwen Series: Qwen2-Audio-7B, Qwen2-Audio-7B-Instruct, Qwen2.5-Omni-7B
  • GLM Series: GLM4-Voice
  • Others: StepAudio, Kimi-Audio

数据集

数据集类型 数据集
ASR LibriSpeech, Fleurs-zh, Fleurs-en, AISHELL-1, AISHELL-2, WenetSpeech
MQA mmau-test-mini, openbookqa, mmsu, MELD, Nonspeech7k, TUT2017, VocalSound, CochlScene
OpenQA alpacaeval_full, commoneval, advbench, ifeval
RefQA ClothoAQA, sd-qa, OpenAudioBench
  • 数据集的类型、归属等更多信息,可以查看相关数据集的实现。

添加数据集

我们相信ALMEvalKit的最大价值不是复现某个已有结果,而是提供一种简单的机制帮助用户添加自己的数据集和模型,并能够与其他模型结果公平比较。

我们强烈建议首先阅读数据集的定义了解我们如何对数据集分类,这将帮助你正确的设定新数据集的meta信息,使它们被更正确的使用。

要添加数据集,你需要写几行代码,为ALMEvalKit准备一个名为dataset_name.jsonl的jsonl文件。jsonl的每一行是一个json记录,我们要求每一行必须具有的字段是:

{
    "index": int, # 一条数据的唯一标识
    "audio_path": str | list[str], # 音频位置
    "question": str, # 针对音频的问题或指令,例如"请将音频内容转写为文字",如果你不需要此字段,请设为空
    "answer": str, # ground truth答案,如果你不需要此字段(如Open-QA),请设为空 
    "subset": str, # 子数据,有时候一个数据集可以被切分为若干个子集,这些子集将被分别评估,独立汇报结果。如果你没有子数据集,填数据集名字即可
}

对于Audio-QA类的数据集,我们要求额外增加一个"audio_content"字段,以文字形式写出内容,以便交给LLM评测模型评测答案是否正确。
{
    "index": int, # 一条数据的唯一标识
    "audio_path": str | list[str], # 音频位置
    "question": str, # 针对音频的问题或指令,例如"请将音频内容转写为文字",如果你不需要此字段,请设为空
    "audio_content": str, # 音频的文本形式
    "answer": str, # ground truth答案,如果你不需要此字段(如Open-QA),请设为空 
    "subset": str, # 子数据,有时候一个数据集可以被切分为若干个子集,这些子集将被分别评估,独立汇报结果。如果你没有子数据集,填数据集名字即可
}

下载数据集表明了我们如何下载&处理数据,你可以拿来参考。

完成此文件后,你可以将你的数据集添加到适当的类别下,一般而言,继承此类别的父类并填写一些字段后,你的数据集就可用了。例如:

class Vocalsound(AudioMQADataset):
    DATASET_NAME = 'VocalSound'
    DATASET_SERIES = 'VocalSound'
    AUDIO_TYPE = 'AudioEvent'

这表明,数据集vocalsound是一个MQA数据集(单选题),它所属的数据集系列是vocalsound,它的AUDIO_TYPE标记为"AudioEvent",说明此数据集是与声音事件(非语音)有关的数据集,这将会在评测时影响一些模型的评测行为。

如果你将其下载到数据集缓存目录下,现在你就可以在任意模型上评测此数据集了

bash run_audio.sh --model Kimi-Audio --data vocalsound

如果你将此文件保存在了其他位置,请在config.yaml中告诉我们

DATASETS:
  dataset_root: "/path/to/your/dataset/root"
  datasets:
    #example:
    example: "/path/to/your/dataset/example.jsonl"
    Vocalsound: "/path/to/your/dataset/VocalSound.jsonl"

添加模型

在ALMEvalKit评测你的模型也十分容易,你只需要实现generate_inner方法即可,此方法的签名是:

def generate_inner(self, msg:dict) -> (str, str)

msg 就是从数据集中的一条数据,它的格式是:

{
    "index": int, # 即数据集中一条数据的index,见上
    "audio": list[str] # 大部分情况下长度是1,取audio[0]即可获得此条数据的音频
    "text": str # 即数据的"question"字段,可能为空
    "meta": dict # 数据集的meta信息,如audio_type, name,task等存在这里,如果数据集的一条数据有meta字段,也将会被吸入此字段中
}

此函数的返回是 prompt:str, result:str,prompt为实际送入模型推理的文本,result为模型推理结果。

注意 "实际送入模型推理的文本"不一定等于msg['text'],因为我们可以在运行时设定规则篡改它,通常我们会实现一个get_prompt(msg) -> text来做这件事。

添加一个模型的最好方式就是copy一个已经实现的模型照猫画虎

Call for contribution

我们希望社区在如下方面共建一个公平、高效、统一的音频大模型评测框架

  • 增加功能,修改bug,提高代码质量和易用性
  • 支持更多模型和数据集
  • 提高可读性,贡献examples和docs

受限于我们所掌握的信息,我们无法为每个模型找到不同任务/数据集下的最佳prompt,我们也欢迎社区提供最佳实践,使得我们的leaderboard能够更加真实的反应模型的极限能力。

我们推荐使用pre-commit来自动格式化你的代码,使你的代码规范与项目保持一致。