焼肉並みに熱い!Mojoで超速プログラミング🔥
概要
この記事の対象者:
Mojoに興味がある初心者を対象に書いています。
この記事の内容:
「Mojo」の特徴、開発経緯、MLIRについての概要、および導入方法について書いています。
この記事を読むとわかること:
Mojoの基本的な特徴や利点、開発の背景、MLIRの役割、およびMojoのインストール方法について理解できます。
序論
みなさん、「Mojo」はご存知でしょうか。
pythonと互換があり、そしてpythonより60000倍早く
なぜかロゴが火の絵文字🔥の謎の言語「もじゃ?」「もじょ?」
みたいな物があるらしいと先ほど焼肉🔥を食べていた際、聞きました。
そんな流れでお肉とMojoについて触ってみることにしました。
Mojoについて [*1]
Mojoとは
- MojoはMLIRを基盤から組み込んだ初のプログラミング言語
- Mojoの読みは「モ'じょ」(モにアクセント)
- 意味は魅力、気力、魔法、、、(魔法のような言語という意味?)
- Python互換: Pythonエコシステムと完全な互換性を目指し、既存のPythonコードをインポートして使用可能。
- 高速: pythonと異なりコンパイル型のプログラミングで、複数コアにわたる並列処理が可能
- MLIRベース: MLIR(中間表現)を基盤とし、幅広いハードウェアでの高性能実行を可能にする。
もじょのMojoを使ってもじょなアプリでもじょを与えるもじょ人になれるかもしれない
Mojoの開発経緯
- Mojaを開発したModular社は当初プログラミング言語を開発する想定はしていなかった。
- AIのプラットフォーム開発の中、異なるハードウェアに対応するために既存の言語がサポートしていない機能(強力なメタプログラミングや適応型コンパイル技術など)が必要となった。
- プログラミング言語の重要性を知ったModular社は2023年に言語を公開した。
MLIRとは
- MLIR(Multi Level Intermediate Representation)とは、プログラミング言語のコンパイラやツールチェーンにおいて、中間表現を多段階で扱うためのフレームワーク
- MLIRは機械学習モデルのコンパイル、高性能コンピューティング (HPC)、コンパイラ構築などに使われる
- 例えばTensorFlow(機械学習モデルを構築し、トレーニングし、デプロイするためツールセット)を異なるハードウェア(CPU、GPU、TPUなど)向けに最適化されたコードを生成する時にMLIRを利用する
導入方法(2024年6月現在)[*2]
対応スペック
- Mac(M1 or M2) or Linuxが対応。
- Windowsや一部のMac(M3,intel chip)は非対応。
- Python 3.8 - 3.11に対応。
1.Install Modular
ターミナルで以下のコマンドを実行してください.
少し時間がかかります(10分ほど)
curl -s https://get.modular.com | sh -
成功すれば以下のように出力されます
__ __ _ _
| \/ | ___ __| |_ _| | __ _ _ __
| |\/| |/ _ \ / _` | | | | |/ _` | '__|
| | | | (_) | (_| | |_| | | (_| | |
|_| |_|\___/ \__,_|\__,_|_|\__,_|_|
Welcome to the Modular CLI!
以下のエラーが発生した場合
curl -s https://get.modular.com | sh -
で以下のエラーが出た場合。
Installing/upgrading Modular using Homebrew
modular: The arm64 architecture is required for this software.
Error: modular: An unsatisfied requirement failed this build.
エラーの原因は一概ではありませんが、私の場合、以下のコマンドでM1/M2チップに対応したHomebrewをインストールし直すことでエラーが解決できました。
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/uninstall.sh)"
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> ~/.zprofile
eval "$(/opt/homebrew/bin/brew shellenv)"
brew update
brew install modular
curl -s https://get.modular.com | sh -
以下私が確認した項目と手順です。
- アーキテクチャの確認
- ターミナルで以下のコマンドを実行してください.
uname -m
- もし x86_64 と表示された場合、現在のマシンはIntelベースであり、arm64アーキテクチャでないためインストール不可です
- Homebrewのパスの確認
-以下のコマンドでHomebrewのパスを確認してくださいecho $PATH
- 通常、/opt/homebrew/bin がパスに含まれている必要があります
- HomebrewのDoctorコマンドを実行
- Homebrewの環境が正しく設定されているか確認するために、以下のコマンドを実行します
brew doctor
- Homebrewのモジュールリストの更新
- Homebrewのパッケージリストを更新して、最新の情報を取得します
brew update
- Modularのインストールパスを確認
brew install modular
- ログファイルの確認
- Homebrewのインストールログを確認して、具体的なエラーの原因を特定します
brew --prefix
- 通常、ログファイルは
/usr/local/var/log
または/opt/homebrew/var/log
にあります。 - しかし、今回
/usr/local
となっておりHomebrewがIntelベースの環境としてインストールされていました。 - そこで上記のM1/M2チップに対応したHomebrewをインストールを行いました。
2.Install Mojo
- お馴染みの仮想環境を作ります。
python3 -m venv mojo-venv && source mojo-venv/bin/activate
- 次にmodularでmojoをインストールします。
modular install mojo
以下の表示がされれば成功です。
🔥 Mojo installed! 🔥
- 最後にパスを通します。(zsh)
MOJO_PATH=$(modular config mojo.path) \
&& BASHRC=$( [ -f "$HOME/.bash_profile" ] && echo "$HOME/.bash_profile" || echo "$HOME/.bashrc" ) \
&& echo 'export MODULAR_HOME="'$HOME'/.modular"' >> "$BASHRC" \
&& echo 'export PATH="'$MOJO_PATH'/bin:$PATH"' >> "$BASHRC" \
&& source "$BASHRC"
3. Run code in the REPL
早速以下のコードよりREPLでmojoを実行してみます。
mojo
以下の画面が表示されますので、`1>``の続きにprint文を入れましょう
Welcome to Mojo! 🔥
Expressions are delimited by a blank line.
Type `:quit` to exit the REPL and `:mojo help repl` for further assistance
1> print("Hello, Enjo! 🔥")
print文が返ってくれば成功です!pythonと同じですね、
4. Run a Mojo file
次は、mojoファイルを作成し実行してみます。
mojoファイルの拡張子は、.mojo
または.🔥
です。
早速、以下のコードをhello.🔥
という名前作成します。
fn main():
print("Hello, Enjo! 🔥")
そしてターミナルで以下を実行します
mojo hello.🔥
print文が返ってくれば成功です。
拡張子が.mojo
でも同様の手順です。
ただし、hello.🔥
で作成してmojo hello.mojo
で実行したり
hello.mojo
で作成してmojo hello.🔥
で実行することはできないので注意です。
結論
今回Mojoを触ってみましたが、「まだまだ味見段階」という感想です。
導入はスムーズでしたが、その真の力を発揮するのはこれからかなと思います。
今後もじょもじょしながらアプリ開発に挑戦してみようと思います。
もしかしたら、本当に焼肉より速いプログラミングができるかもしれません!
参照
*1
*2
Discussion