2023年度未踏ITでの取り組みをだーっと振り返る

2023年度未踏IT事業Wasmを実行するunikernelとWasmコンパイラというプロジェクトに取り組んでいました。本記事では未踏に応募すると決定してから終了するまでの期間を振り返っていきます。

なお、本記事ではmewz-projectというプロジェクトについての振り返りではなく、あくまで未踏での体験について振り返るというスタンスで書いていきます。

また、以下のインタビュー記事でも未踏についての振り返りをしているのですが、インタビュー記事では未踏の経験が自分たちにどんな変化をもたらしたかといった話がメインですが、一方で本記事はただただ自分の印象に残っている出来事などを振り返るだけのポエムになっています。

インタビュー記事 | 未踏事業 | IPA 独立行政法人 情報処理推進機構

プロジェクトについて

プロジェクトでやっていたことは最終成果発表で発表しているのでそちらの説明に任せます。動画はこちら。スライドはこちら

(念のため簡単に説明)もともとWasmはブラウザ上で実行されるバイトコードとして登場してきましたが、近年ではサーバー上で直接動かそうという流れがあります。そこで本プロジェクトではWasmを実行するのに特化した軽量OS、Mewzを開発しました。また、Mewz上でWasmを実行する際にはWasmバイナリはAoTコンパイルされてネイティブコードに変換された状態で実行されます。この変換を行うのがWaskerというWasmのAoTコンパイラで、これがこのプロジェクトの2つ目の成果物です。MewzとWasker、2つ合わせてWasmを実行するunikernel(unikernel=プロセスを1つしか動かさない軽量なOSの種別)とWasmコンパイラ、というわけです。

ところで、MewzWaskerにスターをつけてくださると大変喜びます。

採択されるまで

チーム結成

応募するきっかけとなったのは相方である@ainno321が誘ってくれたことでした。

2022年の11月ぐらいのこと、ちょうどその時自分の知り合いに未踏の経験者がけっこう多いということに気づいて、ちょっと興味を持ってそれらのプロジェクトについて調べていました。その時のツイートがきっかけの1つとなり誘ってくれたそうです。

僕はもともと未踏をやろうという気持ちはなかったのですが、AinnoはSecHack365でXDPをごちゃごちゃいじっていてそれについてのブログを読んでいてすごいなぁと思っていたので、一緒に面白いことできそうだなと思って二つ返事で承諾しました。こうしてチームが結成され、未踏の応募に向けて準備を進めていくことになりました。

応募まで

応募するにはまず取り組むテーマを考えなければなりません。未踏のホームページによると

ソフトウェア関連分野においてイノベーションを創出することのできる独創的なアイディア

が求められるそうです。そんなことを言われても難しいのでまずはとっかかりを探します。まず我々はunikernelに注目して、これをネタに何かできないかということを考えました。相方はunikernelに関心があり、チームを組む直前ぐらいに僕がunikernelに言及したツイートをしていたことがお誘いのきっかけの1つだったりしたそうです。

まず我々はunikernelを用いたFaaSの開発をやることを検討していました。しかしこれはアイディア的にはそんなに新しくないしどこのサーバーで動かすんだみたいな問題もあり、もうちょい良い感じのアイディアが欲しいという状況でした。

ごちゃごちゃと考えていたとき、ちょうど最近クラウドでWasmがアツい みたいな感じの話題が流れてきました。今はunikernelじゃなくてWasmなんだな...となっていたところ、じゃあWasmをunikernelを混ぜればいいとこどりできるじゃんみたいなことを思いつきます。単なる思い付きだったんですが、よく考えてみるとこれが意外と筋がよさそうというので、このプロジェクトが生まれるに至りました。

このアイディアを共有しているDiscordのログ

↑激アツプロジェクト誕生の瞬間。

これでいくと決まればあとは提案書を書くだけです。この時点ですでに2月になっており、応募締め切りまで残り1か月でした。急いで応募資料を書き、大学の先輩方である2019年度未踏ITでVSPプロジェクトをやっていたチームの方々からレビューしてもらうなどしました。これにて応募完了。

二次審査

しばらくして4月頭ごろに、一次審査に通過したとメールが来て、今度は二次審査でプレゼンをしなければなりません。未踏の二次審査ではプロトタイプのデモをやると良いという情報を得ていたため、大急ぎでプロトタイプの実装を始めました。Wasmからカーネルのコードを呼び出してHello Worldを表示するというプロトタイプを1週間ぐらいで作りました。ほんとに小さいプロトタイプで、おそらくカーネルとコンパイラ合わせて300行弱ぐらいの量の実装だったと思います。

10分弱ぐらいのプレゼンをしてPM陣から質疑応答を受けます。後に我々のPMを担当することになる曾川PMを始め、田中PM竹迫PMからいろいろな質疑が飛んできました。全体的に好印象な反応をいただき、特に曾川さんからは「今日はこのプレゼンを聞くのを楽しみにしていた」と言っていただき、審査が終わった後に相方と勝ち確みたいな雰囲気で振り返り会をしました。

期待は外れず、5月中頃に採択通知メールが来ました。受かりそうだと思っていたとは言え、本当に嬉しい瞬間でした。

採択お知らせのDiscordログ

ここでプロジェクトの概要等が発表されるのですが、この時点でたくさん反響があり大変嬉しく、モチベが爆上がりしました。

プロジェクト期間

ここからはひたすら開発と会議の繰り返しです。会議というのはプロジェクトごとに同じ未踏同期のクリエータやPM陣、さらに未踏OBの方々などに対して自分たちのプロジェクトの内容を説明し、それについて議論して各プロジェクトをより良くしようというイベントです。これがだいたい月に1回ずつぐらいあり、そのたびに僕は東京に行くということをしていました。

僕と相方はそれぞれ京都、東京に住んでいるので直接会って開発をやるということはほぼありません。Discordで非同期コミュニケーションをやりながら進めていきました。直接会ってコミュニケーションをするのはほぼ会議のときだけでした。開発の分担としては、僕がMewz(unikernel)を作り、AinnoがWasker(コンパイラ)を作るというのでざっくり分けていました。

ここからは月ごとにダイジェストで振り返ります。

6月

いよいよプロジェクト開始です。まずはブースト会議という全プロジェクトが集まって行われる会議がありました。一般に会議は一部のプロジェクトだけで集まって行われるので全プロジェクト集まるのはかなり稀です。

チームごとに自分たちのプロジェクトの内容について発表します。我々の発表はunikernelとかWasmとか多くの人に馴染みのない技術を扱っている上にプレゼンが下手すぎてあまり理解してもらえなかったと思います。

このタイミングでようやく相方と2回目に直接会いました。

7月

僕は院試があったため開発は止まり気味になります。その一方で相方がコンパイラをモリモリと進めてくれていました。

8月

ようやく院試が終わり、夏休みでもあったので遅れを取り戻すために急ピッチで開発を進めました。

機能としてはメモリ管理周りを実装していました。統合テストの自動化のためにActionsをごちゃごちゃいじるなどもしていました。

9月

NICドライバの開発に着手し始めていました。

Wasm nightというイベントでプロジェクトについての発表をしました。多くの方に面白がってもらえたようで嬉しかったです。

(この頃は命名が定まっておらず、Mewzではなくmewという名前にしていたな)

また、この頃に相方がインターン先でutam0kさんと知り合い、Mewzについての議論をする機会作っていただけました。utam0kさんはyoukiの関係でコンテナとしてのWasmについての話に詳しい方なので、その辺りとMewzの関係といった部分についてお話できました。

10月

今度は情報科学若手の会というイベントでプロジェクトについての発表をしました。これについては個別にブログを書いているので詳しくはそちらに。(第56回 情報科学若手の会に参加してきた

開発としてはlwIPを用いてソケットを実装し、ネットワーク機能をサポートし始めていました。

この辺りからチームの合言葉が「気合い」になりました。結局ソフトウェア開発で大事なことは気合いなので、ごちゃごちゃ言ってないで気合いで全てを解決する気持ちを大事にしようということを言っていました。

気合いの大事さを感じているDiscordログ

11月

この辺りからいよいよプロジェクト期間も折り返しに入ります。開発の進捗としては、作りたい最低限の機能ができつつありましたが、とにかく大量のバグが発生しており、ひたすら潰しまくるということをしていました。

難解なバグばかりで本当に大変でした。

11月の後半には八号目会議という、全プロジェクトが集まって行われる中間発表的なイベントがありました。そこで我々はMewzでHTTPサーバーが動くよという内容のデモを行いました。発表後の休憩時間の時に他プロジェクトのPMである竹迫さんとお話しすることがあり、

竹迫さん「あのサーバーのデモはちゃんと動き続けられるの?」
僕「実はリクエストを100回ぐらい投げたあたりで謎のカーネルパニックを起こすんですよね」
竹迫さん「だよねwww」

というやりとりをしていました。カーネルのレイヤでHTTPサーバーをサポートできるだけの機能を実装することの大変さを共感してもらえて、流石だなぁと思いました。

12月

WasmEdgeの開発をやっているSecondStateのCEO、Michael YuanさんがCloudNative Days Tokyo 2023にいらっしゃるというので、utam0kさんに繋いでいただいてお話する機会ができました。Wasmの未来像などについて議論でき、大変貴重な機会でした。

ついでにCNDTにも参加しました。また、そこでkateinoigakukunさんともお会いし、LLVM周りの知見を教えていただきました。

そして12月末に、ようやくMewzとWaskerをGitHubで公開しました。

国内だけでなく海外からも反応があったのには大変驚きました。SecondStateの方々による拡散の効果が大きかったのでしょう。

1月

リリースもでき、あとは最終成果発表に備えるだけかのように思われましたが、最後の試練が待ち受けていました。性能評価の結果、Mewzのパフォーマンスが既存のWasmランタイムよりも大幅に低いという結果になりました。unikernelだから速いはずだと期待していたのですがそうならず、実装はできたが結果が伴わないという状況になりました。しかも僕は未踏の取り組みで卒論を書いていたので、このままでは卒論も書けないかもしれないということになりました。 かくして、残り1ヶ月でパフォーマンスチューニングして既存のWasmランタイムを超えるチャレンジが始まりました。

まずは「推測するな計測せよ」という格言の通りプロファイリングを取ります。プロファイリングといってもベアメタル環境のコードなのでリッチなプロファイリングツールは使えず、自前でプロファイリングを取るための機能を実装しました。それでボトルネックを特定しようとしたのですが、なかなか見つからず。

ボトルネックが特定できず絶望しているDiscordログ

なぜかというと、ボトルネックはカーネルとハイパーバイザの間で発生していたためでした。その部分も含めて計測するようにした結果ボトルネックを特定でき、じゃあどうやってその部分を速くできるのか、Linuxカーネルのvirtio netドライバのコードを読んでみたりして調べた結果、interrupt coalescingをすれば良さそうという解決策に至りました。これが大きく効き、既存のWasmランタイムを超えることができました。

パフォーマンスチューニングの結果を喜んでいるDiscordログ

2月

WasmEdgeのコミュニティミーティングに呼んでいただき、そこでMewzについての紹介をしました。

そして最終成果発表であるDemo Dayを迎えました。

最初のブースト会議での発表ではプロジェクトについてあまり理解してもらえませんでしたが、Demo Dayでは多くの人にざっくり理解してもらえるようなプレゼンを意識して作りました。結果的には多くの方に興味を持ってもらえたようです。この8ヶ月間で何度もプレゼンに挑戦してきた成果が出たように思います。

総括

さらっと振り返るつもりで書き始めたのですが、書くことが無限にあり思った以上の分量になりました。それだけ未踏での経験は僕にとって重要なものだったと実感しました。

8ヶ月間通して順調に、そして当初の想定以上の成果を出すことができました。元々未踏をやるためだけに組んだチームだったのでうまくいくだろうかと不安だったのですが、結果的には大きな喧嘩をすることもなく、なんやかんやいつの間にか信頼関係を作ることができたと思います。誘ってくれたことにも、一緒に取り組んでくれたことにも感謝しています。

相方のみならず、8ヶ月間支え続けてくださった曾川PM、未踏事務局の方々、その他未踏関係者以外も含め本プロジェクトに様々なご意見やサポートをくださった全ての方々に感謝申し上げます。