分散深層学習の研究を行うために必要な知識な得るためのステップについて考える
2018年3月19日
UQ消化期間に突入したのでぼちぼち研究活動の前段階であるinputをかき集める作業に着手している。 が、その前に、分散深層学習に関する研究をするためにはどのようなステップが必要なのか考えねばなるまい。
研究すること
- ディープラーニングの学習および推論フェーズにおける計算機科学的な問題のどれかを解決する手法を提案する
- 計算機的な問題とは
- スループットの低さ
- 学習におけるスケールアウトの難しさ
- (ChainerMNのスライドとか見ると
モデル並列
とデータ並列
、および同期型
と非同期型
のアプローチの系統があるらしい
- (ChainerMNのスライドとか見ると
- NWボトルネック
- GPGPUの活用
- でもこれCUDA使う以外に何かできることあるんか?
現状
- パーセプトロン、多層パーセプトロンとしてのニューラルネットワーク、勾配、確率的勾配降下法、ぐらいまでしか人に説明できない程度の知識
- ディープラーニング界隈における最新の研究トピックは全然しらない
- ディープラーニングで解決できる課題に関してそれなりに知っているのはMNISTとパンダ画像の分類問題しか知らない
- 分散処理の知識も皆無に等しい
- c++はAtCoderの問題を解く程度のスキルしかない
- CUDA?OpenMP? MPI? なにそれ美味しいの?
4月中にやること
- ゼロからDeep Learningを熟読する
- 多分これがエンジニア脳には一番やさしい
- 深層学習本の知らないところだけを読む
- OSSのDLフレームワークに関する以下の項目を調べる
- スケーラビリティ
- ネットワークの実装スタイル
- パフォーマンス(これは実際に研究室のマシンで動かしたい)
- DLの代表的なベンチマーク的なアレを調べる
- MNISTでもいいがもう少し難しくてデータ量が多いのがいい
- いいのあった https://github.com/arXivTimes/arXivTimes/tree/master/datasets
- 一方でMapReduceを適用するケースについてもやりたいので手を付けておきたい
研究室訪問(1年ぶり)
2018年3月8日
余っているUQ*1のを使って研究室訪問した。前回研究室に来てから実に1年ぶりである。
serihiro-graduate-school.hatenadiary.jp
午前中は担当教授*2と研究の進め方について話し、午後は研究室の先輩に研究室用のメアドを作ってもらったりslackに招待してもらったりssh用の公開鍵を登録してもらったりした。
とりあえず、今年のスケジュールとしては10月に論文を一本どっかに出せることを目標とすることで進めることになった。逆算すると4月~7月でテーマを絞り込まなくてはならない。
思ったより短い感はあるものの、1日の間に使える時間は今よりも長くなるはずなので、スケジュール感覚も少しずつ学生のそれに合わせていかなくてはなるまい。今だと「何かを勉強する」というのは、仕事以外の時間でやるので1日2時間やれたらいい方かなという感覚だが、学生だと講義が1コマしかない日だと最低6時間程度は自由に使うことができるだろう。この辺のスケジュール感覚やペース感覚をまず覚えることが今年前半の課題にはなりそうである。
テーマについては、MapReduceの何らかのレイヤーでの処理の高速化手法について考えるということで大枠は決まったが、具体的なユースケースとして何のアプリを動かすか、というのが決まってなかった。他の論文だとよくWordCountを使っているのだが、それだとどうもパンチが効かないというか印象が弱いのであまり誰もやってないのがいいらしい。かつ、HPC上での実装が前提になるので、計算料が多いアプリケーションの方がよい。ということで、ボスの提案もあり、ディープラーニングをMapReduce、もしくはクラスタで分散環境で実行するケースにおける高速化を仮のテーマとすることにした。ニューラルネットワークは過去にゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装を読んで実装したことはあるが、ホントに基礎的なものだったし、そのあと丸1年以上触ってない関係でだいぶ忘れてしまった。*3
そのため、ディープラーニングを実装するとして、ディープラーニングの最近の研究トピックや、主流の実装方法については殆ど無知に近い状態である。そのため、まずはここからやらねばならない。入学式を経て、本格的に講義と研究が始まる前までにできるだけ事前に調査を行って、最低限研究室の鯖をいじれるようになったらすぐに着手できるようにしたい。
で、色々調べたところ、自分の研究主旨である「クラスタ上で分散実行」や「GPUを使って高速化」して実行するのに良さそうな、Deeplearning4jという、java実装のディープラーニングの実装フレームワークを使おうと考えている。*4
分散ディープラーニングと言えばChainerMNがあるが、DL4JはSpark, Hadoopとの連携(どのレベルの連携なのかまだドキュメント読み切ってないが)が可能であり、分散処理レイヤーとは切り離してディープラーニングの学習モデルを実装できる。これにより、分散処理レイヤーの差がどれぐらい実際に動作するアプリケーションのパフォーマンスに影響を与えるかを評価することができるような気がしている。
昨日、筑波から東京に戻ってから夜試してみたが、サンプルコードが豊富で、毎度おなじみMNISTもあるし、ドキュメントもそれなりに充実しているので、しばらくこれをいじってみようと思う。
あと、ディープラーニングについては日本語が出たばかりのこの書籍を買った。ちなみに原著はweb上で全文が公開されているという太っ腹っぷりなので、訳が怪しそうと思ったら原著を当たればよい。便利。
入学手続書類を出した
2018年2月21
当初の予定通り2月17日に入学手続書類一式が届いた。記入すべき書類の量に面食らってすぐには書く気にはなれず数日寝かせた。
手書きでもろもろ記入するのは大変だったが一通り書いて、午前休とって銀行と郵便局に行って入学金やらなんやらを払って郵送した。
これで入学に関する手続きは一通り終わったはずである。何事もなければあとは入学式に出てそのあとのオリエンテーションに出れば学生証とかもらえるはずである。
これで当日行ったらあなたの学生証ありませんとか言われたらウケる。
仕事の方も徐々に引き継ぎがメインになりつつある。今のチームのメンバーに迷惑をかけないように円満に最後を迎えたいものである。
引っ越し準備進捗
2018年2月4日
現時点での引っ越し進捗
- つくば市の不動産屋に何度か出向いて部屋を決めて契約した
- 今の部屋の退去の手続きをした
- 今の部屋の火災保険の解約手続きをした
- 引っ越し業者の手配をした
- 不用品を処分するための粗大ごみ回収の手続きをした
- 直前だと引っ越し用の段ボールの在庫がなくなるのが怖かったので段ボールを買った
- 電気と水道以外の各種インフラの引っ越し手続きをした(幸いなことに全部webで完結できている)
- 今使ってるジムの解約手続きをした(そういえばつくば行くと近所にジム無いなー)
- 研究室に手続きに必要な書類をいくつか書いて返送した
これからやる
- ベッドと照明器具を粗大ごみに出す
- アコギとサイレントギターを売る
- WiiUを売る
- いらない本を売ったりオフィスに置いて来たり人にあげたりして減らす
引っ越す度に物が減ってどんどん身軽になってきつつある。身軽になっていった方が何かと都合がよいと分かったのは3年前に半年の間に2回引っ越しをしたときだ。
身軽であることの良さは累積的に大きくなる。 一度ものが減ってスッキリした経験をすると、普段からいかにものを買わずに過ごそうかという気持ちになって、余計な出費は減るし、部屋は狭くならない。いらないものはすぐに捨てる。そうなるとますますスッキリする。ミニマリストを志向する人の気持ちが少しは分かるが、自分はスマホとmacbook proとHHKBとipodとkindleだけは何があっても手放せないので、真のミニマリストから見たら爆笑される程度のレベルにしか到達できないだろう。ミニマリスト道は厳しい。
自分の部屋は自分がPCをいじるための机と椅子が全ての中心で、そこで1日中過ごせるように設計されている。大学時代に一人暮らしをしていた時はこたつとか置いてたが、6畳程度の1kに住むようになってからはすっかりこのスタイルに慣れ親しんでいる。 本もなるべくkindleで買うようになってからあまりスペースを取らなくなった。服も靴も同じブランドのものしか身に着けなくなったが何も問題がない。
シンプルでよいのだ。多様性は自分のアウトプットだけにあればよい。
引っ越しに向けた準備を始めた
2018年1月3日
引っ越しはいつもgithubのissueでタスクを管理しているのだが、つくば市への引っ越しが近づいてきたので今回も立てた。
社会人になってからの引っ越しもかれこれ5回目ぐらいか。2~3年ぐらいで転職したり、転職せずとも地方でリモートワークしてみるとか色々と変なことをしていると引っ越しの回数が増える。面倒だが引っ越しはいろいろとリフレッシュできて良いものだ。
流石に慣れてきたもので、今回も引っ越す日から逆算して各タスクの手順とスケジュール感のメドがついている。しかし、今回は追加で国民年金加入手続きと関東ITSの任意継続もしなければならない。これは初めての経験だが、国民年金は市役所で手続きし、関東ITSの任意継続は書面をシュッと送ればシュッとやってくれるらしい。
近況
2017年12月29日
継続して Expert Hadoop Administration: Managing, Tuning, and Securing Spark, YARN, and HDFS を読み続けてるのだが、如何せんページサイズが多いのでなかなか進んでいない。
しかも1/4ぐらい読んで気づいたのだが、序盤はHadoopの基礎的な説明に終始していて、完全に飛ばしていい部分だった。それを頑張って1か月ぐらいかけて読んでいたのだが、結局全部知ってることだった。自分が知りたいのはHDFSの内部アーキテクチャやMapReduceの処理の詳細(できればHadoop2.x以降のYARN版)だったが、それらは後半以降にならないと出てこない内容だった。
英語の文書の場合、どうしても読むスピードが遅い関係で、自分にとって必要かどうかを判断するのが日本語の書籍と比べて相当遅くなるということを実感した。逆に、だからこそ目次を見て各章の最初だけをちょろっと読んで必要かどうかを判断していく読み方の方がいいのかもしれない。英語の勉強も兼ねて頭から読んでいたつもりだったが時間効率は非常によくなかった。しかもこの本は平易な語彙や表現だけを使うように意識してくれているのか、語彙力のない自分でもスラスラ読めてしまうので、勉強という面でもあまり向いてなかったかもしれない。
また、MapReduceの理解のために自分でRubyでMapReduceフレームワークを実装してみた。まだ完全ではないが、Map taskとReduce taskのソースコードの文字列をhttpでPOSTしてjobを登録し、map taskを1node, reduce taskを2nodeで実行して、結果をS3(またはS3互換ストレージ)に格納できるようになった。1
分散ファイルシステムのdata localityを無視すれば作るのは割と簡単だと思っていたが、node管理がなかなかに面倒だったり状態遷移が必要なことをすっかり忘れてたりして思ったより時間がかかった。(実作業時間で多分50時間ぐらい。当初は30時間ぐらいだと思ってた。)しかし1回作ってみることで分散システムにおける必要な要素を身をもって勉強できたので良かったと思う。
また、map taskを分散させるためには結局jobのinputとなる分散ファイルシステム上のファイルを分割して読み込む仕組みが必要だと気付いた。当たり前なのだが、これってHadoopではどうやってやってるんだろと疑問に思った。 例えば、HDFS中の1blockが128MBだとして、そこに1GBの単一ファイルを格納するとなると1000MB / 128MB = 7.8125 であり、8blockに分割されて格納される。しかし、MapReduceにおけるinputの1recordはdelimiter区切りであるため、blockの境界部分で1recordが2つのblockに分断されてしまうことになる。こうなると、境界部分のrecordは2つのblockをreadする必要があり、場合によっては別のdata nodeに格納されているdata blockをreadしにいかなくてはならなくなる。逆に、この処置をしない場合は境界部分の不完全なrecordは無視せざるを得ない。これをHadoop MapReduceではどのように解消しているのか気になったので調べてみた。
3は頻繁に発生すると別のdatanodeへのアクセスが頻発してパフォーマンスが低下するので、厳密な精度が要求されないなら2みたいな感じで中途半端なとこで切られるinputは捨てる前提でjobを設計するのが現実的な気がする。
— Kazuhiro Serizawa (@seri_k) 2017年12月23日
https://t.co/swi2qKGVsM 4年前なのでhadoop1.x時代の話だと思うけど、MapReduceはHFDSのdata blockとは別に論理的な分割単位であるInput Splitsを定義し、data blockの末尾のレコードが1block内に収まって無ければ次のblockの情報をInput Splitsに保持するらしい。なので3のようだ。
— Kazuhiro Serizawa (@seri_k) 2017年12月24日
mapreduce packageにあるLineRecordReaderは https://t.co/M1On0AgaQm を使って実装されてるがまたFileSplitに対するreadlineのアプローチが違う模様。明日読んでみるか。
— Kazuhiro Serizawa (@seri_k) 2017年12月25日
なお、HadoopのMapReduceのClientに関するソースのpackageは2種類存在する。mapredとmapreduceである。 詳細は下記のStackoverFlowの回答が詳しいが、mapredの方が古いpackageであり、commit logを見てみも現在積極的に機能追加されてるのもmapreduceのようだ。
MapReduceむずい
2017年10月30日
MapReduce実装としてHadoopの論文を2個ぐらい読んでMapReduce少しぐらいは理解できたかなーと思ってたけど、よく考えるとあれってどうなってんだ?とか俺の理解だと矛盾してるっぽい?みたいな箇所がちょこちょこ出てくることが多く、なんだかんだで「Hadoop MapReduceのこと、分かってるつもりだったけどよく分かってなかった」という結論になってきた。
Hadoop MapReduceは一時期爆発的な人気があったらしく、ネットを漁ると大量のチュートリアルや解説記事が見つかる。しかし、よくよく読んでみると、ある記事はバージョン0.20ぐらいを前提として書いていたり、またある記事は1.xだったりと、情報リソースによって書いてあることが色々と違ってたりする *1 すでにHadoopブームが去った2017年に、ネットの情報だけで体系的にHadoop MapReduceのアーキテクチャについて理解し、最新の情報まで知識を繋げていくのは結構難しいということが分かってきた。こういう時に有料の論文掲載サイトで論文読み放題だとよいのだが。。
なので情報リソースは一旦この本に絞ることにした。
- 作者: Sam R. Alapati
- 出版社/メーカー: Addison-Wesley Professional
- 発売日: 2016/11/29
- メディア: Kindle版
- この商品を含むブログを見る
出版が2016年11月と比較的最近であることと、作者は本を書くためにHadoopを勉強した人とかではなく、実務でHadoop clusterを6年間運用してきた人物であることから、比較的正しい理解が得られそうな気がしたというのが選定理由である。
あとはHadoopの公式tutorialがある。かなり長いがこれ以外に今のところ信用できるhadoopの最新のdocumentはなさそう。
*1:のだが、日付が書いてないことが多くて意外と気づかない