想象一下如果有一个工具能让你轻松评估各种大模型的性能,而且还提供了丰富的数据集和预处理脚本,让整个评估过程变得既标准化又高效,那会是多么令人兴奋的事情!好消息是,OpenCompass 正是这样一款工具,它为开发者和研究者提供了一个一站式的平台来评估大模型在各种任务上的表现。不管你是想探索不同模型的性能,还是需要对特定任务的最佳模型做出选择,OpenCompass 都能帮助你高效达成目标。

本人亲手实践了对提供了api接口的大模型的测评过程。从本地部署、编写自定义模型配置文件、编写自定义评测配置文件、运行代码得到测评报告等步骤具体说明。

在 OpenCompass 中评估一个模型通常包括以下几个阶段:

配置:需要配置整个评估过程,选择要评估的模型和数据集。还可以选择评估策略、计算后端等,并定义显示结果的方式。

推理与评估:对模型和数据集进行并行推理和评估。推理阶段主要是让模型从数据集产生输出,而评估阶段则是衡量这些输出与标准答案的匹配程度。这两个过程会被拆分为多个同时运行的“任务”以提高效率

可视化:评估完成后OpenCompass 将结果整理成易读的表格,并将其保存为 CSV 和 TXT 文件。

CNN预测模型的技术路线图怎么做英文文章的那种_API

配置 -> 推理 -> 评估 -> 可视化

CNN预测模型的技术路线图怎么做英文文章的那种_数据集_02

整个评测任务拆分多个最小粒度的task 有一个Runner模块负责管理和有序执行所有的task

 

本地部署

安装 OpenCompass:git clone
https://github.com/open-compass/opencompass.git

cd opencompass

pip install -e .

用于在“可编辑”模式下安装一个 Python 包。这个命令通常在包的根目录下执行,其中包含 setup.py 文件.在可编辑模式下安装包的好处是在不重新安装的情况下修改包的源代码,并立即看到这些更改的效果。

在 OpenCompass 项目根目录下运行下面命令,将数据集准备至 ${OpenCompass}/data 目录下,具体支持的数据集列表请直接在 configs/datasets 下进行查找。

wget https://github.com/open-compass/opencompass/releases/download/0.1.8.rc1/OpenCompassData-core-20231110.zip
unzip OpenCompassData-core-20231110.zip

编写自定义模型配置文件

将自定义的API大模型集成到 OpenCompass 框架中。编写一个模型适配器使得模型能够接收 OpenCompass 的输入格式并返回兼容的输出。对于每个模型需要定义预处理和后处理步骤,确保数据正确地流入模型并且模型输出被正确解析。

opencompass/opencompass/models/mymodel_api.py 文件是用于添加一个新的基于API的模型到一个名为 opencompass 的项目中。创建了一个名为 MyModelAPI 的类,它继承自 BaseAPIModel。

类的继承

class MyModelAPI(BaseAPIModel) 表明 MyModelAPI 类继承自 BaseAPIModel 类。这意味着 MyModelAPI 将继承 BaseAPIModel 的所有方法和属性,可以在此基础上添加或覆盖特定的功能。

构造函数 __init__

__init__ 方法是一个构造函数,定义了初始化模型需要的参数,如 path, max_seq_len, query_per_second, retry 等。super().__init__(...) 调用了父类 BaseAPIModel 的构造函数,确保了父类的初始化逻辑被执行。path 可能表示模型或API的路径。max_seq_len 定义了模型可以处理的最大序列长度。query_per_second 定义了每秒可以向API发送的查询数量。retry 定义了在请求失败时重试的次数。

方法 generate

generate 方法用于生成模型的输出。它接受输入、最大输出长度 (max_out_len) 和温度 (temperature) 参数。温度是控制生成文本多样性的超参数。generate 方法需要被实现以根据输入生成相应的输出。

方法 get_token_len

用于计算给定字符串的令牌长度。在处理文本数据时,通常需要将字符串转换为令牌(tokens),并且不同的模型或框架可能对令牌的计算方式有不同的要求。这个方法应该实现这种计算,以便于其他方法或模块能够了解和处理令牌长度的信息。

import time
from concurrent.futures import ThreadPoolExecutor
from typing import Dict, List, Optional, Union
from opencompass.utils.prompt import PromptList
from aigc import AIModelTest
from .base_api import BaseAPIModel
from typing import List

class MyModel(BaseAPIModel):
    is_api: bool = True
    def __init__(self,
                 path: str,
                 max_seq_len: int = 2048,
                 query_per_second: int = 1,
                 retry: int = 2,
                 **kwargs):
        self.model = AIModelTest.WenxinYiyanTextModel()
        self.model_cache = AIModelTest.ModelCache()
        super().__init__(path=path,
                         max_seq_len=max_seq_len,
                         query_per_second=query_per_second,
                         retry=retry,
                         **kwargs)

    def generate(
        self,
        inputs: List[str],
        max_out_len: int = 512,
        temperature: float = 0.7,
    ) -> List[str]:
        # 这里是调用 API 并获取结果的逻辑
        outputs = []
        for input_text in inputs:
            output_text = self.call_external_api(input_text, max_out_len, temperature)
            outputs.append(output_text)
        return outputs

    def get_token_len(self, prompt: str) -> int:
        return len(prompt.split())

    def call_external_api(self, text: str, max_len: int, temp: float) -> str:
        # 这里是与外部 API 交互
        response = self.model_cache.get_response(self.model, text, "cn.zte.gameaiasst")
        return response

编写自定义评测配置文件

通过 OpenCompass 的配置系统,定义测试的具体参数,如要使用的数据集、评估指标、批处理大小、序列长度等。这包括设置模型的各种运行参数和评估标准,以确保测试过程的一致性和可比性。

opencompass/configs/api_examples/eval_api_mymodel.py代码是一个配置脚本,用于设置和运行一个基于 OpenCompass 框架的推理任务。这个配置涉及多个组件,包括数据集、模型、分区器、运行器和任务,以及总结器的配置。下面是对每个部分的详细解释:

导入模块和类

导入所需的 mmengine 和 opencompass 相关模块和类,这些是构建和运行推理任务的基础。

读取基础配置

with read_base()::这个上下文管理器用于读取基础配置信息,确保在这个块中的导入和配置可以继承和覆盖基础配置。

导入数据集和模型

从相对路径导入特定的数据集和摘要器配置,这里包括 ceval_datasets 和 afqmc_datasets。

定义数据集

datasets 列表结合了 ceval_datasets 和 afqmc_datasets,这些数据集将被用于推理任务。ceval_datasets主要是中文一些考试题例如计算机网络考试等。afqmc-dev 在这个上下文中表示是 CLUE_afqmc 数据集中的一个开发(验证)集部分。CLUE 是一个中文语言理解评测基准(Chinese Language Understanding Evaluation Benchmark),而 AFQMC 是其中的一个任务,代表蚂蚁金融语义相似度任务(Ant Financial Question Matching Corpus)。在这个配置中,afqmc-dev 被用作摘要器的一部分,意味着该数据集的结果将被包括在最终的总结报告中

为了尽快得到测试结果 对./data/ceval/formal_ceval下的数据和
./data/CLUE/AFQMC/dev.json"的数据进行了删减

定义模型

models 列表定义了模型的配置,包括模型类型 (MyModel), 路径, 查询频率 (query_per_second), 生成参数 (generation_kwargs), 输出最大长度 (max_out_len), 序列最大长度 (max_seq_len), 和批处理大小 (batch_size)。

推理配置

infer 字典定义了推理任务的配置,包括分区器 (NaivePartitioner), 运行器 (LocalAPIRunner), 和任务类型 (OpenICLInferTask)。NaivePartitioner该划分器会将每个模型和数据集的组合作为一个独立任务派发,为最基础的划分策略,并无任何额外参数。LocalRunner为最基本的运行器,可以将任务在本机并行运行。

工作目录

work_dir 指定了输出和中间结果的存储位置。

摘要器配置

summarizer 字典配置了摘要器,指定了要总结的数据集 (dataset_abbrs) 和总结组 (summary_groups)。summarizer 会以 config 中的 models, datasets 为全集,去尝试读取 {work_dir}/results/ 路径下的评测分数,并按照 summarizer.dataset_abbrs 列表的顺序进行展示。另外,summarizer 会尝试通过 summarizer.summary_groups 来进行一些汇总指标的计算。如果 summarizer 出现在了 config 中,则评测结果输出会按照下述逻辑进行。 如果 summarizer 没有出现在 config 中,则评测结果会按照 dataset 中出现的顺序进行输出。

from mmengine.config import read_base
from opencompass.models import Qwen,MyModel
from opencompass.partitioners import NaivePartitioner
from opencompass.runners.local_api import LocalAPIRunner
from opencompass.tasks import OpenICLInferTask

with read_base():
    from ..summarizers.medium import summarizer
    from ..datasets.ceval.ceval_gen import ceval_datasets
    from ..datasets.CLUE_afqmc.CLUE_afqmc_gen import afqmc_datasets

datasets = [
    *ceval_datasets,*afqmc_datasets
]

models = [
    dict(
        type=MyModel,
        path='MyModel',
        query_per_second=1,
        generation_kwargs={
            'enable_search': False,
        },
        max_out_len=2048,
        max_seq_len=2048,
        batch_size=1
    ),
]

infer = dict(
    partitioner=dict(type=NaivePartitioner),
    runner=dict(
        type=LocalAPIRunner,
        max_num_workers=1,
        concurrent_users=1,
        task=dict(type=OpenICLInferTask)),
)

work_dir = "outputs/api_mymodel/"

summarizer = dict(
    dataset_abbrs = [
        'ceval-computer_network',
        'afqmc-dev'
    ],
    summary_groups=[
        {'name': '基础能力测评', 'subsets': ['ceval-computer_network','afqmc-dev']},
    ]
)

运行代码得到测评报告

使用 OpenCompass 提供的工具和命令行接口启动测试。OpenCompass 会自动处理数据加载、模型推理、结果评估等流程。测试过程中,模型将在指定的数据集上进行推理,生成预测结果。

评测任务的程序入口为run.py 执行命令 python run.py
configs/api_examples/eval_api_mymodel.py --debug --dump-eval-details

--debug: 开启时,推理和评测任务会以单进程模式运行,且输出会实时回显,便于调试

--dump-eval-details 开启时,results 下的评测结果中将会包含更加详细的评测结果信息,例如每条样本是否正确等。

为了尽快得到测试结果仅选择了2个数据集部分内容进行测评。所有过程的日志,预测,以及最终结果会放在opencompass/outputs/大模型名称的目录下

CNN预测模型的技术路线图怎么做英文文章的那种_人工智能_03

测评报告展示了2个数据集的准确率


之后对OpenCompass自带的文件进行解读,包括解读模型配置文件示例、解读数据集配置文件示例、解读评测配置文件示例、解读测评结果示例等。

解读模型配置文件示例

opencompass/opencompass/models/qwen_api.py这段代码定义了一个名为 Qwen 的类,它是一个基于 "通义千问" API 的模型封装。

这个类的构造函数 __init__ 接收多个参数:

  • path:模型的名称,例如 qwen-max。
  • key:授权密钥,用于API的访问认证。
  • query_per_second:每秒查询的最大次数,用于限制对API的调用频率,默认为1。
  • max_seq_len:这里未使用,通常用于指定最大的序列长度。
  • meta_template:如果需要,可以提供模型的元模板,用于注入或包装任何元指令。
  • retry:如果API调用失败,重试的次数,默认为5。
  • generation_kwargs:生成文本时的额外参数。

类中的 generate 方法接收一组输入(字符串或PromptList对象),并对每个输入并发地调用 _generate 方法来生成文本。这里使用了 ThreadPoolExecutor 来实现并发处理。

_generate 方法是实际执行生成操作的方法。它将输入转换为API所需的格式,并调用 dashscope 库(一个假定的库,用于与API交互)发送请求。该方法处理各种可能的响应状态,如成功、错误或速率限制,并根据响应返回生成的文本或错误信息。

class Qwen(BaseAPIModel):
    def __init__(self,
                 path: str,
                 key: str,
                 query_per_second: int = 1,
                 max_seq_len: int = 2048,
                 meta_template: Optional[Dict] = None,
                 retry: int = 5,
                 generation_kwargs: Dict = {}):
        super().__init__(path=path,
                         max_seq_len=max_seq_len,
                         query_per_second=query_per_second,
                         meta_template=meta_template,
                         retry=retry,
                         generation_kwargs=generation_kwargs)
        import dashscope
        dashscope.api_key = key
        self.dashscope = dashscope

    def generate(
        self,
        inputs: List[str or PromptList],
        max_out_len: int = 512,
    ) -> List[str]:
     
        with ThreadPoolExecutor() as executor:
            results = list(
                executor.map(self._generate, inputs,
                             [max_out_len] * len(inputs)))
        self.flush()
        return results

    def _generate( self,
        input: str or PromptList,
        max_out_len: int = 512,
    ) -> str:
     
         if isinstance(input, str):
            messages = [{'role': 'user', 'content': input}]
        else:
            messages = []
            for item in input:
                msg = {'content': item['prompt']}
                if item['role'] == 'HUMAN':
                    msg['role'] = 'user'
                elif item['role'] == 'BOT':
                    msg['role'] = 'assistant'
                elif item['role'] == 'SYSTEM':
                    msg['role'] = 'system'

                messages.append(msg)
        data = {'messages': messages}
        data.update(self.generation_kwargs)

        max_num_retries = 0
        while max_num_retries < self.retry:
            self.acquire()
            response = self.dashscope.Generation.call(
                    model=self.path,
                    **data,
                )
            self.release()
            if response.status_code == 200:
                    msg = response.output.text
                    return msg

解读数据集文件示例

定义测试任务和数据集,确定要测试模型的基础能力领域,例如语言理解、图像识别等,并为这些任务选择或创建相应的数据集。OpenCompass 允许使用多种数据集进行测试,因此可以为模型选择合适的任务和相关数据集进行评估。

CNN预测模型的技术路线图怎么做英文文章的那种_自然语言处理_04

数据集支持

代码
opencompass/configs/datasets/ceval/ceval_gen_5f30c7.py定义了一系列配置,用于构建和处理一个名为 CEvalDataset 的数据集,以及相关的推理(Inferencing)和评估(Evaluation)配置。代码主要包括几个部分:数据集的主题映射定义、数据集配置生成以及推理和评估的配置。下面是各部分的详细解释:

主题映射 (ceval_subject_mapping)

这是一个字典,定义了不同学科的英文名称、中文名称和所属领域。这个映射用于后续生成数据集配置时标识不同的学科。

数据集列表生成 (ceval_all_sets)

通过
ceval_subject_mapping.keys() 生成包含所有学科英文名称的列表。

数据集配置 (ceval_datasets)

通过遍历所有学科和数据集分割(这里只有 "val"),为每个学科生成一个数据集配置。这些配置将用于初始化 CEvalDataset 实例。

数据集配置详解

type: 指定数据集的类型,这里是 CEvalDataset。path: 数据集文件的路径。name 和 abbr: 数据集的名称和缩写。reader_cfg: 配置数据读取,包括输入列、输出列和数据分割。

推理配置 (ceval_infer_cfg)

ice_template: 定义了推理过程中使用的提示模板(PromptTemplate),包括提示的开始标记、交互轮次定义等。retriever: 定义了检索器,这里使用 FixKRetriever,可以固定检索某些ID的条目。inferencer: 指定了推理器,这里是 GenInferencer,用于生成推理结果。

评估配置 (ceval_eval_cfg)

evaluator: 定义了评估器,这里使用 AccEvaluator,用于计算准确率。pred_postprocessor: 定义了预测结果的后处理器,这里是 first_capital_postprocess,用于处理文本的首字母大写等格式化需求。最后,循环中的变量 _split, _name, _ch_name 被删除,以避免后续可能的命名冲突。

在评测阶段,一般以数据集本身的特性来选取对应的评估策略,最主要的依据为标准答案的类型,一般以下几种类型:

选项:常见于分类任务,判断题以及选择题,目前这类问题的数据集占比最大,有 MMLU, CEval 数据集等等,评估标准一般使用准确率–ACCEvaluator。

短语:常见于问答以及阅读理解任务,这类数据集主要包括 CLUE_CMRC, CLUE_DRCD, DROP 数据集等等,评估标准一般使用匹配率–EMEvaluator。

句子:常见于翻译以及生成伪代码、命令行任务中,主要包括 Flores, Summscreen, Govrepcrs, Iwdlt2017 数据集等等,评估标准一般使用 BLEU(Bilingual Evaluation Understudy)–BleuEvaluator。

段落:常见于文本摘要生成的任务,常用的数据集主要包括 Lcsts, TruthfulQA, Xsum 数据集等等,评估标准一般使用 ROUGE(Recall-Oriented Understudy for Gisting Evaluation)–RougeEvaluator。

代码:常见于代码生成的任务,常用的数据集主要包括 Humaneval,MBPP 数据集等等,评估标准一般使用执行通过率以及 pass@k,目前 Opencompass 支持的有MBPPEvaluator、HumanEvaluator。

如下代码展示了ACCEvaluator的工作原理。这段代码定义了一个名为 AUCROCEvaluator 的类,它继承自 BaseEvaluator。这个评估器的主要目的是计算分类任务的 AUC-ROC 分数和准确率。AUC-ROC 是评估二分类模型性能的一个常用指标,它反映了模型区分两个类别的能力。

下面是对这个类的详细解释:类定义:AUCROCEvaluator 类继承自 BaseEvaluator,表明它是一个评估器的具体实现。初始化方法 __init__:这个方法调用了基类的初始化方法。在这个评估器中,没有额外的初始化逻辑。评分方法 score:这个方法接收两个参数:predictions 和 references。predictions 是模型输出的每个类别的概率列表,references 是每个样本的真实标签列表。首先,方法检查 predictions 和 references 的长度是否一致,如果不一致,返回一个包含错误信息的字典。使用 roc_auc_score 函数计算 AUC-ROC 分数。这需要将 references 和 predictions 中每个样本属于正类的概率传递给该函数。

/opencompass/opencompass/openicl/icl_evaluator/icl_aucroc_evaluator.py

class AUCROCEvaluator(BaseEvaluator):
    """Calculate AUC-ROC scores and accuracy according the prediction.

    For some dataset, the accuracy cannot reveal the difference between
    models because of the saturation. AUC-ROC scores can further exam
    model abilities to distinguish different labels. More details can refer to
    https://scikit-learn.org/stable/modules/generated/sklearn.metrics.roc_auc_score.html
    """  # noqa

    def __init__(self) -> None:
        super().__init__()

    def score(self, predictions: List, references: List) -> dict:
        """Calculate scores and accuracy.

        Args:
            predictions (List): List of probabilities for each class of each
                sample.
            references (List): List of target labels for each sample.

        Returns:
            dict: calculated scores.
        """
        if len(predictions) != len(references):
            return {
                'error': 'predictions and references have different length.'
            }
        auc_score = roc_auc_score(references, np.array(predictions)[:, 1])
        accuracy = sum(
            references == np.argmax(predictions, axis=1)) / len(references)
        return dict(auc_score=auc_score * 100, accuracy=accuracy * 100)

这段代码的核心是动态构建一组数据集配置,用于不同学科领域的评估和推理任务。每个数据集的配置包括数据路径、读取配置、推理配置和评估配置,这些配置将被用于后续的数据处理、模型推理和结果评估过程。

from opencompass.openicl.icl_prompt_template import PromptTemplate
from opencompass.openicl.icl_retriever import FixKRetriever
from opencompass.openicl.icl_inferencer import GenInferencer
from opencompass.openicl.icl_evaluator import AccEvaluator
from opencompass.datasets import CEvalDataset
from opencompass.utils.text_postprocessors import first_capital_postprocess

ceval_subject_mapping = {
    'computer_network': ['Computer Network', '计算机网络', 'STEM'],
    'operating_system': ['Operating System', '操作系统', 'STEM'],
}
ceval_all_sets = list(ceval_subject_mapping.keys())

ceval_datasets = []
for _split in ["val"]:
    for _name in ceval_all_sets:
        _ch_name = ceval_subject_mapping[_name][1]
        ceval_infer_cfg = dict(
            ice_template=dict(
                type=PromptTemplate,
                template=dict(
                    begin="</E>",
                    round=[
                        dict(
                            role="HUMAN",
                            prompt=
                            f"以下是中国关于{_ch_name}考试的单项选择题,请选出其中的正确答案。\n{{question}}\nA. {{A}}\nB. {{B}}\nC. {{C}}\nD. {{D}}\n答案: "
                        ),
                        dict(role="BOT", prompt="{answer}"),
                    ]),
                ice_token="</E>",
            ),
            retriever=dict(type=FixKRetriever, fix_id_list=[0, 1, 2, 3, 4]),
            inferencer=dict(type=GenInferencer),
        )

        ceval_eval_cfg = dict(
            evaluator=dict(type=AccEvaluator),
            pred_postprocessor=dict(type=first_capital_postprocess))

        ceval_datasets.append(
            dict(
                type=CEvalDataset,
                path="./data/ceval/formal_ceval",
                name=_name,
                abbr="ceval-" + _name if _split == "val" else "ceval-test-" +
                _name,
                reader_cfg=dict(
                    input_columns=["question", "A", "B", "C", "D"],
                    output_column="answer",
                    train_split="dev",
                    test_split=_split),
                infer_cfg=ceval_infer_cfg,
                eval_cfg=ceval_eval_cfg,
            ))

del _split, _name, _ch_name

具体测评数据文件
opencompass/data/ceval/formal_ceval/val/computer_network_val.csv

id,question,A,B,C,D,answer
0,使用位填充方法,以01111110为位首flag,数据为011011111111111111110010,求问传送时要添加几个0____,1,2,3,4,C
1,在802.3标准中,发送帧之前需要____,等待冲突,等待令牌,监听介质,接受一个帧,C
2,TCP端对端通信作用于____,主机之间,网络之间,进程之间,主机到网络,C
3,对于传输层来说错误的是____,TCP是全双工协议,TCP是字节流协议,TCP和UDP协议不能使用同一个端口,TSAD是IP和端口的组合,C
4,已知当前TCP连接的RTT值为35ms,连续收到3个确认报文段,它们比相应的数据报文段的发送时间滞后了27ms、30ms与21ms。假设α=0.2,则第三个确认报文段到达后新的RTT估计值为____。,33.4ms,32.7ms,21ms,30.4ms,D
5,对于UDP协议,如果想实现可靠传输,应在哪一层实现____,数据链路层,网络层,传输层,应用层,D
6,数据链路层采用了后退N帧的(GBN)协议,如果发送窗口的大小是32,那么至少需要____位的序列号才能保证协议不出错。,4,5,6,7,C
7,TCP“三次握手”过程中,第二次“握手”时,发送的报文段中____标志位被置为1。,SYN,ACK,ACK和RST,SYN和ACK,D
8,一个TCP连接的数据传输阶段,如果发送端的发送窗口值由2000变为3000,意味着发送端可以____。,在收到一个确认之前可以发送3000个TCP报文段,在收到一个确认之前可以发送1000B,在收到一个确认之前可以发送3000B,在收到一个确认之前可以发送2000个TCP报文段,C
9,关于传输层的面向连接服务的特性是____。,既不保证可靠,也不保证按序交付,不保证可靠,但保证按序交付,保证可靠,但不保证按序交付,既保证可靠,也保证按序交付,D
10,____采用链路状态算法,RIP,OSPF,BGP-4,EGP,B

解读评测配置文件示例

opencompass/configs/api_examples/eval_api_qwen.py这段代码是 OpenCompass 框架中的一个配置文件示例,用于设置和运行一个推理任务

导入模块和函数

from mmengine.config import read_base 导入了 read_base 函数,用于读取基础配置。

导入的其它模块 Qwen, NaivePartitioner, LocalAPIRunner, 和 OpenICLInferTask 分别代表模型、数据分区器、运行器和任务类型。

读取和引入额外配置

使用 with read_base(): 创建一个上下文环境,其中导入了额外的配置信息,比如 summarizer 和 ceval_datasets。

配置数据集 (datasets)

datasets = [*ceval_datasets,] 设置了用于推理的数据集。这里使用了 ceval_datasets,* 用于解构列表,即将 ceval_datasets 列表中的元素作为 datasets 的元素。

配置模型 (models)

在 models 列表中定义了一个字典,指定了模型的配置。这包括模型的类型 (Qwen)、路径 (path)、密钥 (key) 和一些特定的生成参数 (generation_kwargs)。generation_kwargs 中的 'enable_search': False 表示在生成时不启用搜索功能。还设置了每秒查询次数 (query_per_second), 输出最大长度 (max_out_len), 序列最大长度 (max_seq_len), 和批处理大小 (batch_size)。

推理配置 (infer)

partitioner 字典定义了如何对数据进行分区,这里使用了 NaivePartitioner。

runner 字典配置了运行器,这里使用 LocalAPIRunner 本地API运行器,并设置了最大工作数和并发用户数。

task 字典指定了要运行的任务类型,这里是 OpenICLInferTask,即 OpenCompass 中的推理任务。

工作目录 (work_dir)

work_dir 指定了输出和中间结果的存储目录。

总的来说,这个配置文件定义了一个使用 Qwen 模型和 ceval_datasets 数据集的推理任务,通过 LocalAPIRunner 在本地运行,输出和中间结果将存储在指定的 work_dir 目录中。通过这种方式,可以灵活地配置和执行不同的推理任务。

from mmengine.config import read_base
from opencompass.models import Qwen
from opencompass.partitioners import NaivePartitioner
from opencompass.runners.local_api import LocalAPIRunner
from opencompass.tasks import OpenICLInferTask

with read_base():
    from ..summarizers.medium import summarizer
    from ..datasets.ceval.ceval_gen import ceval_datasets

datasets = [
    *ceval_datasets,
]

models = [
    dict(
        abbr='qwen-max',
        type=Qwen,
        path='qwen-max',
        key='xxxxxxxxxxxxxxxx',  # please give you key
        generation_kwargs={
            'enable_search': False,
        },
        query_per_second=1,
        max_out_len=2048,
        max_seq_len=2048,
        batch_size=8
    ),
]

infer = dict(
    partitioner=dict(type=NaivePartitioner),
    runner=dict(
        type=LocalAPIRunner,
        max_num_workers=1,
        concurrent_users=1,
        task=dict(type=OpenICLInferTask)),
)

work_dir = "outputs/api_qwen/"

解读测评结果示例

所有运行结果会默认放在outputs/模型名称/目录下 每一个时间戳中存在以下内容:

configs 文件夹,用于存放以这个时间戳为输出目录的每次运行对应的配置文件;

logs 文件夹,用于存放推理和评测两个阶段的输出日志文件,各个文件夹内会以模型为子文件夹存放日志;

predicitions 文件夹,用于存放推理 json 结果,以模型为子文件夹;

results 文件夹,用于存放评测 json 结果,以模型为子文件夹

afqmc-dev测评的详细结果路径
opencompass/outputs/api_mymodel/20240308_160019/results/opencompass.models.MyModel_opencompass_MyModel/afqmc-dev.json 如下所示

{
    "accuracy": 70.0,
    "details": {
        "0": {
            "prompt": "语句一:“双十一花呗提额在哪”\n语句二:“里可以提花呗额度”\n语句一与语句二是关于蚂蚁金融产品的疑问,两者所询问的内容是否完全一致?\nA. 不完全一致\nB. 完全一致\n请从“A”,“B”中进行选择。\n答:",
            "origin_prediction": "这是一个关于语句内容比较的问题。为了确定两个语句是否完全一致,我们需要仔细分析它们的含义和询问的内容。\n\n1. 语句一:“双十一花呗提额在哪”明确询问了在双十一期间如何提升花呗的额度,并期望得到一个具体的操作位置或方法。\n2. 语句二:“里可以提花呗额度”并不是一个完整的句子,它似乎被截断了。但从给出的部分来看,它也在询问关于如何提升花呗额度的问题。但具体的情境或时间(如双十一)并没有明确提及。\n3. 对比两个语句,我们可以发现它们都在询问如何提升花呗额度的问题,但语句一更具体地提到了双十一这个背景。而语句二则较为模糊,没有明确的背景信息。\n\n综合上述分析,我们可以得出结论:两个语句虽然都在询问关于花呗提额的问题,但由于语句二缺少了具体的情境信息,使得两者在内容上并不完全一致。\n\n答案选择:A. 不完全一致。",
            "predictions": "A",
            "references": "A"
        },
        "1": {
            "prompt": "语句一:“花呗支持高铁票支付吗”\n语句二:“为什么友付宝不支持花呗付款”\n语句一与语句二是关于蚂蚁金融产品的疑问,两者所询问的内容是否完全一致?\nA. 不完全一致\nB. 完全一致\n请从“A”,“B”中进行选择。\n答:",
            "origin_prediction": "A. 不完全一致\n\n语句一询问的是“花呗”是否支持高铁票支付,关注的是花呗的支付范围;而语句二询问的是“为什么友付宝不支持花呗付款”,关注的是友付宝不支持花呗付款的原因。虽然两句话都涉及到了花呗,但是它们询问的内容并不完全一致。因此,答案是A,不完全一致。\n\n需要注意的是,语句二中的“友付宝”可能是一个笔误或者打字错误,因为通常我们更熟悉的是“支付宝”。如果将“友付宝”替换为“支付宝”,那么两句话的主题就更接近了,但是它们询问的内容仍然不完全一致。",
            "predictions": "A",
            "references": "A"
        },
        "2": {
            "prompt": "语句一:“我的蚂蚁花呗支付金额怎么会有限制”\n语句二:“我到支付宝实体店消费用花呗支付受金额限制”\n语句一与语句二是关于蚂蚁金融产品的疑问,两者所询问的内容是否完全一致?\nA. 不完全一致\nB. 完全一致\n请从“A”,“B”中进行选择。\n答:",
            "origin_prediction": "这是一个语言逻辑与理解的问题。我们将依据给定的问题进行解析:\n\n1. 首先,理解两个语句的内容:\n* 语句一:“我的蚂蚁花呗支付金额怎么会有限制”,这里主要是询问为什么蚂蚁花呗支付金额会有限制,聚焦在“为什么”会有这个限制。\n* 语句二:“我到支付宝实体店消费用花呗支付受金额限制”,这句话在描述一个在支付宝实体店消费用花呗支付时遇到的具体限制情况,并没有明确表达出“为什么”有疑问,但确实是遇到了支付限制的问题。\n\n2. 比较两个语句的核心信息和询问的焦点:\n* 从语句一中我们可以知道,提问者的疑惑焦点在于“为何会有支付限制”;\n* 语句二中虽然也是提到“花呗支付受金额限制”,但是其主要信息更偏向描述了一个实际情况,而没有明确指出疑惑或问题的所在。\n\n3. 综合判断:\n* 两个语句虽然都在描述或涉及到“蚂蚁花呗支付金额限制”这个问题,但是语句一明确地表达了提问者对这一限制存在原因的疑问,而语句二只是陈述了一个遇到的支付情况,并未明确表示对“为什么会有这样的限制”进行提问。\n\n根据以上的解析,我们可以得出结论:虽然两句话都在涉及到“蚂蚁花呗支付金额限制”这个话题,但语句一明确表达了对这一限制的疑问,而语句二并未表达出同等的疑问深度。所以,两者所询问的内容并不是完全一致的。因此,答案选择A. 不完全一致。",
            "predictions": "A",
            "references": "B"
        }}

参考资料

https://opencompass.readthedocs.io/zh-cn/stable