Shortcuts

基于参数类型注释的多分派

MMEval 希望能够支持多种机器学习框架,一个最为简单的方案是让所有评测指标的计算都支持 NumPy 即可。

这样做可以实现大部分评测需求,因为所有机器学习框架的 Tensor 数据类型都可以转为 numpy.ndarray。

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

  • 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

目前,我们使用 plum-dispatch 来实现 MMEval 中的分发机制,在 plum-dispatch 基础上,做了一些速度上的优化,并且扩展支持了 typing.ForwardRef

警告

受限于 Python 动态类型的特性,在运行时确定一个变量的具体类型可能会比较耗时,尤其是碰到一些大的嵌套结构数据。因此基于类型注释的动态多分派机制可能会存在一些性能问题,更多信息可以参考:wesselb/plum/issues/53

Read the Docs v: latest
Versions
latest
stable
Downloads
pdf
html
epub
On Read the Docs
Project Home
Builds

Free document hosting provided by Read the Docs.