shumai
shumai 是一个专为 JavaScript 和 TypeScript 开发者打造的高性能可微分张量库。它旨在解决前端及全栈工程师在尝试进行机器学习研发时,往往受限于 Python 生态或现有 JS 数学库性能不足、缺乏自动求导能力的痛点。通过让开发者直接使用熟悉的 Web 技术栈即可构建和训练神经网络模型,shumai 极大地降低了 AI 工程化的门槛。
这款工具特别适合软件工程师、全栈开发者以及希望快速原型验证的研究人员使用。其核心亮点在于独特的技术架构:底层基于高性能 C++ 张量库 Flashlight(现依托 ArrayFire 后端),上层结合超快速的 JavaScript 运行时 Bun。这种组合不仅提供了极致的运算速度,支持 GPU 加速,还实现了完整的自动微分功能,并具备原生的网络通信能力,便于构建分布式或端云协同的 AI 应用。
需要注意的是,shumai 目前仍处于实验阶段,主要支持 macOS 和 Linux 环境。尽管它在 CPU 后端优化上仍有提升空间,且正在积极拓展对 OpenCL 等更多后端的支持,但它已为希望在 JavaScript 生态中探索高性能深度学习的项目提供了一个极具潜力的新选择。
使用场景
一位全栈工程师正在为电商网站开发实时的“个性化商品推荐”功能,需要在 Node.js 环境中直接运行深度学习模型进行推理。
没有 shumai 时
- 架构割裂严重:前端或后端逻辑使用 TypeScript 编写,而模型推理必须调用独立的 Python 服务,导致系统需要维护两套运行时环境,部署复杂度极高。
- 通信延迟高昂:Node.js 服务与 Python 推理服务之间需通过 HTTP 或 gRPC 传递大量张量数据,网络序列化与反序列化过程引入了显著的毫秒级延迟,无法满足实时交互需求。
- 开发体验断层:算法工程师优化的模型难以直接复用于工程代码,类型系统不互通,调试时需要同时在两个语言生态中切换,极易出错且效率低下。
- 资源利用率低:为了维持双服务架构,服务器必须同时加载 Node.js 和 Python 的解释器及依赖库,内存占用翻倍,增加了云成本。
使用 shumai 后
- 原生统一运行:借助 Bun 运行时,shumai 让开发者直接在 TypeScript 代码中导入并执行高性能张量运算,彻底消除了对独立 Python 推理服务的依赖。
- 零拷贝极速推理:利用底层 Flashlight 和 ArrayFire 的加速能力,数据在内存中直接处理,避免了跨进程/跨语言的网络传输开销,将推荐响应时间从百毫秒级降低至毫秒级。
- 端到端类型安全:整个数据流转过程(从用户请求到模型输出)均保持在 TypeScript 类型系统内,享受完整的智能提示与编译期检查,大幅提升了代码可维护性。
- 轻量化部署:单一二进制文件即可包含业务逻辑与 AI 能力,显著减少了容器镜像体积和服务器内存占用,使得边缘计算或 Serverless 部署变得轻而易举。
shumai 打破了 JavaScript 生态与高性能 AI 计算之间的壁垒,让全栈开发者能在一个统一的类型安全环境中构建真正的实时智能应用。
运行环境要求
- Linux
- macOS
- Linux 默认使用 CUDA 后端(需 NVIDIA GPU),macOS 默认使用 CPU 后端
- 未明确指定具体显卡型号、显存大小或 CUDA 版本要求,但需安装支持 CUDA 的 ArrayFire
未说明

快速开始
一个为 TypeScript(及 JavaScript)打造的、快速、支持网络连接且可微分的张量库。基于 bun 和 flashlight 构建,适用于软件工程师和研究人员。

⚠️ 本项目为实验性软件! ⚠️
快速入门
对于 Linux 用户:
如果您运行的是 x86-64 架构的 Ubuntu,可以使用官方提供的包管理器进行安装:
curl https://bun.sh/install | bash
sudo apt install -y gnupg2 ca-certificates
sudo apt-key adv --fetch-key https://repo.arrayfire.com/GPG-PUB-KEY-ARRAYFIRE-2020.PUB
echo "deb https://repo.arrayfire.com/debian all main" | sudo tee /etc/apt/sources.list.d/arrayfire.list
sudo apt update
sudo apt install -y arrayfire-cpu3-dev arrayfire-cpu3-openblas
如果您运行的是 ARMv8 架构的 Ubuntu,则需要从源码编译:
curl https://bun.sh/install | bash
sudo apt remove libarrayfire-dev libarrayfire-cpu3 libarrayfire-cpu-dev
sudo apt install -y libblas-dev liblapack-dev liblapacke-dev libfftw3-dev libboost-all-dev cmake make g++
cd /tmp
sudo rm -rf arrayfire
git clone https://github.com/arrayfire/arrayfire.git
cd arrayfire
cmake -Bbuild -DAF_BUILD_EXAMPLES=OFF -DCMAKE_BUILD_TYPE=Release -DAF_BUILD_UNIFIED=OFF -DAF_TEST_WITH_MTX_FILES=OFF -DBUILD_TESTING=OFF
make -j4 -Cbuild
sudo make install -Cbuild
其他情况,请参考官方的 ArrayFire 安装指南。
然后运行:
bun install @shumai/shumai
目前仅支持 macOS 和 Linux 系统。Linux 默认使用 CUDA 进行 GPU 计算,而 macOS 则使用 CPU。详细的安装说明请参见 下方。
安装仍在开发中:如果您遇到任何问题,请提交 issue。
使用方法
shumai 会优先尝试使用连接的 GPU 或加速器;不过,CPU 计算将使用 ArrayFire 的 CPU 后端,该后端尚未经过充分优化。
我们计划尽快支持 ArrayFire 的 OpenCL 后端以及其他非 ArrayFire 的张量后端。
如果 shumai 运行速度异常缓慢,请提交 issue!
标准数组工具:
import * as sm from "@shumai/shumai"
// 创建一个 1024x1024 的随机正态分布张量
let X = sm.randn([1024, 1024])
let W = sm.identity(1024)
let Y = X.matmul(W)
console.log(Y.shape)
与原生 JavaScript 数组之间的转换:
const data : Float32Array = new Float32Array(128)
for (let i = 0; i < 128; ++i) {
data[i] = Math.random()
}
const X : Tensor = sm.tensor(data)
const pi = sm.scalar(3.14)
const Y = X.mul(pi)
// 张量可以转换回原生 JavaScript
const Y_data = Y.toFloat32Array()
// 标量张量可以转换为 JavaScript 数值
const total : number = X.sum().toFloat32()
梯度:
const W = sm.randn([128, 128])
W.requires_grad = true
const X = sm.randn([128, 128])
const diff = X.sub(W)
const mse = diff.mul(diff).sum()
mse.backward()
W.grad // 此时梯度已被填充
// 复制 W 但不允许更新梯度
const Y = W.detach()
Y.sum().backward() // 不会发生任何变化
更多示例请参阅 这里。
支持的操作列表请参见 此处。
安装
安装流程仍在开发中! 如果您在构建或安装过程中遇到任何问题,我们非常感谢您提交 issue。请务必告知我们您的平台/操作系统信息。
先决条件:
- 确保已安装 bun (https://bun.sh)。
- 安装 ArrayFire。macOS 用户应安装 ArrayFire 的 CPU 后端;Linux 用户则应安装 CUDA 后端^。
- macOS --- 可以通过 Homebrew 轻松安装 ArrayFire:
brew install arrayfire - Linux --- 安装说明请参见 此处。在 Ubuntu 上,可以通过包管理器(如
apt)安装 ArrayFire。
一旦 bun 和 ArrayFire 安装完毕,即可使用 bun 安装包及其依赖库:
bun install @shumai/shumai
Windows 支持
虽然未正式支持,但有用户成功利用 Docker + WSL2 + Linux 环境来运行,甚至包括 CUDA 支持。
从源码构建原生库
注意: 在本地开发 TypeScript/Javascript 库组件时无需执行此步骤。
以下是针对以下平台的源码构建说明:
此过程将构建依赖的 FFI 库(libflashlight 和 libflashlight_binding),并使用 npm pack 将其打包成 @shumai/shumai_*.tgz 包。随后,您可以使用 npm install $PATH_TO_SOURCE/@shumai/shumai-*.tgz 在任意位置安装该包。
在 macOS 上从源码构建
首先,使用 brew install arrayfire 安装 ArrayFire CPU 版本。
构建并安装 Flashlight:
mkdir -p $HOME/usr/ # 将 Flashlight 安装到这里
git clone --recursive --depth 1 https://github.com/flashlight/flashlight.git
cd flashlight
mkdir -p build
cd build
cmake .. \
-DCMAKE_BUILD_TYPE=Release \
-DBUILD_SHARED_LIBS=ON \
-DCMAKE_INSTALL_PREFIX=$HOME/usr \
-DFL_USE_ARRAYFIRE=ON \
-DFL_ARRAYFIRE_USE_CPU=ON \
-DFL_USE_ONEDNN=OFF \
-DFL_BUILD_DISTRIBUTED=OFF \
-DFL_BUILD_TESTS=OFF \
-DFL_BUILD_EXAMPLES=OFF
make -j$(nproc)
make install
为 Shumai 构建 Flashlight 绑定:
cd shumai
mkdir -p build
cd build
cmake .. -Dflashlight_DIR=$HOME/usr/share/flashlight/cmake/
make -j$(nproc)
性能分析
在 macOS 上,你可以使用 xcrun xctrace record --template "Time Profiler" --launch $(which bun) train.js 来录制性能分析数据。
在 Linux 上从源码构建
首先安装 ArrayFire。Shumai 的 Linux 构建默认使用 CUDA 后端,但如果你从源码编译,也可以构建 CPU 后端(OpenCL 支持即将推出)。
构建并安装 Flashlight:
mkdir -p $HOME/usr/ # 将 Flashlight 安装到这里
git clone --recursive --depth 1 https://github.com/flashlight/flashlight.git
cd flashlight
mkdir -p build
cd build
cmake .. \
-DCMAKE_BUILD_TYPE=RelWithDebInfo \ # 或根据需求指定
-DFL_ARRAYFIRE_USE_CPU=OFF \
\ # 切换为上述选项以构建 CPU 版本
-DFL_ARRAYFIRE_USE_CUDA=ON \
-DFL_BUILD_DISTRIBUTED=OFF \
-DFL_USE_ONEDNN=OFF \
-DFL_BUILD_TESTS=OFF \
-DFL_BUILD_EXAMPLES=OFF \
-DFL_BUILD_SCRIPTS=OFF \
-DCMAKE_INSTALL_PREFIX=$HOME/usr/
make -j$(nproc)
make install
构建 Shumai 的绑定:
mkdir -p build && cd build
cmake .. \
-DBUILD_SHARED_LIBS=ON \
-DCMAKE_BUILD_TYPE=RelWithDebInfo \ # 或根据需求指定
-Dflashlight_DIR=${FLASHLIGHT_INSTALL_PREFIX}/share/flashlight/cmake \
-DArrayFire_DIR=${ARRAYFIRE_INSTALL_PREFIX}/share/ArrayFire/cmake # 如果是从源码构建,则需要;否则不需要
make -j$(nproc)
为什么要构建这个?
借助 Shumai,我们希望实现以下目标:
- 更轻松地创建数据集
- JavaScript 拥有原生的类型化数组和 JIT 编译器,非常适合在将数据转换为大型、扁平化的 GPU 兼容数组之前进行数据处理。
- 更快地训练小型模型
- Bun 中的 FFI 绑定速度极快(约 3 纳秒),因此在训练小型模型时,JavaScript 不会成为瓶颈。
- 更灵活、更精细的训练/推理逻辑
- Bun 使用 JSC JIT 编译器,这意味着你可以放心地编写复杂的训练逻辑,而无需依赖原生 C++ 实现。
- 开发更具吸引力的应用程序
- JavaScript 拥有一个
庞大巨大的生态系统,这有助于更好地进行应用程序开发。
- JavaScript 拥有一个
基准测试
基准测试数据来自 https://github.com/shumai-org/benchmarks。
在 Apple M1 Pro 上:
| 基准测试 | Shumai (bun) | TF.js (node) | 差异 |
|---|---|---|---|
| 32 宽度加法 | 624.78K 次/秒 | 195.627K 次/秒 | 3.19 倍 |
| 1024 宽度加法 | 460.008K 次/秒 | 94.945K 次/秒 | 4.84 倍 |
| 32768 宽度加法 | 57.929K 次/秒 | 40.484K 次/秒 | 1.43 倍 |
| 64×64 方阵乘法 | 43 GFlop/s | 28.533 GFlop/s | 1.51 倍 |
| 128×128 方阵乘法 | 518.704 GFlop/s | 58.764 GFlop/s | 8.83 倍 |
| 1024×1024 方阵乘法 | 2,147.771 GFlop/s | 318.826 GFlop/s | 6.74 倍 |
| B=64,64 宽度隐藏层 + 5 次逐点运算 | 41.344K 次/秒 | 16.679K 次/秒 | 2.48 倍 |
| B=64,128 宽度隐藏层 + 5 次逐点运算 | 24.554K 次/秒 | 8.563K 次/秒 | 2.87 倍 |
| B=64,1024 宽度隐藏层 + 5 次逐点运算 | 2.716K 次/秒 | 0.969K 次/秒 | 2.80 倍 |
在 Nvidia GP100 上:
| 基准测试 | Shumai (bun) | TF.js (node) | 差异 |
|---|---|---|---|
| 32 宽度加法 | 243.217K 次/秒 | 34.539K 次/秒 | 7.04 倍 |
| 1024 宽度加法 | 144.771K 次/秒 | 18.006K 次/秒 | 8.04 倍 |
| 32768 宽度加法 | 71.793K 次/秒 | 17.071K 次/秒 | 4.21 倍 |
| 64×64 方阵乘法 | 63.239 GFlop/s | 12.749 GFlop/s | 4.96 倍 |
| 128×128 方阵乘法 | 435.565 GFlop/s | 104.885 GFlop/s | 4.15 倍 |
| 1024×1024 方阵乘法 | 7,165.062 GFlop/s | 6,470.793 GFlop/s | 1.11 倍 |
| B=64,64 宽度隐藏层 + 5 次逐点运算 | 25.507K 次/秒 | 5.192K 次/秒 | 4.91 倍 |
| B=64,128 宽度隐藏层 + 5 次逐点运算 | 22.529K 次/秒 | 4.861K 次/秒 | 4.63 倍 |
| B=64,1024 宽度隐藏层 + 5 次逐点运算 | 11.568K 次/秒 | 2.854K 次/秒 | 4.05 倍 |
内存使用
虽然开箱即用的内存管理在许多情况下已经足够,但通过调整内存使用策略,可以显著减少垃圾回收器带来的额外开销,从而提升性能。
import { util } from '@shumai/shumai'
util.memoryOptions({
lowerBoundThreshold: 100e6, // 100MB
upperBoundThreshold: 5e9, // 5GB
delayBetweenGCs: 1000 // 1 秒
})
请特别注意 upperBoundThreshold 参数:一旦超过该阈值,每次分配张量时都会强制触发垃圾回收,此时 delayBetweenGCs 将被忽略。合理设置该参数以充分利用硬件资源,可以显著提升性能。
统计信息
graph TD
OpA(操作A) --> statsA{{"统计A"}};
OpB(操作B) --> statsA;
statsA --> LoggerA{{"LoggerConsole A"}};
LoggerA --> Stdout(("标准输出"));
OpC(操作C) --> statsA;
OpD(操作D) --> statsA;
statsA --> LoggerB("自定义日志记录器B");
LoggerB --> Disk(("磁盘"));
收集统计信息的基本用法非常简单,只需使用默认的 StatsLoggerConsole 添加一个收集器即可。
import { stats, StatsLoggerConsole, rand, matmul } from '@shumai/shumai'
stats.enabled = true // 之后的所有操作都会捕获统计信息
// 执行操作...
stats.enabled = false // 之后的所有操作将不再捕获统计信息
虽然上述示例对于简单的使用场景已经足够,但如果你希望在多个线程、进程和/或主机上捕获统计信息,StatsLoggerHttp 将能满足你的需求。
graph TD
subgraph 主机C
Processor("Http日志处理器")
style Processor stroke:#222,stroke-width:4px,stroke-dasharray:5 5
end
subgraph 主机A
OpA(操作A) --> statsA{{"统计A"}};
OpB(操作B) --> statsA;
statsA --> LoggerA{{"Http日志记录器A"}};
LoggerA --> Processor;
end
subgraph 主机B
OpC(操作C) --> statsB{{"统计B"}};
OpD(操作D) --> statsB;
statsB --> LoggerB{{"Http日志记录器B"}};
LoggerB --> Processor;
end
import { StatsLoggerHttp } from '@shumai/shumai'
stats.logger = new StatsLoggerHttp({ url: 'http://localhost:4242' })
对于更定制化的需求,你可以提供自己的日志记录器:
import { StatsLogger, StatsLoggerData } from '@shumai/shumai'
class CustomLogger implements StatsLogger {
async process(data: StatsLoggerData): Promise<void> {
const summary = data.collector.getSummary()
console.log('收集器统计信息:', summary)
}
}
stats.logger = new CustomLogger()
默认情况下,堆栈跟踪功能是禁用的,因为它会增加 50% 以上的开销。不过,可以通过设置 stats.collectStacks = true 来启用它。
作用域内的统计信息
如果你希望隔离统计分析,也可以这样做:
import { collectStats } from '@shumai/shumai'
const scopedStats = collectStats(() => {
// 执行操作...
}/*, StatsCollectorOptions | StatsLogger */)
console.log(scopedStats.getSummary())
贡献
如果你想对核心绑定或 FFI 进行修改,请先从源代码构建。
所有以 *.inl 或 *_gen.ts 结尾的文件都是生成的。这些文件可以通过编辑 scripts/gen_binding.py 并运行 ./scripts/gen_all_binding.sh 来修改。
有关风格指南及如何参与贡献的更多信息,请参阅 CONTRIBUTING 文件。 😁
许可证
shumai 采用 MIT 许可证,具体内容请参见 LICENSE 文件。
常见问题
相似工具推荐
openclaw
OpenClaw 是一款专为个人打造的本地化 AI 助手,旨在让你在自己的设备上拥有完全可控的智能伙伴。它打破了传统 AI 助手局限于特定网页或应用的束缚,能够直接接入你日常使用的各类通讯渠道,包括微信、WhatsApp、Telegram、Discord、iMessage 等数十种平台。无论你在哪个聊天软件中发送消息,OpenClaw 都能即时响应,甚至支持在 macOS、iOS 和 Android 设备上进行语音交互,并提供实时的画布渲染功能供你操控。 这款工具主要解决了用户对数据隐私、响应速度以及“始终在线”体验的需求。通过将 AI 部署在本地,用户无需依赖云端服务即可享受快速、私密的智能辅助,真正实现了“你的数据,你做主”。其独特的技术亮点在于强大的网关架构,将控制平面与核心助手分离,确保跨平台通信的流畅性与扩展性。 OpenClaw 非常适合希望构建个性化工作流的技术爱好者、开发者,以及注重隐私保护且不愿被单一生态绑定的普通用户。只要具备基础的终端操作能力(支持 macOS、Linux 及 Windows WSL2),即可通过简单的命令行引导完成部署。如果你渴望拥有一个懂你
stable-diffusion-webui
stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面,旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点,将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。 无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师,还是想要深入探索模型潜力的开发者与研究人员,都能从中获益。其核心亮点在于极高的功能丰富度:不仅支持文生图、图生图、局部重绘(Inpainting)和外绘(Outpainting)等基础模式,还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外,它内置了 GFPGAN 和 CodeFormer 等人脸修复工具,支持多种神经网络放大算法,并允许用户通过插件系统无限扩展能力。即使是显存有限的设备,stable-diffusion-webui 也提供了相应的优化选项,让高质量的 AI 艺术创作变得触手可及。
everything-claude-code
everything-claude-code 是一套专为 AI 编程助手(如 Claude Code、Codex、Cursor 等)打造的高性能优化系统。它不仅仅是一组配置文件,而是一个经过长期实战打磨的完整框架,旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。 通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能,everything-claude-code 能显著提升 AI 在复杂任务中的表现,帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略,使得模型响应更快、成本更低,同时有效防御潜在的攻击向量。 这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库,还是需要 AI 协助进行安全审计与自动化测试,everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目,它融合了多语言支持与丰富的实战钩子(hooks),让 AI 真正成长为懂上
ComfyUI
ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎,专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式,采用直观的节点式流程图界面,让用户通过连接不同的功能模块即可构建个性化的生成管线。 这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景,也能自由组合模型、调整参数并实时预览效果,轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性,不仅支持 Windows、macOS 和 Linux 全平台,还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构,并率先支持 SDXL、Flux、SD3 等前沿模型。 无论是希望深入探索算法潜力的研究人员和开发者,还是追求极致创作自由度的设计师与资深 AI 绘画爱好者,ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能,使其成为当前最灵活、生态最丰富的开源扩散模型工具之一,帮助用户将创意高效转化为现实。
gemini-cli
gemini-cli 是一款由谷歌推出的开源 AI 命令行工具,它将强大的 Gemini 大模型能力直接集成到用户的终端环境中。对于习惯在命令行工作的开发者而言,它提供了一条从输入提示词到获取模型响应的最短路径,无需切换窗口即可享受智能辅助。 这款工具主要解决了开发过程中频繁上下文切换的痛点,让用户能在熟悉的终端界面内直接完成代码理解、生成、调试以及自动化运维任务。无论是查询大型代码库、根据草图生成应用,还是执行复杂的 Git 操作,gemini-cli 都能通过自然语言指令高效处理。 它特别适合广大软件工程师、DevOps 人员及技术研究人员使用。其核心亮点包括支持高达 100 万 token 的超长上下文窗口,具备出色的逻辑推理能力;内置 Google 搜索、文件操作及 Shell 命令执行等实用工具;更独特的是,它支持 MCP(模型上下文协议),允许用户灵活扩展自定义集成,连接如图像生成等外部能力。此外,个人谷歌账号即可享受免费的额度支持,且项目基于 Apache 2.0 协议完全开源,是提升终端工作效率的理想助手。
markitdown
MarkItDown 是一款由微软 AutoGen 团队打造的轻量级 Python 工具,专为将各类文件高效转换为 Markdown 格式而设计。它支持 PDF、Word、Excel、PPT、图片(含 OCR)、音频(含语音转录)、HTML 乃至 YouTube 链接等多种格式的解析,能够精准提取文档中的标题、列表、表格和链接等关键结构信息。 在人工智能应用日益普及的今天,大语言模型(LLM)虽擅长处理文本,却难以直接读取复杂的二进制办公文档。MarkItDown 恰好解决了这一痛点,它将非结构化或半结构化的文件转化为模型“原生理解”且 Token 效率极高的 Markdown 格式,成为连接本地文件与 AI 分析 pipeline 的理想桥梁。此外,它还提供了 MCP(模型上下文协议)服务器,可无缝集成到 Claude Desktop 等 LLM 应用中。 这款工具特别适合开发者、数据科学家及 AI 研究人员使用,尤其是那些需要构建文档检索增强生成(RAG)系统、进行批量文本分析或希望让 AI 助手直接“阅读”本地文件的用户。虽然生成的内容也具备一定可读性,但其核心优势在于为机器