seri::diary

日常

会社員辞めて入学した大学院修士課程がそろそろ終わろうとしているのでまとめておく

これは何か

2018年3月に仕事を辞めて,2018年4月に筑波大学大学院システム情報工学研究科コンピュータサイエンス専攻博士前期課程(修士課程)に入学したのだが,もうすぐ修了なので大学院生活を忘れないうちにまとめておくだけのエントリである.修了自体は2020年3月だが,あとは修論を仕上げて提出すれば終了なので研究自体はもう実質終わっている状態である*1

筆者について

2009年3月に岩手大学農学部を卒業.新卒で上流系SIerに就職して2年半ぐらい勤務した後に,コード書きたくてwebアプリエンジニアに転向.その後,6年半ぐらいweb受託,webサービス運営企業などでソフトウェアエンジニアとして勤務.2018年3月に仕事を辞めて,2018年4月に大学院に入学した.詳しい入学の経緯は以下のエントリを参照.

serihiro.hatenablog.com

なぜ大学院に入ったのか

上のエントリと重複するが,簡単に言えばCS (Computer Science)を勉強したいと思ったからである.学部は農学部で,プログラミングは会社員になってからほぼ独学で勉強して,上流系SIerからweb屋にキャリアチェンジしている.そのため,きちんと体系立てられたCSの勉強をした機会が一切無かった.

CSが具体的に何を指すのかすら入学時点では良くわかってなかったが,それとは別に具体的な問題意識として,業務で解決できないパフォーマンス問題に遭遇するケースがたまにあって,そういうものをHWのスペックに頼らずにソフトウェアで解決するための基礎力を身に付けたいという動機があった.そのための道筋として,優秀なエンジニアが大体みんな口を揃えて「重要である」と語る「CS」をちゃんと勉強して,自分のスキルの幅を増やしたいというのが動機である.最終的には,プロジェクトやキャリアの選択の幅を広げることが目標だった.初めからMaster取ったら再就職する予定で,Ph.D.まで取ってアカデミアにキャリアチェンジしようとは思っていなかったし,実際,修了後は都内で再びソフトウェアエンジニアとして勤務し始める予定である.

CSの基礎知識はパタヘネに書いてあると思い込み,前職で輪読会をやったりして同僚と読んだりしたが,どうにもどの知識がどう役立つのかが分からない問題があった.「知識」ではなく「具体的に使える知恵」として昇華させるには,CSの研究を実践している場に行って学んで来るのが早かろうと思った次第である.詳しくは上のエントリに譲るが,ちょうど資金的にも親から少し借金すれば何とかなるぐらいの目処がついていた時期だった.

日本の大学院という場所について

日本の大学院を修了した方ならすでにお気づきだろうが,自分は入学時点で大きな思い違いをしていた.

それは「日本の大学院は勉強する場所ではない」ということである.何をする場所かといえば「研究をする場所」であり,「大学院生は研究室に所属して研究する人」という扱いである*2.つまり,何かを学ぶためにゼロからやってくる場所ではなく,必要な知識や技術は所有している前提で,その上で研究をする場所である.
なので,その事実が正しければ「CSを勉強したことないから日本の大学院行って勉強する」というのは誤った行動である.もちろん,大学院生はプロの研究者ではないので,その前提で扱われる.しかし,自身の研究によって対外的な成果が明確に求められる存在でもある*3.実際,自分の所属研究室でも多くの学生が国内外で対外発表をしている.

そういう環境なので,「自分は研究はそこそこやって,後はやりたい勉強を優先する」とはいかないのである.そういう「修論以外の研究はやりたい学生だけが頑張ればいい」という研究室もあるのかも知れないが,自分の場合はそうではなかった.仕事のように毎週ミーティングで進捗を共有する義務があるし,国内外の対外発表のタイミングが近づいてくれば「誰が論文を投稿できそうか」という話題がミーティング上の議題となる.入学前の自分は,研究で対外発表ができるほどの成果が出せるとは思っていなかったし,ちゃんと修了できればそれでいいぐらいにしか思っていなかった.また,指導教員とも入学前にこの辺の認識合わせをしていなかったため,入学後にこの実情を知り,若干面食らったというのが本音であったりする.

さて,そういう環境下において「CSを勉強する」ことを目的として入学したマヌケな自分はどう過ごしたかといえば,平日の日中は研究をして,夜や土日に図書館や自宅でやりたい勉強をしていた.時間の使い方だけ見れば会社員時代の仕事が研究にそのまま置き換わったような感じではあった.だが,研究と自分の勉強したい内容はある程度オーバーラップしていたので「プライベートの勉強に加えて研究からも勉強する」という体制が確立できていた.この辺は研究テーマの選び方次第という感じがするが,完全に違うジャンルだったらプライベートでの勉強が「完全なただの独学」となってしまい,効率がかなり下がっていて厳しかったと思う.オーバーラップしていたお陰で,勉強していて分からないこととか本の選び方等を研究室の学生や指導教官に質問できるのでこれはありがたかった.

プライベートで勉強したことを直接研究に反映できたかというと若干怪しいのだが*4,その逆として研究での実装作業を通じて学んだことは多かった.Pythonでの並行・並列プログラミングの難しさとか*5,用途に合わせた性能計測の仕方とか,再利用可能なshell scriptの書き方とか*6,Rのggplot2を使った見やすくてアカデミアでも怒られないマナー*7を守ったグラフの書き方とか.当初勉強したいと思っていたことをすべて消化できたかというとそんなことはないのだが,それでも自分が知らない知識や知見を得られるのはなんでであれ重要なので,いい経験になったと思う.英語の論文を読むことに一切抵抗がなくなったのも良かった.

CSについては色々と勉強した結果,「解決したい問題に対して最適な既知のアルゴリズムを選ぶ,もしくは自分で考案することが,コンピュータを効率よく使うための基本的かつ一番重要なアプローチ」ということが分かってきた,というか自分が一番苦手なのその部分だと分かってきたので,最近は競技プログラミングで修行している.*8

f:id:serihiro:20190523084807j:plain
研究室における筆者の作業スペース.ディスプレイがやたら余っていたので2台借りていた.PCはMacBook Pro (Retina, 13-inch, Mid 2015).

大学院での研究内容について

筑波大学大学院ではHigh Performance Computing System研究室に所属した.文字通りHigh Performance Computing,つまりスパコン*9に関する技術研究をする研究室である.

なぜこの研究室を選んだのかといえば,自分はもともとwebエンジニアで,現場で遭遇するパフォーマンス問題は大体が大規模なデータ処理に関するものだった.そのため,大規模データの処理に関する研究をする指導教官がいる研究室を選んだ,というのが動機となる.あとスパコンは当時の自分の知識体系からは最も遠い場所にある存在で,かつ民間企業,特にベンチャー企業では触れる機会がほとんどないもの,というイメージが強かった*10.なのでせっかくだし触れてみようと思った.

研究テーマとしては深層学習の訓練処理の高速化について取り扱った.深層学習を選んだのは「HPC + 深層学習(の中でも訓練処理)」の研究が2018年春の当時でトレンドになり始めており需要がありそうだったのと,自分自身がもともと統計や機械学習に興味があり多少独学で勉強していたので取っつきやすかったためである.

最初の研究は「深層学習の訓練処理中のGPUをプロファイルしてGPUの負荷がサチるギリギリのミニバッチサイズを見つける研究」というものである.これは事前調査でChainerのCIFAR100+VGG16のサンプルスクリプトを回してGPUの負荷状況をプロファイルしたところ,一般的なローカルミニバッチサイズである16や32で回すとGPU(P100とV100で実験)が相当遊んでいた事実に起因するネタだが,研究テーマがなかなか決まらなくて苦しみ続けてM1秋の修論中間発表*11の2週間ぐらい前にギリギリで思いついた思い出深い研究である.この研究自体は一度HPC研究会で発表はしてみたものの,実用性の問題とその後の研究の発展性が思いつかなかったことからそれっきりで終わってしまった.しかし,ImageNet 1-K (ILSVRC 2012のtrainデータ)を訓練データとして使用すると,CPU側での処理時間がボトルネックとなり,ミニバッチサイズを上げてもGPU側の負荷は断続的にしかかからず,結果的に訓練処理中のGPUのアイドル時間はCIFAR100を使った時と比べて相当長くなっている事実を発見した.これが次の研究につながった.詳細は以下を参照.

serihiro-graduate-school.hatenadiary.jp

先の研究が終わってから,指導教官は分散ファイルシステムやI/O最適化が専門なのでアドバイスを受けやすいその路線で何かいいネタはないかと先行研究をサーベイした.そして見つけたのが「訓練データのreadの高速化」というテーマだった.例えばEntropy-Aware I/O Pipelining for Large-Scale Deep Learning on HPC Systemsのように,大規模な訓練データを訓練プロセスに高速にfeedさせるための手法が提案されていた.訓練データのread自体はワークロードやHW環境に性能が強く依存するタスクなので,特定のケースに限定すればまだ何とか自分が手を付ける余地がありそうだ,と思った.

そんなこんなであれこれ考えて手法を思いついて実装して評価して論文にした結果,最終的にshort paperながらも国際会議に通せた.詳細は以下を参照.

serihiro-graduate-school.hatenadiary.jp

serihiro-graduate-school.hatenadiary.jp

自分の発表実績

査読付き国際会議のProceedingsが1本(short paper),査読なし国内研究会のProceedingsが2本というのが自分の最終的な実績である.多分もう増えないと思う*12

客観的に見て多いのか少ないのかは分からないが,B4の卒業研究からではなく,M1の4月からノープランな状態から研究ネタを考え始めた事実を考慮すればまぁまぁではなかろうか.理想を言えば,M1の6月ぐらいにテーマを決定して,12月のHPC研究会に一本出してM2の6月ぐらいには国際会議に投稿できるぐらいのペースで進めたかったが,実力不足で思うようにはいかなかった.

  • 査読付き国際会議

    • Kazuhiro Serizawa and Osamu Tatebe. 2019. Accelerating Machine Learning I/O by Overlapping Data Staging and Mini-batch Generations. In Proceedings of the 6th IEEE/ACM International Conference on Big Data Computing, Applications and Technologies (BDCAT '19). ACM, New York, NY, USA, 31-34. DOI: https://doi.org/10.1145/3365109.3368768
  • 査読なし国内研究会

大学院生活について

上述したように平日は研究室に行ったり講義を受けたりして,土日は主に自宅にいる生活をしていたので生活リズムは会社員時代と大して変わらなかった.寧ろ夜遅くまで仕事をしなければいけないという制約が無くなったので,以前よりも規則正しい生活となった.大体23時には寝て6時半ぐらいに起きる生活であり,7.5時間睡眠が維持されている.

一方で会社員時代から変わったこともある.それは経済活動で,要するに収入がガッツリ減ったので趣味とかに使えるお金がかなり制限された.まぁ初めからそれを分かっていたのだが,会社員時代には金額を気にせずに買っていた本が買えなくなったのは結構厳しさがあった*13.あと旅行に行けなくなったとか,東京の勉強会・技術カンファレンスに気軽に参加できなくなったりとか,趣味にお金をかけられなくなったのも痛かった.本はなるべく図書館で借りるとか東京行ったときにまとめて立ち読みすることで対応していたが,息抜きがうまく出来なくなってストレスが溜まっていた一時期は結構しんどい思いをしたりもした.そのためお金をかけない息抜きとして大学構内を毎日30分近く散歩することが新たな趣味となった.程よい運動になって良いのだが,生活水準が一気に下がると結構なストレスになる事実を身を以て学んだ次第である.

f:id:serihiro:20191121132812j:plain
筑波大学の北側はこんな感じの道が敷地の周囲に存在するため散歩するには丁度良かった

あとは,仕事をしなくなったので,誰かと一緒になにかをするという機会が殆どなくなったという変化がある.そのため,誰かと何かの問題を議論したり,相談を受けたり,逆に相談したり,というインタラクティブなコミュニケーションの量がかなり減った.指導教官と1 on 1をすることはあるが,仕事のそれと比べるとその機会は圧倒的に少ない.自分は一人で黙々と作業するのは得意というか好きな方だとばかり思っていたし実際そうだと思うのだが,それと同じぐらい他人とコミュニケーションをしたり何かを一緒にやることが好きだったようなので,その片方が無くなったので寂しいと感じた.大学院での教育として研究をしている側面もあるので,他の学生と協力してやる訳にもいかない部分があるため仕方ないのだが,この辺は長期的に開発のバイトとかをしていればもしかしたらカバーできたかもしれない.M1の夏に参加したトレジャーデータでの2ヶ月間のインターンが終わった直後に特にこの寂しさを感じたので,長年仕事してきて,仕事における他人とのコミュニケーションがいつの間にか日々の心の支えにもなっていたのかも知れない.

serihiro.hatenablog.com

おわりに

本エントリは,社会人学生 Advent Calendar 2019 というアドベントカレンダーを今日(2019/12/7)偶然見つけて,まだ埋まっていない日があったので,せっかくだから自分も書いて埋めようと思って書き始めたところ,書いてる間に枠が埋まってしまったのでアドベントカレンダー関係なくただ公開しただけのポエムである.

自分の場合,働きながらではなく仕事を辞めてガチ無職になり入学しているので,一般的な社会人学生としての苦労はほとんどなかったように思う*14.なので働きながら大学院に進学することを考えてる人が読んでもあまり参考にはならないと思われる.参考になるかもしれないのはフルタイム大学院進学を検討しているB3, B4あたりの学生かも知れない.

*1:終了に必要な単位はM1の時にすべて取ったが,趣味でM2の秋学期にも1個だけ講義を取っていたりする

*2:ここで「日本の」と書いたのは,海外の大学院だとCSコースでも研究室への所属や修論の執筆が義務化されていない場合があるためである

*3:これは自分の研究室におけるケースでありすべての研究室がそうであるとは限らない.

*4:プライベートではC++だとか数値計算の最適化だとか並列化とかコンパイラだとかアセンブリだとかニューラルネットの推論の最適化とかを勉強したり実装したりしていた

*5:multiprocessing.Queueはデフォルトだと中身が空にならないと親プロセスが終了しなくてジョブが終了しないままスパコンのポイントを浪費するとかそういう落とし穴をたくさん踏み抜いた

*6:スパコンの場合,ジョブスケジューラから指定できるのは1ファイルのshell scriptだけみたいな事が多いので,用途に応じて複数のshell scriptをloadしてタスクを構成して再利用できるようにしたりした

*7:軸の数値は必ず原点は0にするとか軸の対数・実数は揃えるとか凡例はグラフの中に書くとかのマナーが多い

*8:余談だが競プロ参戦記録などを記録するためのブログを最近始めた https://serihiro-competitive-programming.hatenablog.jp/

*9:「2位じゃダメなんでしょうか」でお馴染み

*10:今はAWS, GCPなどでもメニーコアCPUやGPU付きのインスタンスが利用できるようになったのでそのハードルはかなり下がったように思う

*11:筑波大のCS専攻生向けに書いとくと「CSセミナー」である

*12:BDCAT '19ではshort paperでacceptされたので,最初に投稿したfull paperの供養をどうするかと考えている程度である

*13:会社員時代は技術書やビジネス書や漫画の購入に毎月1万円程度使っていた

*14:住民税と任意継続した社会保険の初年度の支払いで苦しんだぐらいである