前一阵子就在各个公众号中看到 Mojo 相关的文章推送了,标题中均与 py 进行了对比
只保留标题,链接就不放了
毕竟自己对于 py 实在是太熟悉了,于是决定趁此征文机会来亲体验一下这个 Mojo 到底怎么样
官网:https://www.modular.com/
映入眼帘的是 MAX 平台——Modular Accelerated Xecution,而 Mojo 应该是其中的一个产品
The Modular Accelerated Xecution (MAX) platform is a unified set of tools and libraries that provides everything you need to deploy low-latency, high-throughput, real-time AI inference pipelines into production.
意思是:模块化加速执行 (MAX) 平台是一套统一的工具和库,可提供部署低延迟、高吞吐量、实时 AI 推理管道到生产环境所需的一切
在下面的 MAX 组件中找到了 Mojo,除他之外还有 MAX Engine 和 MAX Serving
Mojo 中提供的代码片段也是与机器学习相关的库,使用 Mojo 仅需三行代码即可接入
可用于替换TensorFlow, PyTorch,ONNX inference(这个就叫做 MAX Engine)
官网:https://www.modular.com/max/mojo
这下明白了为啥 mojo 的 uri 是 /max/mojo 了,因为它是 modular 推出的 MAX 平台的产品之一
官网上的吉祥物?似乎就是个拟人化的🔥,xswl
Mojo 结合了 py 的易用性和 C 的性能。众所周知,其实 py 的 Numpy 库,为了速度也把关键的计算部分下放到 C/C++ 上了
高级类型。像是 py 的 typing
def sort(v: ArraySlice[Int]):
for i in range(len(v)):
for j in range(len(v) - i - 1):
if v[j] > v[j + 1]:
swap(v[j], v[j + 1])
零成本抽象。通过将值内联分配到结构中来掌控存储
struct MyPair:
var first: Int
var second: F32
def __init__(self, first: Int, second: F32):
self.first = first
self.second = second
利用具有内存安全性而无毛边的优势?
def reorder_and_process(owned x: HugeArray):
sort(x) # Update in place
give_away(x^) # Transfer ownership
print(x[0]) # Error: ‘x’ moved away!
可移植参数化算法。hardware-agnostic 是与硬件无关的算法,难道说的是 SHA256?
def exp[dt: DType, elts: Int]
(x: SIMD[dt, elts]) -> SIMD[dt, elts]:
x = clamp(x, -88.3762626647, 88.37626266)
k = floor(x * INV_LN2 + 0.5)
r = k * NEG_LN2 + x
return ldexp(_exp_taylor(r), k)
语言集成自动调优。会自动找到参数的最佳值,这个特性看起来可以的
def exp_buffer[dt: DType](data: ArraySlice[dt]):
# Search for the best vector length
alias vector_len = autotune(1, 4, 8, 16, 32)
# Use it as the vectorization length
vectorize[exp[dt, vector_len]](data)
还有未详细列出的
可利用多核、矢量单元和外来加速器单元。可实现与 C++ & CUDA 相当的性能,震惊😱
虽然 py 有 GIL,但是 py 又不是不能并行……这个图就看个乐子吧
果然之后在官方文档中找到了详细说明。没错,指的果然是 GIL
然后就看到了广为传播的 68000x:https://www.modular.com/blog/mojo-a-journey-to-68-000x-speedup-over-python-part-3
说的就是可以与 py 代码结合的写,比如下面的 Python.import_module("matplotlib.pyplot")
已经完全看不懂了,说的应该是模型相关的内容
文档:https://docs.modular.com/mojo/manual/get-started/
在官网看了这么久,终于可以 get-started 来安装尝试一下了 > <
目前仅支持:Linux 和 Mac,自己用的是后者。并且 Mac 必须是 Apple silicon (M1 or M2 processor),自己是最基础的 M1
Mac 需求
最高支持到 py3.11,并不支持 py3.12。这里也能看出其实 mojo 是依赖 py 的
首先检查本地的 py3 版本,然后升级 py3.11 到最新 3.11.9
yuangezhizao@MacMini ~ % brew search python@3
==> Formulae
boost-python3 python@3.12 ✔ python@3.9 ✔ cython
python@3.10 ✔ python@3.7 ipython jython
python@3.11 ✔ python@3.8 bpython
yuangezhizao@MacMini ~ % brew upgrade python@3.11
Warning: python@3.11 3.11.9 already installed
yuangezhizao@MacMini ~ % python3.11
Python 3.11.9 (main, Apr 2 2024, 08:25:04) [Clang 15.0.0 (clang-1500.3.9.4)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>>
zsh: suspended python3.11
1. 这样需求就完全满足了,然后开始安装 modular
因为 Mojo 集成在 MAX SDK 中,所以其实安装后者后就有 Mojo 了
但是这个 MAX SDK 目前仅支持 Linux Ubuntu 20.04/22.04 LTS,不支持 windows 和 macOS。所以在 macOS 下只能安装单 Mojo 了
yuangezhizao@MacMini ~ % curl -s https://get.modular.com | sh -
Updating Homebrew
==> Updating Homebrew...
Already up-to-date.
Installing/upgrading Modular using Homebrew
==> Tapping modularml/packages
Cloning into '/opt/homebrew/Library/Taps/modularml/homebrew-packages'...
remote: Enumerating objects: 120, done.
remote: Counting objects: 100% (120/120), done.
remote: Compressing objects: 100% (67/67), done.
remote: Total 120 (delta 29), reused 100 (delta 24), pack-reused 0
Receiving objects: 100% (120/120), 14.28 KiB | 2.86 MiB/s, done.
Resolving deltas: 100% (29/29), done.
Tapped 1 formula (13 files, 23.2KB).
==> Fetching modularml/packages/modular
==> Downloading https://dl.modular.com/public/installer/raw/names/modular-mac-ar
==> Downloading from https://dl.modular.com/public/installer/raw/names/modular-m
######################################################################### 100.0%
==> Installing modular from modularml/packages
cat <<EOF
__ __ _ _
| \/ | ___ __| |_ _| | __ _ _ __
| |\/| |/ _ \ / _\` | | | | |/ _\` | '__|
| | | | (_) | (_| | |_| | | (_| | |
|_| |_|\___/ \__,_|\__,_|_|\__,_|_|
Welcome to the Modular CLI!
To get started, see:
MAX - https://modul.ar/get-started
Mojo - https://modul.ar/mojo-get-started
For info about this tool, type "modular --help".
EOF
==> Caveats
The Modular tool expects or will create a MODULAR_HOME directory.
This defaults to `~/.modular`. You can create your own, and if you do,
please add `MODULAR_HOME=/path/to/your/dir` to your environment.
==> Summary
🍺 /opt/homebrew/Cellar/modular/0.7.1: 6 files, 61.4MB, built in 4 seconds
==> Running `brew cleanup modular`...
Disable this behaviour by setting HOMEBREW_NO_INSTALL_CLEANUP.
Hide these hints with HOMEBREW_NO_ENV_HINTS (see `man brew`).
2. 然后还得连接自己的 Modular 账户,竟然不能完全离线使用?也就是说它并不能安装在完全离线的类似客户的生产环境中
于是被迫去注册账户,注册时还得用同一个浏览器,并且验证账户还是 hubspotlinks.com 域名,还不能开代理……
yuangezhizao@MacMini ~ % modular auth
To complete auth, open this web page:
https://developer.modular.com/device?userCode=MPFL-<rm>
Verify using this code:
MPFL-<rm>
Waiting for confirmation...
3. 最后才能正式安装 mojo
yuangezhizao@MacMini ~ % modular install mojo
# Found release for https://packages.modular.com/mojo @ 24.2.1-2f0dcf11-release
# Downloading archive: packages/24.2.1-2f0dcf11-release/mojo-arm64-apple-darwin22.6.0-24.2.1-2f0dcf11-release-12-0.tar.gz
Downloaded [ ██████████████████████████ ] 100% 167MiB/167MiB
# Extracting downloaded archives.
Extracted [ ██████████████████████████ ] 100% 167MiB/167MiB
# Extraction complete, setting configs...
# Configs complete, running post-install hooks...
🔥 Mojo installed! 🔥
Mojo's Python virtual environment created at /Users/yuangezhizao/.modular/pkg/packages.modular.com_mojo/venv
If you are using ZSH (default on macOS), run the following commands:
echo 'export MODULAR_HOME="/Users/yuangezhizao/.modular"' >> ~/.zshrc
echo 'export PATH="/Users/yuangezhizao/.modular/pkg/packages.modular.com_mojo/bin:$PATH"' >> ~/.zshrc
source ~/.zshrc
If you are using bash, run the following commands:
BASHRC=$( [ -f "$HOME/.bash_profile" ] && echo "$HOME/.bash_profile" || echo "$HOME/.bashrc" )
echo 'export MODULAR_HOME="/Users/yuangezhizao/.modular"' >> "$BASHRC"
echo 'export PATH="/Users/yuangezhizao/.modular/pkg/packages.modular.com_mojo/bin:$PATH"' >> "$BASHRC"
source "$BASHRC"
Then enter 'mojo' to start the Mojo REPL.
For tool help, enter 'mojo --help'.
For more docs, see https://docs.modular.com/mojo.
4. 设置环境变量
yuangezhizao@MacMini ~ % echo 'export MODULAR_HOME="/Users/yuangezhizao/.modular"' >> ~/.zshrc
yuangezhizao@MacMini ~ % echo 'export PATH="/Users/yuangezhizao/.modular/pkg/packages.modular.com_mojo/bin:$PATH"' >> ~/.zshrc
yuangezhizao@MacMini ~ % source ~/.zshrc
终于,Mojo 安装完成了
运行的时候进程时 mojo-lldb
看到它有 VS Code 的拓展,于是去安装并激活
下载例程:git clone https://github.com/modularml/mojo.git
然后就可以在 VS Code 中运行了,成功跑通 hello world
再运行一个 deviceinfo.mojo 查看设备信息
yuangezhizao@MacMini examples % mojo deviceinfo.mojo
System information:
OS : macOS
CPU : apple-m1
Arch : arm64-apple-darwin23.4.0
Physical Cores : 8
Logical Cores : 8
CPU Features : neon Apple M1
折腾了这么久(近 3h),是时候来总结一下了。Mojo 对于 AI 方向的使用确实是有优点,毕竟它可以自动调优寻找参数
很明显但是对于传统的 py 开发,它并不能从根本上替代,它本来的定位也是 py 的超集
作为一名 py 开发者也完全没有必要惊慌,毕竟安装 python 可不会让你联网关联账号(笑
关于 Mojo 的特性后续还可以继续深入了解一下,比如还是那个 LANGUAGE INTEGRATED AUTO-TUNING 还是很吸引人的
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。