让开源决策模型 Laya 在本地自己玩俄罗斯方块 —— 跨平台搭建全记录
不用显卡、不用联网 API,一台普通电脑就能让一个 3.2 亿参数的 AI 决策模型实时玩俄罗斯方块,单步决策约 122ms。本文覆盖 macOS / Windows / Linux 三大主流平台的完整搭建过程,照着做即可复现。
一、Laya 是什么?
Laya 是近期 GitHub 上爆火的开源项目(上线 5 天破 2 万 Star),它是一个非自回归的"系统一"决策引擎:
- 不逐字生成文本,而是一次前向传播直接输出类型化决策(choice / score / noul 三种问题类型),单次推理仅约 33ms;
- 支持 100+ 语言,概率经过校准,可以放心用于自动化决策;
- 官方演示里最抓眼球的玩法就是:让模型实时玩贪吃蛇和俄罗斯方块。
不过要注意一个坑:官方主仓库 NandhaKishorM/laya 自带的游戏 demo 只有贪吃蛇(TypeScript 版)。官方推荐的俄罗斯方块 demo 在社区仓库 zzhdbw/laya-Ascend(fork 自官方主仓库),支持 CPU 和华为昇腾 NPU,普通玩家走 CPU 路径即可,Mac、Windows、Linux 都能跑。
它玩俄罗斯方块的思路很有意思:
- 枚举当前方块的所有合法落点;
- 用经典启发式算法筛出 4 个候选;
- 把每个候选翻译成一句中文陈述,例如:
这个落点消除一行,不留空洞,堆叠保持低位。 - 向 Laya 提一个
noul(是/否)问题:这是一个好的落点吗? - 选择
P(好落点)概率最高的候选落子。外层还有安全护栏,避免模型把堆叠玩到板顶。
二、环境准备
本教程实测于 macOS(Apple Silicon)+ Python 3.13,命令同时给出三大平台的版本。三平台共同要求:
- Python ≥ 3.10(依赖 torch 2.14、transformers 5.x 都要求 3.10+;3.11/3.12/3.13 均可)
- 能访问 GitHub 和 PyPI;HuggingFace 直连不通的话用国内镜像(下文有说明)
- 磁盘空间约 3GB(torch + 模型权重)
各平台安装 Python 的方式:
| 平台 | 安装方式 |
|---|---|
| macOS | 官网安装包,或 brew install python@3.12 |
| Windows | python.org 下载安装包,务必勾选 "Add python.exe to PATH" |
| Linux (Ubuntu/Debian) | sudo apt install python3 python3-venv python3-pip |
| Linux (Fedora/RHEL) | sudo dnf install python3 python3-pip |
全程只需 CPU,不需要 NVIDIA 显卡;有独占 GPU 的机器也一样走 CPU 路径,速度完全够用(每步决策百毫秒级)。
三、第一步:下载俄罗斯方块 demo 仓库
macOS / Linux(终端):
mkdir -p ~/studyspace/laya && cd ~/studyspace/laya
# 方式一:git clone
git clone --depth 1 https://github.com/zzhdbw/laya-Ascend.git
# 方式二:网络不稳时,直接下 tarball
curl -L -o laya-ascend.tar.gz https://codeload.github.com/zzhdbw/laya-Ascend/tar.gz/refs/heads/main
tar -xzf laya-ascend.tar.gz && mv laya-Ascend-main laya-Ascend
Windows(PowerShell):
mkdir ~\studyspace\laya; cd ~\studyspace\laya
# 方式一:git clone(需已安装 Git for Windows)
git clone --depth 1 https://github.com/zzhdbw/laya-Ascend.git
# 方式二:tarball(Windows 10+ 自带 curl 和 tar)
curl.exe -L -o laya-ascend.tar.gz https://codeload.github.com/zzhdbw/laya-Ascend/tar.gz/refs/heads/main
tar -xzf laya-ascend.tar.gz; Move-Item laya-Ascend-main laya-Ascend
下载后确认 demo 文件齐全(三平台通用,Windows 在 PowerShell 里跑同款命令):
ls laya-Ascend/examples/tetris/
# game.py policy.py play.py runtime.py server.py static/
各文件的分工:
| 文件 | 作用 |
|---|---|
game.py |
俄罗斯方块规则、落点枚举、启发式候选筛选 |
policy.py |
把候选落点翻译成中文陈述,用 Laya 打分 |
play.py |
终端 ASCII 可视化 |
server.py |
网页可视化服务(Canvas 动画) |
runtime.py |
自动选择 CPU/NPU、加载模型、warmup |
四、第二步:创建虚拟环境并安装 Laya
强烈建议用虚拟环境,避免污染系统 Python。以下命令假设你都在 laya-Ascend 的上一级目录工作,后文统一用 ~/.venvs/laya 作为虚拟环境位置(Windows 为 ~\.venvs\laya)。
macOS / Linux(bash/zsh):
python3 -m venv ~/.venvs/laya
source ~/.venvs/laya/bin/activate
pip install --upgrade pip
pip install laya
Windows(PowerShell):
py -3 -m venv ~\.venvs\laya
~\.venvs\laya\Scripts\Activate.ps1
pip install --upgrade pip
pip install laya
Windows 首次激活脚本可能报"禁止运行脚本",先执行一次:
Set-ExecutionPolicy -Scope CurrentUser RemoteSigned,输入Y回车即可。
激活成功后命令行前面会出现 (laya) 前缀。安装会自动带上 torch、transformers、huggingface_hub 等全部依赖(torch 比较大,耐心等几分钟)。
装完验证一下版本(三平台相同):
python -c "import laya; print(laya.__version__)"
# 笔者写作时输出: 0.3.20
激活虚拟环境后,直接用
python命令即可;未激活时用完整路径~/.venvs/laya/bin/python(macOS/Linux)或~\.venvs\laya\Scripts\python.exe(Windows)。
五、第三步:下载模型权重
demo 默认使用 laya-multilingual 检查点(mmBERT 底座,3.22 亿参数),放到仓库的 models/laya-multilingual 目录。
网络可以直连 HuggingFace 的读者:
huggingface-cli download convaiinnovations/laya-multilingual `
--local-dir laya-Ascend/models/laya-multilingual
(PowerShell 中换行符用反引号 `,bash/zsh 用 \;不嫌长就写成一行。)
直连不通(国内网络环境常见),用 hf-mirror 镜像:
# macOS / Linux
export HF_ENDPOINT=https://hf-mirror.com
# Windows PowerShell
$env:HF_ENDPOINT = "https://hf-mirror.com"
然后(三平台相同):
huggingface-cli download convaiinnovations/laya-multilingual --local-dir laya-Ascend/models/laya-multilingual
提示: - 新版 huggingface_hub(1.x)的命令是
hf download,老的huggingface-cli download仍然兼容; - 下载约 1GB,完成后laya-Ascend/models/laya-multilingual/里应能看到model.safetensors、encoder/、tokenizer/等文件。
六、第四步:先跑通终端版
先别急着开网页,用终端版验证整条链路(模型加载 + 推理决策)。三平台命令相同(确保虚拟环境已激活):
cd laya-Ascend
python examples/tetris/play.py --device cpu --pieces 3
正常的话你会看到类似输出:
candidates:
* [0] lines=0 holes=0 height=4 heuristic=-3.00 p_good=0.7184 这个落点不消行,不留空洞,堆叠保持低位。
[1] lines=0 holes=1 height=2 heuristic=-8.40 p_good=0.3765 这个落点不消行,埋下一个空洞,堆叠保持低位。
...
proposed=0 executed=0 intervened=False inference=122.2ms tokens=206
+----------+
|..........|
...
score=0 lines=0 pieces=3 current=I next=Z alive=True
看到 p_good 概率和 inference 耗时,说明 Laya 已经在正常决策了。可以把 --pieces 调大到 20 甚至 50,看它连续玩的表现。
Windows 终端若显示中文乱码,先执行
chcp 65001切换到 UTF-8 代码页再运行。
七、第五步:打开网页,看 Laya 玩俄罗斯方块
终端 ASCII 终归不够过瘾,demo 自带一个 Canvas 网页版,有方块下落动画、候选概率面板和速度调节。三平台命令相同:
cd laya-Ascend
python examples/tetris/server.py --device cpu --port 8011
看到服务启动后,浏览器打开:
http://127.0.0.1:8011
页面里可以:
- 点击 新开一局,观看 Laya 逐块决策,方块带下落动画;
- 查看 4 个候选落点各自的
P(好落点)概率条; - 调节速度、开关安全护栏;
- 观察得分、消除行数、护栏干预次数和每块推理耗时。
八、如何停止本地服务
这是很多教程漏掉的一步。分两种情况:
情况一:服务在终端前台运行(你能看到它的日志输出)
三平台通用:在服务所在终端窗口直接按 Ctrl + C 即可终止。
情况二:服务在后台运行(比如用了 nohup、&,或终端窗口已被关闭)
需要先找到占用 8011 端口的进程,再终止它。
macOS / Linux:
# 查看谁在监听 8011
lsof -nP -iTCP:8011 -sTCP:LISTEN
# 输出类似:
# COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
# python3.1 29308 johnjackson 5u IPv4 ... TCP 127.0.0.1:8011 (LISTEN)
# 用上面的 PID 终止进程
kill 29308
# 确认端口已释放(无输出即成功)
lsof -nP -iTCP:8011 -sTCP:LISTEN
一行版的"查找并停止"(确认无误后再执行):
kill $(lsof -t -nP -iTCP:8011 -sTCP:LISTEN)
Windows(PowerShell,管理员或普通权限均可):
# 查看谁在监听 8011(最后一列就是 PID)
netstat -ano | findstr :8011
# 输出类似:
# TCP 127.0.0.1:8011 0.0.0.0:0 LISTENING 29308
# 用上面的 PID 终止进程
taskkill /PID 29308
# 如果提示"无法终止",加 /F 强制终止
taskkill /PID 29308 /F
# 确认端口已释放(无输出即成功)
netstat -ano | findstr :8011
注意: - macOS/Linux 用普通
kill(SIGTERM)即可优雅退出,不必上kill -9; - Windows 的taskkill不带/F发的是温和终止请求,实在退不出再用/F; - 防火墙首次弹窗时选择"允许",服务只监听本机 127.0.0.1,不对外网开放。
下次想再看它玩,重新执行第七步的 server.py 命令即可。
九、常见问题排查
1. Model directory not found: .../models/laya-multilingual
模型没下载到默认路径。确认 laya-Ascend/models/laya-multilingual/ 下有 model.safetensors,或用 --model /path/to/checkpoint 显式指定路径。
2. 模型下载卡住 / 401
国内网络用 export HF_ENDPOINT=https://hf-mirror.com(Windows:$env:HF_ENDPOINT = "https://hf-mirror.com")走镜像再下载。
3. Python 版本报错(要求 ≥ 3.10)
torch 2.14 / transformers 5.x 都要求 Python 3.10+。macOS/Linux 用 python3 --version,Windows 用 py -0 查看已装版本,必要时安装高版本并重建虚拟环境。
4. 端口被占用
server.py --port 8012 换个端口,或按第八节的方法释放 8011。
5. Windows 激活虚拟环境报"禁止运行脚本"
先执行 Set-ExecutionPolicy -Scope CurrentUser RemoteSigned,再重新运行激活命令。
6. Windows 终端中文乱码
运行游戏前执行 chcp 65001 切换 UTF-8 代码页;用 Windows Terminal 体验更佳。
7. 想看看官方仓库本身
git clone --depth 1 https://github.com/NandhaKishorM/laya.git
主仓库里有完整的 Quickstart、CLI(laya "你的问题" --predict)和本地 Web GUI(examples/server.py),适合把它用在邮件分诊、风控判断等正经决策场景。
十、写在最后
整个过程最难的不是安装,而是理解 Laya 的玩法:它不"生成"玩法,而是把游戏决策压缩成一个个是/否判断,用毫秒级前向传播替代大模型的逐词生成。这也是"系统一"(快速直觉反应)和"系统二"(慢速推理生成)架构差异最直观的演示。
你可以进一步折腾的方向:
- 关掉安全护栏(
--no-guard),看看没有护栏时模型会不会"作死"; - 换
laya(英文检查点)对比laya-multilingual的中文陈述打分差异; - 试着修改
policy.py里的中文陈述模板,观察决策质量变化; - 同一套代码还能跑贪吃蛇(
examples/snake/),命令几乎一样。
祝玩得开心!
参考链接: - Laya 主仓库:https://github.com/NandhaKishorM/laya - 俄罗斯方块 demo 仓库:https://github.com/zzhdbw/laya-Ascend - 模型权重:https://huggingface.co/convaiinnovations/laya-multilingual - 在线体验:https://huggingface.co/spaces/convaiinnovations/laya-demo

浙公网安备 33010602011771号