OpenReg 是一个使用 PyTorch 核心框架的“PrivateUse1”机制的树外后端实现的独立演示。该实现有两个主要目的:
- 参考实现:为第三方设备厂商通过 PrivateUse1 与 PyTorch 集成提供了一个实用的模板。
- CI 测试基础设施:为持续集成管道提供设备无关的测试能力。
使用说明
模块安装
cd {project}/test/cpp_extensions/open_registration_extension
python setup.py install
用例
import torch
import pytorch_openreg
if __name__ == "__main__":
print(torch.ones(1, 2, device='openreg'))
架构概述
流程管理
OpenReg 通过启动 N 个独立的子进程实现虚拟设备隔离,每个子进程维护专用的请求/响应队列以进行进程间通信。父进程驱动程序将设备操作封装到命令包中,这些命令包:
- 通过请求队列发送到目标设备
- 异步处理,并通过响应队列返回结果
图:父进程与子进程通信流程
内存管理
设备内存分配在各个子进程中发生,以确保:
- 设备间严格的内存隔离
- 物理设备约束的逼真模拟
组件分解
_aten_impl.py
此模块承担双重职责:
- 悬钩注册:
- 使用 _IMPL_REGISTRY 绑定 C++ 后端钩子(例如,getDevice、getStream)到设备驱动实现
- 回退机制:
- 定义一个新的
torch.Library
,用于注册回退,当调用 PrivateUse1 的后端内核时将被调用。它包含处理所有类型本地函数的逻辑,计算输出元数据,分配它,并且仅调用设备守护进程以执行计算
- 定义一个新的
_device_daemon.py
核心子系统
- 分配器:
-
HostAllocator
: 管理父进程中的固定内存 - 处理具有张量重建功能的设备内存
-
- 驱动程序(父进程):
- 维护设备上下文(活动设备/流)
- 实现设备控制操作:
- 设置设备/获取设备
- 设备数量
- 交换流
- 通过基于队列的 IPC orchestrate 命令执行
- 执行器(子进程):
- 处理命令类型:
- 内存操作(
malloc
/free
) - 张量计算(
run_op
) - 数据传输(
send_data
/recv_data
) - 流/事件管理(主要由于 CPU 同步特性而无需操作)
- 内存操作(
- 处理命令类型:
_meta_parser.py
关键特性:
- 实现跨进程对象传输的序列化工具
- OpenRegTensorMeta 类封装了以下完整的张量元数据:
- 输出张量重建
- 设备端计算准备
设计考虑
执行特性
- 同步计算:CPU 运算符执行需要同步处理
- 流/事件语义:由于同步执行模型,实现为空操作
- 内存隔离:通过子进程分配强制执行严格的按设备内存边界
此架构能够在保持 PyTorch 兼容性的同时,通过标准后端接口实现设备集成的真实模拟。