Deep Learningで人気の分散ファイルシステムは？

# DFSの種類多すぎない?
・遅いDFSを導入して400万枚の画像読み込むジョブが永遠に終わらない！
・テラバイト級のデータセットを扱ってたらHDDが埋まった！

そんな悩みはありませんか？
とは言っても最適なDFSを選ぶのは簡単ではないですよね。

僕のケースでは、Wikipediaのリストには大量のDFSが羅列されており、読もうとして脳のメモリがオーバーフローしました。
どれがDeep Learningに向いてるかぱっと見判断できないので、リスト上のDFSに関してGoogle検索のヒット数で調査してみました。

これはDeep Learningと一緒にヒット数が多いDFSはdeeep learningで人気があったり、知見が多く共有されているはずだ、という仮定に基づいています。

# 集計の方法
今回は分散ファイルシステムについてdeep learning分野における人気度を調査しました。
方法はGoogle検索で「DFSの名前」＋「deep learning」とクエリを打ち、
検索ヒット数を単純に合計し集計しました。


# 結果概要

**Lustre, GlusterFS, IPFS, HDFS, Ceph, Quantcast File System, MinIO**
などが上位にランクインしました。Lustreの人気は目を見張るものがあります。

https://docs.google.com/spreadsheets/d/19mKkBgfJoObe7gVIsKCZWLDLRNpNx7GpxAlIjgT8JQ0/edit?usp=sharing

Googleドキュメントに集計結果まとめてあるので参考にしてください。

![スクリーンショット 2021-05-24 20.41.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614389/12398675-3186-39e3-7a73-26c34b994220.png)

上位から5番目までメンバー紹介していきます。

# 上位DFSのサマリー
## 1. Lustre
「Lustreしか勝たん」とHPCクラスタの世界では王道中の王道のようです。
約２０年もの間開発されてきた長い歴史があり、DFS界のいわば山下達郎という感じでしょうか？

> The Lustre® file system is an open-source, parallel file system that supports many requirements of leadership class HPC simulation environments. Whether you’re a member of our diverse development community or considering the Lustre file system as a parallel file system solution, these pages offer a wealth of resources and support to meet your needs.

Wikipediaでもこんな記述があります。
> 世界の最も高速なスーパーコンピュータシステム100のうちの60以上で採用されている

https://ja.wikipedia.org/wiki/Lustre_(%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0)

スパコン界のデファクトスタンダードになっており、ドキュメントや蓄積された知見なども豊富そうなので、Deep Learningでスーパーコンピュータを構築したい人はLustreを検討してみてもいいのではないでしょうか。

後日、使ってみて感想を述べたいと思います。

## 2. GlusterFS

https://www.gluster.org/

私が初めて触ったDFSがGlusterFSです。
**しかし、Deep Learningで本当に使い勝手がいいかと聞かれると、疑問です。**
セットアップなどが簡単なためか検索結果が多いですが、**Deep Learningで大量のファイルを扱うのには向いてないと感じました。**

### セットアップやスケールが簡単
セットアップは簡単で、ノードを増やすのにも手間はかからないお手頃DFSなためか、そこそこ人気があります。
**認証系のセットアップとかしなくてもTCPでノードを繋いでくれる優しいDFSです。**
モードにはReplicated（レプリカを作る）, Distributed（ファイル単位で分散）, Striped（特定のデータの塊単位で分割）などがあります。DistributedやStripedを使えば、簡単に容量を増やせます。例えば、1TBノードが100個あれば、簡単に100TBほどの論理的なボリュームを作成できます。Stripedは一つノードがぶっ壊れれば、全体がぶっ壊れます。Distributedはそうなっても、ぶっ壊れてないノードのファイルにはアクセスできます。Replicatedは名前の通り冗長にしてくれるので、安心度が高いですが、ボリューム容量が限られます。

ちなみに、Distributedだと、ファイル名のハッシュ値で保存するノードが決定されるため、大体全体のファイルサイズをノード数で割れば、それぞれのノードに最低必要な容量が見積もりしやすいです。

Ansibleのプレイブックなども公式で提供されているため、ありがたいですね。

### 大量の小さいファイル達の扱いは苦手
しかし、実際に私がテストしてみたところ、**小さいファイルがテラバイト級にたくさんある場合には使い物にならないレベルで遅いです。**
そのような環境ではlsやlinuxコマンドがいちいち非常に遅いです。ファイルをディレクトリに分けるとかしたらマシになるかもしれませんが。
1GBとかのファイルならそんなにローカルHDDとreading speedは遜色ありませんが、テラバイト級になると**ぴえん＆ぱおん**です。
ネット上にも同様の報告が報告されてます。
**.zarr**とかで小さいファイルをまとめて使って試してみたらパフォーマンスは改善されるのでしょうか？
機会があったら試してみます。

https://zarr.readthedocs.io/en/stable/

## 3. IPFS

Blockchain, Transfer Learningと一緒のヒット結果が多いです。
一般のニューラルネットで人気なのかどうかは正直わかりませんでした。

Blockchain関連の結果が多いのは、IPFSを用いた暗号通貨"Filecoin"があるためだそうです。
>Filecoin is an open-source, public cryptocurrency and digital payment system intended to be a blockchain-based cooperative digital storage and data retrieval method. It is made by Protocol Labs and builds on top of InterPlanetary File System, allowing users to rent unused hard drive space.

おそらく、Filecoin関連の結果のせいでヒット数が多くなって、上位に来てしまったのかもしれませんね。


## 4. HDFS

https://hadoop.apache.org/docs/r1.2.1/hdfs_design.html

Hadoopは名前はよく聞きますし、名前がかっこよくて覚えてしましました。
こちらもGlusterFS, Cephと並んでベンチマークが比較されている印象です。

こちらの論文のAbstractでは大量の小さいファイルでのパフォーマンスが悪いというHDFSのデメリットが指摘されています。ただ、この問題は他のDFSでもよく言われることのようなので、HDFSだけがパフォーマンスが悪いわけでななさそうですね。

> However, in deep learning datasets, the number of files is huge but the file size is small, making HDFS suffer a severe performance penalty.

https://www.sciencedirect.com/science/article/abs/pii/S1383762120301028

この派生版としてHopsFSなるものがあるそうで、かなりパフォーマンスがいいそうですが、RAM最低要件が32GB以上で途中で調べるのを諦めました。RAMが有り余ってる方は詳細をみてみてはどうでしょう？以下の記事では激推しされてるようです。

https://www.logicalclocks.com/blog/hopsfs-100x-times-faster-than-aws-s3

https://www.logicalclocks.com/blog/why-you-need-a-distributed-filesystem-for-deep-learning




## 5. Ceph
使ったことはないけどGlusterFSと比較されるDFSの代表格です。GlusterFSをCephFSに変えたらパフォーマンスが向上したという記事をよく見かけます。ベンチマークでも、GlusterFSよりReading speedは早いという結果を見かけます。

セットアップは鍵の設定が必要だったりと、GlusterFSよりは面倒かもしれませんね。（Gluster FSが簡単すぎる）
よく見かけますが、触ったことないので、違いうちに試してみます。

https://docs.ceph.com/en/latest/install/

Ansibleのプレイブックなども公式で提供されているため、ありがたそうですね。
後日、使ってみて感想を述べたいと思います。

# 感想
Google検索では似てる単語の検索結果もヒット数に含まれるため、必ずしもこの記事は正確とは限りません。
"Hadoop" "deep learning"など、Must Includeのクエリを含めて検索してみると、より良い結果が得られるかもしれませんね。

DFSは多種多様で、一つ一つの詳細をみる時間はないので、有名どころから優先的に試してみるというやり方は効率がいいと思いました。
試してないDFSがいっぱいあるので、また試してみたら記事にしようと思います。

読んでいただきありがとうございました！