OpenMMLab 各算法库的评测指标集成

电子说

1.2w人已加入

描述

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

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

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

 

GitHub 主页:

https://github.com/open-mmlab/mmeval

(文末点击阅读原文可直达)

欢迎大家来 star~

中文文档:

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()

 

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

多分布式通信后端支持

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

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

将各个进程中保存的评测指标计算中间结果 all-gather

将 rank 0 进程计算得到的指标结果 broadcast 给所有进程

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

计算机视觉

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

MPI4Py torch.distributed Horovod paddle.distributed
MPI4PyDist TorchCPUDist & TorchCUDADist TFHorovodDist PaddleDist

多机器学习框架支持

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

 

愿景

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

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

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

持续的补充添加评测指标,不断扩展到 NLP、语音、推荐系统等更多的任务领域

支持更多机器学习框架,并且探索多机器学习框架支持的新方式  

      审核编辑:彭静
打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分