• MMEval:统一开放的跨框架算法评测库


    引言

    在前段时间 2022 世界人工智能大会(WAIC)上, OpenMMLab 基于新一代训练架构 MMEngine ,发布了全新的 OpenMMLab 2.0 视觉算法体系,详细见上一期内容

    MMEngine 提供了强大灵活的训练引擎,以及常见的训练技术,以满足用户多样的模型训练需求。对于模型评测的需求,MMEngine 也提供了评测指标(Metric)和评测器(Evaluator)模块,下游算法库基于 MMEngine 提供的评测指标基类,实现对应任务所需的评测指标。

    OpenMMLab 是深度学习时代最完整的计算机视觉开源算法体系,目前已涵盖 30+ 研究领域,这些研究领域都有各自任务的评测指标。我们希望能够将这些评测指标统一起来,以更加易用和开放的方式服务于更多用户。因此,我们在 MMEngine 中的评测指标模块基础上,将原 OpenMMLab 各算法库的评测指标集成进来,开发了一个统一开放的跨框架算法评测库:MMEval

    MMEval 的 GitHub 主页:https://github.com/open-mmlab/mmeval

    MMEval 的中文文档:https://mmeval.readthedocs.io/zh_CN/latest

    MMEval 简介

    MMEval 是一个跨框架的机器学习算法评测库,提供高效准确的分布式评测以及多种机器学习框架后端支持,具有以下特点:

    • 提供丰富的计算机视觉各细分方向评测指标(自然语言处理方向的评测指标正在支持中)
    • 支持多种分布式通信库,实现高效准确的分布式评测。
    • 支持多种机器学习框架,根据输入自动分发对应实现。

    MMEval 的架构如下图所示:

    在这里插入图片描述

    和已有一些开源的算法评测库相比,如 Lightning-AI/metrics,huggingface/evaluate,以及近日开源的 pytorch/torcheval,MMEval 的区别主要在于对计算机视觉领域评测指标的更全面支持,以及提供跨框架评测的能力。

    MMEval 目前提供了 20+ 评测指标,涵盖了分类,目标检测,图像分割,点云分割,关键点检测和光流估计等任务,MMEval 已支持的评测指标可以在文档中的支持矩阵中查看:https://mmeval.readthedocs.io/zh_CN/latest/get_started/support_matrix.html

    MMEval 安装与使用

    MMEval 依赖 Python 3.6+,可以通过 pip 来安装 MMEval:pip install mmeval

    MMEval 中的评测指标提供两种使用方式,以 Accuracy 为例:

    from mmeval import Accuracy
    
    import numpy as np
    accuracy = Accuracy()
    
    # 第一种是直接调用实例化的 Accuracy 对象,计算评测指标。
    labels = np.asarray([0, 1, 2, 3])
    preds = np.asarray([0, 2, 1, 3])
    accuracy(preds, labels)
     # {'top1': 0.5}
    # 第二种是累积多个批次的数据后,计算评测指标。
    
    for i in range(10):
        labels = np.random.randint(0, 4, size=(100, ))
        predicts = np.random.randint(0, 4, size=(100, ))
        # 调用 `add` 方法,保存指标计算中间结果。
        accuracy.add(predicts, labels)
    
    
    
    # 调用 compute 方法计算评测指标
    
    accuracy.compute()
    # {'top1': ...}
    # 调用 reset 方法,清除保存的中间结果。
    accuracy.reset()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    MMEval 中的评测指标还支持分布式评测功能,关于分布式评测的使用方式可以参考教程:https://mmeval.readthedocs.io/zh_CN/latest/tutorials/dist_evaluation.html

    多分布式通信后端支持

    在评测过程中,通常会以数据并行的形式,在每张卡上推理部分数据集的结果,以加快评测速度。而在每个数据子集上计算得到的评测结果,通常不能通过简单的求平均来与整个数据集的评测结果进行等价。因此,通常的做法是在分布式评测过程中,将每张卡得到的推理结果或者指标计算中间结果保存下来,在所有进程中进行 all-gather 操作,最后再计算整个评测数据集的指标结果。

    MMEval 在分布式评测过程中所需的分布式通信需求,主要有以下两个:

    • 将各个进程中保存的评测指标计算中间结果 all-gather
    • 将 rank 0 进程计算得到的指标结果 broadcast 给所有进程

    为了能够灵活的支持多种分布式通信库,MMEval 将上述分布式通信需求抽象定义了一个分布式通信接口 BaseDistBackend,其接口设计如下图所示:

    在这里插入图片描述

    MMEval 中已经预置实现了一些分布式通信后端,如下表所示:

    MPI4Pytorch.distributedHorovodpaddle.distributed
    MPI4PyDistTorchCPUDist & TorchCUDADistTFHorovodDistPaddleDist

    多机器学习框架支持

    MMEval 希望能够支持多种机器学习框架,一个最为简单的方案是让所有评测指标的计算都支持 NumPy 即可。这样做可以实现大部分评测需求,因为所有机器学习框架的 Tensor 数据类型都可以转为 NumPy 的数组。

    但是在某些情况下可能会存在一些问题:

    • NumPy 有一些常用算子尚未实现,如 topk,会影响评测指标的计算速度。
    • 大量的 Tensor 从 CUDA 设备搬运到 CPU 内存会比较耗时。
    • 如果希望评测指标的计算过程是可导的,那么就需要用各自机器学习框架的 Tensor 数据类型进行计算。

    为了应对上述问题,MMEval 的评测指标提供了一些特定机器学习框架的指标计算实现。同时,为了应对不同指标计算方式的分发问题,MMEval 采用了基于类型注释的动态多分派机制,可以根据输入的数据类型,动态的选择不同的计算方式。

    一个基于类型注释的多分派简单示例如下:

    from mmeval.core import dispatch
    @dispatch
    def compute(x: int, y: int):
        print('this is int')
    
    @dispatch
    def compute(x: str, y: str):
        print('this is str')
    
    compute(1, 1)
    
    # this is int
    compute('1', '1')
    
    # this is str
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    愿景

    在机器学习模型实验和生产过程中,训练和评测是其中两个非常重要的阶段。

    MMEngine 已经提供了一个灵活强大的训练架构,而 MMEval 则希望能够提供一个统一开放的模型评测库。其中统一体现在不同领域不同任务的模型评测需求都能够满足,开放则体现为与机器学习框架解耦,以更加开放的方式为不同的机器学习框架生态提供评测功能。

    目前 MMEval 仍处于早期阶段,有很多评测指标仍在添加当中,有一些架构设计可能不够成熟。在之后的一段时间里,MMEval 将主要围绕以下两个方向去持续迭代完善:

    • 持续的补充添加评测指标,不断扩展到 NLP,语音,推荐系统等更多的任务领域。
    • 支持更多机器学习框架,并且探索多机器学习框架支持的新方式。
  • 相关阅读:
    腾讯云轻量数据库性能如何?轻量数据库租用配置价格表
    spring源码解析——IOC之自定义标签解析
    依赖注入(六)
    Vue_Bug VUE-ELEMENT-ADMIN默认是英文模式
    经济计:宏观计算题
    mysql两阶段提交
    怎样才能上传百度文库,上传百度文库的操作步骤和技巧
    稳态视觉诱发电位 (SSVEP) 分类学习系列 (1) :FFT-CNN-CCA
    数据结构---二叉搜索树
    纯Python实现遗传算法
  • 原文地址:https://blog.csdn.net/qq_39967751/article/details/127661782