Skip to content

Commit 6bdfc47

Browse files
miaobytepeng.li24
andauthored
deepxir: (#112)
* deepxir:设计完善 * deepxir:设计完善 * deepxir:接近第一版方案定型 --------- Co-authored-by: peng.li24 <peng.li24@nio.com>
1 parent c945aa9 commit 6bdfc47

7 files changed

Lines changed: 214 additions & 121 deletions

File tree

.github/workflows/executor-deepxcore.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
name: Excuter/cppcommon Build
1+
name: executor/deepxcore Build
22
on:
33
push:
44
paths:

.github/workflows/executor-heapmemcuda.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
name: op/cuda-linux Build
1+
name: executor/heapmem-cuda Build
22
on:
33
push:
44
paths:
@@ -61,8 +61,8 @@ jobs:
6161
cp -r include/* /usr/local/include/ && \
6262
cd /workspace && \
6363
64-
# 构建 common
65-
cd executor/cpp-common && \
64+
# 构建 deepxcore
65+
cd executor/deepxcore && \
6666
mkdir -p build && cd build && \
6767
cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_COMPILER_LAUNCHER=ccache -GNinja .. && \
6868
ninja && \

.github/workflows/executor-op-cuda-linux.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
name: Excuter/cuda-linux Build
1+
name: executor/op-cuda-linux Build
22
on:
33
push:
44
paths:

.github/workflows/executor-op-ompsimd-linux.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
name: Excuter/ompsimd-linux Build
1+
name: executor/op-mem-ompsimd-linux Build
22
on:
33
push:
44
paths:

docs/deepxIR/deepxir.md

Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,136 @@
1+
# DeepX IR(deepxir)规范
2+
3+
## 1. 类型系统
4+
5+
### 基础数据类型
6+
```
7+
type f16, f32, f64, bf16, bf8 // 浮点类型
8+
type i8, i16, i32, i64, u8 // 整数类型
9+
type bool // 布尔类型
10+
```
11+
12+
### 动态长度类型
13+
```
14+
list<type> // list 可以和以上基础类型组合
15+
```
16+
17+
### 类型约束
18+
```
19+
f32|f64 // 支持两种/多种 类型之一
20+
```
21+
22+
### Tensor 类型模板
23+
```
24+
type tensor<shape, elem_type>
25+
```
26+
- shape 格式:dim1xdim2x...xdimN,或使用 `?` 表示动态维度。 最后一个x后的是精度。
27+
- 示例:`tensor<10x20xf32>`, `tensor<?x?xi32>`
28+
29+
tensor 也可以没有 shape 和 dtype 的约束,例如:
30+
```
31+
deepxir addscalar(A:tensor, b:i8|i16|i32|i64) -> (c:tensor) { ... }
32+
```
33+
表示任意 shape、任意 dtype 的 tensor 都可作为参数。
34+
35+
### 动态维度变量
36+
- `?` 任意数字
37+
- `?1` 动态维度变量 1
38+
- `?2` 动态维度变量 2(用于表示同名变量处维度需一致)
39+
- 示例:`tensor<?1x?2xf32>`
40+
41+
## 2. IR 定义格式
42+
43+
语法示例:
44+
```
45+
deepxir ir_name(ro_p1:type1, ro_param2:type2, ...) -> (w_p1:type3, w_p2:type4, ...)
46+
{
47+
// 函数体:IR 操作序列
48+
operation_name(ro_p1, ro_p2) -> w_p1
49+
operation_name(ro_p2, ro_p2) -> w_p2
50+
}
51+
```
52+
- `deepxir` 为关键字,也可使用 `function``func` 等。
53+
- 参数遵循“左读右写”规则(无返回值;通过写入参数实现输出)。
54+
- 参数类型支持:`tensor``list<tensor>`、基础类型,以及基础类型的 list。
55+
56+
## 3. 设计思考
57+
DeepX IR 采用简洁的文本格式表示张量类型约束、运算定义与运算体,便于阅读与解析。
58+
deepx不是ssa,调用时,依然遵循左读右写的参数列表原则,右写的参数列表支持多个。
59+
60+
## 4. 具体示例
61+
62+
### 示例 1:融合 Linear + 归一化
63+
```
64+
deepxir fused_linear_norm(
65+
A: tensor<?1x?2xf32>,
66+
W: tensor<?2x?3xf32>,
67+
b: tensor<?3xf32>,
68+
axis: i32,
69+
keepdims: bool
70+
) -> (out: tensor<?1x?3xf32>) {
71+
newtensor(?1x?3, f32)->(mm)
72+
matmul(A, W)-> (mm)
73+
newtensor(?1x?3, f32)-> bias
74+
add(mm, b)-> bias
75+
deltensor(mm)-> mm
76+
newtensor(?1, f32)-> mean
77+
sum(bias, axis, keepdims)-> mean
78+
newtensor(?1x?3, f32)-> centered
79+
sub(bias, mean)-> centered
80+
deltensor(bias)-> bias
81+
deltensor(mean)-> mean
82+
newtensor(?1x?3, f32)-> sq
83+
mul(centered, centered)-> sq
84+
deltensor(centered)-> centered
85+
newtensor(?1, f32)-> var
86+
sum(sq, axis, keepdims)-> var
87+
deltensor(sq)-> sq
88+
constant(1e-5)-> eps
89+
newtensor(?1, f32)-> var_eps
90+
add(var, eps)-> var_eps
91+
deltensor(var)-> var
92+
deltensor(eps)-> eps
93+
newtensor(?1, f32)-> std
94+
sqrt(var_eps)-> std
95+
deltensor(var_eps)-> var_eps
96+
div(std, std)-> std
97+
deltensor(std)-> std
98+
div(centered, std)-> out
99+
}
100+
```
101+
102+
下面给出一个完整的 `deepxir` 调用示例:在一个 IR 中先构造输入张量和辅助参数,然后调用 `fused_linear_norm`,输出 `out`
103+
104+
```
105+
deepxir example_use_fused_linear_norm() -> (out: tensor<2x3xf32>) {
106+
newtensor([2,4], f32)-> A
107+
newtensor([4,3], f32)-> W
108+
newtensor([3], f32)-> b
109+
fused_linear_norm(A, W, b, 1, false) -> out
110+
}
111+
```
112+
113+
该示例展示了如何在 IR 中构造必要的张量/参数并调用 `fused_linear_norm`,其中 `out` 的类型为 `tensor<2x3xf32>`,与 `W` 的列数和 `A` 的行数对应。
114+
115+
### 示例 2:融合 Attention score + Softmax
116+
```
117+
deepxir fused_attention_scores(
118+
Q: tensor<?x?xf32>,
119+
K: tensor<?x?xf32>,
120+
axis: list<i32>,
121+
keepdims: bool,
122+
shape_scores: list<i32>,
123+
shape_sum: list<i32>
124+
) -> (out: tensor<?x?xf32>) {
125+
newtensor(shape_scores, f32)-> scores_tmp
126+
matmul(Q, K)-> scores_tmp
127+
newtensor(shape_scores, f32)-> exp_tmp
128+
exp(scores_tmp)-> exp_tmp
129+
deltensor(scores_tmp)-> scores_tmp
130+
newtensor(shape_sum, f32)-> sum_tmp
131+
sum(exp_tmp, axis, keepdims)-> sum_tmp
132+
div(exp_tmp, sum_tmp)-> out
133+
deltensor(exp_tmp)-> exp_tmp
134+
deltensor(sum_tmp)-> sum_tmp
135+
}
136+
```

docs/deepxIR/ir.md

Lines changed: 0 additions & 115 deletions
This file was deleted.

executor/deepxcore/README.md

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
# deepxcore
2+
3+
deepxcore 是 deepx 执行器层与统一存算面协议共享的 C++ 核心基础库。
4+
5+
它的目标是提供稳定、跨执行器可复用的数据模型与协议对象,避免把 CUDA/Metal/CPU 等具体实现细节渗透到上层与其他组件,从而保证进程间与代码组件的隔离。
6+
7+
## 定位
8+
- 面向:执行器进程(heapmem-*、op-*)、统一存算面 SDK、调度/编译侧的 C++ 组件
9+
- 提供:dtype/shape/tensor 等基础数据结构、协议对象的结构化表达、配置与序列化基础设施
10+
- 不提供:具体硬件算子实现、显存/IPC 生命周期实现、调度编译逻辑
11+
12+
## 职责
13+
14+
### 1) 基础数据模型
15+
- `DType`:数据类型描述与大小/对齐等基础能力
16+
- `Shape`:维度/元素数量/bytes 计算、shape 合法性检查
17+
- `Tensor`:Tensor 元信息与句柄表达(不绑定具体设备实现)
18+
19+
这些类型应作为所有执行器的共同语言,保证跨组件传递时语义一致。
20+
21+
### 2) 统一存算面协议对象
22+
用于在统一寻址空间(如 Redis KV)与执行器之间传递的数据结构,例如:
23+
- tensor 元信息记录(name/key、dtype、shape、device、bytes、ctime 等)
24+
- 生命周期指令(create/get/delete 等)
25+
26+
deepxcore 只负责“结构化表达与编解码”,不负责“真正分配/回收/IPC 映射”。
27+
28+
### 3) 序列化/反序列化与配置
29+
- 将协议对象、元信息在 JSON/YAML/二进制之间进行编解码
30+
- 读取执行器/客户端的配置(例如地址、设备策略、协议版本等)
31+
32+
目标是让其他组件不要各自实现一套解析与校验逻辑。
33+
34+
### 4) 通用基础设施
35+
- 轻量的错误与返回值表达(Status/Result)
36+
- 字符串、文件系统等工具的薄封装
37+
38+
要求保持依赖尽量少、接口稳定、与具体硬件/运行时解耦。
39+
40+
## 非职责(边界)
41+
42+
### 不做硬件绑定
43+
- 不直接依赖 CUDA/Metal/ROCm/NCCL 等
44+
- 不实现任何具体算子 kernel
45+
46+
这些应由 `op-cuda``op-ompsimd``op-mem-mps` 等执行器承担。
47+
48+
### 不做堆 tensor 生命周期与 IPC
49+
- 不管理持久堆 tensor 的分配/回收
50+
- 不负责 CUDA IPC handle 的创建/打开/关闭
51+
52+
这些应由 `heapmem-cuda` 这类“统一寻址空间的 tensor 具体实现”承担。
53+
54+
### 不做编译与调度
55+
- 不负责 deepxIR 的编译替换、fusion、分布式调度
56+
57+
这些属于中端编译器与调度器。
58+
59+
## 与其他组件的关系
60+
61+
- heapmem-*:owner 侧负责堆 tensor 生命周期与跨进程共享;deepxcore 提供 dtype/shape/协议对象
62+
- op-*:算子执行器负责栈 tensor(中间变量)与 kernel;deepxcore 提供基础数据模型与统一的元信息表达
63+
- 前端/SDK:通过统一协议把计算图与 tensor 元信息写入统一寻址空间;deepxcore 是 C++ 侧共用的协议层
64+
65+
## 目录
66+
- `src/`:核心库实现
67+
- `test/`:单元测试
68+
69+
## 构建
70+
本库通过 CMake 构建,并作为其他执行器目标的依赖被链接。
71+
72+
在上层执行器中使用时,通常只需要链接 `deepxcore` 目标,并包含对应头文件。

0 commit comments

Comments
 (0)