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コンパイラ、というわけです。
ところで、MewzとWaskerにスターをつけてくださると大変喜びます。
採択されるまで
チーム結成
応募するきっかけとなったのは相方である@ainno321が誘ってくれたことでした。
2022年の11月ぐらいのこと、ちょうどその時自分の知り合いに未踏の経験者がけっこう多いということに気づいて、ちょっと興味を持ってそれらのプロジェクトについて調べていました。その時のツイートがきっかけの1つとなり誘ってくれたそうです。
過去の未踏のプロジェクトを見ながらすごいなぁという気持ちになった
— Saza (@saza_ku) November 19, 2022
僕はもともと未踏をやろうという気持ちはなかったのですが、AinnoはSecHack365でXDPをごちゃごちゃいじっていてそれについてのブログを読んでいてすごいなぁと思っていたので、一緒に面白いことできそうだなと思って二つ返事で承諾しました。こうしてチームが結成され、未踏の応募に向けて準備を進めていくことになりました。
応募まで
応募するにはまず取り組むテーマを考えなければなりません。未踏のホームページによると
ソフトウェア関連分野においてイノベーションを創出することのできる独創的なアイディア
が求められるそうです。そんなことを言われても難しいのでまずはとっかかりを探します。まず我々はunikernelに注目して、これをネタに何かできないかということを考えました。相方はunikernelに関心があり、チームを組む直前ぐらいに僕がunikernelに言及したツイートをしていたことがお誘いのきっかけの1つだったりしたそうです。
Unikernel とかいう技術が最近気になってる
— Saza (@saza_ku) November 18, 2022
これ Docker みたいにパッケージ化できたり、クラウドでサポートされたりしたら流行らないかな
まず我々はunikernelを用いたFaaSの開発をやることを検討していました。しかしこれはアイディア的にはそんなに新しくないしどこのサーバーで動かすんだみたいな問題もあり、もうちょい良い感じのアイディアが欲しいという状況でした。
ごちゃごちゃと考えていたとき、ちょうど最近クラウドでWasmがアツい みたいな感じの話題が流れてきました。今はunikernelじゃなくてWasmなんだな...となっていたところ、じゃあWasmをunikernelを混ぜればいいとこどりできるじゃんみたいなことを思いつきます。単なる思い付きだったんですが、よく考えてみるとこれが意外と筋がよさそうというので、このプロジェクトが生まれるに至りました。
↑激アツプロジェクト誕生の瞬間。
これでいくと決まればあとは提案書を書くだけです。この時点ですでに2月になっており、応募締め切りまで残り1か月でした。急いで応募資料を書き、大学の先輩方である2019年度未踏ITでVSPプロジェクトをやっていたチームの方々からレビューしてもらうなどしました。これにて応募完了。
未踏提案書提出 DONE
— Saza (@saza_ku) March 15, 2023
二次審査
しばらくして4月頭ごろに、一次審査に通過したとメールが来て、今度は二次審査でプレゼンをしなければなりません。未踏の二次審査ではプロトタイプのデモをやると良いという情報を得ていたため、大急ぎでプロトタイプの実装を始めました。Wasmからカーネルのコードを呼び出してHello Worldを表示するというプロトタイプを1週間ぐらいで作りました。ほんとに小さいプロトタイプで、おそらくカーネルとコンパイラ合わせて300行弱ぐらいの量の実装だったと思います。
10分弱ぐらいのプレゼンをしてPM陣から質疑応答を受けます。後に我々のPMを担当することになる曾川PMを始め、田中PMや竹迫PMからいろいろな質疑が飛んできました。全体的に好印象な反応をいただき、特に曾川さんからは「今日はこのプレゼンを聞くのを楽しみにしていた」と言っていただき、審査が終わった後に相方と勝ち確みたいな雰囲気で振り返り会をしました。
期待は外れず、5月中頃に採択通知メールが来ました。受かりそうだと思っていたとは言え、本当に嬉しい瞬間でした。
未踏に採択されました😁😁
— Saza (@saza_ku) June 2, 2023
Zig で OS を書きつつ Rust でコンパイラも書きます pic.twitter.com/KmRl28W0Cb
ここでプロジェクトの概要等が発表されるのですが、この時点でたくさん反響があり大変嬉しく、モチベが爆上がりしました。
wasmでunikernelは世界の夢なのよ https://t.co/I0GmMyxFPU
— ぬるぽへ (@nullpo_head) June 2, 2023
https://t.co/opeUCMvz6y
— すみどら (@sizumita) June 20, 2023
僕が作りたかったものまさにそれが採択されていて狂喜乱舞してる
プロジェクト期間
ここからはひたすら開発と会議の繰り返しです。会議というのはプロジェクトごとに同じ未踏同期のクリエータやPM陣、さらに未踏OBの方々などに対して自分たちのプロジェクトの内容を説明し、それについて議論して各プロジェクトをより良くしようというイベントです。これがだいたい月に1回ずつぐらいあり、そのたびに僕は東京に行くということをしていました。
僕と相方はそれぞれ京都、東京に住んでいるので直接会って開発をやるということはほぼありません。Discordで非同期コミュニケーションをやりながら進めていきました。直接会ってコミュニケーションをするのはほぼ会議のときだけでした。開発の分担としては、僕がMewz(unikernel)を作り、AinnoがWasker(コンパイラ)を作るというのでざっくり分けていました。
ここからは月ごとにダイジェストで振り返ります。
6月
いよいよプロジェクト開始です。まずはブースト会議という全プロジェクトが集まって行われる会議がありました。一般に会議は一部のプロジェクトだけで集まって行われるので全プロジェクト集まるのはかなり稀です。
チームごとに自分たちのプロジェクトの内容について発表します。我々の発表はunikernelとかWasmとか多くの人に馴染みのない技術を扱っている上にプレゼンが下手すぎてあまり理解してもらえなかったと思います。
このタイミングでようやく相方と2回目に直接会いました。
ブースト会議、他のクリエータたちと仲良くなったというのより、まず相方と仲良くなったというのがある。直接会うの2回目だったため
— Saza (@saza_ku) June 25, 2023
7月
僕は院試があったため開発は止まり気味になります。その一方で相方がコンパイラをモリモリと進めてくれていました。
あと1週間で院試から解放
— Saza (@saza_ku) July 30, 2023
8月
ようやく院試が終わり、夏休みでもあったので遅れを取り戻すために急ピッチで開発を進めました。
自分が院試で止まってる間相方が大量のアウトプットを出していてくれたので感謝の涙を流しながらレビュー祭りしてる
— Saza (@saza_ku) August 11, 2023
機能としてはメモリ管理周りを実装していました。統合テストの自動化のためにActionsをごちゃごちゃいじるなどもしていました。
GitHub Actions あるある pic.twitter.com/QdgjYIR7Uy
— Saza (@saza_ku) August 14, 2023
コンパイラのPR作るとOSのレポジトリcheckoutしてコンパイラ実行してOSビルドしてQEMUで動かしてstdout に期待値が含まれるかのCIが走るの楽しすぎるな
— Ainno (@ainno321) September 19, 2023
(すべて相方が作ってくれたので私はありがたく使うだけ)
9月
NICドライバの開発に着手し始めていました。
Wasm nightというイベントでプロジェクトについての発表をしました。多くの方に面白がってもらえたようで嬉しかったです。
WebAssembly night #11 参加します!
— Saza (@saza_ku) September 15, 2023
未踏で取り組んでいる、Wasm を実行する unikernel と Wasm コンパイラを @ainno321 と発表します!#wasmnighthttps://t.co/BmcuT3wqyl
WASM/WASIランタイムはOS,Platform非依存なJVMみたいなものという認識しかなかったけど、ランタイムそのものをkernelにしてしまえというアイデアは逆立ちしても自分は思いつかなかった#wasmnight
— 乳牛@それはまだ早い! (@NewGyu) September 16, 2023
WASM/WASIのIFを共通のレイヤーとして置くことで上位のアプリケーションの出力を共通化するといいよねっていう話は語られがちだけど、mewとwaskerはその下のレイヤーから見たIFの共通化の意義を話していて面白い #wasmnight
— Koji Yamazaki (@kojipole) September 15, 2023
(この頃は命名が定まっておらず、Mewzではなくmewという名前にしていたな)
また、この頃に相方がインターン先でutam0kさんと知り合い、Mewzについての議論をする機会作っていただけました。utam0kさんはyoukiの関係でコンテナとしてのWasmについての話に詳しい方なので、その辺りとMewzの関係といった部分についてお話できました。
10月
今度は情報科学若手の会というイベントでプロジェクトについての発表をしました。これについては個別にブログを書いているので詳しくはそちらに。(第56回 情報科学若手の会に参加してきた)
開発としてはlwIPを用いてソケットを実装し、ネットワーク機能をサポートし始めていました。
この辺りからチームの合言葉が「気合い」になりました。結局ソフトウェア開発で大事なことは気合いなので、ごちゃごちゃ言ってないで気合いで全てを解決する気持ちを大事にしようということを言っていました。
11月
この辺りからいよいよプロジェクト期間も折り返しに入ります。開発の進捗としては、作りたい最低限の機能ができつつありましたが、とにかく大量のバグが発生しており、ひたすら潰しまくるということをしていました。
バグってたの相方に投げてたら実は自分が埋め込んだバグが原因だったことが判明して真顔 https://t.co/bcxV06LmBB
— Saza (@saza_ku) November 4, 2023
これのおかげでリリースビルドでしか再現しないバグの存在にいち早く気づくことができて、自動テストありがとう...という気持ちに https://t.co/1ZSPm9GCjW
— Saza (@saza_ku) November 16, 2023
カーネルのページテーブルが勝手に書き換わるという謎のバグが発生して、バグを起こしている命令を特定するために GDB で命令ごとにステップ実行して伝家の宝刀†二分探索†を行うなど正気の沙汰ではないデバッグをしていた
— Saza (@saza_ku) November 17, 2023
最近は毎日ベアメタルプログラミング特有の激キモバグたちに苦しめられていてメンブレピンチ
— Saza (@saza_ku) November 18, 2023
難解なバグばかりで本当に大変でした。
11月の後半には八号目会議という、全プロジェクトが集まって行われる中間発表的なイベントがありました。そこで我々はMewzでHTTPサーバーが動くよという内容のデモを行いました。発表後の休憩時間の時に他プロジェクトのPMである竹迫さんとお話しすることがあり、
竹迫さん「あのサーバーのデモはちゃんと動き続けられるの?」
僕「実はリクエストを100回ぐらい投げたあたりで謎のカーネルパニックを起こすんですよね」
竹迫さん「だよねwww」
というやりとりをしていました。カーネルのレイヤでHTTPサーバーをサポートできるだけの機能を実装することの大変さを共感してもらえて、流石だなぁと思いました。
12月
WasmEdgeの開発をやっているSecondStateのCEO、Michael YuanさんがCloudNative Days Tokyo 2023にいらっしゃるというので、utam0kさんに繋いでいただいてお話する機会ができました。Wasmの未来像などについて議論でき、大変貴重な機会でした。
ついでにCNDTにも参加しました。また、そこでkateinoigakukunさんともお会いし、LLVM周りの知見を教えていただきました。
#CNDT2023 きた pic.twitter.com/dkTQC4pYjy
— Saza (@saza_ku) December 11, 2023
そして12月末に、ようやくMewzとWaskerをGitHubで公開しました。
Wasm の実行に特化した unikernel、Mewz と
— Saza (@saza_ku) December 29, 2023
Wasm をネイティブなオブジェクトファイルに変換する Wasm コンパイラ、Wasker を公開しました!
これは wasker によって Wasm がネイティブバイナリに変換され、それが QEMU 内で Mewz 上で実行される様子です。 pic.twitter.com/HmIzz3ubIB
未踏で作っているWasmを実行するunikernel とWasmコンパイラをリリースしました!https://t.co/QsofXvGoEphttps://t.co/xeiv7X0JIm
— Ainno (@ainno321) December 29, 2023
Wasmとunikernelを組み合わせたら最高だよね!!という発想のソフトウエアです↓(詳細は以下
国内だけでなく海外からも反応があったのには大変驚きました。SecondStateの方々による拡散の効果が大きかったのでしょう。
With Mewz's #unikernel design for #Wasm apps and Wasker's innovative binary conversion, experience unparalleled efficiency and securityhttps://t.co/UPVTIIaqi0#WebAssembly https://t.co/VaiaxNus55
— Second State (@secondstateinc) December 29, 2023
this is a very cool little dance done here. #webassembly and #wasi support, too..... https://t.co/qER5dTZGMB
— home skillet (@[email protected]) (@ralph_squillace) December 29, 2023
1月
リリースもでき、あとは最終成果発表に備えるだけかのように思われましたが、最後の試練が待ち受けていました。性能評価の結果、Mewzのパフォーマンスが既存のWasmランタイムよりも大幅に低いという結果になりました。unikernelだから速いはずだと期待していたのですがそうならず、実装はできたが結果が伴わないという状況になりました。しかも僕は未踏の取り組みで卒論を書いていたので、このままでは卒論も書けないかもしれないということになりました。 かくして、残り1ヶ月でパフォーマンスチューニングして既存のWasmランタイムを超えるチャレンジが始まりました。
まずは「推測するな計測せよ」という格言の通りプロファイリングを取ります。プロファイリングといってもベアメタル環境のコードなのでリッチなプロファイリングツールは使えず、自前でプロファイリングを取るための機能を実装しました。それでボトルネックを特定しようとしたのですが、なかなか見つからず。
なぜかというと、ボトルネックはカーネルとハイパーバイザの間で発生していたためでした。その部分も含めて計測するようにした結果ボトルネックを特定でき、じゃあどうやってその部分を速くできるのか、Linuxカーネルのvirtio netドライバのコードを読んでみたりして調べた結果、interrupt coalescingをすれば良さそうという解決策に至りました。これが大きく効き、既存のWasmランタイムを超えることができました。
2月
WasmEdgeのコミュニティミーティングに呼んでいただき、そこでMewzについての紹介をしました。
そして最終成果発表であるDemo Dayを迎えました。
最初のブースト会議での発表ではプロジェクトについてあまり理解してもらえませんでしたが、Demo Dayでは多くの人にざっくり理解してもらえるようなプレゼンを意識して作りました。結果的には多くの方に興味を持ってもらえたようです。この8ヶ月間で何度もプレゼンに挑戦してきた成果が出たように思います。
コンセプト自体が面白いのはもちろん、プロダクトの作り込みもプレゼンの流れも凄かったです!引き続き応援してます! https://t.co/iwsMxPnN0k
— Yuta Saito (@kateinoigakukun) February 18, 2024
Mewz/Waskerの発表をリアルタイムより少し遅れて観させてもらっておりました,めちゃくちゃ説明がわかりやすい上にデモでサラッと凄いことをやってらっしゃる
— 画力・博士号・油田 (@bd_gfngfn) February 18, 2024
総括
さらっと振り返るつもりで書き始めたのですが、書くことが無限にあり思った以上の分量になりました。それだけ未踏での経験は僕にとって重要なものだったと実感しました。
8ヶ月間通して順調に、そして当初の想定以上の成果を出すことができました。元々未踏をやるためだけに組んだチームだったのでうまくいくだろうかと不安だったのですが、結果的には大きな喧嘩をすることもなく、なんやかんやいつの間にか信頼関係を作ることができたと思います。誘ってくれたことにも、一緒に取り組んでくれたことにも感謝しています。
相方のみならず、8ヶ月間支え続けてくださった曾川PM、未踏事務局の方々、その他未踏関係者以外も含め本プロジェクトに様々なご意見やサポートをくださった全ての方々に感謝申し上げます。