Mojoがいよいよオープンソース化…だから実際に試してみた

BBetter Stack
Computing/Software

Transcript

00:00:00プログラミング言語のMojoがバージョン1.0になりましたが、タイミングが少し奇妙です。
00:00:05クローズドなコンパイラとして公開され、その7日後にオープンソース化され、
00:00:09ちょうどQualcommがその企業を買収したところでした。
00:00:12だが、それはいったん置いておこう。
00:00:14Mojoの真骨頂は、速度のためにC++やCUDAを捨てずに、Pythonのようなコードを書ける点です。
00:00:20では、実際にそれが機能するのか確かめてみましょう。
00:00:27Mojoの本質は、一つの問いにあります。
00:00:30見た目も感触もPythonそっくりのコードを書くことができて、
00:00:34C++やCUDAに落とし込まずに、本当に重要な部分を実行できたらどうでしょうか?
00:00:39CPUとGPUの間で、一つの読みやすい言語を使えるのです。
00:00:42それがここでの全てです。
00:00:43ついにMojoが1.0になった今、このうちどれだけが本当に現実なのか実際に確かめてみたかったのです。
00:00:49ですから、Qualcommやオープンソース化の話に入る前に、まずは動かしてみましょう。
00:00:53ワークフローを加速させるコーディングツールが好きなら、ぜひチャンネル登録を。
00:00:57常に新しい動画を公開しています。
00:00:59自分のマシンでこれを実行しますが、今回はMojoのチュートリアルをするわけではありません。
00:01:03もし初めて見る方なら、確かにPythonのように見えるでしょうが、
00:01:07いくつかの重要な違いにお気づきになるはずです。
00:01:10左側がPythonです。
00:01:12右側がMojoです。
00:01:13同じループ、同じグリッド、同じイテレーション上限です。
00:01:17この中の数学的な解説は特にしません。
00:01:202つのwhileループを見ていてください。
00:01:21やっていることは同じです。
00:01:23まずはPythonから実行します。
00:01:26よし、素晴らしい。
00:01:27動きました。
00:01:28実行完了です。
00:01:28では、同じプログラムをMojoでコンパイルします。
00:01:32繰り返しますが、実行してみましょう。
00:01:35そしてドン。
00:01:35これで完了です。
00:01:36なお、チェックサムの最後の桁は一致しません。
00:01:3925万に対して数百ほどの違いがあります。
00:01:43Pythonは掛け算をしてから足し算をします。
00:01:45Mojoのコンパイルならそれを1つの命令に統合できます。
00:01:49いくつかのピクセルで余分なイテレーションが発生します。
00:01:51ここでの秒数は実数として捉えてください。
00:01:54これはNumPyではありません。
00:01:55モデルでもありません。
00:01:56パフォーマンスの向上は、CPUのループが速くなっただけにとどまりません。
00:02:00Pythonは簡単なので、Pythonから始めることができます。
00:02:03その後、C++やCUDAへ移行する流れになります。
00:02:06すると2つのファイルを管理することになり、次第に乖離が始まります。
00:02:09そこで、Mojoが投げかけている問いがこちらです。
00:02:12読み込んでいるファイルと、GPUを直撃するファイルを同じにすることはできないのか?と。
00:02:17この関数がカーネルです。
00:02:18それぞれのGPUスレッドが一対の数値を足し合わせます。
00:02:20それだけです。
00:02:21MetalやSwift、CUDAに切り替えたりはしていません。
00:02:24コンパイルします。
00:02:26これでコードが実行できました。
00:02:28ですから、そう。
00:02:30Mojoにはかなり面白いことができる能力があります。
00:02:32普段のコードを書いているのと同じ言語、つまりPythonを使って、MacBook上で動作するGPUカーネルをコンパイルできたのです。
00:02:38Pythonですね。
00:02:40機械学習のコードは扱いやすいためPythonから始まります。
00:02:44それは皆さんもご存知のとおりです。
00:02:45そして最終的には、パフォーマンスが重要になってきます。
00:02:48そのため、重要な部分はC++やCUDAで書き直されることになります。
00:02:52こうして私たちは同じシステムの2つのバージョンを維持管理することになります。
00:02:55そして繰り返しますが、時間が経つにつれてそれは混乱を招くだけです。
00:02:58Mojoの狙いは、読みやすいファイルと高速なファイルが完全に同一のものであるということです。
00:03:03さて、これらすべてを背後で支えているのがChris Lattnerです。
00:03:06彼はLLVMを作り、Clang、そしてSwiftを構築しました。
00:03:10しかし、GPUカーネルを動かすのと、
00:03:14言語を1.0と呼ぶのとは、少し話が違います。
00:03:18では、1.0とは実際には何を意味するのでしょうか?
00:03:21Mojoが完成したという意味ではありません。
00:03:23それは概ね「安定性」を意味しています。
00:03:25今日書いたコードが壊れないという保証がそこにはあります。
00:03:29このようなメジャーリリースとはそういうものです。
00:03:30しかしそこで最初の奇妙な点に突き当たります。
00:03:32Mojoはコンパイラがオープンソース化されるよりも前にバージョン1.1に達していました。
00:03:37標準ライブラリはすでに2024年3月に公開されていました。
00:03:40Maxカーネルは2025年に公開されました。
00:03:43しかし、コンパイラ、つまり実際にコンパイルを行う本体は、今年の8月18日までプロプライエタリなままでした。
00:03:50Apache 2.0の下で公開されましたが、Mojo 1.0が出荷されたわずか7日前時点ではまだ非公開だったため、これは重要です。
00:03:57そしてそれは、Mojoが3年連続で受けてきた最大の批判の一つに答えるものとなります。
00:04:02以前なら、「なるほど、でもコンパイラが非公開じゃないか」と言うことができました。
00:04:05もはやそう簡単には言えなくなりました。これは正しい方向へ進んでいるように思えます。
00:04:10実際そうかもしれません。
00:04:10その3週間前に何が起きたかを見るまでは。
00:04:14Qualcommによる買収が7月29日に完了しました。
00:04:16Mojo 1.0がリリースされたのは8月11日です。
00:04:19コンパイラの公開は8月18日です。
00:04:21つまり、Mojoの歴史において最大級の開放の節目は、Modularが独立企業でなくなってから3週間足らずの間に起きたのです。
00:04:29これにより、この件の捉え方には全く異なる2つの見方が生まれます。
00:04:331つ目は、Qualcommがあらゆる場所でMojoを使いたいからModularを買収したという見方です。
00:04:37おそらく違うでしょう。
00:04:37あるいは、QualcommがModularを買収し、最終的にこのすべてがはるかに巨大な企業に吸収されるという見方です。
00:04:44Qualcommはチップを作っています。
00:04:45チップに対してうまくコンパイルできる言語は、はるかに価値が高いものになります。
00:04:49私たちは実際にそれを自由に使えるようになります。
00:04:50ですから、オープンソース化という動きは理にかなっています。
00:04:53しかし、Mojoが成功するかどうかはおそらくQualcomm次第ではないでしょう。
00:04:57そもそも言語そのものが、乗り換えを正当化するのに十分なほど優れているかどうかにかかっています。
00:05:02しかし繰り返しになりますが、ここから物事が複雑にこじれ始めます。
00:05:05Mojoにはベンチマークの問題があります。
00:05:072023年に遡ると、MojoはPythonよりも6万8,000倍高速になり得るという大々的な数字が掲げられました。
00:05:13それは常軌を逸しています。
00:05:14DNAパースにおいてMojoがRustよりも50%高速であると主張する投稿もいまだに存在しています。
00:05:19そのベンチマークは徹底的に解体されました。
00:05:21そのベンチマークが測定していたのは、主張されているものではなかったことが示されたのです。
00:05:25そして今でも3万5,000倍という数字が飛び交っているのを目にするでしょう。
00:05:29それは行列積に由来するものです。
00:05:31しかし、彼らが比較しているのは、ええと、
00:05:34一方には完全なベクトル化、並列化、タイル化が行われたMojoの実装があります。
00:05:40もう一方には、純粋なPythonによる三重のループがあります。
00:05:44そう、三重のループです。
00:05:45NumPyではなく、地球上の誰も実際には使わないようなネストしたループです。
00:05:49ですから、3万5,000倍高速という話にはあまり興味がありません。
00:05:52私はこのマシンでの数値が知りたかったのです。
00:05:54M4 Proでの純粋なPythonとの比較です。
00:05:57純粋なPythonに対しては、26倍半ほど高速でした。
00:06:00NumPyと比較すると、処理ごとに約2倍近い高速化が見られます。
00:06:05もちろん、26倍は6万8,000倍ではありません。
00:06:08しかし、NumPyの内部はすでにC言語で書かれていることを考慮すれば、26倍というのも立派な数字です。
00:06:14その時点ですでにPythonを凌駕しているわけではありません。
00:06:16優れたメモリ挙動をもってC言語を凌駕しているのです。
00:06:19それがMojoについての歯がゆいところです。
00:06:21ですが、パフォーマンスこそが今私がMojoの採用をためらう最大の理由ではありません。
00:06:25以前にも触れました。
00:06:27今日もここで実行しています。
00:06:28大きな問題は安定性です。
00:06:30さて、これはどれほど安定しているのでしょうか?
00:06:32Mojo 1.0には、int、print、lenといったコアな組み込み関数を含め、41の不安定なAPI警告が含まれた状態でリリースされているからです。
00:06:40それらは「安定性リリース」と称されるものの中で、不安定なものとしてフラグが立てられていました。
00:06:45そしてMojoがコードは壊れないと約束したまさにその日に、fnキーワードの削除によりおよそ39個のパッケージエコシステムが壊れました。
00:06:52今や、Mojoの動作において極めて重要だったfnキーワードが完全に削除されてしまいました。
00:06:58FCプロセスもありません。
00:06:59コンパイラはオープンソースになりましたが、まだコントリビューションは受け付けていません。
00:07:04ですからMojo 1.0は安定していると言えるのでしょう、おそらくは。
00:07:07しかし、彼らが言うほど安定してはいないかもしれません。
00:07:09そこで、本当に重要な唯一の問いに行き着きます。
00:07:12これを使うべきでしょうか?
00:07:13もしGPUカーネルやCUDA、Tritonといった世界でコードを書いているなら、Mojoは1、2日触ってみるだけの価値が間違いなくあると思います。
00:07:21CPUとGPUで単一の言語が使え、ノートPC上で動作するGPUカーネルをコンパイルできました。
00:07:27それを実現できるものは他にあまりありません。
00:07:29しかし、これにはまだ成長の余地がたくさん残されています。
00:07:31そのため、現時点では何よりも優先して採用することはないでしょう。
00:07:353年前、Mojoに対する反対意見は非常にシンプルでした。
00:07:38クールな新言語だが、いったい誰が使うのか?と。
00:07:40それは、開発者にすべてを賭けるよう求めるスタートアップによるクローズドな言語でした。
00:07:44今日では、コンパイラはApache 2.0になり、
00:07:47言語は1.0になり、
00:07:48そしてそのスタートアップは今やQualcommの一部となっています。
00:07:51BetterStackのJoshでした。
00:07:53このようなコーディングのヒントやコツが気に入ったら、ぜひチャンネル登録を。
00:07:56また別の動画でお会いしましょう。

Key Takeaway

Mojo 1.0のリリースとコンパイラのオープンソース化によってPythonライクな記述でCPUとGPUを統合する実用性が高まった一方、APIの不安定さや言語仕様の変更が課題として残っている。

Highlights

  • プログラミング言語Mojoがバージョン1.0に到達し、Apache 2.0ライセンスの下でコンパイラがオープンソース化された。

  • MojoはQualcommによるModularの買収からわずか数週間後にオープンソース化された。

  • M4 Pro上のMojo版プログラムは純粋なPythonに対して約26.5倍高速に動作した。

  • Mojo 1.0のリリース時にはintやprintなどのコアな組み込み関数を含む41の不安定なAPI警告が含まれていた。

  • Mojoの安定性リリースにおいてfnキーワードが削除され、およそ39個のパッケージエコシステムに影響を与えた。

Timeline

Mojo 1.0の登場と背景

  • Mojoはバージョン1.0を迎え、Pythonのような記述でC++やCUDAと同等の速度を実現することを目指している。
  • 左側のPythonと右側のMojoで同じループ処理を実行すると、Mojoのコンパイルでは命令が統合される。
  • PythonからC++やCUDAへ移行する従来の流れは2つのファイルの管理と乖離を生む原因となる。

MojoはPythonの書きやすさを維持しながら、CPUとGPUの間で単一の言語を使用できる環境を提供する。同じロジックを持つループ処理を実行した際、PythonとMojoではコンパイル方式の違いにより演算の統合や最適化が行われる。複数の言語を使い分けることによる管理の複雑さを解消するのがMojoの存在意義である。

オープンソース化とQualcommによる買収

  • MojoはMacBook上で動作するGPUカーネルをPythonと同じ言語で直接コンパイルできる。
  • 標準ライブラリやMaxカーネルの公開を経て、コンパイラ本体が2025年8月18日にApache 2.0の下でオープンソース化された。
  • コンパイラ公開の直前である7月29日にQualcommによるModularの買収が完了した。

Mojoはコンパイラが非公開であった点が長年の批判材料となっていたが、バージョン1.0の出荷直前にオープンソース化された。この開放のタイミングはQualcommによるModularの買収と重なっており、チップの性能を引き出すための言語としての価値や今後のエコシステムに大きな影響を与える。

ベンチマークの実態と安定性の課題

  • Mojoは純粋なPythonに対して約26.5倍高速であり、NumPyと比較しても約2倍近い高速化が見られる。
  • 過去に主張された6万8,000倍という数字は、完全並列化されたMojoとPythonの非現実的な三重ループを比較したものである。
  • Mojo 1.0は41の不安定なAPI警告を含み、fnキーワードの削除によって複数のパッケージに影響が出ている。

過激なベンチマーク数値の検証が行われる中、実際のMojoは純粋なPythonやNumPyに対して確実なパフォーマンス上の優位性を示す。しかし、バージョン1.0と称されながらもコアな組み込み関数に不安定なAPIフラグが残っており、重要なキーワードの削除によって既存のパッケージが破損するなど、実運用に向けた安定性の面にはまだ課題が残されている。

Community Posts

No posts yet. Be the first to write about this video!

Write about this video