前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >实战Mojo🔥安装 & 使用,Python 开发者不必惊慌

实战Mojo🔥安装 & 使用,Python 开发者不必惊慌

原创
作者头像
远哥制造
修改2024-04-16 15:12:48
24000
代码可运行
修改2024-04-16 15:12:48
举报
文章被收录于专栏:远哥制造远哥制造
运行总次数:0
代码可运行

0x00.前言

前一阵子就在各个公众号中看到 Mojo 相关的文章推送了,标题中均与 py 进行了对比

只保留标题,链接就不放了

毕竟自己对于 py 实在是太熟悉了,于是决定趁此征文机会来亲体验一下这个 Mojo 到底怎么样

0x01.Modular

官网: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)

0x02.Mojo

官网:https://www.modular.com/max/mojo

这下明白了为啥 mojo 的 uri 是 /max/mojo 了,因为它是 modular 推出的 MAX 平台的产品之一

官网上的吉祥物?似乎就是个拟人化的🔥,xswl

Mojo 结合了 py 的易用性和 C 的性能。众所周知,其实 py 的 Numpy 库,为了速度也把关键的计算部分下放到 C/C++ 上了

一、部分特性:

1. PROGRESSIVE TYPES

高级类型。像是 py 的 typing

代码语言:python
代码运行次数:0
复制
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])

2. ZERO COST ABSTRACTIONS

零成本抽象。通过将值内联分配到结构中来掌控存储

代码语言:javascript
复制
struct MyPair:
  var first: Int
  var second: F32
  
  def __init__(self, first: Int, second: F32):
    self.first = first
    self.second = second

3.OWNERSHIP + BORROW CHECKER

利用具有内存安全性而无毛边的优势?

代码语言:javascript
复制
def reorder_and_process(owned x: HugeArray):
  sort(x)	# Update in place
  
  give_away(x^)	# Transfer ownership
  
  print(x[0])	# Error: ‘x’ moved away!

4.PORTABLE PARAMETRIC ALGORITHMS

可移植参数化算法。hardware-agnostic 是与硬件无关的算法,难道说的是 SHA256?

代码语言:javascript
复制
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)

5. LANGUAGE INTEGRATED AUTO-TUNING

语言集成自动调优。会自动找到参数的最佳值,这个特性看起来可以的

代码语言:javascript
复制
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)

还有未详细列出的

  • The full power of MLIR
  • Parallel heterogenous runtime
  • Fast compile times

二、解锁 py 的性能

可利用多核、矢量单元和外来加速器单元。可实现与 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")

四、可拓展性

已经完全看不懂了,说的应该是模型相关的内容

0x03.安装

文档:https://docs.modular.com/mojo/manual/get-started/

在官网看了这么久,终于可以 get-started 来安装尝试一下了 > <

目前仅支持:Linux 和 Mac,自己用的是后者。并且 Mac 必须是 Apple silicon (M1 or M2 processor),自己是最基础的 M1

Mac 需求

  • Apple silicon (M1 or M2 processor) ✅
  • macOS Monterey (12) or later✅
  • Python 3.8 - 3.11✅
  • Command-line tools for Xcode, or Xcode✅

最高支持到 py3.11,并不支持 py3.12。这里也能看出其实 mojo 是依赖 py 的

首先检查本地的 py3 版本,然后升级 py3.11 到最新 3.11.9

代码语言:bash
复制
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 了

代码语言:bash
复制
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 域名,还不能开代理……

代码语言:bash
复制
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

代码语言:bash
复制
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. 设置环境变量

代码语言:bash
复制
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 安装完成了

0x04. Hello World

运行的时候进程时 mojo-lldb

看到它有 VS Code 的拓展,于是去安装并激活

下载例程:git clone https://github.com/modularml/mojo.git

然后就可以在 VS Code 中运行了,成功跑通 hello world

再运行一个 deviceinfo.mojo 查看设备信息

代码语言:bash
复制
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

0x05. 后记

折腾了这么久(近 3h),是时候来总结一下了。Mojo 对于 AI 方向的使用确实是有优点,毕竟它可以自动调优寻找参数

很明显但是对于传统的 py 开发,它并不能从根本上替代,它本来的定位也是 py 的超集

作为一名 py 开发者也完全没有必要惊慌,毕竟安装 python 可不会让你联网关联账号(笑

关于 Mojo 的特性后续还可以继续深入了解一下,比如还是那个 LANGUAGE INTEGRATED AUTO-TUNING 还是很吸引人的

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 0x00.前言
  • 0x01.Modular
  • 0x02.Mojo
    • 一、部分特性:
      • 1. PROGRESSIVE TYPES
      • 2. ZERO COST ABSTRACTIONS
      • 3.OWNERSHIP + BORROW CHECKER
      • 4.PORTABLE PARAMETRIC ALGORITHMS
      • 5. LANGUAGE INTEGRATED AUTO-TUNING
        • 二、解锁 py 的性能
          • 三、互操作性
            • 四、可拓展性
            • 0x03.安装
            • 0x04. Hello World
            • 0x05. 后记
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档