项目介绍:FFCV
什么是FFCV?
FFCV
,即《Fast Forward Computer Vision》,是一个即插即用的数据加载系统,旨在显著提升模型训练过程中的数据吞吐量。这个系统的核心理念是通过加速数据加载来降低模型训练的成本和时间,无需更改训练算法,只需要替换数据加载器即可。比如,用FFCV
在一个GPU上训练ImageNet模型只需35分钟,而训练CIFAR-10模型更是只需36秒,大幅降低云平台上的开销。
如何安装FFCV?
FFCV
支持在Linux和Windows系统上安装,安装过程分为以下几个步骤:
Linux系统安装
- 创建新的Conda环境,并安装所需的依赖库:
conda create -y -n ffcv python=3.9 cupy pkg-config libjpeg-turbo opencv pytorch torchvision cudatoolkit=11.3 numba -c pytorch -c conda-forge conda activate ffcv
- 使用pip安装FFCV:
pip install ffcv
如果安装过程中遇到包冲突错误,可以尝试conda config --env --set channel_priority flexible
,或者在某些情况下增加compilers
包。此外,还提供了一个无需Conda的Dockerfile,供选择使用。
Windows系统安装
- 安装OpenCV4,并将相应的路径添加到环境变量。
- 安装libjpeg-turbo和pthread,同样将相应路径添加到环境变量。
- 根据CUDA版本安装CuPy。
- 使用pip安装FFCV:
pip install ffcv
快速开始
FFCV
的使用分为两个主要步骤。
转换数据集
首先,需要将数据集转换为FFCV
格式。这可以通过ffcv.fields
模块定义数据字段类型,然后使用DatasetWriter
写入数据集。例如:
from ffcv.writer import DatasetWriter
from ffcv.fields import RGBImageField, IntField
my_dataset = make_my_dataset() # 用户需定义自己的数据集
write_path = '/输出/路径/转换后的数据集.beton'
writer = DatasetWriter(write_path, {
'image': RGBImageField(max_resolution=256),
'label': IntField()
})
writer.from_indexed_dataset(my_dataset)
替换数据加载器
在训练时,使用ffcv
的加载器替换原有的数据加载器,非常简单。例如,在PyTorch中:
from ffcv.loader import Loader, OrderOption
from ffcv.transforms import ToTensor, ToDevice, ToTorchImage, Cutout
from ffcv.fields.decoders import IntDecoder, RandomResizedCropRGBImageDecoder
decoder = RandomResizedCropRGBImageDecoder((224, 224))
image_pipeline = [decoder, Cutout(), ToTensor(), ToTorchImage(), ToDevice(0)]
label_pipeline = [IntDecoder(), ToTensor(), ToDevice(0)]
pipelines = {
'image': image_pipeline,
'label': label_pipeline
}
loader = Loader(write_path, batch_size=bs, num_workers=num_workers,
order=OrderOption.RANDOM, pipelines=pipelines)
for epoch in range(epochs):
...
特色功能
FFCV
拥有一系列独特的功能,使其在多种资源受限环境下加快训练速度:
-
即插即用:只需简单地替换数据加载器即可使用FFCV,无需更改训练代码中的其他部分。
-
快速数据处理:自动处理数据读取、缓存、传输等,高效节省用户时间。
-
数据处理自动编译与融合:支持预写和自定义数据增强操作,这些操作会自动转为机器码并异步调度以避免加载延迟。
-
灵活的数据加载选项:可以根据可用的资源优化数据加载方式,支持从RAM、SSD或网络磁盘加载数据。
-
多模型同GPU训练:采用线程式加载方式,允许在同一GPU上同时训练多个模型而无数据加载开销。
-
图像处理工具:提供快速JPEG编码与解码,以及混合存储数据集以便优化I/O与计算开销。
以上列举的功能,让FFCV
在计算机视觉任务中占据了重要地位,且提供了详细的性能指导和示例代码,帮助用户快速上手。
贡献者团队
FFCV的开发团队包括Guillaume Leclerc、Logan Engstrom、Andrew Ilyas、Sam Park和Hadi Salman等多人,他们共同努力致力于提升训练速度,去除数据瓶颈。