deepx一种以统一存算面为底座的深度学习计算框架,模型函数可以通过简单的数学形式进行表达为计算图,计算图可以写入到统一存算面的存储空间,被统一存算面的调度执行器自动执行,你也可以按照统一存算面的协议,实现自己的执行器,例如dataloader的数据处理执行器是训练用户必须自己实现的。
deepx可以划分为前端与统一存算面(中端与后端),分别是为
- 前端
- 模型表达api
- 统一存算面sdk
- 统一存算面 中端:编译替换调度层。对数学表达式进行等价编译替换,以匹配最优的后端kernel。 后端:执行器层:遵守严格的进程间与代码组件的隔离,以保证分工明确,架构长久稳定。
面向算法工程师、用接近数学的表达方式,设计其数学计算过程。只表示为单线程的简洁数学表达过程。不容许涉及复杂的device类型、分布式概念等。 tensor相关的函数表达式,和pytorch/numpy的api风格接近 deepx前端会输出计算图的IR序列,传递给统一存算面
面向算法和infra工程师,可以通过deepx存算协议标准,实现自己的调度器、执行器。 dataloader程序负责向存算面注册新的input tensor序列,因此依赖deepx sdk
统一存算面可以被看作一个原生的分布式tensor计算解释器。 统一存算面把分布式的gpu集群,抽象为统一的计算与存储平面,具体而言,就是存储了tensor元信息、计算图。但存算面本身,目前只利用了redis的kv功能。tensor的真正存储依然在gpu显存、内存、磁盘上,真正的计算,也是由执行器进程通过gpu/cpu去进行计算。但统一存算面的作用在于,抽象了tensor相关的计算图与存储表示,为tensor编程,开辟了新的上层表达语言,从而可以完全和复杂的底层工程代码隔离。
-
统一寻址空间
- 当前采用redis存储tensor元信息,配合heapmem进程,负责管理堆tensor的生命周期。
-
调度层:编译替换与分布式调度层:注册了多轮不同类型的IR编译器,实现等价替换,可以以插件的形式增加自定义能力如定制kvcache,实现对计算图进行局部替换,获得新的能力。
- 算子注册: 收集当前已就绪的执行器的算子列表,收集算子时耗和存储占用信息。计算图编译器优化器:fusion算子,计算图节点消除,自动生成tensor拆分并行的计算子图并替代原节点
- 反向传播推导引擎:深度学习模型,如pytorch框架,通常只需要定义模型前向过程,反向的计算图是通过pytorch自动实现的。deepx同理。
- 执行调度器:负责数据并行,流水线并行(前向反向并行),模型并行
-
执行器层:绑定具体的加速硬件,实现真正的tensor的储存、计算、网络通信,大规模并行化。
- heapmem-cuda:实现了nv平台的tensor生命周期管理,是统一寻址空间中的tensor的具体实现。 当我们在统一寻址空间删除一个key对应的tensor,实际的tensor会通过heapmem-cuda进程进行删除,创建同理。 heapmem管理的tensor,通常是持久的权重,可能被很多个不同进程访问,。 相对应的,随着函数执行完毕自动回收的中间变量tensor,可以被称之为stacktensor,这些tensor交给op进程自行管理。
- op-cuda:实现了nv平台的常用基础算子。cuda
为了把gpu上的tensor计算过程,区别于传统cpu上的程序,我们为tensor的分布式计算,定义一个新概念————T程序
概念比较
| cpu程序 | T程序 |
|---|---|
| 数据区、代码区 | kv存储管理 |
| 上层程序设:func和struct | deepxIR和tensor |
| cpu执行底层机器码/字节码 | deepx执行器执行deepxIR |
| 存储-堆 | kv存储tensor元信息,heapmem管理gpu、内存上的tensordata |
| 线程栈 | 计算进程自行管理 |
商业支持:lipeng@mirrorsoft.cn
本项目采用Apache License 2.0协议
- 允许商用和修改分发
- 需保留版权声明
- 修改文件需在头注释说明变更
- 不提供任何明示担保
完整协议见:LICENSE