在 MM 系列框架上使用 FFRecord

小杞    November 03, 2022

FFRecord 是幻方AI提供的训练数据格式,其可以整合大量零散的小文件,支持训练数据的随机索引,极大发挥分布式高速存储的性能,提高训练效率。然而,对于 mmdetection, mmsegmentation 等广受研究者欢迎的 mm-* 系列框架,其深度封装了数据和模型,让萤火集群的用户不能方便快捷的进行 FFRecord 转化。对此,幻方AI针对这类场景进行了优化,提供了 FFRecordClient 接口。用户能够在配置文件中选择使用 FFRecordClient 来替换默认的读取后端。

那么 FFRecordClient 和之前的 FFRecord 有什么不同?它具体该如何使用?本期文章将为大家分享。在阅读本文之前,建议读者先了解一下 MMCV FileClient 的原理

方法介绍

我们知道,FFRecord 可以将大量的小文件整合到几个大文件中。与 TFRecord 这种开源文件格式不同,FFRecord 可以支持随机读取,批量读取,可以极大地提高高速存储的数据读取性能。对于 mm-* 系列框架中的数据封装,FFRecord 扩展了文件夹打包能力,以适配这种场景。具体的使用方式如下:

import ffrecord
ffrecord.pack_folder("/path/to/dataset", "packed.ffr")

在训练中,可以使用 FFRecordClient 读取后端

  1. 在训练代码中导入 FFRecordClient:

    import hfai.utils.mm
  2. 修改配置文件,为所有的读取小文件的操作添加 file_client_args 参数,比如在 mmseg 中:

    file_client_args=dict(
        backend="ffrecord",
        fname="packed.ffr",
    )
    
    train_pipeline = [
        dict(type='LoadImageFromFile', file_client_args=file_client_args),
        dict(type='LoadAnnotations', reduce_zero_label=True, file_client_args=file_client_args),
        dict(type='Resize', img_scale=(2048, 512), ratio_range=(0.5, 2.0)),
        ...
    ]

使用示例

接下来我们展示两个示例,分别是在 mmdetection 和 mmsegmentation 上的使用。

mmdetection

以 coco 数据集为例,假设我们已经有 coco 的原始数据集,目录结构如下:

coco/
├── annotations
├── train2017
└── val2017
  1. 我们先打包整个数据集到 data/coco/coco.ffr 中:

    import ffrecord
    ffrecord.pack_folder("coco/", "data/coco/coco.ffr")
  2. 然后把 annotations 文件夹单独拷贝出来放到 data/coco/annotations,现在目录结构如下:

    data
    └── coco
        ├── annotations
        └── coco.ffr
  3. 在训练代码中导入 FFRecordClient:

    import hfai.utils.mm
  4. 修改配置文件 configs/_base_/datasets/coco_detection.py 的内容为: coco_detection.py

mmsegmentation

以 ADE20k 数据集为例,假设我们已经有 ADE20k 的原始数据集,目录结构如下:

ADEChallengeData2016
├── annotations
├── images
├── objectInfo150.txt
└── sceneCategories.txt
  1. 我们先打包整个数据集到 data/ade20k.ffr 中:

    import ffrecord
    ffrecord.pack_folder("ADEChallengeData2016/", "data/ade20k.ffr")
  2. 在训练代码中导入 FFRecordClient:

    import hfai.utils.mm
  3. 修改配置文件 configs/_base_/datasets/ade20k.py 的内容为: ade20k.py


本文作者: 小杞


您可以转载、不违背作品原意地摘录及引用本技术博客的内容,但必须遵守以下条款: 署名 — 您应当署名原作者,但不得以任何方式暗示幻方为您背书,亦不会对幻方的权利造成任何负面影响。 非商业性使用 — 您不得将本技术博客内容用于商业目的。 禁止演绎 — 如果基于该内容改编、转换、或者再创作,您不得公开或分发被修改内容,该内容仅可供个人使用。