章节 01
导读 / 主楼:DinoML v2:实验性ML编译器与运行时实验室
DinoML v2是一个实验性ML编译器/运行时,将Python定义的模型图转换为CPU、CUDA和ROCm目标的独立原生工件,支持追踪、降级、性能分析和量化。
正文
DinoML v2是一个实验性ML编译器/运行时,将Python定义的模型图转换为CPU、CUDA和ROCm目标的独立原生工件,支持追踪、降级、性能分析和量化。
章节 01
DinoML v2是一个实验性ML编译器/运行时,将Python定义的模型图转换为CPU、CUDA和ROCm目标的独立原生工件,支持追踪、降级、性能分析和量化。
章节 02
章节 03
大多数机器学习部署栈迫使开发者在高级 ergonomics 和底层控制之间做出选择。要么使用PyTorch/TensorFlow等框架获得便利的Python接口,要么用CUDA/C++手写内核获得极致性能,但两者难以兼得。
DinoML v2正是针对这一痛点的实验性解决方案——它试图同时保持两者:用Python定义模型,追踪为紧凑可检查的中间表示,降级为独立工件,生成目标特定的原生代码,基于实测性能而非静态启发式选择内核,最终加载运行工件而无需依赖原始Python模型。
章节 04
| 领域 | 状态 |
|---|---|
| Python追踪前端 | 活跃原型 |
| CPU后端 | 可用测试目标 |
| CUDA后端 | 活跃原型,支持CUTLASS候选 |
| ROCm后端 | 活跃原型,Composable Kernel脚手架 |
| 运行时加载器 | 可用的原生模块/会话API |
| 性能分析/执行计划 | 活跃原型 |
| GGUF量化内核 | 研究/原型 |
| 公共API稳定性 | 不稳定 |
这不是一个 polished 的用户 facing 框架,而是一个编译器/运行时实验室,用于快速构建和测试推理系统想法。
章节 05
DinoML v2的大部分工作是通过人工指导的代理工作流而非一次性提示会话开发的。该工作流使用仓库本地引导文档、项目记忆、提供商契约、算子准入规则、验证门控和排序工作队列,使自主实现保持有界和可审查。
这些过程文档的精选公开快照位于:https://github.com/hlky/dinoml_v2_agents
这种开发方式本身就是一个重要信号——当AI代理成为开发流程的一等公民时,如何组织人机协作成为项目成功的关键。
章节 06
开发者用Python定义模型,DinoML提供类似PyTorch的API:
import dinoml as dml
class Linear(dml.Module):
def __init__(self):
self.weight = dml.Parameter([8, 6], dtype="float32")
self.bias = dml.Parameter([6], dtype="float32")
def forward(self, x):
y = dml.ops.gemm_rrr_bias(x, self.weight, self.bias)
return dml.ops.output(y, "y")
追踪API捕获模型结构、数据类型、形状约束和常量:
batch = dml.Dim("batch", min=1, max=4, typical=3, buckets=(1, 3, 4))
spec = dml.trace(
Linear(),
inputs={"x": dml.TensorSpec([batch, 8], "float32")},
constants=constants,
name="linear",
)
章节 07
编译将追踪得到的spec转换为目标特定的原生工件:
python -m dinoml.cli compile examples/cuda_linear.py --target cpu --out build/linear_cpu.dinoml
python -m dinoml.cli compile examples/cuda_linear.py --target cuda --arch sm_86 --out build/linear_cuda.dinoml
python -m dinoml.cli compile examples/cuda_linear.py --target rocm --arch gfx1201 --out build/linear_rocm.dinoml
章节 08
加载编译后的工件,创建会话,执行推理:
from dinoml import runtime
module = runtime.load("build/linear_cpu.dinoml")
session = module.create_session()
outputs = session.run_numpy({"x": input_array})