seri::diary::graduate_school

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

近況

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日

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

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

続きを読む

秋学期始まった && つくば温泉 喜楽里別邸に行ってきた

2018年10月7日

秋学期が始まった。そこまで積極的に取りたい講義はないのだが、並列分散に関する輪講と同じ研究室の先生がやっているHPC系講義は受けといた方がよさそうなので受けることにする。あとはデータベースに関する講義とかシスプロの演習とか。正直シスプロの演習は、講義カリキュラムを見ると思ってたより基礎的で簡単そうというか、過去に自分が勉強のために写経していたコードとあまり変わらないような気もしたが、定期的にCでコード書いてないと忘れそうなのでそのトレーニングだと思って受講することにする。

秋学期の山場はどちらかといえば修論の中間発表に該当する講義で、自分の発表について論文形式でまとめて学生と教授陣の前で発表しなければならない。今の所、何の成果も出ていない自分としては何を書けばいいか皆目分からず、課題背景と関連研究の説明に終始するような感じになりそうである。それで単位出るんだろうか。出来が悪いと発表やり直しになるという厳しいものである。筑波大学は基本的に研究者としての教育を第一に考えているようで、修論に関係するイベントは出席率やレポートの評価含めてとても厳しく行われている。

さて、前回の日記を読むと週末ごとに有意義(笑)なことを〜とか書いてあるので、とりあえず昨日の夜に研究学園駅の近くにある温泉に行ってきた。

www.yurakirari.com

正直な感想として、1,200円という、タオル付きであることを差し引いてもちょっと高い入場料の割にはまぁ普通といった感じであった。内風呂、露天風呂ともに広くないせいで、土曜日ということもあってかめちゃくちゃ密度が高いし、サウナも広くはなかった。

以前よく行っていた、埼玉県七光台市の七光台温泉や、川崎の志楽の湯の方が設備もコスパはよいのだが、つくば市からでは遠すぎて、交通費を合わせると1,200円を超えてしまうためトータルのコスパを考えるとこの温泉に通うのが良さそうである。まぁサウナと水風呂があるからまぁいいかという感じではある。会計時にクレカが使えるのも外国人には優しいのではと思う。

2018年4月-8月を振り返って思ったこと

2018年9月12日

インターンの業務でアメリカのカリフォルニア州マウンテンビュー市に滞在し始めて今日で10日になる。10日もいれば些細なトラブルにも直面するもので、プリペイドsimで取得した電話番号に変な間違い電話がかかってきたり、バスが時間どおりに来なくて遅刻しそうになったり、同僚と英語で1on1してもらっても全然会話できなかったり。ちなみに普段の会話は多分半分は聞き取れていないが、聞き返しまくったり前後の文脈から全力で類推してかろうじてコミュニケーションが取れているような状態である。米国に滞在することはインターン参加前から分かってたのだから英語を少しは勉強しとけばよかったものを、期末テスト&レポートラッシュを乗り切った安心感からか7月は腑抜けてしまい全く英語学習をしなかった。そのせいか大分苦労しているが、一方で自分の英会話スキルの低さを身を以て体感することができ、多分今英語を勉強するモチベーションは非常に高まっている。いや、ホントね、なんか会話できないと申し訳ない気持ちでいっぱいになるし、英語をペラペラ喋ってる日本人の同僚がめっちゃカッコよく見えるし、絶対「英語」で「会話」ができると人生の幅が広がるなと思うに至っている。日本にいる時は英語の論文やライブラリや言語のdocumentが読めればそれで事足りてしまうのだが、どうも会話のスキルは(当たり前だが)個別に磨かない限り中学生レベルで止まったままになるということがよくわかった。

なんの話を書こうとしたのか。そうか春学期の振り返りである。

成績

まず単位は一通り全部とれた。具体的な評価で言えば、現時点で成績が明らかになっている講義についてのみ内訳を記載すると下記の通りである。

評価 講義数
A+ 3
A 3
B 3

半分以上がA以上なので恐らく悪くはないのではないだろうか。*1他の人の成績がどんなもんなのか分かってないので比較はできない。

ちなみにCまでは単位が付与されDが不可である。A+は講義を受ける前から知ってる話題が多かったので取れたという気がする。Aは知らない話題が多かったが普通に講義受けてたら取れたという印象。Bは露骨に提出物の出来が悪かった、ということなのだろう。なんのフィードバックも得られないので改善しようがなかったりするのであまり気にせず、後から振り返った時に自分が苦手な分野としての目印ぐらいに思っておけば良い気がする。

研究

Chainerの使い方を覚えたり実際にGPU積んだマシンクラスタでデータ並列学習を試してみたりと良い経験はできた気がするが、具体的な成果は今の所何もない状態である。ヤバい。関連論文もそれなりに読んだが「自分の」研究になりそうなものはまだ決まっていない。

指導教官がストレージやI/Oパフォーマンスの最適化とかが専門なのでそれに近いことをテーマとしてやった方が指導は受けやすいのだろうけど、一方でGPUのI/Oパフォーマンスの最適化にも興味がある、というか実際自分がChainerでConvLSTMのモデルを回す時に時間がかかりすぎて困ったのが訓練データのCPU<->GPU間のtransferだったので、この辺を最適化する方法について興味がある。ただ、探しても関連論文が見つからず、唯一見つけたのは、Ideinが開発しているラズパイに最適化されるコンパイラでCPUとGPU間のデータ転送を最小化する最適化をやっている事例である。

ascii.jp

これと同じことがChainerでもできないだろうか、というのが最近考えていることであるが、とりあえずは読むように指示されている論文があるのでそれを全部消化するのが先かという状態である。いずれにせよ秋学期は早々に具体的な成果を出すために動き出さなければならない。

プライベート

全く生活に余裕がなかったため殆ど何もしてなかったように思う。

1回だけreject kaigiというRubyKaigiで応募したトークが採択されなかった人たちの集まりみたいなやつに参加したぐらいで、あとはtechカンファレンスや勉強会の類には顔を出していない。あとはインターンの面接で東京に何度か行ったぐらい。この数ヶ月ほとんどつくば市から出てすらいなかったのではないだろうか。その分大学の講義やら研究活動はちゃんとやっていたということの裏返しでもあるのだが、こういう過ごし方は久々である。東京にいると大抵のイベントが電車で数十分、しかも殆ど待たずに乗れる、という程度の移動コストで行けてしまうのでホイホイ出掛けてしまいがちであるということを再認識した。つくばからだとまず駅に行くまでに下手すると30分とかかかるため、そこからさらに1時間かけて東京まで出ようとも思わないという事情もある。

結果的に休日は勉強してるか引きこもってスプラトゥーン2やってたりニコ動観たり平日にブクマしたサイトを読んで1日が終わるみたいなことが多く、生産的でなかったように思う。この辺を反省し、たまには興味のあるイベントに顔を出したり、後述するが自分の勉強を計画的に進めるように改善していきたい。

個人的な勉強

この辺が大分ヤバいのだが、全くと言っていいほどやっていない。いや大学の講義が勉強と言ってしまえばそうなのだが、仕事していた頃にやっていたようにd言語を勉強するとかelectronでチャットアプリ作るとかそういう全然関係ないことを全くできていないことに気づいた。。やりたいことをまとめてgithubのprivate repositoryのissueにまとめていたりするのだが全然消化できていない。原因としては大学生活で余裕がなかったからというのもあるが、やはり明確な期限を設けてなかったからのような気がする。先に述べた「やりたいことリスト」みたいなやつもざっくりとクォーター単位で期限をつけてみたが見事にスルーしてしまった。今リストを見返すと以下のようなものが列挙されている

Cのsubset compilerはrui ueyamaさんの9ccをcommitの古い順から写経して四則演算ができるぐらいまでは再現したりとかしてるのだが、インターンで平日は1日8時間程度働いていることも相まって完全に止まってしまっている。

github.com

これはちゃんともう少し細かいスケジュールを切って勧めていきたい所存。特にNFSRFCをざっと読むと作れそうな雰囲気を感じるのでいろんな言語でこれを作ったら言語の勉強にもなるのではないかと思っている。一度作ったら多分他の言語で作るのはかなりハードルが下がるはずである。

総括

学生生活はまぁまぁちゃんとやっていたように思うが、余暇の過ごし方がちょっとまずかった。いつまでも部屋に引きこもってスプラトゥーンだけではマズいのである。その辺反省しつつ、土日も有効活用するようにしていきたい。

TRY

急にKPTっぽくなった。まずは毎週末ごとに自分の勉強や、何か有意義っぽいことを1個でもやって、それをこのブログに書いてみることにする。とりあえず今週はApple Park Visitor Centerに行ってみるのだ。

*1:少なくとも「可」「良」「優」「秀」の4段階評価で「良」と「可」だけで埋め尽くされた学部時代よりは良い気がする

卒業後の進路について

2018年8月21日

最近はインターンで毎朝6時30分に起床して東京に行き、23時には寝る規則正しい生活をしている。勤務先が東京なので大体ドア2ドアで片道1.5時間はかかっている。新卒の頃の通勤時間に匹敵するが、幸いつくばエクスプレスの末端同士の駅を利用するため、座って通勤できるのでまだラクだ。新卒の頃は1時間近く立ったまま紙の本や新聞を読むとかしていたが、あれが平気だったのはまだ若かったからだろう。

電車の中ではpc開いて何か作業しようと思っていたのだが、とてもじゃないがpcを開いていられないほどの混雑ぶりのため1日目にして挫折した。変わりにkindleでずっと本を読んでいるのだが、久々に読んだこの本が面白かった。

70年代頃から2010年代頃までの仕事に対する価値観の推移や年齢構造の変化などを例に挙げた上で、2010年代以降の働き方を提案する内容となっている。作者の主張として面白いと思ったのが「40代を境に仕事人生を2分する」というもので、40代以降の生き方について改めて考えてみようというもの。「とにかく転職しろ!」「企業しろ!」みたいな極論一辺倒の論調の本も最近は増えているが、そうではなく「本当に自分がやりたいことは若いうちの方がやりやすい。だからできるうちに(精神的/体力的にキツくなる前に)やりたいことをやれる働き方を考えてみてはどうか。もちろん今の自分の働き方を続けるのがベストという結論ならそのままでもOKやで。」というもので、とにかく考えることを読者に求める。これはものすごく大事だと自分は思う。実際に経験しなくても想像するだけでも色々と気づきはあるもので、自分なんぞは「もし自分がgoogleに入ったら何ができるか」「エンジニアじゃなくなったらどうするか」みたいなことばかりをよく妄想しているが、それそれでいろいろと気づくことがある。

この本を読みながら卒業後の進路を考えるなどしている。卒業はたかだか1年と7.5か月後であり、実際に研究に使える時間のリミットはM2の12月が限界だろうから実際には1年と4.5である。そしたらまた働きに出なければならない。正直、今の時間は休暇期間だとは全く思っていないので、卒業後に1か月ぐらいフラっと出かけたいという気持ちもあるが、一方でお金がないという現実もあり、ガチ無職期間を経ずに働かなければならない状態である。

卒業直後の2020年4月では34歳になっている。どんなに無理しても決して若者に分類されることはない見事なオッサンである。そこから何をやるか。インターン先ではそれなりに年数を経て大規模になったコードをメンテしているが、年齢的には今のところは全く衰えを感じていない。それどころか、コードを読んで全体構造を理解するスピードや、どこから手をつけるべきか当たりを付けて、適度な粒度のタスクを積み上げて一個ずつ潰していく能力は働いていた頃と同じか、当時よりも上がっているような気すらする。とすると、コードをガリガリ書くおじさんとしてはちょうど今ぐらいの年齢が能力的にピークなのかもしれない。なので34歳になってももう少しの間は「コードガガリおじさん」でも食っていけるのかもしれない*1

しかし、個人的には卒業したら全くやったことがない仕事をしてみたいという思いもある。とはいってもソフトウェアの領域であるため1年もやれば「よく知ってる領域」になってしまう可能性もあるのだが、少なくとも、卒業後5年間は今は全くやったことがない領域をやりたい。で、40歳になった時に「webサービスのバックエンド系開発に関すること全部」と「それ以外の領域」で2本柱を持てるようになりたいと考えている。40歳以降もガリガリさんが必要ならガリガリさんをやるが、若者の育成や組織の開発体制の強化にまつわることなんかも並行してやれたらよいなと思っている。自分は若いころは指導してくれる先輩にあまり出会うことができず独学だったり怒られたりしながらヒーヒー言いながら育った身なので、若者にはもっと効率よく成長できるパスを用意したいなという気持ちがある。一方で、バックエンド系開発はサービスメッシュという概念が登場し、かつての分散並列処理システム(ちょうど前期にやってたやつだ)を支えた技術トレンドが復活しそうな気もしていることもあり、前職で触れたマイクロサービスを用いた設計からさらに洗練された考え方を学ぶ必要があると思っている。一度勉強したからといってアップデートを止めると一瞬で置いていかれるのがこの業界である。卒業してもこの心構えは忘れずにいたい所存。大学にいるとついつい新しい技術よりも研究や単位を取るのに必要な技術ばかり目が行ってしまうが業界の流れもチラ見しながらついていきたい。

で、話は戻るが具体的にもう一本の柱は何をやるか。。というのは未定なのだが、今薄っすら考えている候補は

  • ラズパイなどのデバイス上で動くソフトウェアや特定のCPUのためのコンパイラを書く
  • 深層学習のモデル実装を極める
  • 量子コンピュータのためのコンパイラを書いたりする(そんな仕事があるのかはさておき)
  • 学部時代に卒論でやった農業 + 機械学習でなんかやる
  • Halideみたいな実行環境に応じて最適化されたコードを吐くコンパイラを書いて特に組み込み分野で使える最適化されたコードを抽象表現から生成できるようにする

という感じか。結局、機械学習を用いたプロダクト開発か、用途特化のデバイス上で動作するソフトウェアの開発か、コンパイラみたいなコード最適化や低レイヤを触る、といった辺りが今まで全くやったことがなくてかつ興味がある分野という感じである。そんな仕事あるんかいなというのはさておき、何がやりたいかを知っておくことは重要だとちきりんも言っていたので、今後も情報を集めつつ自分でも手を動かしつつ考えていきたい所存。

*1:ガリガリさんって発売されてそうでされてない

春学期振り返り(本音編)

2018年8月3日

4月にスタートした春学期も来週で終わりである。集中講義に一個出てレポート出して終わりである。 このブログはなるべく本音を書くようにしているのだが、今日はちょっとネガティブなことを書くので苦手な人はリターンしていただきたい。(別に何か問題になるようなことを書く訳じゃないけど)

続きを読む