seri::diary::graduate_school

大学院修士課程での研究生活について書いています

第168回HPC研究会で口頭発表してきた

2019年3月14日

すでに先週のことなのだが、3月5日から3月7日の間に開催された第168回HPC研究会という研究会にて口頭発表をしてきた。

f:id:serihiro:20190306124203j:plain
会場兼宿泊場所の旅館「瑠璃光」。朝食も夕食もご飯が美味しかった。

何気に初めての学外での研究発表ということになった。査読なしの口頭発表、しかも研究会なので、プロの研究者から見たら大したことのない場なのかも知れない。実際、何回も発表してる「常連」のような雰囲気の人も多く、聞いてる方もずいぶんリラックスしているように見えた。しかし、入学以来、学外での研究発表が初めての自分にとっては十分緊張するに値する機会であった。

今回発表したネタは深層ニューラルネットワークにおける訓練高速化のための自動最適化というもので、内容的にはChainerで実装したModelで実際にforward/backwardを実行して、処理時間とか訓練処理中のGPUの利用状況をプロファイルして、1 epochの訓練をできるだけ高速化するミニバッチサイズを見つける最適化スクリプトをChainerのExtensionとして実装したよ、という話。

今回の発表のために実装したコードは取り急ぎGithubに上げてある。まだドキュメントを一切書いてないのだがこちらについてもちゃんとドキュメントを書いて別のブログ(seri::diary)の方で紹介したい。

github.com

これを使うと、例えばChainer付属のCifar100+VGG16のサンプルスクリプトだと、「V100が刺さってるマシンだとミニバッチサイズ196ぐらいが1 epoch当たりのforward/backwardの処理時間がいい感じに早くなるミニバッチサイズだよ」ってことを自動で判定してくれるやつである。モデルの精度は全く見ておらず、単にGPUを使い切る当たりを狙ってミニバッチサイズを調整する、という感じである。得られた最適値をそのまま使うというより、GPUを使い切るにはこれぐらいのミニバッチサイズになるということが分かるので、そこから精度に影響しない範囲でサイズを調整するとか、精度改善のために学習率を調整するとかバッチ正則化層を入れるなどの、マニュアルチューニングを入れた上で使用することを想定している。

f:id:serihiro:20190314223512p:plain
得られた最適値で実際に1 epoch訓練したときにかかった時間を計測してみた結果

ちなみに今回はCifar100 + VGG16で試した限りではミニバッチサイズ196でも32や54と比べてさほど汎化性能に影響はなかった。たまたまであるが。

f:id:serihiro:20190314224949p:plain
Cifar100 + VGG16でバッチサイズを変えて100 epoch訓練したときのmain/validation accuracy

この研究のモチベーションとしては、なぜかミニバッチサイズってどの論文でもモデルに関係なく32とか64を使っていて、それが本当に最適なのかが気になったのと、そういうミニバッチサイズで1 GPUをちゃんと使い切れるかどうかというのが気になったというの2つの理由がある。

この研究の結論としては、V100なんかが刺さってるマシンだとCifar100 + VGG16みたいなトイデータだとバッチサイズは32や64からは明らかに大きくできる余地があった。一方でImageNet-1k(224x224にcropしたもの)だとデータのロードやpngからndarrayへの変換処理などの処理時間と思われる、GPUを使わない時間帯が多く存在し、GPUが「遊んでいる」時間帯が1 iterationごとに1秒ほど存在しており、ミニバッチサイズを増加させてもなかなか性能改善につながらないということがわかった。ChainerのImageNet-1k + ResNetのサンプルだと、この問題を回避するために非同期でデータをロードするMultiProcessIteratorを使用している。

じゃあMultiProcessIterator使えばいいじゃん、でこの話は正直言って終わりなのだが、逆に言えばMultiProcessIteratorのような機構がない場合は、画像サイズが32x32から高々224x224になるだけで随分とGPUの利用が阻害されるという問題が簡単に起きるということを示している。これは一般的に知られているんだかいないんだか分からないが、安易に訓練データのサイズを上げることの影響は予想以上に大きいということを示唆しているという点でそれなりに意味のある発見。。なのではないだろうかと勝手に思っているのだが、どうなのだろう。周りに深層学習ガチ勢がいないのでちょっと分からない。ガチ勢が集まる場所で聞いてみたい。

とりあえず今回の研究発表はこんな感じであり、会場からはいくつか質問もいただいて、最低限伝えたいところは伝わったようなのでホッとしている。このOptimizerのコードはそのうち公開する予定である。高々数百行で作れるExtensionなので、自分の書いた原稿を読めば誰でも作れそうなモンであるが、一応ちゃんと動くものができたのでそれはそれで意味があるのではないだろうか。

初めて対外論文書いて気づいたこと

2019年1月27日

  • 論文の結論が客観的に説明できるレベルで明確になる前にとりあえず応募してはならない
    • 指導教官に論文出せと言われても、論文の要旨を専門外の人間に説明できるレベルで明確に説明できないような状態では絶対に応募すらしてはいけない。
    • 書いてる途中に問題に気づいて時間が足りずに論文にまとめられない可能性すらある
    • 今回はギリギリなんとかなったがヤバかった
    • 指導教官は専門外の研究者の目線でレビューしてくれるので積極的にレビューを依頼して分かりにくい説明を潰していく
      • 今回は投稿締め切りの10日前、20日前にWIPレビューを依頼している
  • グラフの作成は死ぬほど時間がかかる
    • グラフは普段から論文に貼って一般公開できるクオリティのものを作り込んでおく
    • ggplot2でグラフ書くにしてもMakefileとかでコマンド一発で最新化できるようにしておく
    • 今回はグラフの見た目の試行錯誤の時間が長かったのでRmdにしたが、今後元データやファイルが増えたらCLIから実行できるようにしたほうが良さそう)
  • 論文の文章を書くのは信じられないほど時間がかかる
    • 今回の論文、texファイルの1日分(実作業時間7時間程度)のdiffを調べたら、2段組pdfにしたときの行数で30行程度しか変更がなかった日もあった
    • 研究している自分にとっては完全に常識になっているようなこともゼロから説明する必要があるケースが多いというかほとんどなので、前提知識を確実にかつ端的に説明する方法を身につける必要がある
  • 自分がやってる研究がソフトウェア論文に近くなると気づいた段階から、論文にそのままコピペできるクオリティの説明文を進捗MTGの時点で書いておくべし
  • 進捗MTGのために研究結果をまとめたり説明スライドを作るのではなく、そのまま論文にコピペできる文章を積み上げていくスタイルに変える
  • とにかく普段から論文を積み上げていく習慣を身に着けないといけない
  • そうしないと論文は書けない
  • いくらブログを書いていても客観的な視点で書かれた読みやすい文章は書けない

煙に巻いているような気分になる

2019年1月17日

HPC研究会に投稿するための論文を書いているが、どうにも自分で書いている論文の説明がどんどんキナ臭く感じてしまい、なかなか筆が進まずにいる。

やる気がでない言い訳とかではなく、どんな風に書いても批判やツッコミが来そうだなという感情が湧いてきてしまい、不安になる。論文なんてのは本来、査読でボコボコに叩かれて生き残ったものだけがカンファレンスで日の目を見られる世界なのだろうから、人に見せる前から批判を恐れている場合ではないはずである。しかし、それにしても自分からみても大した内容ではないことが分かっているため、どうにもそれをちゃんとした研究であるかのように説明することに積極的になれないでいる。

そもそも良い研究とはなにか?ということも良くわからない。良いソフトウェアとは何か?という問いに答えがないように、恐らく答えがない類の問いなのだろうけど、実装したコードの行数とか実験にかけた時間とか、そういう定量的なもので測れるものではない以上、良くわからなくなってくる。別段、自分は研究者になるつもりは全くないので出来が良かろうが悪かろうが今後の人生に及ぼす影響は大きくはないだろうけど、今やるべきことが研究しかないため、それについて成果が出ないというのは自分自身の否定であるかのような心持ちになる。実際、弊研究室では研究成果が全てである。引いては大学という場所がそもそもそういう場所であり、やはり研究を志した人間だけが大学という場所に来るべきなのではなかろうかという、散々自問した問題にまた回帰してしまう。

2019年について

2019年1月1日

初日の出を総合研究棟Bの10階で拝んでそのまま研究室で作業していた。作業が一区切りついてあとは計算ノードさんよろしくお願いしますという感じになったのでブログを書いている。

今日は年初ということもあり、2019年の目標というか予定みたいなものを整理しておきたい。

今年のペース配分

  • 1月〜6月に研究に集中してそれ以降はサボってても卒業できるようにする
    • 単位についてはM1で受講した講義の単位が全部取れてれば卒業要件 + 11単位になるので、M2は一切講義に出なくても卒業できる
  • そうすると8月,9月にインターンに行く時間も取れるし就活の時間も取れる
  • 今年投稿するであろう研究会はおそらく168回HPC研究会とSWoPP2019の2つぐらいだが両方とも今年前半なのでやはり前半線が勝負
  • 10月以降は心穏やかにやりたい勉強をしながら修論をまとめたい
  • 就職先は10月ぐらいまでに決めておくのがベストなのでそう考えると6月ぐらいから就活しておきたい所存

未来予測

1月

2月

  • 第168回HPC研究会の論文投稿締切りが2/5なのでそれまでに提出する
  • 発表スライドを作って内部発表する
  • 確定申告を行う

3月

4月

  • M2の間は集中講義以外の講義は基本取らない予定なので研究を進める
  • PFNのインターン応募が確か4月末とかの締切なので応募するなら応募する

5月

  • 研究を進める
  • SWoPPが例年だとだいたい5月ぐらいに応募締切らしいので投稿できそうなら応募する

6月

  • 研究を進める
  • この辺から就活するかという気もするが急ぐ必要はないのでゆっくりやる
  • 下旬ぐらいから修論中間発表の準備をしたほうがいい

7月

  • 修論中間発表がある。ネタが2つあるのだがどちらで書くことになるのかは良くわかってない。
  • 例年だとSWoPPが7月末〜8月頭らしいので応募してたら参加する

8月

  • インターンにいくなら多分この辺から行くんだろう
  • そうでなければ研究を進める

9月

  • 研究を進める

10月

  • 何事もなければこの辺で研究は終了にして修論作成に着手する
  • でもM2の人見てると結構ギリギリまで研究活動したり学会発表したりしてるのでいつ修論作成に着手するかは全くわからん
  • あとこの辺で就職先決めとかないと厳しそう。なんかこのぐらいの時期に進路調査票みたいのを書くイベントもあるらしいし。

11月

  • さすがに修論書いてるやろ

12月

近況

2018年12月7日

今年も残す所あと僅かであり、秋学期ABの講義期間も間もなく終わりを迎えようとしている。
秋学期ABが終わって、願わくば今受けてる講義すべてで単位が取れれば修了要件を満たすことができるため、もう講義を取る必要がなくなる。 今のペースだと必要単位数+10単位ぐらいの単位を取って修了するペースである。多分取りすぎであり、おかげで毎日のように課題のコードを書いたり専門外の論文を読んだりレポートを書いたりしている。

講義が終わったらあとは修論を仕上げるために研究に勤しむだけなのだが、入学前に思っていたよりも、多くの講義はあっさりというか簡単だったという印象である。

もっとエグい実装や論文読みを課せられる講義があるのかと身構えていたのだが、殆どの講義でそんなことはなく普通にやってれば終わってしまうような課題ばかりだった。*1 特に実装関係はホント簡単だったのでこれでいいのかという気持ちなのだが、まぁ好きで書いてる人は放っておいても書けるようになるし、研究で書く必要がない人は全く書かないし、、みたいな感じなので、実装力は重要視してないのかもしれない。この一年で自分が課題で書いたもっとも複雑なコードはrubyで500行ぐらいで書いたマルチプロセスで動作するMapReduceフレームワークのコードぐらいで、短いものだと多分10行ぐらいの穴埋め問題的なやつを書いて動作確認しただけだと思う。それ以外でも入門書のサンプルコード程度である。

このような講義を受けてきて最近思うのは、世に出ている日本語の入門書というのは実はすごく充実しているのではないかということである。自分は社会人になってから書籍に頼って勉強してきたワケだが、それらのその辺の本屋で買える入門書はとても実用性が高いものだったのではないかと感じるようになった。つまり、大学の講義レベルの内容を読むだけで学べるぐらいには良い内容の本がその辺の本屋に売っている、といっても過言ではないのかもしれない。世の中のCS専攻を出ていないエンジニア達よ、技術書を買って勉強すれば基礎分野なら十分CS専攻卒と張り合えるぞ、多分。

一方で、講義で扱わなければ恐らく一生読まなかったであろう本に出会えることもあり、こういうのはきっと大学の講義固有の価値なんだろうなと思う。
秋学期に並列システムアーキテクチャに関する講義を取っているのだが、そこで教科書として使っている本は自分にとってまさに「知らないこと」を学べる一冊だった。

Introduction to Parallel Computing

Introduction to Parallel Computing

自分は並列システムというと、マルチスレッド/マルチプロセスの実装の仕方みたいな話しか知らなかったのだが、そもそもなぜ並列化が必要なのか?という話から始まり、インストラクションレベルの並列化、つまりパイプライン、スーパースカラに代表されるプロセッサレベルの技術から解説される。ソフトとハードの両面でどのような技術が用いられて並列に動作するシステムが実現できているかを解説している。
この本の特徴として、メモリバンド幅がどれだけパフォーマンスに影響を与えるかという話をあらゆる例題を用いて説明している。一貫して「メモリシステムはCPUよりはるかに遅い」ということを繰り返し主張している。具体的には「1サイクルでアクセスできるL1キャッシュと100サイクルでアクセスできるメモリがあって、キャッシュヒット率が10%落ちるとプログラムのレイテンシがどれぐらい落ちるか」といった感じで、具体的なスペックを示したシステムを例として読者に考えさせている。
この辺の考え方はうっすらと知っていた程度で、具体的な数値について考えたことがなかった。しかし実際に計算してみることでどれぐらいキャッシュミスがパフォーマンスに影響を与えるかということがよく分かる。これは独学でやっていたら恐らく手をつけなかった、というより、この手の話は日本語だとちゃんと解説されている本が少ないと思われるので出会わなかったかも知れない。そういう意味でこの本はここで読む機会を持つことが出来てよかったし、実際キャッシュヒット率を意識した実装は重要である。単純な1000x1000ぐらいの行列同士の積を二重ループで求めるようなシンプルな処理でもキャッシュヒット率が下がると露骨に処理時間が長くなるのは他の講義でも体験した。

*1:もちろんエグい課題がある講義もあったが全体で見れば1割ぐらいである

10月が異常にしんどかった理由とその考察

2018年11月13日

8月,9月のインターンが終わり、間髪入れずに10月から大学の秋学期が始まり講義と研究に取り組む日々が再開した。 自分の専攻では10月〜1月にかけてM1の学生が毎週交代で各自の修論について説明する講義がある。要するに修論中間発表的なものである。

この中間発表のためにはある程度固まった研究方針と成果が必要なのだが、自分は大学院に入ってから今の研究を始めたこともあり全く成果がなかった。春学期は前提知識の勉強、先行研究のサーベイと細々とした実験結果しかなく、人前で話せる成果が何もない状態だった。

一方で、自分よりも順番が早い他の学生の発表を聞いていると、学部から同じ研究を続けている人が多いということもあるだろうがある程度の成果と進捗のある内容を発表していた。すでに学会で何度か同じ内容を発表している学生も結構いた。別に気にせず自分が何の成果も出していないことを堂々と発表すりゃいいのだが、自分は完全に自信をなくしてしまった。というより、思っていた以上に通常想定されている以上に進捗がなく、大きなビハインドを抱えていることをここに来て初めて痛感した。春学期の講義でまぁまぁ良い成績が取れたので浮かれていたような所もある。しかし日本の大学院というのは研究で成果を出さなければ卒業できない訳で、やはり肝心の研究で何の成果も出ていないという事実は自分にとってかなり痛手であった。

結果的に、11月頭の自分の発表では、修論として何とか事足りると思われる研究方針を決定して、それを中心に今までやってきた先行研究のサーベイや事前評価の結果、及びその考察について発表することが出来たのだが、10月中は本当に精神的にきつかった。自分はこの段階で何の進捗も出せていないのなら、4月から一体どんな変化があったというのか。仕事を辞めてまで一体何をしていたのか。そういう感情に支配されて何もやる気が出ず、その上取っていた複数の講義のレポートの〆切がいい感じに同じ時期に集中したりして完全に参っていた*1

結果的にこの修論中間発表が終わったことで多少気が楽になり、また何とか形にしようとアレコレ考え抜いたお陰で修論になりそうなアイデアを思いつくことができた。まだどうなるかは分からないが、最終的にはChainerにハイパーパラメータの最適化機能を持つようなTrainerクラス実装する予定である。この辺はある程度形になったらまた別途書きたい。まずはCuPyを拡張してnvmlのメソッドをpythonから呼べるようにしなければならないのでcythonについて勉強している。

*1:寝不足でフラフラになりながらも全部締め切り前に提出した

なぜ今つらいのかを分析してみる

2018年10月19日

最近とても精神的につらい。

精神的につらいせいなのかどうかは分からないが肉体の方も疲労感が抜けなくなり、あらゆる生産性が落ちてる。
このままではいかんと早めに休息を取ったり休める時は家で寝ているようにしているのだがそれでも改善しない。
季節の代わり目で肉体の方が先にやられてそれにつられて精神もやられている可能性があるが、因果関係はともかく今の精神状態についてつらつらと書いてみる。なお、これは将来見返してハハッワロスと楽しむために書いているのでそこまで心配せぬよう。

続きを読む