概要
- クラウドストレージ(Amazon S3)からアタッチするのが良い
- manifest.jsonlの生成までの速度は、おそらくディスクI/Oに依存している
CVATとは?
- CVATとは、intel謹製の画像・動画アノテーションツールです。CVATの説明についてはこの記事では割愛します。
たくさんの画像をアノテーションしたい
- 数万枚(~5MBを5万枚とか)の画像をアノテーションしたい、という課題がありました。
- Web上に上がっている記事を見る限り、これとかこれとかCVATそのものの紹介記事はあるのですが、GitHubの公式のissueを見ても、「えと、当方は数万枚とか一気に上げないといけないんですけど・・・」と良い記事が見当たらず、試行錯誤することになりました。ということで、この記事を書いて情報を共有する次第です。
環境
- CVATサーバ: CVATはEC2のインスタンスタイプr6i.2xlargeで運用。versionは2.2.0です。
- 前準備サーバ: 別途、manifest.jsonlを生成するためにEC2のインスタンスタイプc5.2xlargeを使用し、ここにcvatをcloneしてmanifestファイルを生成しています。
- 画像データの流れは、
- ローカルHDDからAmazon S3に画像数万枚の入ったフォルダをupload
- 前準備サーバでフォルダを作り、goofysでS3バケットをアタッチ。manifestファイルをS3バケット内で直接作成。
- あとは、CVATのGUIからS3をアタッチして、完了!
ボトルネック
- この作業でのボトルネックは、ローカル→S3へのアップロードでした。AWS CLIの設定値もいじったのですが、大して効果がありませんでした。
ssaitoh@ubuntu123:~$ cat ~/.aws/config
[default]
region = ap-northeast-1
output = json
s3 =
max_queue_size = 10000
max_concurrent_requests = 100
multipart_chunksize = 16MB
multipart_threshold = 64MB
max_bandwidth = 100MB/s
- manifest.jsonl自体は、時間がかかるとはいえ、EC2にS3をアタッチして7~8it/sは出ました。また、複数スレッドで別々のフォルダのmanifestファイルを作っても、特に速度低下はありませんでした。
- ローカル(MacBookPro 2019, 2.6 GHz 6コアIntel Core i7, RAM32GB)のSSD内に画像ファイルを置いてmanifest.jsonlを生成すると、10~11it/s程度だったので、こちらもディスクI/Oが原因なのかもしれません。
- 一旦S3に画像ファイルとmanifestファイルを上げてしまえば、CVATのGUI上でアタッチするのはあまり時間はかかりませんでした。3万枚程度でも、1〜2分で終わり、エラーが出ることはありませんでした。
なぜローカルフォルダから直接CVATに上げないの?
- 数枚〜数百枚程度ならおそらくGUI経由で行けるのですが、数千枚〜になるとCVATが500エラーや413エラーを返してきますし、その上一からやり直しになります。数千枚〜のオーダーで画像を上げる際は、Amazon S3経由をオススメします。
なぜローカルフォルダでmanifestファイルを作らないの?
- ファイルが合計で1TB以上もあり、とても自分のマシンの中に置いておきたくなかったからです。ファイルの実体は会社のサーバールームのファイルサーバにあり、私はリモートワークで100km以上離れたところにいるため、自分のマシンに持ってくるとVPN回線を圧迫します。
- そのため、サーバールーム内のLinuxマシンでS3にアップし、EC2でmanifestファイルを生成しました。
- なお、サーバールーム内のLinuxマシンでmanifestファイルを作ってもよかったのですが、こちらはファイルアップロードに専念してもらう、ということで役割分担をしました。
おわり