快速计算机视觉:以加速数据加载的成本的一小部分训练模型!
[install] [QuickStart] [功能] [docs] [support slack] [主页] [paper]
维护者:Guillaume Leclerc,Andrew Ilyas和Logan Engstrom
ffcv是一个滴入数据加载系统,可大大增加模型培训中的数据吞吐量:
$YOUR_DATASET型号$REALLY_FAST (对于$WAY_LESS )保持培训算法相同,只需更换数据加载程序即可!看看这些加速:
ffcv还配备了标准视觉基准的快速,简单的代码:
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 install ffcv
故障排除注释1:如果以上命令导致软件包冲突错误,请尝试在环境中运行conda config --env --set channel_priority flexible并重新安装命令。
故障排除注释2:在某些系统(但很少)上,您需要将compilers软件包添加到上面的第一个命令中。
故障排除注释3:由@kschuerholt提供,这是一个可能有助于无Conda安装
..../opencv/build/x64/vc15/bin到路径环境变量..../libjpeg-turbo64/bin到路径环境变量pthread/include/pthread.h ,然后将下面的代码添加到文件顶部。 # define HAVE_STRUCT_TIMESPEC..../pthread/dll到路径环境变量pip install ffcv 如果您使用FFCV,请将其引用为:
@inproceedings{leclerc2023ffcv,
author = {Guillaume Leclerc and Andrew Ilyas and Logan Engstrom and Sung Min Park and Hadi Salman and Aleksander Madry},
title = {{FFCV}: Accelerating Training by Removing Data Bottlenecks},
year = {2023},
booktitle = {Computer Vision and Pattern Recognition (CVPR)},
note = {url{https://github.com/libffcv/ffcv/}. commit xxxxxxx}
}
(确保用所用的提交的哈希替换上面的xxxxxxx!)
使用ffcv加速任何学习系统。首先,将数据集转换为ffcv格式( ffcv转换索引Pytorch数据集和WebDataTaset):
from ffcv . writer import DatasetWriter
from ffcv . fields import RGBImageField , IntField
# Your dataset (`torch.utils.data.Dataset`) of (image, label) pairs
my_dataset = make_my_dataset ()
write_path = '/output/path/for/converted/ds.beton'
# Pass a type for each data field
writer = DatasetWriter ( write_path , {
# Tune options to optimize dataset size, throughput at train-time
'image' : RGBImageField ( max_resolution = 256 ),
'label' : IntField ()
})
# Write dataset
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
# Random resized crop
decoder = RandomResizedCropRGBImageDecoder (( 224 , 224 ))
# Data decoding and augmentation
image_pipeline = [ decoder , Cutout (), ToTensor (), ToTorchImage (), ToDevice ( 0 )]
label_pipeline = [ IntDecoder (), ToTensor (), ToDevice ( 0 )]
# Pipeline for each data field
pipelines = {
'image' : image_pipeline ,
'label' : label_pipeline
}
# Replaces PyTorch data loader (`torch.utils.data.Dataloader`)
loader = Loader ( write_path , batch_size = bs , num_workers = num_workers ,
order = OrderOption . RANDOM , pipelines = pipelines )
# rest of training / validation proceeds identically
for epoch in range ( epochs ):
...请参阅此处,以获取为数据集部署ffcv更详细指南。
从格栅到基准测试再到快速研究迭代,有很多理由需要更快的模型培训。在下面,我们提出了用于Imagenet和Cifar培训的预制代码库,包括(a)可扩展的代码库以及(b)大量预制培训配置。
我们提供一个独立的脚本,以快速训练成像网。在上方,我们将训练时间与精度边界以及数据量速度绘制为1-GPU RESNET-18和8-GPU RESNET-50的数据速度,并与几个基线一起进行。
| 链接到配置 | top_1 | top_5 | #时代 | 时间(分钟) | 建筑学 | 设置 |
|---|---|---|---|---|---|---|
| 关联 | 0.784 | 0.941 | 88 | 77.2 | Resnet-50 | 8 x A100 |
| 关联 | 0.780 | 0.937 | 56 | 49.4 | Resnet-50 | 8 x A100 |
| 关联 | 0.772 | 0.932 | 40 | 35.6 | Resnet-50 | 8 x A100 |
| 关联 | 0.766 | 0.927 | 32 | 28.7 | Resnet-50 | 8 x A100 |
| 关联 | 0.756 | 0.921 | 24 | 21.7 | Resnet-50 | 8 x A100 |
| 关联 | 0.738 | 0.908 | 16 | 14.9 | Resnet-50 | 8 x A100 |
| 关联 | 0.724 | 0.903 | 88 | 187.3 | Resnet-18 | 1 x A100 |
| 关联 | 0.713 | 0.899 | 56 | 119.4 | Resnet-18 | 1 x A100 |
| 关联 | 0.706 | 0.894 | 40 | 85.5 | Resnet-18 | 1 x A100 |
| 关联 | 0.700 | 0.889 | 32 | 68.9 | Resnet-18 | 1 x A100 |
| 关联 | 0.688 | 0.881 | 24 | 51.6 | Resnet-18 | 1 x A100 |
| 关联 | 0.669 | 0.868 | 16 | 35.0 | Resnet-18 | 1 x A100 |
训练自己的Imagenet模型!您可以使用我们的培训脚本和预制配置来训练上图上看到的任何模型。
我们还包括examples/目录中CIFAR-10上有效培训的预制代码,在单个A100 GPU上在36秒内获得了93%的TOP1精度(没有优化,例如Mixup,Ghost BatchNorm等,它们有可能进一步提高准确性)。您可以在这里找到培训脚本。

无论是否计算机视觉,FFCV都可以帮助您在各种资源受限的设置中更快地培训!我们的绩效指南对FFCV可以适应不同性能瓶颈的方式更详细地说明。
FFCV专注于删除数据瓶颈,而不是更改模型培训本身的各个方面,而不是更改模型培训本身的各个方面,从神经网络培训到线性回归,这都是一个问题。这意味着:
请参阅我们的入门指南,示例演练和代码示例,以了解入门有多容易!
快速数据处理而不会造成痛苦:FFCV会以极有效的方式自动处理数据读数,预取,缓存和在设备之间进行传输,以便用户不必考虑它。
自动融合和编译的数据处理:通过使用预编写的FFCV变换或易于编写自定义的数据处理,用户可以利用FFCV的编译和管道功能,它们将自动融合并使用NUMBA融合简单的Python Exumentations,并使用NUMBA将其安排到机器代码,并将其安排为避免加载损失。
从RAM,SSD或网络磁盘中快速加载数据:FFCV揭示了可以根据可用资源进行调整的用户友好选项。例如,如果数据集适用于内存,则FFCV可以在OS级别缓存,并确保多个并发过程都可以快速数据访问。否则,FFCV可以使用快速的流程级缓存,并将优化数据加载以最大程度地减少磁盘读数。有关更多信息,请参见《瓶颈医生指南》。
每GPU训练多个型号:由于完全基于线程的数据加载,您现在可以在同一GPU上进行培训多个模型,而无需任何数据加载开销。有关更多信息,请参见本指南。
用于图像处理的专用工具:上述所有功能同样适用于各种机器学习模型,但是FFCV还提供了一些特定于视觉的功能,例如快速的JPEG编码和解码,将数据集,存储数据集作为原始图像和压缩图像的混合物来交易I/o i/o的i/o盖帽和计算盖帽等等。