LAION-400M(4 億枚の画像とテキストペアのデータセット)をダウンロードして管理したいメモ(なんかダウンロード無理っぽそう)

# 背景

LAION-5B 出た!(50 億枚の画像とテキストペアのデータセット)

https://laion.ai/blog/laion-5b/

これで自前環境で 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 億枚の画像)でお試ししたい...

## 情報

https://laion.ai/blog/laion-400-open-dataset/

画像データは URL のリストです.
img2dataset で webdataset 形式(実体は tar で固めたもの)にするのが推奨されています.
400M で 256x256 にリサイズして webdataset 形式にして, だいたい 10 TB のようです. 

https://github.com/rom1504/img2dataset

https://qiita.com/tttamaki/items/4dc981a7da02e88029a1

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 くらいしかでませんでした :cry:3~4 日くらいの ETA になりました.

https://deploy.laion.ai/ もありますが, 執筆時点(2022/10/19)では `the eye` のほうが速いかも?



### aria2c

https://aria2.github.io/

今回ではじめてしりましたが wget or curl みたいなもので高速(並列)ダウンロードできました!

curlやwgetの数倍速い 爆速ダウンローダー aria2を使う
https://qiita.com/TokyoMickey/items/cb51805a19dcee416151

### parquet ファイル

メタデータなどは parquet 形式のファイルになっています.

https://www.databricks.com/jp/glossary/what-is-parquet

こちらも今回ではじめてしりましたが, CVS をいい感じにした感じのデータベース(?)フォーマットなのですね.


### 画像圧縮形式

https://github.com/rom1504/img2dataset#encode-format-choice

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 ができなくなっていまいました... :sweat_smile: 

https://endy-tech.hatenablog.jp/entry/systemd-resolved-basics

ubuntu では最近はデフォルトでは systemd-resolved で, これがリクエストをさばききれなくなっているようです

https://github.com/rom1504/img2dataset#setting-up-a-knot-resolver

にあるように, knot dns と bind9 の設定をします!
(TODO: 再起動したら設定もどっちゃうかもなので persistent な設定をさがす)

しかしそれでも DNS が止まる... ルーターかプロバイダーの DoS 対策が働いていたりするんじゃろか :thinking: 

いろいろためして, やはりルータかどこかで DNS クエリ大量発生でさばききれないのか, 帯域使いすぎなのがわかりました.
スレッド数などかなり減らしてなんとか動くのを確認しました(それでもやはり他 PC での接続が悪くなる).

## laion-face ダウンロードに三ヶ月くらいかかった

三ヶ月くらいちびちびダウンロードして, なんとか laion-face 2TB ダウンロードできました.

success rate は 85% くらいでした.

LAION-400M ダウンロードは回線考えないと無理っぽですね.
国内で DNS クエリばしばししても制約かからない VPS を探して(AWS などの帯域課金されるところだと帯域代だけですごいことになるので), それを proxy にして, データはまとめて手元に QUIC なり ZSTD 圧縮で転送とか?

## Face detection データ

いつの間にか face detection のデータが取得できるいようになっていました.

https://github.com/FacePerceiver/LAION-Face

pytorch ファイルで, hugging face にアップロードされています.

中身としては顔 bounding box, 5 点 landmark, confidece のようです.

## TODO

* [ ] VPS 側でダウンロードリクエスト処理させて(DNS query など), ダウンロードデータは ZSTD 圧縮あたりして nc/socat あたりで手元環境に転送される方法を見つける