pco2699’s blog

学んだものについて、メモしておく場所

CMUのソフトウェア工学修士を修めた

昨年12月にCMUのソフトウェア工学修士を無事に修めました。主に昨年 秋学期の振り返りをしようかと思います。入学から秋~春ぐらいのお話は以下の過去記事を参照ください。

blog.pco2699.net

blog.pco2699.net

blog.pco2699.net

授業

今年の秋は、「Advanced Distributed And Operating Systems」という CSのPhD向けのクラスを取りました。

www.cs.cmu.edu

授業はCSの論文のディスカッション、グループプロジェクトで構成されます。学期前半はDynamoMapReduceTenserflowなど著名な分散システムやオペレーティングシステムの論文を読んでディスカッションを行います。学期後半は、グループプロジェクトとして、3人グループで論文を書きます。

この授業の教授がシステム界隈では有名な方らしく、実際に授業でのディスカッションの内容が面白かったので取ることにしました。

一番、印象に残っているのはExokernelという論文のディスカッションです。OSの拡張性をどうやって担保するかという論文からOSのObeservaibilityやExtensibilityの話 -> eBPF -> WASMをOSをObserableにする統一インターフェースとして活用できるのでは という話をものすごい勢いで、教授が話します。「この技術は全体でみるとこういう背景があったのか!」というのが腹落ちしてわかって面白かったです。

en.wikipedia.org

プロジェクトは、友人がDeep Learningなどの機械学習に興味があったため「分散Deep Learningのパラメータ計算のためのAllReduceアルゴリズムのパフォーマンス改善・計測」をテーマとして論文を書くことになりました。自分は、夏にWebAssemblyに携わった関係で、WebAssemblyの脆弱性検査を動的解析するツールを開発して論文を書きたかったのですが、他のメンバの賛同を得られず、Deep Learningの方を進めることになりました。

tech.preferred.jp

メンバー皆、就職活動がかなり忙しかったため、プロジェクト後半はかなり炎上気味でした。メンバの一人がDoubleTreeアルゴリズムという実装を担当することになったのですが、DoubleTreeアルゴリズムが予想以上に難しく、自分とメンバで一日中ZOOMでペアプロをして開発したのが思い出です。まあ、結果的にバグが取り切れずに未完成で終わってしまったのですが。。。

developer.nvidia.com

プロジェクト

私のプログラムはStudio Projectというチームプロジェクトが単位の主を占めます。*1

このプロジェクトワークは1年を通じて、5人のチームで顧客の要件にもとづいてシステムを構築するものです。私のチームはピッツバーグ最大手のスーパーマーケットチェーンを顧客としてシステムを作りました。

2023年の1月のプロジェクトの立ち上げでプロジェクトの希望を選びます。 ただ、自分が要件を勘違いしており、フルスタック的なアプリをつくるプロジェクトなのかと思っていました。しかし、そうではなく、おもいっきりデータサイエンス・機械学習のプロジェクトだということが入ってから判明しました。*2

自分は、機械学習などの経験が一切ないので、一から機械学習のキャッチアップを行いました。具体的には、以下の本を読んでキャッチアップしたりしました。

「仕事ではじめる機械学習」は機械学習の経験がないソフトウェアエンジニアのキャッチアップにはうってつけの本でした。プロジェクトの後半はもっぱらMLOpsのアーキテクチャ設計やインフラ構築を担当したのですが、MLOpsもカバーされており参考になりました。

幸いにもほかのメンバが機械学習の経験や知識があったため、自分は機械学習やデータの部分はお任せして、インフラ構築の担当としてアーキテクチャ設計やパイプラインの設計を行いました。

夏から秋はひたすらずっとAzureの機械学習系のドキュメントとにらめっこして設計書を書いて、インフラ構築をするという作業を行いました。

learn.microsoft.com

いろいろありましたが、無事に機械学習のモデルを顧客におさめ、最終プレゼンで仲間と祝杯をあげることができてよかったです。

90年代のスタートアップのような最終日のチームの写真

研究

以下の記事にも書いた通り、WebAseemblyの論文の執筆を夏に手伝ったのですが、年末~年明けぐらいに論文のレビューの対応があり、卒業後も少し論文の修正で実験のデータを取り直したりしていました。

blog.pco2699.net

無事にレビューが通れば、以下の会議で発表されるはずなので楽しみです。

www.asplos-conference.org

TA

留学後にやってみたかった一つのこととしてTA(Teaching Assistant)がありました。 きっかけは来る前に読んでいたこの記事でした。

rintaro.hateblo.jp

TAとは教授の補佐で、授業の運営にまつわるいろいろなことをやるアルバイトです。

  • Office Hourと呼ばれる生徒からの質問に答える時間
  • Recetationと呼ばれる授業の復習のような軽い授業
  • プログラミングの宿題のコードレビュー
  • 筆記宿題や試験の問題作成
  • 試験の採点

自分は最後の学期に分散システムのTAの機会をいただくことができました。

www.composablesystems.org

Office Hourで生徒とディスカッションをするのは楽しかったです。皆さん、CMUの学生だけあって質問の内容が鋭く、自分も負けまいとOffice Hourの前 3~4時間はプログラミング課題の復習をしたりホームワークを事前に解いておいたりと準備を怠らないようしました。

人に説明すると自分の理解が進む、というのはその通りで、分散システムの以下のいろいろなトピックをさらに深く理解できるようになりました。

  • Lamport Clock/Vector Clock
  • MapReduce/Spark
  • PaxosなどのDistributed Consensusアルゴリズム

並行して就活の対策で、System Designの対策を行っていたのですが例えば「ZookeeperにはPaxosなどの分散合意アルゴリズムが使われている」など、System Designの対策にも役に立ちました。

他にも、Homeworkと呼ばれる宿題やMidtermと呼ばれる中間試験の問題を作成するのもTAの仕事です。自分はMapReduceやCDNなどの自分の興味あるトピックについて問題を作成しました。

印象的だった失敗(?)だったのは、MapReduceの問題をつくったときです。通常は、過去の問題を少し改変して問題を作ることが多いのですが、自分は意気込んで問題を一から作ることにしました。内容はMapReduceの設計を行う問題で、お題(例: Webのlogから各パスのアクセス回数を集計せよ)にもとづいてMapperとReducerはどのようなことを行うか、記述で書かせる問題を作りました。

ただ、この問題を出した直後、授業の掲示板で、自分が作った宿題について質問が相次ぎ、以下の問題点があることがわかりました。

  • 解法が一つに定まらない。何通りも考えられる
  • ヒントが問題文中にあるが、それを使わなくても解ける

平たく言うと、問題がわかりづらく生徒を混乱させてしまっていたのでした。そのため、自分はわかりづらい問題を作ってしまったことを謝罪し、問題のフォローアップを掲示板上で行いました。

実際のフォローアップ

このように、なかなかTAと言えどチャレンジングで問題をわかりやすくデザインする力が必要です。こういった力を鍛えることができたのは貴重な経験だと思います。

最終的には、フィードバックで以下のようなコメントがもらえて非常にうれしかったです。

Always helpful and know about what's going on in hw/projects! One of my favorite TAs : ) いつも親切で宿題やプロジェクトをよく理解してます!私のお気に入りのTAの一人です!

卒業後の進路

卒業後の進路については、現在、就職活動が現在進行形で進んでおり、まだ結論が出せていない状況です。 ただ、もうそろそろ結論が出ると思うので、詳しい就職活動の内容とともに記事を書こうかと思っています。

CMUに入ってみて

CMUに入ってみてよかったか?と観点で振り返ると「入ってよかった」という答えになると思います。CMUはコンピュータサイエンスで有名なこともあり、やはり歴史が素晴らしさを物語っています。

教授陣は非常に優秀な方ばかりですし、コンピュータサイエンスの歴史を作ってきているので、その歴史を授業や会話で間近に感じ取ることができます。

例えば、ソフトウェアアーキテクチャの授業の教授が以下の内容を授業中にしゃべっていました。

昔、自分の教えていた生徒が、「分散システムでのModularityを保つために、function callの要領でネットワーク上のマシンのコードを呼び出せばいいのでは」と言い始めたんだ。結局、その生徒はRPCの論文を書いて、有名になった。

あまりにさりげなく授業中にすごいことを言い始めたので、思わず聞き流すところでしたが、私はすごいところにいるのだな、と実感した瞬間でした。 このようにサラッと昨今のソフトウェアエンジニアリングの当たり前となった技術に貢献してきた人と話ができたり、授業を受けられるのは素晴らしいと思いました。

他にも自分がIndependent Studyをした教授はWebAssemblyの創始者の一人ですし、他にもScalaのコミュニティオーナーだったり、現在進行形でもソフトウェアエンジニアの歴史に貢献している人と話をできることが素晴らしかったです。

例えば、自分が一介の働いているエンジニアだとして、そういった教授にアプローチするのは躊躇しますし、実際に難しいと思うのですが、生徒・教授という立場だと気軽に話を聞きに行くことができます。

「こんなすごいところ自分には入れない」と思うかもしれませんがMasterへの入学はUndergradやPhDと比べて、かなり易しいと思います。なぜならMasterのプログラムはどの大学でも大量に人を採っているからです。 Masterは期間が短い上に大学側がお金を支払う必要が無いため、どの大学の大量に採って、収入源にしているのです。

CMUは20人~50人ぐらいのBatchのMasterのプログラムが大量にあります。実際の数はわかりませんがMasterだけでも5000人/年ぐらいはいるのではないでしょうか。

逆に言うと、お金がある程度あってRequirementさえ満たせばMasterに入ることはそんなに難しくないのです。お金が無い人はStudent Loanで借りてきてもお釣りが来るぐらい貴重な経験ができるのではないかと自分は思います。

ぜひ、記事を読んで詳しいお話や聞きたいことがある方ははXや右の「お問い合わせ」から連絡をください。なんでも相談に乗ります。

*1:一学期中3/4がこのプロジェクトの単位から来る

*2: プログラム自体は、ソフトウェアエンジニアリングなので、教授陣もびっくりしてました。