快速計算機視覺:以加速數據加載的成本的一小部分訓練模型!
[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蓋帽和計算蓋帽等等。