用 CPU 跑通第一次决策¶
English walkthrough · 实际输出 · 模型与硬件支持
System1-Omni 可以为 agent 提供结构化决策,例如把工单分给账单团队、
评估紧急程度、判断客户是否要求退款。这里用 LAYA 英文检查点的 CPU worker
跑通「安装 → worker → Rust frontend → 健康检查 → 退款判断」。
这条路径不需要 GPU、权重导出或 CUDA 编译,支持文本 choice、score、noul。
它使用上游 Python 模型执行,不验证原生 Rust 模型执行,也不支持本示例之外的
图片、音频或视频推理。
本页是英文指南的简明中文入口。更新命令、依赖、能力范围或 链接时,两页应在同一 PR 中同步修改;完整排障和复现记录要求见英文版。 中文说明不代表该英文检查点已验证中文输入,请保留下面的英文请求。
开始前¶
- Linux x86_64 CPU,worker 使用 4 个 PyTorch 线程。Apple 用户见 MPS 指南。
- 为短文本示例预留 8 GB 主机内存、6 GB 空闲磁盘,用于环境、模型和 Rust 构建, 不含工具链安装。这是规划余量,不是实测最低配置;长输入和额外模型需要更多资源。
- 安装 Git、curl、带
venv/pip 的 Python 3.12、Rust stable/Cargo、 C 编译器和链接器。Debian/Ubuntu 的编译工具包为build-essential。 本次复现使用 Python 3.12.13、Rust/Cargo 1.98.1。 - 依赖固定为
laya[serve]==0.3.20、CPU 版torch==2.8.0+cpu、transformers==4.55.0等,完整直接依赖见 requirements-cpu.txt。MPS 环境使用另一份依赖文件。 - 首次启动从公开的 convaiinnovations/laya 下载约 846 MB 的英文权重、分词器及编码器配置,无需 Hugging Face token。 需要能访问 GitHub、PyPI、PyTorch CPU wheel 源和 Hugging Face。
- 准备三个终端,localhost 8000 和 8080 端口应空闲。
记录中的缓存模型版本为 55cf4c4ebb4ebe31b2550e8bdf3bd21b99753851;
新环境、空 Hub 缓存复现使用 7b928d828b7b0e022f929d9bd2e44165aa270148,两次均通过。
laya-serve 0.3.20 没有模型 revision 参数,默认下载 Hub 当前版本,后续下载的
概率值可能不同。安装、下载、编译、加载耗时应与推理延迟分别记录;没有固定的
安装时间承诺,本指南也不提供 CPU 延迟基准。
1. 安装和构建(终端 1)¶
已有仓库可从 venv 命令开始;已有 .venv 应先核对依赖。此后三个终端都在仓库根目录运行。
git clone https://github.com/ThinkFlowLab/system1-omni.git
cd system1-omni
python3.12 -m venv .venv
.venv/bin/python -m pip install 'torch==2.8.0+cpu' --index-url https://download.pytorch.org/whl/cpu
.venv/bin/python -m pip install -r recipe/laya/requirements-cpu.txt
cargo build -p omni-jev --release --locked
只构建 omni-jev frontend,不需要 CUDA 工具链。若 Python 缺少 venv/pip,
先安装对应组件;也可用 uv venv --python 3.12 --seed .venv 替换创建环境的命令。
2. 启动 worker(终端 1)¶
LAYA_HOST=127.0.0.1 LAYA_PORT=8000 LAYA_DEVICE=cpu \
LAYA_MODELS=english LAYA_PRELOAD=1 LAYA_THREADS=4 \
.venv/bin/laya-serve
等待下载、加载完成,日志出现 Uvicorn running on http://127.0.0.1:8000。
保留进程运行;后续启动复用 Hugging Face 缓存。若失败,先查看此终端日志。
3. 检查 worker 并启动 frontend(终端 2)¶
curl --noproxy '*' --fail --silent --show-error http://127.0.0.1:8000/health
OMNI_JEV_BIND=127.0.0.1:8080 \
OMNI_JEV_BACKEND_URL=http://127.0.0.1:8000 \
./target/release/omni-jev
健康检查应返回 {"status":"ok","loaded":["english"],"device":"cpu"}。
frontend 应打印 omni-jev listening on 127.0.0.1:8080 和
forwarding to http://127.0.0.1:8000/,保留两个服务运行。
普通 laya-serve 的健康检查确认模型已加载,但不包含前向预热,首次请求仍可能较慢。
4. 发送退款判断(终端 3)¶
curl --noproxy '*' --fail --silent --show-error http://127.0.0.1:8080/health
curl --noproxy '*' --fail --silent --show-error http://127.0.0.1:8080/v1/systemone \
-H 'Content-Type: application/json' \
-d '{"model":"english","state":"Please refund the duplicate charge.","questions":{"refund":{"type":"noul","instructions":"Does the customer ask for a refund?"}}}'
frontend 的健康响应应与 worker 一致。决策应返回 HTTP 200,
answers.refund.type 为 noul,answers.refund.noul 是模型对该问题的肯定概率值。
实际运行中的答案为:
{"refund":{"type":"noul","noul":0.8364,"confidence":0.8364,"answer_confidence":0.8364,"action":{"act_probability":1.0}}}
完整响应还有 model、usage、routing,其中 routing.model 为 english。
具体小数是本次运行的输出,不是准确率或校准效果保证。
5. 核对三类问题并记录环境(终端 3)¶
python3.12 recipe/compare_with_backend.py --model english \
--backend http://127.0.0.1:8000 --frontend http://127.0.0.1:8080
git rev-parse HEAD
.venv/bin/python -m pip freeze
.venv/bin/python - <<'PY'
from huggingface_hub import scan_cache_dir
for repo in scan_cache_dir().repos:
if repo.repo_id == "convaiinnovations/laya":
print("cached model revisions:", sorted(r.commit_hash for r in repo.revisions))
for rev in repo.revisions:
if "main" in rev.refs:
print("cached main:", rev.commit_hash)
PY
预期五行 PASS:health、department、urgency、refund、combined,
均为 status 200 -> 200。脚本比较直连与 frontend 的状态码、内容类型和响应;
序列化或 usage 不同时也允许解析后的 answers 相等。这验证转发一致性,不测任务准确率。
在其他进程更新缓存前记录 cached main。
完成后分别在两个服务终端按 Ctrl-C。首次复现者可向 issue #86提供 OS/CPU/RAM、 仓库 SHA、依赖版本、模型 revision、实际命令及首个失败或不清楚的步骤。 本次 agent 的已有环境复现不能替代独立首次使用者的报告。
端口占用时另选空闲端口,并同步修改环境变量、URL 和比较命令。
连接失败或 502 时先查 worker 日志和直连健康检查;504 表示 frontend 等待超时,
见frontend 配置。下载失败时检查网络和缓存空间;
只有完整模型已缓存时才能使用 HF_HUB_OFFLINE=1。启动时可能出现 choice:11+
温度被限制的警告,本示例及二选一检查仍可运行,受影响条目的置信度应视为未校准。
下一步:Apple MPS、 原生 Open-Jev CUDA、支持矩阵。 Open-Jev H200 结果来自另一组单候选 GPU 工作负载, 不能当作本 CPU 示例的性能。