| # Kimi-Audio-Evalkit |
|
|
| [English Version](README.md) |
|
|
| ## 介绍 |
|
|
| Kimi-Audio-Evalkit是一个为音频大模型评测设计的评测框架,基于Kimi-Audio-Evalkit,你可以快速实现自己的模型或数据集,并公平的与其他开源模型进行比对。 |
|
|
| 我们的工作[Kimi-Audio](https://github.com/MoonshotAI/Kimi-Audio-Evalkit)基于此框架评测。 |
|
|
| [Leaderboard](./LEADERBOARD.md)是目前的评测结果。 |
|
|
| ## 开始评测 |
|
|
| ### Step1: 获取代码 |
|
|
| ```bash |
| git clone https://github.com/MoonshotAI/Kimi-Audio-Evalkit.git |
| cd Kimi-Audio-Evalkit |
| git submodule update --init --recursive |
| ``` |
|
|
| ### Step2: 准备环境 |
|
|
| 你可以直接使用我们预先build好的镜像,如果你需要更新镜像环境,可以修改Dockerfile后重新构造 |
| ```bash |
| docker pull moonshotai/almevalkit:v0.4 |
| ``` |
| 通常情况你需要mount本地目录,并将其作为工作目录,以便评测结果在容器退出后仍然存在 |
| ```bash |
| docker run -it -v $(pwd):/app moonshotai/almevalkit:v0.4 bash |
| ``` |
|
|
| ### Step3: 获取数据集 |
|
|
| ALMEvalKit所用的大部分数据集都可以通过我们附带的工具下载,有些数据集不能全自动执行,具体请参阅[下载数据集](./data/README.md) |
| 对位于huggingface的数据集,我们很快将提供更直接的使用方式,请关注更新。 |
|
|
| ### Step4: 配置config.yaml |
| 你也许需要填写根目录下的config.yaml中的若干字段,帮助我们找到你的数据源。默认情况下,数据集会被下载到当前目录的data/downloaded_datasets下,如果你下载到了其他地方,请将根目录填入dataset_root字段。 |
| ```yaml |
| 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的最大价值不是复现某个已有结果,而是提供一种简单的机制帮助用户添加自己的数据集和模型,并能够与其他模型结果公平比较。 |
|
|
| 我们强烈建议首先阅读[数据集的定义](./almeval/datasets/base.py)了解我们如何对数据集分类,这将帮助你正确的设定新数据集的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, # 子数据,有时候一个数据集可以被切分为若干个子集,这些子集将被分别评估,独立汇报结果。如果你没有子数据集,填数据集名字即可 |
| } |
| ``` |
| [下载数据集](./data/download_benchmark.py)表明了我们如何下载&处理数据,你可以拿来参考。 |
| |
| 完成此文件后,你可以将你的数据集添加到适当的类别下,一般而言,继承此类别的父类并填写一些字段后,你的数据集就可用了。例如: |
| ``` |
| class Vocalsound(AudioMQADataset): |
| DATASET_NAME = 'VocalSound' |
| DATASET_SERIES = 'VocalSound' |
| AUDIO_TYPE = 'AudioEvent' |
| ``` |
| 这表明,数据集vocalsound是一个MQA数据集(单选题),它所属的数据集系列是vocalsound,它的AUDIO_TYPE标记为"AudioEvent",说明此数据集是与声音事件(非语音)有关的数据集,这将会在评测时影响一些模型的评测行为。 |
| |
| 如果你将其下载到数据集缓存目录下,现在你就可以在任意模型上评测此数据集了 |
| ```bash |
| bash run_audio.sh --model Kimi-Audio --data vocalsound |
| ``` |
| 如果你将此文件保存在了其他位置,请在config.yaml中告诉我们 |
| ```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** 就是从数据集中的一条数据,它的格式是: |
| ```python |
| { |
| "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](https://pre-commit.com/)来自动格式化你的代码,使你的代码规范与项目保持一致。 |
|
|