背景
LAION-5B 出た!(50 億枚の画像とテキストペアのデータセット)
これで自前環境で Stable diffusion 学習とかしたい...
だいたい 300 TB に収まるようです.
ストレージについては Chia farming などで 1 PC あたり 100 TB くらいの環境はそろえている...
(TiB だと 90 TiB くらい...)
/dev/sda2 2.7T 2.5T 76G 98% /mnt/chia-000
/dev/sdb 13T 13T 75G 100% /mnt/chia-001
/dev/sdc 7.3T 6.9T 27G 100% /mnt/chia-002
/dev/sdd 7.3T 6.9T 27G 100% /mnt/chia-003
/dev/sde 13T 13T 75G 100% /mnt/chia-004
/dev/sdf 7.3T 6.9T 27G 100% /mnt/chia-005
/dev/sdg 13T 12T 20G 100% /mnt/chia-006
/dev/sdh 7.3T 6.9T 7.4G 100% /mnt/chia-007
/dev/sdj 7.3T 6.9T 27G 100% /mnt/chia-009
/dev/sdk 7.3T 6.8T 68G 100% /mnt/chia-010
/dev/sdl 13T 12T 21G 100% /mnt/chia-011
/dev/sdm 3.7T 3.6T 41G 99% /mnt/chia-008
これが 3 ノードあれば 300 TB は用意できます!
とはいえまだ img2dataset とか使ったことないので, まずは LAION-400M(4 億枚の画像)でお試ししたい...
情報
画像データは URL のリストです.
img2dataset で webdataset 形式(実体は tar で固めたもの)にするのが推奨されています.
400M で 256x256 にリサイズして webdataset 形式にして, だいたい 10 TB のようです.
12 TB の HDD x 1 に収まりますが, 読み書き速度が 100 MB/s と仮定すると, ダウンロードはいいのですが,
学習などしたいときに読み出しだけで全部アクセスするとなると 27 時間かかってしまいますので, 複数ディスクに分散がよいでしょう.
mdadm などで raid を組む必要はなくて, tar ファイル単位で分散でよいはず. webdataset(のローダー)ではディレクトリ階層つくったりで管理できるかしらん?
準備
まずメタデータあたりを落とします. CLIP のデータが 1 TB, その他のデータが 0.3 TB くらいで 1.3 TB くらいいります.
こちらは SSD に落としておきます.
the eye
はスポンサーでなんかサーバー提供してくれているっぽ?
aria2c "https://the-eye.eu/public/AI/cah/laion400m-met-release.torrent"
https://the-eye.eu
のサーバー具合や, プロバイダー, ルーターの P2P 対策にもよります. 筆者環境では 5 MB/s くらいしかでませんでした 3~4 日くらいの ETA になりました.
https://deploy.laion.ai/ もありますが, 執筆時点(2022/10/19)では the eye
のほうが速いかも?
aria2c
今回ではじめてしりましたが wget or curl みたいなもので高速(並列)ダウンロードできました!
curlやwgetの数倍速い 爆速ダウンローダー aria2を使う
https://qiita.com/TokyoMickey/items/cb51805a19dcee416151
parquet ファイル
メタデータなどは parquet 形式のファイルになっています.
こちらも今回ではじめてしりましたが, CVS をいい感じにした感じのデータベース(?)フォーマットなのですね.
画像圧縮形式
webp 100 %(ロスレス) が推奨でしょうか.
(自作)画像ローダーなどが webp 対応していない場合は jpg でしょうかね.
高精細(e.g. 1024x0124)で画像扱いたい場合は PNG がいいかもしれません.
ただ, png はエンコードとデコード遅いです.
fpng https://github.com/richgel999/fpng を使うとよいでしょう
(python binding https://github.com/richgel999/fpng/issues/18 )
インターネット速度
100 Mbps ~ 1 Gbps(10 MB/s ~ 100 MB/s)でしょうか.
HDD
だいたい 100 ~ 200 MB/s です.
SSD
だいたい 1~3 GB/s でますが, ダウンロードにおいてはインターネット速度に律速されます.
まずは laion-face (2TB) でお試し.
Chia plotter 用に調達した 3 TB NVMe SSD(3 GB/s くらいでる)があるので,
/dev/nvme0n1 3.5T 239G 3.3T 7% /mnt/ssd-001
これを利用してまずは laion-face https://github.com/rom1504/img2dataset/blob/main/dataset_examples/laion-face.md をお試しダウンロードしてみます.
img2dataset で変換すると
基本は手順通りです. parquet metadata が 20 GB くらいあります. aria2 でもいいですがこれくらいなら wget で十分かもしれません.
DNS
筆者環境(Ubuntu 20.04)では, img2dataset
を素で走らせたら, DNS クエリがたくさん発生するのか DNS resolve ができなくなっていまいました...
ubuntu では最近はデフォルトでは systemd-resolved で, これがリクエストをさばききれなくなっているようです
にあるように, knot dns と bind9 の設定をします!
(TODO: 再起動したら設定もどっちゃうかもなので persistent な設定をさがす)
しかしそれでも DNS が止まる... ルーターかプロバイダーの DoS 対策が働いていたりするんじゃろか
いろいろためして, やはりルータかどこかで DNS クエリ大量発生でさばききれないのか, 帯域使いすぎなのがわかりました.
スレッド数などかなり減らしてなんとか動くのを確認しました(それでもやはり他 PC での接続が悪くなる).
laion-face ダウンロードに三ヶ月くらいかかった
三ヶ月くらいちびちびダウンロードして, なんとか laion-face 2TB ダウンロードできました.
success rate は 85% くらいでした.
LAION-400M ダウンロードは回線考えないと無理っぽですね.
国内で DNS クエリばしばししても制約かからない VPS を探して(AWS などの帯域課金されるところだと帯域代だけですごいことになるので), それを proxy にして, データはまとめて手元に QUIC なり ZSTD 圧縮で転送とか?
Face detection データ
いつの間にか face detection のデータが取得できるいようになっていました.
pytorch ファイルで, hugging face にアップロードされています.
中身としては顔 bounding box, 5 点 landmark, confidece のようです.
TODO
- VPS 側でダウンロードリクエスト処理させて(DNS query など), ダウンロードデータは ZSTD 圧縮あたりして nc/socat あたりで手元環境に転送される方法を見つける