早送りコンピュータービジョン:アクセラレーションのデータ読み込みにより、数分の1のコストでモデルを訓練します!
[インストール] [QuickStart] [feature] [docs] [support slack] [Homepage] [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の礼儀、こちらがコンドラフリーのインストールに役立つ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データセットとWebDatasetsの両方を変換します):
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のトレーニング用の事前のコードベースを提示します。
イメージネットを速くトレーニングするための自己完結型スクリプトを提供します。上記のトレーニング時間と精度のフロンティアと、1 gpu ResNet-18および8-gpu Resnet-50のデータの速度をいくつかのベースラインとプロットします。
| configにリンクします | 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/ DirectoryでCIFAR-10で効率的なトレーニングのための事前のコードを含め、単一のA100 GPUで36秒で93%のTOP1精度を取得します(MIXUP、Ghost BatchNormなどの最適化なしでは、精度をさらに高める可能性があります)。ここでトレーニングスクリプトを見つけることができます。

コンピュータービジョンかどうかにかかわらず、FFCVは、さまざまなリソースに制約のある設定でトレーニングをより速くするのに役立ちます!パフォーマンスガイドには、FFCVがさまざまなパフォーマンスボトルネックに適応できる方法の詳細な説明があります。
既存のトレーニングコードのプラグアンドプレイ:モデルトレーニング自体の側面を変更するのではなく、FFCVはデータボトルネックの削除に焦点を当てています。これは、それを意味します:
開始ガイド、ウォークスルーの例、コードの例をご覧ください。
痛みのない高速データ処理:FFCVは、ユーザーがそれについて考える必要がないように、非常に効率的にデバイス間でデータの読み取り、事前フェッチング、キャッシュ、転送を自動的に処理します。
自動的に融合してコンパイルされたデータ処理:事前に書かれたFFCV変換を使用するか、カスタムの変換を簡単に書き込むことにより、ユーザーはFFCVのコンピレーションとパイプライニング能力を利用できます。
データをRAM、SSD、またはネットワークディスクから高速にロードする:FFCVは、利用可能なリソースに基づいて調整できるユーザーフレンドリーなオプションを公開します。たとえば、データセットがメモリに収まる場合、FFCVはOSレベルでキャッシュし、複数の同時プロセスがすべて高速データアクセスを取得することを確認できます。それ以外の場合、FFCVは高速プロセスレベルのキャッシュを使用し、データの読み込みを最適化して、基礎となるディスク読み取りを最小限に抑えることができます。詳細については、Bottleneck Doctor Guideを参照してください。
GPUあたりの複数のモデルのトレーニング:完全に非同期スレッドベースのデータ読み込みのおかげで、データロードオーバーヘッドなしで、同じGPUで複数のモデルを効率的にトレーニングすることができます。詳細については、このガイドを参照してください。
画像処理のための専用ツール:上記のすべての機能はあらゆる種類の機械学習モデルに等しく適用できますが、FFCVは、高速のJPEGエンコードとデコード、データセットの保存、I/Oオーバーヘッドと計算オーバーヘッドなど、生および圧縮画像の混合物としてデータセットを保存するなどの視力固有の機能も提供します。