ARTI 指南
程序与张量资源
显式表达计算,再决定参数和演进状态分别由谁拥有。
组合数值工作
FormulaProgram 用命名轴、输入和 Bank 操作数描述有类型的计算,FormulaFabricV2 执行这份声明。算术、收缩、归约、索引、mask、局部窗口与 Observation 可以组成更大的程序,操作数绑定仍可被检查。
通过资源连接值
TensorResource 声明值的张量契约与生命周期,Connection 关联资源端口。数值节点通过端口读取和发布值。ProgramGraph 为组合提供执行结构,使依赖关系无需全部隐含在应用代码中。
- 阶段让就绪运算先读取同一快照,再发布已完成的写入。
- 路由选择声明的分支,汇合跟踪到达同一汇合点的值。
- 有界循环携带声明状态,并按执行契约停止。
分开声明、参数与状态
程序规定执行什么,参数提供可训练的数值,前向状态则在需要保留的调用之间携带值与执行游标。区分这些对象,应用才能明确选择什么参与学习、什么保持存在,以及梯度在哪里继续。
- 资源持久存在本身不会使它成为优化器参数。
- 优化器更新与可微前向写入是不同操作。
- 对于 carry 和原生 JAX 等函数式状态接口,需要续接时,由调用方将返回状态传入后续调用。
定义程序如何学习
目标由应用提供。共享参数所有者和独立声明的学习区域可以遵循不同 credit 与优化器契约。分支、路由选择或持久值出现在图中,并不会自动获得有效的任务学习规则。
一个小型 Formula 示例
运行阅读上手包后,可以用这个小型 CPU 程序检查声明运算、可学习操作数与返回状态。它是机制示例,不是任务效果 benchmark。
from json import dumps
from torch import autograd, nn, tensor
from arti import mechanisms as api
pair = api.TensorType(("C",), (2,), dtype="float32")
signal = api.InputBinding("signal", pair)
carry = api.InputBinding("carry", pair)
bank = api.BankBinding("weight", "tutorial/carry-weight@1", "weight", api.TensorType((), (), dtype="float32"))
transition = api.add(carry, api.scale(signal, bank))
summary = api.reduce_tensor(transition, axis="C", mode="sum")
program = api.FormulaProgram.build(outputs=(summary, transition))
parameter = nn.Parameter(tensor(0.75))
provided = dict(signal=tensor([4.0, -2.0]), carry=tensor([1.0, 1.0]))
emitted = api.FormulaFabricV2(program)(inputs=provided, banks=dict(weight=bank.bind(parameter)))
readout, returned_carry = emitted.values
gradient = autograd.grad(readout, parameter)[0]
record = dict(readout=readout.item(), next_carry=returned_carry.detach().tolist(), weight_vjp=gradient.item())
print(dumps(record))下载 Python 文件 ↗python resource-program.py
本地 CPU 运行结果
读出对权重的 VJP 为 2。原始 carry 保持不变,程序返回新的 carry。
{
"readout": 3.5,
"next_carry": [
4.0,
-0.5
],
"weight_vjp": 2.0
}这个例子只运行一次前向与 VJP,没有优化器更新。后续调用是否采用新 carry,由调用方决定。
选择执行边界
固定图与动态搜索有不同的准入和编译要求。ARTILayer 承载配置好的图或 federation;未配置形式提供恒等行为,而不是学到的适配。组件身份、配置 schema 与包版本分别记录。
本文对应 arti-fit 3.3.0 · 公开源码 dcb321d6