빠른 전진 컴퓨터 비전 : 가속화 된 데이터 로딩으로 비용의 일부로 모델을 훈련시킵니다!
[설치] [QuickStart] [기능] [DOCS] [Support Slack] [HomePage] [용지]
관리자 : 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의 제공, 여기에 콘다가없는 설치에 도움이 될 수있는 dockerfile이 있습니다.
..../opencv/build/x64/vc15/bin to path 환경 변수를 추가하십시오..../libjpeg-turbo64/bin to path 환경 변수pthread/include/pthread.h 열고 아래 코드를 파일 상단에 추가하십시오. # define HAVE_STRUCT_TIMESPEC..../pthread/dll to path 환경 변수를 추가하십시오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 데이터 세트 및 웹 다타 타자를 모두 변환) :
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 배포에 대한 자세한 내용 가이드는 여기를 참조하십시오.
그리드딩에서 벤치마킹, 빠른 연구 반복에 이르기까지 더 빠른 모델 교육을 원하는 많은 이유가 있습니다. 아래에서는 (a) 확장 가능한 코드베이스 및 (b) 수많은 미리 미트 훈련 구성을 포함하여 Imagenet 및 Cifar에 대한 교육을위한 미리 메이드 코드베이스를 제시합니다.
우리는 Imagenet을 빨리 훈련하기위한 독립적 인 스크립트를 제공합니다. 위의 우리는 훈련 시간 대 정확도 프론티어 및 1-GPU RESNET-18 및 8-GPU RESNET-50에 대한 데이터로드 속도를 몇 개의 기준선과 함께 표시합니다.
| 구성 링크 | top_1 | TOP_5 | # epochs | 시간 (분) | 건축학 | 설정 |
|---|---|---|---|---|---|---|
| 링크 | 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 정확도를 얻습니다 (믹스 업, 유령 배치 노르름 등과 같은 최적화 없이는 정확도를 더욱 높일 수있는 가능성이 있습니다). 여기에서 훈련 스크립트를 찾을 수 있습니다.

컴퓨터 비전 여부에 관계없이 FFCV는 다양한 자원으로 제한된 설정에서 더 빠르게 교육을받을 수 있습니다! 우리의 성능 가이드는 FFCV가 다양한 성능 병목 현상에 적응할 수있는 방법에 대한 자세한 설명을 가지고 있습니다.
기존 교육 코드를 사용한 플러그 앤 플레이 : 모델 교육 자체의 측면을 변경하는 대신 FFCV는 데이터 병목 현상을 제거하는 데 중점을 두어 신경망 교육에서 선형 회귀에 이르기까지 모든 곳에서 문제가됩니다. 이것은 다음을 의미합니다.
시작 가이드, 예제 연습 및 코드 예제를 참조하여 시작하는 것이 얼마나 쉬운 지 확인하십시오!
통증이없는 빠른 데이터 처리 : FFCV는 장치간에 데이터 읽기, 사전 가져 오기, 캐싱 및 전송을 매우 효율적으로 처리하여 사용자가 생각할 필요가 없습니다.
자동 융합 및 컴파일 된 데이터 처리 : 사전 작성된 FFCV 변환을 사용하거나 사용자 정의 변환을 쉽게 작성하면 사용자는 FFCV의 컴파일 및 파이프 라인 방지 능력을 활용하여 NUMBA를 사용하여 기계 코드에 간단한 Python 증강을 자동으로 융합하고 컴파일 할 수 있으며,로드 지연을 피할 수 있도록 예약합니다.
RAM, SSD 또는 네트워크 디스크에서 데이터를 빠르게로드하면 사용 가능한 리소스를 기반으로 조정할 수있는 사용자 친화적 인 옵션을 노출시킵니다. 예를 들어, 데이터 세트가 메모리에 맞는 경우 FFCV는 OS 레벨에서 캐시를 캐시하고 여러 동시 프로세스가 모두 빠른 데이터 액세스를받을 수 있습니다. 그렇지 않으면 FFCV는 빠른 프로세스 레벨 캐싱을 사용할 수 있으며 데이터로드를 최적화하여 기본 디스크 판독 값을 최소화합니다. 자세한 내용은 병목 현상 의사 가이드를 참조하십시오.
GPU 당 여러 모델 교육 : 완전히 비동기 스레드 기반 데이터로드 덕분에 데이터로드 오버 헤드없이 동일한 GPU에서 여러 모델을 효율적으로 교육 할 수 있습니다. 자세한 내용은이 안내서를 참조하십시오.
이미지 처리를위한 전용 도구 : 위의 모든 기능은 모든 종류의 머신 러닝 모델에 동일하게 적용 할 수 있지만 FFCV는 빠른 JPEG 인코딩 및 디코딩과 같은 비전 관련 기능을 제공하고, 데이터 세트를 원시 및 압축 이미지의 혼합물로 저장하여 I/O 오버 헤드 및 오버 헤드를 계산하는 등의 혼합물을 제공합니다.