Tech-Renaissance API 参考文档
概述
单人团队以 AI 技术开发的超轻量级高性能深度学习训练框架。
Tech-Renaissance 采用静态图编译执行、CUDA Graph 全捕获、FP16 AMP 混合精度训练、分布式数据并行等先进技术,在训练吞吐量上相比传统深度学习框架具有显著优势。在 A100 × 8 平台上,VGG16BN 训练吞吐量比 PyTorch + torch.compile 快 26.65%;在七个不同 GPU 平台上,MLP 训练加速比达到 6.90x - 13.58x。
本文档为 Tech-Renaissance V4.20.692 的完整 API 参考,涵盖七大核心模块的所有公开接口。
版本:V4.20.692
依赖项
| 工具/库 | 最低版本 |
|---|---|
| CMake | 3.28 |
| gcc | 13.3 |
| MSVC | 14.44.35207 |
| Ninja | 1.11 |
| Python | 3.12 |
| Eigen | 5.0 |
| XNNPACK | 2024-08-20 |
| CUDA | 13.1 |
| cuDNN | 9.17 |
| cuDNN Frontend | 1.17 |
| NCCL | 2.29 |
| zlib | 1.3 |
| libcurl | 8.5 |
| libjpeg-turbo | 3.1 |
| mimalloc | 3.2 |
| stb | 2024-07-29 |
| simd | 6.2 |
配置与运行
推荐以 Docker 容器方式运行,可确保环境一致并省去手动安装依赖的步骤。
# 1. 克隆项目
mkdir -p /opt/tr4 && cd /opt/tr4
git clone https://gitee.com/tech-renaissance/renaissance.git
# 2. 拉取镜像并启动容器
docker pull crpi-vbtd6yj00u83ugqk.cn-beijing.personal.cr.aliyuncs.com/tech-renaissance/tr4:v4.20
docker run -d -it --name tr4-dev --gpus all --cap-add SYS_NICE -v /opt/tr4:/opt/tr4 -w /opt/tr4 \
crpi-vbtd6yj00u83ugqk.cn-beijing.personal.cr.aliyuncs.com/tech-renaissance/tr4:v4.20 \
tail -f /dev/null
docker exec -it tr4-dev bash
# 3. 配置与编译
cd /opt/tr4/renaissance && python configure.py
./build.sh
# 4. 运行示例
/opt/tr4/renaissance/build/bin/tests/example/mlp_mnist
注意:
configure.py会从当前环境自动查找依赖并生成编译脚本。若不使用 Docker,需手动安装所有依赖项(见上表)并确保 GPU 驱动、CUDA、NVIDIA Container Toolkit 已正确配置。
代码示例
以下示例展示从引入头文件到完成训练的最短路径(训练 MLP 至 99.4% 以上的 MNIST 准确率):
#include <renaissance.h>
using namespace tr;
int main() {
// 1. 全局训练环境配置
GLOBAL_SETTING
.use_gpu("0") // 使用 GPU 0
.amp(true) // 启用 FP16 自动混合精度训练
.manual_seed(123) // 固定随机种子,保证结果可复现
.global_batch_size(200)
.input_resolution(28);
// 2. 数据预处理配置
PREPROCESSOR_SETTING
.dataset("mnist", std::string(TR_PROJECT_ROOT) + "/data/mnist")
.download(true)
.preprocess_workers(8)
.normalization(NormMode::MNIST)
.train_transforms(
Pad(2),
RandomCrop(28),
RandomRotation(20.0f, 0),
RandomScale(0.8f, 1.2f),
RandomErasing(0.5f)
)
.commit();
// 3. 模型定义:4 层 MLP
// 输入 [28, 28] -> Flatten -> 1024 -> 512 -> 256 -> 10 (SoftmaxCE)
BluePrint mlp = seq(
fc(1024, true), relu(),
fc(512, true), relu(),
fc(256, true), relu(),
fc(10, true)
);
constexpr int kTotalEpochs = 100;
// 4. 训练任务配置
DeepLearningTask task;
task.model(mlp)
.loss(CrossEntropyLoss().label_smoothing(0.1f))
.total_epochs(kTotalEpochs)
.optimizer(AdamW().weight_decay(1e-4f))
.scheduler(CosineAnnealingLR().base_lr(0.001f).warmup(5));
// 编译:默认仅打印 ArchPlan,适合普通用户快速查看模型结构。
// 需要调试时,可改为 task.compile(CompileInfo::ALL);
task.compile();
// 5. 执行训练
auto result = task.run();
// 6. 输出训练结果
std::cout << "Best Top-1: " << result.best_top1 * 100.0f << "%\n";
return 0;
}
七大模块
Tech-Renaissance 采用模块化架构,分为七大核心模块:
| 模块 | 职责 | 关键头文件 |
|---|---|---|
| Core | 类型系统、日志、RNG、全局配置、异常 | types.h、rng.h、logger.h、global_registry.h |
| Data | 数据加载、图像预处理增强管线 | data_loader.h、preprocessor.h、preprocess_operation.h |
| Tensor | CPU 端 Tensor 与分布式 DTensor | tensor.h、distributed_tensor.h |
| Graph | 计算图构建、编译、内存规划、CUDA Graph 捕获 | blueprint.h、compiler.h、computation_graph.h |
| Algo | 损失函数、优化器、学习率调度器 | optimizer.h、scheduler.h、loss.h |
| Task | 训练/推理任务门面与生命周期 | task_base.h、simple_task.h、deep_learning_task.h |
| Backend | 算子注册、设备上下文、图执行器、内存池 | graph_executor.h、device_context.h、memory_arena.h |
Core 模块
提供基础类型定义(Shape、DType、Region、Phase、StreamKind)、高性能可复现 RNG、线程安全日志系统、统一异常体系和全局配置管理。
Data 模块
负责数据加载与预处理,支持 MNIST、CIFAR、ImageNet 等数据集,提供完整的图像增强操作链(RandomResizedCrop、ColorJitter、Normalize 等),采用多线程流水线架构实现高效传输。
Tensor 模块
提供 CPU 端数据容器 Tensor(紧凑布局、移动语义、TSR 格式序列化)和分布式张量描述符 DTensor(多卡统一内存视图、对齐计算、槽位管理)。
Graph 模块
实现计算图编译与捕获,提供 BluePrint DSL 定义模型、五阶段编译管线、多流 CUDA Graph 捕获、基于 69-Region 规范的显存布局引擎。
Algo 模块
提供训练算法配置接口,包括 SGD/LARS/Adam/AdamW 优化器、支持 Warmup 的多种学习率调度器(PolynomialLR、CosineAnnealingLR、StepLR 等)、交叉熵损失函数。
Task 模块
提供训练/推理任务门面与生命周期管理,SimpleTask 用于手动构图场景,DeepLearningTask 封装完整训练循环(验证、SEMA、早停、指标收集、模型保存)。
Backend 模块
作为执行引擎,管理硬件设备、内存/显存池、算子执行和多流调度,提供 DeviceContext、MemoryArena、GraphExecutor、算子注册表等核心组件。
Core
板块介绍
Core 模块是 Tech-Renaissance 框架的核心基础设施,提供基础类型定义、随机数生成、日志记录、异常处理、全局配置管理等功能。
该模块对外提供的核心能力包括:
- 基础数据类型定义(Shape、DType、Region、枚举类型等)
- 高性能可复现的随机数生成(基于 Philox4x32-10 算法)
- 线程安全的日志系统(支持编译期级别过滤)
- 统一的异常体系和错误处理机制
- 全局配置管理(GlobalRegistry 单例)
- 张量初始化配置和管理
- GPU/CPU 设备配置和 Staging 内存管理
- 文件下载工具(Downloader)
关键头文件路径:
include/renaissance/core/types.h- 基础类型定义include/renaissance/core/rng.h- 随机数生成器include/renaissance/core/logger.h- 日志系统include/renaissance/core/tr_exception.h- 异常体系include/renaissance/core/global_registry.h- 全局配置管理include/renaissance/core/initializer.h- 初始化器include/renaissance/core/init_config.h- 初始化配置include/renaissance/core/global_config.h- 全局配置常量
内部实现位置:src/core/
struct Shape
概述
Shape 是表示张量形状的结构体,采用 NHWC(Batch-Height-Width-Channel)格式,支持 4 维张量的形状描述。
所属头文件:#include
设计定位:值类型,可拷贝,可移动
常用使用路径:作为 Tensor 构造参数、数据层配置、模型输入输出形状描述
典型使用代码片段:
// 默认构造:标量 [1,1,1,1]
tr::Shape scalar;
// 从4个元素构造:[N,H,W,C]
tr::Shape image_batch(32, 224, 224, 3);
// 从初始化列表构造(右对齐填充)
tr::Shape vector{128}; // [1,1,1,128]
tr::Shape matrix{64, 128}; // [1,1,64,128]
tr::Shape tensor{8, 28, 28, 64}; // [8,28,28,64]
构造与赋值
Shape::Shape()
Shape() = default;
功能简介 默认构造函数,创建标量形状 [1,1,1,1]。
参数 无
返回值 无
异常 无
Shape::Shape(int n, int h, int w, int c)
TR_NOINLINE Shape(int n, int h, int w, int c);
功能简介 从 4 个显式参数构造 Shape [N,H,W,C]。使用 TR_NOINLINE 和 volatile 写入修复 MSVC /O2 优化问题。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| n | int | - | Batch 大小(N) |
| h | int | - | 高度(H) |
| w | int | - | 宽度(W) |
| c | int | - | 通道数(C) |
返回值 无
异常 无
注意事项
- 非正值(<=0)会自动修正为 1
- TR_NOINLINE 防止 MSVC Release 模式下的优化错误
- volatile 写入强制内存写入,防止参数传递错误
Shape::Shape(std::initializer_list list)
Shape(std::initializer_list<int> list);
功能简介 从初始化列表构造 Shape,支持 1-4 个元素,右对齐填充。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| list | std::initializer_list |
- | 形状列表(1-4个元素) |
返回值 无
异常 无
注意事项 填充规则(右对齐):
- 1 个元素 {C} → [1,1,1,C]
- 2 个元素 {W,C} → [1,1,W,C]
- 3 个元素 {H,W,C} → [1,H,W,C]
- 4 个元素 {N,H,W,C} → [N,H,W,C]
非正值(<=0)会自动修正为 1。
示例
tr::Shape s1{128}; // [1,1,1,128]
tr::Shape s2{64, 128}; // [1,1,64,128]
tr::Shape s3{28, 28, 3}; // [1,28,28,3]
tr::Shape s4{32, 224, 224, 3}; // [32,224,224,3]
数据访问
int& Shape::operator[](size_t i)
int& operator[](size_t i);
const int& operator[](size_t i) const;
功能简介 访问第 i 个维度(0-based)。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| i | size_t | - | 维度索引(0-3) |
返回值 对应维度的引用
异常 无(不进行边界检查)
int Shape::n() const
int n() const;
功能简介 获取 Batch 大小 N(维度 0)。
参数 无
返回值 Batch 大小
异常 无
int Shape::h() const
int h() const;
功能简介 获取高度 H(维度 1)。
参数 无
返回值 高度值
异常 无
int Shape::w() const
int w() const;
功能简介 获取宽度 W(维度 2)。
参数 无
返回值 宽度值
异常 无
int Shape::c() const
int c() const;
功能简介 获取通道数 C(维度 3)。
参数 无
返回值 通道数
异常 无
int64_t Shape::numel() const
int64_t numel() const noexcept;
功能简介 计算总元素数量 N×H×W×C。
参数 无
返回值 总元素个数(int64_t)
异常 无
运算符
bool Shape::operator==(const Shape& other) const
bool operator==(const Shape& other) const noexcept;
功能简介 相等比较运算符。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| other | const Shape& | - | 另一个 Shape |
返回值 所有维度是否完全相同
异常 无
bool Shape::operator!=(const Shape& other) const
bool operator!=(const Shape& other) const noexcept;
功能简介 不等比较运算符。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| other | const Shape& | - | 另一个 Shape |
返回值 是否有任何维度不同
异常 无
工具方法
std::string Shape::to_string() const
std::string to_string() const;
功能简介 转换为字符串表示,如 "[32,224,224,3]"。
参数 无
返回值 字符串表示
异常 无
static constexpr size_t Shape::ndim()
static constexpr size_t ndim();
功能简介 获取维度数量(总是返回 4)。
参数 无
返回值 维度数量(4)
异常 无
enum class DType
概述
数据类型枚举,表示张量的元素类型。
所属头文件:#include
| 枚举值 | 说明 |
|---|---|
FP32 |
32 位浮点数(单精度) |
FP16 |
16 位浮点数(半精度) |
INT8 |
8 位整数 |
INT32 |
32 位整数 |
enum class NormMode
概述
归一化模式枚举,指定数据预处理的归一化方式。
所属头文件:#include
| 枚举值 | 说明 |
|---|---|
NO_NORM |
不归一化 |
MLPERF |
MLPerf 基准测试归一化参数 |
IMAGENET |
ImageNet 数据集归一化参数 |
MNIST |
MNIST 数据集归一化参数 |
CIFAR |
CIFAR-10/100 数据集归一化参数 |
enum class Region
概述
显存区域枚举,定义了 69 个显存区域(Region),用于显存池管理和张量分配。按功能分为多个系列:B 系列(BN 统计量)、W 系列(主模型权重)、E 系列(EMA 权重)、A 系列(AMP FP16 权重)、G 系列(梯度)、M 系列(一阶动量)、V 系列(二阶动量)、N 系列(LARS 范数)、I 系列(输入缓冲区)、F 系列(特征图)、S 系列(标量)、T 系列(临时张量)、R 系列(结果区)。
所属头文件:#include
| 枚举值 | 系列 | 说明 |
|---|---|---|
B_PREV_MEAN |
B | BN 上一轮均值(epoch 级生命周期) |
B_PREV_VAR |
B | BN 上一轮方差 |
B_NEXT_MEAN |
B | BN 下一轮均值 |
B_NEXT_VAR |
B | BN 下一轮方差 |
W_EQ_BIAS |
W | 等价融合 Bias |
W_EQ_SCALE |
W | 等价融合 Scale |
W_BN_BIAS |
W | BN 偏置(权重) |
W_BN_WEIGHT |
W | BN 缩放权重 |
W_FC_BIAS |
W | 全连接层偏置 |
W_FC_WEIGHT |
W | 全连接层权重 |
W_FIRST_CONV |
W | 首层卷积权重 |
W_DEEP_CONV |
W | 深层卷积权重 |
E_BN_BIAS |
E | EMA BN 偏置 |
E_BN_WEIGHT |
E | EMA BN 缩放权重 |
E_FC_BIAS |
E | EMA 全连接层偏置 |
E_FC_WEIGHT |
E | EMA 全连接层权重 |
E_FIRST_CONV |
E | EMA 首层卷积权重 |
E_DEEP_CONV |
E | EMA 深层卷积权重 |
E_FC_WEIGHT_FP16 |
E | EMA 全连接层 FP16 权重 |
E_FIRST_CONV_FP16 |
E | EMA 首层卷积 FP16 权重 |
E_DEEP_CONV_FP16 |
E | EMA 深层卷积 FP16 权重 |
A_FC_WEIGHT |
A | AMP 全连接层 FP16 权重 |
A_FIRST_CONV |
A | AMP 首层卷积 FP16 权重 |
A_DEEP_CONV |
A | AMP 深层卷积 FP16 权重 |
G_BN_BIAS |
G | 梯度:BN 偏置(桶 2 起点) |
G_BN_WEIGHT |
G | 梯度:BN 缩放权重 |
G_FC_BIAS |
G | 梯度:全连接层偏置 |
G_FC_WEIGHT |
G | 梯度:全连接层权重(桶 2 终点) |
G_DEEP_CONV |
G | 梯度:深层卷积权重(桶 1) |
R_RESULT |
R | 结果区(FP32 三标量:loss + top1 + top5) |
G_FC_WEIGHT_FP16 |
G | 梯度:全连接层 FP16 权重 |
G_FIRST_CONV_FP16 |
G | 梯度:首层卷积 FP16 权重 |
G_DEEP_CONV_FP16 |
G | 梯度:深层卷积 FP16 权重 |
M_BN_BIAS |
M | 一阶动量:BN 偏置 |
M_BN_WEIGHT |
M | 一阶动量:BN 缩放权重 |
M_FC_BIAS |
M | 一阶动量:全连接层偏置 |
M_FC_WEIGHT |
M | 一阶动量:全连接层权重 |
M_FIRST_CONV |
M | 一阶动量:首层卷积权重 |
M_DEEP_CONV |
M | 一阶动量:深层卷积权重 |
V_BN_BIAS |
V | 二阶动量(Adam):BN 偏置 |
V_BN_WEIGHT |
V | 二阶动量(Adam):BN 缩放权重 |
V_FC_BIAS |
V | 二阶动量:全连接层偏置 |
V_FC_WEIGHT |
V | 二阶动量:全连接层权重 |
V_FIRST_CONV |
V | 二阶动量:首层卷积权重 |
V_DEEP_CONV |
V | 二阶动量:深层卷积权重 |
N_FC_WEIGHT |
N | LARS 范数:全连接层权重 |
N_FIRST_CONV |
N | LARS 范数:首层卷积权重 |
N_DEEP_CONV |
N | LARS 范数:深层卷积权重 |
I_A_LABEL |
I | 输入缓冲区:A 路标签 |
I_A_DATA |
I | 输入缓冲区:A 路数据 |
I_B_LABEL |
I | 输入缓冲区:B 路标签 |
I_B_DATA |
I | 输入缓冲区:B 路数据 |
F_FEATURE_FP32 |
F | 特征图 FP32 |
F_GRAD_SLOT_FP32 |
F | 梯度槽 FP32 |
F_FEATURE_FP16 |
F | 特征图 FP16 |
F_GRAD_SLOT_FP16 |
F | 梯度槽 FP16 |
S_SCALAR_FP32 |
S | 标量 FP32 |
S_SCALAR_FP16 |
S | 标量 FP16 |
S_SCALAR_INT32 |
S | 标量 INT32 |
S_SCALAR_INT8 |
S | 标量 INT8 |
S_MASK |
S | 掩码 |
T_TEMP_FP32 |
T | 临时张量 FP32 |
T_TEMP_FP16 |
T | 临时张量 FP16 |
T_TEMP_INT32 |
T | 临时张量 INT32 |
T_TEMP_INT8 |
T | 临时张量 INT8 |
R_PREDICTED_LABEL |
R | 推理标签值([batch] INT32) |
R_RESULT_ACCUMULATED |
R | 累积结果区(FP32:sum_loss, sum_top1, sum_top5) |
DEFAULT |
- | 等价于 B_PREV_MEAN |
NUM_REGIONS |
- | Region 总数(69) |
struct PlanConfig
概述
内存规划配置结构体,用于指示 MemoryPlan 需要为哪些类型的张量分配显存。
所属头文件:#include
设计定位:值类型,8 个布尔/整数字段,直接传递给内存规划器
成员
| 字段名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
bn_folded |
bool |
true |
是否将 BN 折叠进卷积 |
use_lars |
bool |
false |
是否使用 LARS 优化器 |
use_adam |
bool |
false |
是否使用 Adam/AdamW 优化器 |
use_momentum |
bool |
true |
是否使用动量(Adam 隐含需要 M_/V_ 系列) |
has_ema |
bool |
false |
是否维护 EMA 权重 |
num_models |
int |
1 |
预留字段,当前固定为 1 |
need_mask |
bool |
false |
是否需要掩码区 |
need_temp |
bool |
false |
是否需要临时张量区 |
enum class GraphMode
概述
图模式枚举,表示计算图的工作模式。
所属头文件:#include
| 枚举值 | 说明 |
|---|---|
TRAIN_FORWARD |
训练前向传播 |
TRAIN_BACKWARD |
训练反向传播 |
INFERENCE |
推理模式 |
enum class Phase
概述
任务生命周期枚举,表示任务的不同阶段。
所属头文件:#include
| 枚举值 | 说明 |
|---|---|
PLANNING |
规划阶段 |
MEMORY_LOCKED |
内存锁定阶段 |
COMPILED |
已编译阶段 |
enum class StreamKind
概述
CUDA 流类型枚举,定义 5 个物理非阻塞流。
所属头文件:#include
| 枚举值 | 说明 |
|---|---|
TRANS |
传输流(H2D/D2H) |
COMP_1 |
计算流 1 |
COMP_2 |
计算流 2 |
COMP_3 |
计算流 3 |
UPDATE |
更新流(梯度更新) |
enum class OptimizerKind
概述
优化器类型枚举,用于配置优化器。
所属头文件:#include
| 枚举值 | 说明 |
|---|---|
SGD |
随机梯度下降 |
SGD_MOMENTUM |
SGD with Momentum |
SGD_NESTEROV |
SGD with Nesterov momentum |
LARS |
Layer-wise Adaptive Rate Scaling |
LARS_NESTEROV |
LARS with Nesterov momentum |
ADAM |
Adaptive Moment Estimation |
ADAMW |
Adam with decoupled weight decay |
enum class NormalizePreset
概述
归一化预设配置枚举,定义常用的数据集归一化参数。
所属头文件:#include
| 枚举值 | 说明 |
|---|---|
NO_NORM |
不归一化(仅 ToTensor) |
MNIST |
MNIST 数据集归一化参数 |
CIFAR |
CIFAR-10/100 数据集归一化参数 |
IMAGENET |
ImageNet 数据集归一化参数 |
MLPERF |
MLPerf 基准测试归一化参数 |
enum class ConvSearchMode
概述
卷积搜索模式枚举,控制 cuDNN 卷积算法选择策略。
所属头文件:#include
| 枚举值 | 说明 |
|---|---|
HEURISTIC_B |
启发式搜索(默认) |
EXHAUSTIVE_C |
穷举搜索(仅 AMP Conv,仅 A100/RTX5090) |
enum class Metric
概述
指标位掩码枚举,用于指定需要计算的评估指标。
所属头文件:#include
| 枚举值 | 说明 |
|---|---|
NONE |
无指标 |
TRAIN_LOSS |
训练损失 |
VAL_LOSS |
验证损失 |
VAL_TOP1 |
验证 Top-1 准确率 |
VAL_TOP5 |
验证 Top-5 准确率 |
EMA_TOP1 |
EMA Top-1 准确率 |
EMA_TOP5 |
EMA Top-5 准确率 |
enum class TTA
概述
TTA(Test Time Augmentation)模式枚举,测试时数据增强技术。
所属头文件:#include
| 枚举值 | 说明 |
|---|---|
DISABLED |
禁用 TTA(默认) |
LR |
左右翻转 |
SHIFT_1PX |
一像素平移(四个方向+中心) |
struct InputSpec
概述
输入规格结构体,描述模型输入的默认维度。
所属头文件:#include
设计定位:值类型,4 字段 POD
成员
| 字段名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
n |
int |
1 |
Batch 大小 |
c |
int |
3 |
通道数 |
h |
int |
224 |
输入高度 |
w |
int |
224 |
输入宽度 |
struct TrainingResult
概述
训练结果结构体,由 Task::run() 返回,汇总训练过程中的最佳指标。
所属头文件:#include
设计定位:值类型,返回结果容器
成员
| 字段名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
best_top1 |
float |
0.0f |
最佳 Top-1 准确率 |
best_top5 |
float |
0.0f |
最佳 Top-5 准确率 |
best_ema_top1 |
float |
0.0f |
最佳 EMA Top-1 准确率 |
best_ema_top5 |
float |
0.0f |
最佳 EMA Top-5 准确率 |
best_epoch |
int |
-1 |
最佳 epoch 索引 |
工厂方法
static TrainingResult TrainingResult::debug_stub()
static TrainingResult debug_stub();
功能简介 返回一个默认构造的 TrainingResult,用于调试占位。
参数 无
返回值 默认 TrainingResult
异常 无
enum class LogLevel
概述
日志级别枚举,控制日志输出的详细程度。
所属头文件:#include
| 枚举值 | 说明 |
|---|---|
DEBUG |
调试信息(最详细) |
INFO |
一般信息 |
WARN |
警告信息 |
ERR |
错误信息 |
enum class InitKind
概述
初始化方法枚举,定义 8 种张量初始化策略,覆盖 MLPerf 全部需求。
所属头文件:#include
| 枚举值 | 说明 |
|---|---|
NONE |
不初始化(显存池已为零) |
ZEROS |
全零 |
CONSTANTS |
全常量 |
KAIMING_NORMAL |
He 正态分布 |
KAIMING_UNIFORM |
He 均匀分布 |
XAVIER_NORMAL |
Glorot 正态分布 |
XAVIER_UNIFORM |
Glorot 均匀分布 |
TRUNC_NORMAL |
截断正态分布(MLPerf 卷积专用) |
FIXED_NORMAL |
固定正态分布 |
STANDARD |
BN 标准初始化 |
ZERO_GAMMA |
BN ZERO_GAMMA 初始化 |
enum class FanMode
概述
Fan 计算模式枚举,用于卷积初始化时的 fan_in/fan_out 计算。
所属头文件:#include
| 枚举值 | 说明 |
|---|---|
FAN_IN |
fan_in = C_in × H × W |
FAN_OUT |
fan_out = C_out × H × W |
FAN_AVG |
(fan_in + fan_out) / 2 |
struct InitConfig
概述
初始化配置结构体,8 字节紧凑布局,描述张量的初始化策略。
所属头文件:#include
设计定位:值类型,可通过 NCCL Broadcast 一次性传输
常用使用路径:作为 Initializer::derive() 的返回值
成员
| 字段名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| scale | float | 1.0f | 数值参数(含义依赖 kind) |
| kind | InitKind | InitKind::NONE | 初始化方法种类 |
| fan | FanMode | FanMode::FAN_IN | fan 计算模式 |
总大小:8 bytes(含 2 字节 padding)
数据访问
bool InitConfig::needs_init() const
bool needs_init() const noexcept;
功能简介 判断是否需要执行初始化。
参数 无
返回值 kind != NONE 时返回 true
异常 无
const char* InitConfig::to_string() const
const char* to_string() const noexcept;
功能简介 转换为可读字符串(调试用)。
参数 无
返回值 格式化的字符串(静态缓冲区)
异常 无
class Generator
概述
Generator 是基于 Philox4x32-10 算法的伪随机数生成器,支持多线程可复现、高性能、跨平台。
所属头文件:#include
设计定位:有状态(stateful),使用 Pimpl 模式避免 MUSA SDK 的
常用使用路径:
- 全局随机种子设置:通过 GlobalRegistry::manual_seed()
- 独立生成器:多线程数据加载(每个线程独立 Generator)
典型使用代码片段:
// 全局设置(推荐)
tr::GlobalRegistry::instance().manual_seed(42);
// 使用默认生成器
tr::cpu_rand_normal_float(ptr, count, 0.0f, 1.0f);
// 使用独立生成器(多线程)
tr::Generator gen(1234);
tr::cpu_rand_normal_float(ptr, count, 0.0f, 1.0f, gen);
构造与赋值
Generator::Generator(uint64_t seed)
explicit Generator(uint64_t seed = 0) noexcept;
功能简介 构造函数,创建指定种子的生成器。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| seed | uint64_t | 0 | 随机种子 |
返回值 无
异常 无
Generator::~Generator()
~Generator();
功能简介 析构函数。
参数 无
返回值 无
异常 无
Generator::Generator(Generator&& other)
Generator(Generator&& other) noexcept;
功能简介 移动构造函数。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| other | Generator&& | - | 源对象 |
返回值 无
异常 无
注意事项 源对象的 impl_ 自动置为 nullptr
Generator& Generator::operator=(Generator&& other)
Generator& operator=(Generator&& other) noexcept;
功能简介 移动赋值运算符。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| other | Generator&& | - | 源对象 |
返回值 *this
异常 无
注意事项 禁止拷贝(拷贝构造和拷贝赋值已删除)
种子管理
void Generator::set_seed(uint64_t seed)
void set_seed(uint64_t seed);
功能简介 设置种子(重置 offset 为 0)。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| seed | uint64_t | - | 新种子 |
返回值 无
异常 无
注意事项 线程安全,但会短暂阻塞其他操作
uint64_t Generator::seed() const
uint64_t seed() const noexcept;
功能简介 获取当前种子。
参数 无
返回值 种子值
异常 无
状态管理(用于 Checkpoint)
std::pair Generator::get_state() const
std::pair<uint64_t, uint64_t> get_state() const;
功能简介 获取完整状态 {seed, offset}。
参数 无
返回值 {seed, offset} 对
异常 无
void Generator::set_state(uint64_t seed, uint64_t offset)
void set_state(uint64_t seed, uint64_t offset);
功能简介 设置完整状态。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| seed | uint64_t | - | 种子 |
| offset | uint64_t | - | 偏移量 |
返回值 无
异常 无
偏移量管理(核心方法)
uint64_t Generator::next_offset(uint64_t count)
uint64_t next_offset(uint64_t count);
功能简介 原子预留偏移量区间,实现多线程可复现的关键。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| count | uint64_t | - | 需要的随机数个数 |
返回值 本次预留的起始 offset
异常 无
注意事项
- 调用者获得 [返回值, 返回值+count) 区间的独占使用权
- 多线程并发调用时,每个调用获得的区间互不重叠
- 相同的调用序列产生相同的区间分配
uint64_t Generator::current_offset() const
uint64_t current_offset() const noexcept;
功能简介 获取当前偏移量(不修改状态)。
参数 无
返回值 当前 offset
异常 无
辅助方法
int Generator::random_int(int low, int high)
int random_int(int low, int high);
功能简介 生成 [low, high] 范围的随机整数(包含两端)。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| low | int | - | 最小值(包含) |
| high | int | - | 最大值(包含) |
返回值 [low, high] 范围内的随机整数
异常 无
注意事项 可复现:相同的 seed 和 offset 序列产生相同的结果,用于 Fisher-Yates 洗牌等场景
class Logger
概述
Logger 是轻量级、线程安全、可编译关闭的日志系统,支持四级日志(DEBUG/INFO/WARN/ERROR)和模块化标记。
所属头文件:#include
设计定位:单例模式,线程安全,支持编译期级别过滤
常用使用路径:
- 运行时配置:Logger::instance().set_level()
- 宏使用:TR_LOG_INFO("Module") << "message"
典型使用代码片段:
// 设置日志级别
tr::Logger::instance().set_level(tr::LogLevel::INFO);
// 设置输出文件
tr::Logger::instance().set_output_file("app.log");
// 使用日志宏
TR_LOG_INFO("TR") << "Training started";
LOG_WARN << "Low memory detected";
构造与析构
Logger& Logger::instance()
static Logger& instance() noexcept;
功能简介 获取 Logger 单例实例(Meyers 单例,线程安全)。
参数 无
返回值 Logger 单例引用
异常 无
Logger::~Logger()
~Logger();
功能简介 析构函数,自动关闭日志文件。
参数 无
返回值 无
异常 无
注意事项 禁止拷贝和赋值
配置方法
void Logger::set_level(LogLevel level)
void set_level(LogLevel level) noexcept;
功能简介 设置日志级别,低于此级别的日志将被过滤。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| level | LogLevel | - | 日志级别 |
返回值 无
异常 无
void Logger::set_output_file(const std::string& filename)
void set_output_file(const std::string& filename);
功能简介 设置日志输出文件。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| filename | std::string | - | 日志文件路径,空字符串表示控制台输出 |
返回值 无
异常 无
void Logger::set_quiet_mode(bool quiet)
void set_quiet_mode(bool quiet) noexcept;
功能简介 设置静默模式。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| quiet | bool | - | true 表示不输出任何日志 |
返回值 无
异常 无
核心日志方法
void Logger::log(LogLevel level, const char module, const char file, int line, const std::string& message)
void log(LogLevel level, const char* module, const char* file,
int line, const std::string& message);
功能简介 核心日志方法,输出日志消息。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| level | LogLevel | - | 日志级别 |
| module | const char* | - | 模块名称 |
| file | const char* | - | 源文件名 |
| line | int | - | 行号 |
| message | std::string | - | 日志消息 |
返回值 无
异常 无
注意事项 线程安全,内部使用互斥锁保护
查询方法
LogLevel Logger::level() const
LogLevel level() const noexcept;
功能简介 获取当前日志级别。
参数 无
返回值 当前日志级别
异常 无
内部生命周期方法
void Logger::init()
void init();
功能简介 初始化 Logger(供 Initializer 调用)。
参数 无
返回值 无
异常 无
注意事项 空实现,保留接口一致性。实际初始化由 Logger::instance() 的 Meyers 单例完成。
void Logger::cleanup()
void cleanup();
功能简介 清理 Logger(供 Initializer 调用)。
参数 无
返回值 无
异常 无
注意事项 空实现,保留接口一致性。
void Logger::log_exception(const TRException& e)
[[deprecated]] void log_exception(const TRException& e);
功能简介 将异常信息记录到日志。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| e | const TRException& | - | 要记录的异常 |
返回值 无
异常 无
注意事项 【已废弃】自 V4.20.1 起,异常不再自动记录到 Logger。此方法仅保留给特殊场景,新代码应避免使用。
宏定义
概述
框架提供的日志、线程安全输出及平台兼容宏定义。
头文件:
renaissance/core/logger.h- 日志宏与线程安全输出宏renaissance/core/types.h- 平台兼容属性宏
日志宏
所属头文件:#include
编译期过滤宏
编译期日志过滤由
TR_LOG_LEVEL控制(定义于renaissance/core/logger.h):
-TR_LOG_LEVEL <= 0:DEBUG 及以上启用
-TR_LOG_LEVEL <= 1:INFO 及以上启用
-TR_LOG_LEVEL <= 2:WARN 及以上启用
-TR_LOG_ERROR始终保留,不受该宏影响
- 未定义时,Debug 模式默认为 0,Release 模式默认为 2
TR_LOG_DEBUG(module)
TR_LOG_DEBUG(module)
签名 宏调用形式:TR_LOG_DEBUG(module)
功能简介 DEBUG 级别日志宏,编译期可过滤。在 Release 模式下完全消失(零开销)。
参数
| 参数名 | 类型 | 说明 |
|---|---|---|
| module | const char* | 模块名称(字符串字面量) |
返回值 LogStream 或 NullStream(支持流式操作)
异常 无
注意事项
- TR_LOG_LEVEL <= 0 时启用
- Debug 模式下等同于 TR_LOG_INFO
- 支持
<<流式语法
TR_LOG_INFO(module)
TR_LOG_INFO(module)
签名 宏调用形式:TR_LOG_INFO(module)
功能简介 INFO 级别日志宏。
参数
| 参数名 | 类型 | 说明 |
|---|---|---|
| module | const char* | 模块名称 |
返回值 LogStream 或 NullStream
异常 无
注意事项 TR_LOG_LEVEL <= 1 时启用
TR_LOG_WARN(module)
TR_LOG_WARN(module)
签名 宏调用形式:TR_LOG_WARN(module)
功能简介 WARN 级别日志宏。
参数
| 参数名 | 类型 | 说明 |
|---|---|---|
| module | const char* | 模块名称 |
返回值 LogStream 或 NullStream
异常 无
注意事项 TR_LOG_LEVEL <= 2 时启用
TR_LOG_ERROR(module)
TR_LOG_ERROR(module)
签名 宏调用形式:TR_LOG_ERROR(module)
功能简介 ERROR 级别日志宏,始终保留(不可编译期过滤)。
参数
| 参数名 | 类型 | 说明 |
|---|---|---|
| module | const char* | 模块名称 |
返回值 LogStream
异常 无
便捷宏(自动推断模块)
LOG_DEBUG / LOG_INFO / LOG_WARN / LOG_ERROR
#define LOG_DEBUG TR_LOG_DEBUG("TR")
#define LOG_INFO TR_LOG_INFO("TR")
#define LOG_WARN TR_LOG_WARN("TR")
#define LOG_ERROR TR_LOG_ERROR("TR")
签名 宏调用形式:LOG_DEBUG、LOG_INFO、LOG_WARN、LOG_ERROR
功能简介 便捷日志宏,自动使用 "TR" 作为模块名。
参数 无
返回值 LogStream 或 NullStream
异常 无
示例
LOG_INFO << "Training started";
LOG_WARN << "GPU memory usage: " << usage << "%";
LOG_ERROR << "Failed to load model";
线程安全原子性输出宏
所属头文件:#include
TR_ATOMIC_COUT
TR_ATOMIC_COUT
签名 宏调用形式:TR_ATOMIC_COUT
功能简介 线程安全原子性标准输出宏,直接输出到 stdout,不经过日志级别过滤、不附加时间戳/模块名。通过全局互斥锁保证多线程下整行/整块输出不被打断。
参数 无
返回值 AtomicCoutStream(支持流式操作)
异常 无
注意事项
- 不受日志级别过滤影响
- 不添加时间戳、模块名等元信息
- 适用于需要原始输出的场景
示例
TR_ATOMIC_COUT << "Progress: " << percent << "%" << std::endl;
平台兼容属性宏(实现细节)
所属头文件:#include
以下宏为框架内部平台兼容/编译器控制宏,普通用户通常无需直接使用。
TR_NOINLINE
#ifdef _MSC_VER
#define TR_NOINLINE __declspec(noinline)
#elif defined(__GNUC__) || defined(__clang__)
#define TR_NOINLINE __attribute__((noinline))
#else
#define TR_NOINLINE
#endif
功能简介 禁止编译器内联当前函数。用于修复特定平台/优化级别下的正确性问题。
使用位置 主要在 Shape::Shape(int n, int h, int w, int c) 构造函数中使用,避免 MSVC /O2 优化导致的参数传递错误。
注意事项
- 属于实现细节,不建议用户在自己的代码中使用
- 删除该属性可能导致 Release 模式下
Shape构造异常
struct ExceptionContext
概述
异常上下文信息结构体,用于记录异常发生时的文件、函数和消息。
所属头文件:#include
设计定位:值类型,构成 TRException 的上下文链
成员
| 字段名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
file |
const char* |
- | 源文件名(basename) |
func |
const char* |
- | 函数名 |
message |
std::string |
- | 上下文消息 |
工具方法
std::string ExceptionContext::to_string() const
std::string to_string() const;
功能简介 将上下文格式化为可读字符串。
参数 无
返回值 格式:message (at file :: func())
异常 无
class TRException
概述
TRException 是框架统一异常基类,支持 Context Chain(多层上下文叠加)、延迟构建 what()、线程安全。
所属头文件:#include
设计定位:异常基类,所有框架异常的根
常用使用路径:通过 TR_THROW() 宏抛出,通过 catch 块捕获
典型使用代码片段:
// 抛出异常
TR_THROW(ValueError, "Invalid batch size: " << batch_size);
// 条件检查
TR_CHECK(ptr != nullptr, MemoryError, "null pointer");
// 重新抛出并添加上下文
try {
// ...
} catch (tr::TRException& e) {
TR_RETHROW(e, "While loading model from " << path);
}
构造与析构
TRException::TRException(const char type_name, const std::string& message, const char file, const char* func)
TRException(const char* type_name,
const std::string& message,
const char* file,
const char* func);
功能简介 构造异常对象。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| type_name | const char* | - | 异常类型名 |
| message | std::string | - | 错误消息 |
| file | const char* | - | 源文件名(__FILE__) |
| func | const char* | - | 函数名(__func__) |
返回值 无
异常 无
TRException::~TRException()
virtual ~TRException() noexcept = default;
功能简介 虚析构函数。
参数 无
返回值 无
异常 无
TRException::TRException(const TRException& other)
TRException(const TRException& other) noexcept;
功能简介 拷贝构造函数(MSVC C5272 警告修复,noexcept)。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| other | const TRException& | - | 源异常对象 |
返回值 无
异常 无
注意事项 mutex_ 成员不可复制,需要在新对象中重新初始化
TRException& TRException::operator=(const TRException& other)
TRException& operator=(const TRException& other) noexcept;
功能简介 拷贝赋值运算符(MSVC C5272 警告修复,noexcept)。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| other | const TRException& | - | 源异常对象 |
返回值 *this
异常 无
核心方法
const char* TRException::what() const
const char* what() const noexcept override;
功能简介 获取完整错误描述(线程安全 + OOM 安全)。
参数 无
返回值 包含 Context Chain 的完整消息
异常 无
注意事项
- 首次调用时构建完整消息并缓存
- 后续调用直接返回缓存
- 线程安全(使用 mutex 保护)
void TRException::add_context(const std::string& ctx_message, const char file, const char func)
void add_context(const std::string& ctx_message,
const char* file,
const char* func);
功能简介 添加上下文信息(线程安全,支持重新抛出)。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| ctx_message | std::string | - | 上下文消息 |
| file | const char* | - | 文件名 |
| func | const char* | - | 函数名 |
返回值 无
异常 无
注意事项 通过 TR_RETHROW 宏使用,不要手动调用
const char* TRException::type() const
const char* type() const noexcept;
功能简介 获取异常类型名。
参数 无
返回值 异常类型字符串
异常 无
const std::string& TRException::message() const
const std::string& message() const noexcept;
功能简介 获取根消息。
参数 无
返回值 根消息字符串引用
异常 无
std::vector TRException::get_contexts() const
std::vector<ExceptionContext> get_contexts() const;
功能简介 获取上下文链(线程安全,返回拷贝)。
参数 无
返回值 上下文链的副本
异常 无
注意事项 推荐使用此方法而非已废弃的 contexts()
const std::vector& TRException::contexts() const
[[deprecated]] const std::vector<ExceptionContext>& contexts() const;
功能简介 获取上下文链的常量引用。
参数 无
返回值 上下文链的常量引用
异常 无
注意事项 【已废弃】直接返回内部 vector 引用,存在线程安全和生命周期风险。请改用 get_contexts()。
具体异常类型
概述
框架提供的具体异常类型,均继承自 TRException。
所属头文件:#include
| 异常类型 | 说明 |
|---|---|
NotImplementedError |
功能未实现 |
FileNotFoundError |
文件未找到 |
ValueError |
参数值错误 |
IndexError |
索引越界 |
TypeError |
类型错误 |
ZeroDivisionError |
除零错误 |
ShapeError |
张量形状错误 |
DeviceError |
设备错误 |
MemoryError |
内存错误 |
TimeoutError |
超时错误 |
GPUOutOfMemoryError |
GPU 显存不足(可恢复) |
DistributedError |
分布式训练错误 |
RuntimeError |
通用运行时错误 |
异常宏
概述
框架提供的异常抛出、条件检查与消息构建宏。
所属头文件:#include
核心异常宏
TR_THROW(ExceptionType, msg_stream)
#define TR_THROW(ExceptionType, msg_stream)
签名 宏调用形式:TR_THROW(ExceptionType, msg_stream)
功能简介 抛出异常的核心宏。
参数
| 参数名 | 类型 | 说明 |
|---|---|---|
| ExceptionType | 异常类型 | 异常类名(如 ValueError) |
| msg_stream | 流式消息 | 支持 << 的消息流 |
返回值 无(抛出异常)
异常 抛出指定的异常类型
示例
TR_THROW(ValueError, "Invalid size: " << size);
TR_THROW(ShapeError, "Expected shape " << expected << ", got " << actual);
TR_CHECK(condition, ExceptionType, msg_stream)
#define TR_CHECK(condition, ExceptionType, msg_stream)
签名 宏调用形式:TR_CHECK(condition, ExceptionType, msg_stream)
功能简介 条件检查(所有模式都执行),条件为 false 时抛出异常。
参数
| 参数名 | 类型 | 说明 |
|---|---|---|
| condition | 布尔表达式 | 检查条件 |
| ExceptionType | 异常类型 | 条件为 false 时抛出的异常类型 |
| msg_stream | 流式消息 | 错误消息 |
返回值 无(条件为 false 时抛出异常)
异常 条件为 false 时抛出指定异常
注意事项
- 适用场景:外部输入校验、关键不变量检查
- Release 模式下仍保留完整检查
示例
TR_CHECK(x > 0, ValueError, "x must be positive, got " << x);
TR_CHECK(ptr != nullptr, MemoryError, "null pointer");
TR_DEBUG_CHECK(condition, ExceptionType, msg_stream)
#define TR_DEBUG_CHECK(condition, ExceptionType, msg_stream)
签名 宏调用形式:TR_DEBUG_CHECK(condition, ExceptionType, msg_stream)
功能简介 防御性检查(仅 Debug 模式执行),Release 模式下完全消失(零开销)。
参数
| 参数名 | 类型 | 说明 |
|---|---|---|
| condition | 布尔表达式 | 检查条件 |
| ExceptionType | 异常类型 | 条件为 false 时抛出的异常类型 |
| msg_stream | 流式消息 | 错误消息 |
返回值 无(Debug 模式下条件为 false 时抛出异常)
异常 Debug 模式下条件为 false 时抛出指定异常
注意事项
- 适用场景:热路径防御性断言、边界检查
- Release 模式下完全消失,零开销
TR_RETHROW(exception, ctx_stream)
#define TR_RETHROW(exception, ctx_stream)
签名 宏调用形式:TR_RETHROW(exception, ctx_stream)
功能简介 重新抛出并添加上下文(带引用安全检查)。
参数
| 参数名 | 类型 | 说明 |
|---|---|---|
| exception | TRException& | 异常引用(必须是左值引用) |
| ctx_stream | 流式消息 | 上下文消息 |
返回值 无(重新抛出异常)
异常 重新抛出输入的异常
注意事项
- 必须在 catch 块中使用
- exception 参数必须是左值引用(catch TRException& e)
- 编译期检查防止值捕获错误
示例
try {
// Some operation
} catch (tr::TRException& e) {
TR_RETHROW(e, "While loading model from " << path);
}
便捷异常宏
所属头文件:#include
TR_MSG(...)
#define TR_MSG(...)
签名 宏调用形式:TR_MSG(...)
功能简介 构建异常消息字符串,供 TR_THROW 系列宏内部使用。
参数
| 参数名 | 类型 | 说明 |
|---|---|---|
| ... | 流式表达式 | 支持 << 连接的消息片段 |
返回值 std::string 形式的消息字符串
异常 无
注意事项 通常不直接调用,由 TR_THROW 和便捷异常宏自动展开。
以下宏是 TR_THROW 的便捷版本,自动指定异常类型:
#define TR_NOT_IMPLEMENTED(...) TR_THROW(NotImplementedError, TR_MSG(__VA_ARGS__))
#define TR_VALUE_ERROR(...) TR_THROW(ValueError, TR_MSG(__VA_ARGS__))
#define TR_SHAPE_ERROR(...) TR_THROW(ShapeError, TR_MSG(__VA_ARGS__))
#define TR_TYPE_ERROR(...) TR_THROW(TypeError, TR_MSG(__VA_ARGS__))
#define TR_INDEX_ERROR(...) TR_THROW(IndexError, TR_MSG(__VA_ARGS__))
#define TR_DEVICE_ERROR(...) TR_THROW(DeviceError, TR_MSG(__VA_ARGS__))
#define TR_FILE_NOT_FOUND(...) TR_THROW(FileNotFoundError, TR_MSG(__VA_ARGS__))
#define TR_ZERO_DIVISION(...) TR_THROW(ZeroDivisionError, TR_MSG(__VA_ARGS__))
#define TR_MEMORY_ERROR(...) TR_THROW(MemoryError, TR_MSG(__VA_ARGS__))
#define TR_TIMEOUT_ERROR(...) TR_THROW(TimeoutError, TR_MSG(__VA_ARGS__))
#define TR_GPU_OOM(...) TR_THROW(GPUOutOfMemoryError, TR_MSG(__VA_ARGS__))
#define TR_DISTRIBUTED_ERROR(...) TR_THROW(DistributedError, TR_MSG(__VA_ARGS__))
#define TR_RUNTIME_ERROR(...) TR_THROW(RuntimeError, TR_MSG(__VA_ARGS__))
class GlobalRegistry
概述
GlobalRegistry 是全局配置管理类,线程安全的单例,存储训练过程中需要共享的配置信息。
所属头文件:#include
设计定位:单例模式,线程安全,分类管理(fixed 固定型 + alterable 可变型)
常用使用路径:
- 链式配置:
GLOBAL_SETTING.use_gpu().manual_seed(42) - 直接访问:
GlobalRegistry::instance()
典型使用代码片段:
// 链式配置
GLOBAL_SETTING
.use_gpu("0,1,2,3")
.manual_seed(42)
.global_batch_size(128);
// 查询配置
bool using_gpu = GLOBAL_SETTING.using_gpu();
int batch_size = GLOBAL_SETTING.get_local_batch_size();
单例访问
GlobalRegistry& GlobalRegistry::instance()
static GlobalRegistry& instance();
功能简介 获取单例实例。
参数 无
返回值 GlobalRegistry 单例引用
异常 无
注意事项 禁止拷贝和移动
初始化方法
void GlobalRegistry::initialize()
void initialize();
功能简介 初始化全局注册表,检查所有 fixed 变量是否已赋值。
参数 无
返回值 无
异常 ValueError - 如果有 fixed 变量未赋值
注意事项
- 只在首次调用时生效
- 后续调用无效果
void GlobalRegistry::init()
void init();
功能简介 初始化(供 Initializer 调用),空实现,保留接口一致性。
参数 无
返回值 无
异常 无
注意事项 实际初始化由 begin_train() / begin_val() 触发
void GlobalRegistry::cleanup()
void cleanup();
功能简介 清理(供 Initializer 调用),空实现,保留接口一致性。
参数 无
返回值 无
异常 无
阶段管理方法
void GlobalRegistry::begin_train()
void begin_train();
功能简介 开始训练阶段。
参数 无
返回值 无
异常 无
注意事项
- train_counter_ 加一
- 如果尚未初始化,会自动调用 initialize()
void GlobalRegistry::end_train()
void end_train();
功能简介 结束训练阶段。
参数 无
返回值 无
异常 ValueError - 如果 train_counter_ 减到负数
void GlobalRegistry::begin_val()
void begin_val();
功能简介 开始验证阶段。
参数 无
返回值 无
异常 无
注意事项
- val_counter_ 加一
- 如果尚未初始化,会自动调用 initialize()
void GlobalRegistry::end_val()
void end_val();
功能简介 结束验证阶段。
参数 无
返回值 无
异常 ValueError - 如果 val_counter_ 减到负数
链式配置方法
GlobalRegistry& GlobalRegistry::manual_seed(uint64_t seed)
GlobalRegistry& manual_seed(uint64_t seed);
功能简介 设置全局随机种子。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| seed | uint64_t | - | 种子值 |
返回值 GlobalRegistry 引用,支持链式调用
异常 无
注意事项 调用 rng_set_seed() 设置全局随机数生成器的种子
GlobalRegistry& GlobalRegistry::auto_seed()
GlobalRegistry& auto_seed();
功能简介 使用时间种子自动初始化随机数生成器。
参数 无
返回值 GlobalRegistry 引用,支持链式调用
异常 无
注意事项 使用当前时间戳作为种子调用 manual_seed()
GlobalRegistry& GlobalRegistry::reproducible()
GlobalRegistry& reproducible();
功能简介 确保可复现性(启用可复现性保险)。
参数 无
返回值 GlobalRegistry 引用,支持链式调用
异常 无
注意事项 只要调用了 manual_seed() 或 auto_seed(),就会自动启用可复现模式
void GlobalRegistry::set_reproducibility_insurance(bool value)
void set_reproducibility_insurance(bool value);
功能简介 设置是否启用可复现性保险。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| value | bool | - | true=启用可复现性保险 |
返回值 无
异常 ValueError - 初始化后修改或非幂等赋值时
void GlobalRegistry::ensure_reproducibility(bool value)
void ensure_reproducibility(bool value);
功能简介 set_reproducibility_insurance 的别名。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| value | bool | - | true=启用可复现性保险 |
返回值 无
异常 ValueError - 初始化后修改或非幂等赋值时
bool GlobalRegistry::reproducibility_insurance() const
bool reproducibility_insurance() const;
功能简介 获取可复现性保险是否启用。
参数 无
返回值 启用返回 true
异常 无
GlobalRegistry& GlobalRegistry::amp(bool value)
GlobalRegistry& amp(bool value);
功能简介 设置是否使用混合精度训练(AMP)。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| value | bool | - | 是否使用 AMP |
返回值 GlobalRegistry 引用,支持链式调用
异常 ValueError - 初始化后对 AMP 设置进行非幂等修改时
GlobalRegistry& GlobalRegistry::use_tf32(bool value)
GlobalRegistry& use_tf32(bool value = true);
功能简介 设置是否允许 cuDNN 使用 TF32 Tensor Core 加速。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| value | bool | true | true=允许 TF32(默认),false=禁用 TF32 |
返回值 GlobalRegistry 引用,支持链式调用
异常 无
注意事项 必须在第一个 cuDNN Graph 构建之前调用
GlobalRegistry& GlobalRegistry::local_batch_size(int value)
GlobalRegistry& local_batch_size(int value);
功能简介 设置本地 batch size。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| value | int | - | batch size 值 |
返回值 GlobalRegistry 引用,支持链式调用
异常 ValueError - 对 fixed batch size 进行非幂等修改时
GlobalRegistry& GlobalRegistry::global_batch_size(int value)
GlobalRegistry& global_batch_size(int value);
功能简介 设置全局 batch size(自动计算本地 batch size)。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| value | int | - | 全局 batch size 值 |
返回值 GlobalRegistry 引用,支持链式调用
异常 DeviceError - 如果尚未调用 use_gpu() 或 use_cpu() ValueError - 如果 value 不能被 world_size 整除
注意事项 将 global_batch_size / world_size 的商作为 local_batch_size 设置
状态查询方法
bool GlobalRegistry::is_training() const
bool is_training() const;
功能简介 是否处于训练阶段。
参数 无
返回值 训练阶段返回 true
异常 无
bool GlobalRegistry::is_validating() const
bool is_validating() const;
功能简介 是否处于验证阶段。
参数 无
返回值 验证阶段返回 true
异常 无
bool GlobalRegistry::is_busy() const
bool is_busy() const;
功能简介 是否忙碌(有对象正在训练或验证)。
参数 无
返回值 忙碌状态返回 true
异常 无
bool GlobalRegistry::is_initialized() const
bool is_initialized() const;
功能简介 是否已初始化。
参数 无
返回值 已初始化返回 true
异常 无
GPU 配置高层接口
GlobalRegistry& GlobalRegistry::use_gpu()
GlobalRegistry& use_gpu();
功能简介 配置 GPU 使用模式(无参数版本,自动使用所有可见 GPU)。
参数 无
返回值 GlobalRegistry 引用,支持链式调用
异常 ValueError - 当可见 GPU 数量为 0、不是 2 的幂或超过 16 时
注意事项
- 探测可见 GPU 数量(通过 CUDA/MUSA)
- 如果可见 GPU 数量为 0,自动改为 CPU 模式
- 自动使用所有可见 GPU
- GPU 数量必须小于 16
GlobalRegistry& GlobalRegistry::use_cpu()
GlobalRegistry& use_cpu();
功能简介 配置为 CPU 模式。
参数 无
返回值 GlobalRegistry 引用,支持链式调用
异常 无
GlobalRegistry& GlobalRegistry::use_gpu(const std::string& gpu_id_str)
GlobalRegistry& use_gpu(const std::string& gpu_id_str);
功能简介 配置 GPU 使用模式(字符串版本)。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| gpu_id_str | std::string | - | GPU ID 字符串,如 "0,1,2,3" 或 "0-7" |
返回值 GlobalRegistry 引用,支持链式调用
异常 ValueError - 如果 GPU ID 无效或数量不是 2 的幂
注意事项
- 解析逗号分隔的 GPU ID 字符串
- 自动去重并排序
- 验证 GPU ID 在可见范围内
示例
GLOBAL_SETTING.use_gpu("0,1,2,3"); // 使用 GPU 0-3
GLOBAL_SETTING.use_gpu("0-7"); // 使用 GPU 0-7
分辨率配置方法
GlobalRegistry& GlobalRegistry::train_resolution(int value)
GlobalRegistry& train_resolution(int value);
功能简介 设置训练分辨率(非渐进式)。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| value | int | - | 训练分辨率,必须大于 0 |
返回值 GlobalRegistry 引用,支持链式调用
异常 ValueError - 如果 value 不大于 0
注意事项
- 调用 set_using_progressive_resolution(false)
- 将值赋给 train_sample_resolution_begin_ 和 train_sample_resolution_end_
GlobalRegistry& GlobalRegistry::val_resolution(int value)
GlobalRegistry& val_resolution(int value);
功能简介 设置验证分辨率。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| value | int | - | 验证分辨率,必须大于 0 |
返回值 GlobalRegistry 引用,支持链式调用
异常 ValueError - 如果 value 不大于 0
GlobalRegistry& GlobalRegistry::input_resolution(int value)
GlobalRegistry& input_resolution(int value);
功能简介 同时设置训练和验证分辨率。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| value | int | - | 训练和验证共用分辨率,必须大于 0 |
返回值 GlobalRegistry 引用,支持链式调用
异常 ValueError - 如果 value 不大于 0
注意事项 依次调用 train_resolution(value) 和 val_resolution(value)
GlobalRegistry& GlobalRegistry::train_resolution(std::pair pair_begin, std::pair pair_end)
GlobalRegistry& train_resolution(std::pair<int, int> pair_begin, std::pair<int, int> pair_end);
功能简介 设置渐进式训练分辨率。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| pair_begin | std::pair |
- | 起始参数对 (starting_epoch, train_sample_resolution_begin) |
| pair_end | std::pair |
- | 结束参数对 (boundary_epoch, train_sample_resolution_end) |
返回值 GlobalRegistry 引用,支持链式调用
异常 ValueError - 如果参数不合法
注意事项
- starting_epoch 必须为 0
- boundary_epoch 必须大于 0
- 调用 set_using_progressive_resolution(true)
锁页内存管理
GlobalRegistry& GlobalRegistry::allocate_staging_memory(size_t bytes_per_device)
GlobalRegistry& allocate_staging_memory(size_t bytes_per_device);
功能简介 为所有活跃设备分配 Staging 内存。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| bytes_per_device | size_t | - | 每块 Staging 内存的字节数 |
返回值 GlobalRegistry 引用,支持链式调用
异常 ValueError - 如果 bytes_per_device 为 0、或已分配但大小不同
注意事项
- GPU 场景使用 cudaHostAlloc/musaHostAlloc
- CPU 场景使用 malloc
- 幂等设计:若已分配且大小相同,直接返回
void* GlobalRegistry::staging_memory_ptr(int rank) const
void* staging_memory_ptr(int rank) const;
功能简介 按 RANK 获取 Staging 内存指针。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| rank | int | - | RANK 索引(0-based) |
返回值 Staging 内存指针
异常 RuntimeError - 如果尚未分配 Staging 内存 IndexError - 如果 rank 越界
GlobalRegistry& GlobalRegistry::allocate_staging_params(size_t bytes_per_rank)
GlobalRegistry& allocate_staging_params(size_t bytes_per_rank = 256);
功能简介 分配 Staging 参数区(StagingParamPool)。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| bytes_per_rank | size_t | 256 | 每 rank 参数区大小 |
返回值 GlobalRegistry 引用,支持链式调用
异常 无
注意事项
- 专用于 RANGE_H2D_COPY_DTENSOR 算子的 per-rank 标量参数传输
- 独立于 StagingBufferPool,两次不同的分配
void* GlobalRegistry::staging_params_ptr(int rank) const
void* staging_params_ptr(int rank) const;
功能简介 获取 rank 对应的 Staging 参数区指针。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| rank | int | - | RANK 索引(0-based) |
返回值 Staging 参数区指针
异常 RuntimeError - 如果尚未分配 IndexError - 如果 rank 越界
bool GlobalRegistry::has_staging_memory() const
bool has_staging_memory() const;
功能简介 是否已分配 Staging 内存。
参数 无
返回值 已分配返回 true
异常 无
size_t GlobalRegistry::staging_memory_size() const
size_t staging_memory_size() const;
功能简介 获取每 GPU Staging 内存字节数。
参数 无
返回值 字节数;未分配时返回 0
异常 无
int GlobalRegistry::staging_memory_numa_node(int rank) const
int staging_memory_numa_node(int rank) const;
功能简介 按 RANK 获取 Staging 内存所在 NUMA 节点编号。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| rank | int | - | RANK 索引(0-based) |
返回值 NUMA 节点编号;查询失败返回 -1
异常 RuntimeError - 如果尚未分配 Staging 内存 IndexError - 如果 rank 越界
bool GlobalRegistry::has_staging_params() const
bool has_staging_params() const;
功能简介 是否已分配 Staging 参数区。
参数 无
返回值 已分配返回 true
异常 无
size_t GlobalRegistry::staging_params_bytes() const
size_t staging_params_bytes() const;
功能简介 获取每 rank Staging 参数区字节数。
参数 无
返回值 字节数;未分配时返回 0
异常 无
void GlobalRegistry::clear_staging_memory()
void clear_staging_memory();
功能简介 显式释放所有 Staging 内存。
参数 无
返回值 无
异常 无
注意事项 析构时会自动释放,此方法用于提前释放
常用配置查询与设置
以下方法在 GlobalRegistry 的已有文档中未完整覆盖,但属于用户常见查询/配置入口。
GlobalRegistry& GlobalRegistry::setup()
GlobalRegistry& setup();
功能简介 入口方法(空实现),仅返回引用以支持链式配置语法。
参数 无
返回值 GlobalRegistry 引用,支持链式调用
异常 无
static int GlobalRegistry::get_visible_gpu_count()
static int get_visible_gpu_count();
功能简介 获取当前环境可见的 GPU 数量。
参数 无
返回值 可见 GPU 数量;CPU 模式或无可用 GPU 时返回 0
异常 无
void GlobalRegistry::set_dataset_type(DatasetType value)
void set_dataset_type(DatasetType value);
功能简介 设置数据集类型。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| value | DatasetType | - | 数据集类型 |
返回值 无
异常 ValueError - 初始化后修改或非幂等赋值时
DatasetType GlobalRegistry::dataset_type() const
DatasetType dataset_type() const;
功能简介 获取数据集类型。
参数 无
返回值 当前数据集类型
异常 ValueError - 尚未设置时
void GlobalRegistry::set_num_classes(int value)
void set_num_classes(int value);
功能简介 设置分类数量。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| value | int | - | 分类数量 |
返回值 无
异常 ValueError - 初始化后修改或非幂等赋值时
int GlobalRegistry::num_classes() const
int num_classes() const;
功能简介 获取分类数量。
参数 无
返回值 分类数量
异常 ValueError - 尚未设置时
void GlobalRegistry::set_num_color_channels(int value)
void set_num_color_channels(int value);
功能简介 设置颜色通道数。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| value | int | - | 颜色通道数,如 1 或 3 |
返回值 无
异常 ValueError - 初始化后修改或非幂等赋值时
int GlobalRegistry::num_color_channels() const
int num_color_channels() const;
功能简介 获取颜色通道数。
参数 无
返回值 颜色通道数
异常 ValueError - 尚未设置时
void GlobalRegistry::set_num_load_workers(int value)
void set_num_load_workers(int value);
功能简介 设置 DataLoader 加载线程数。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| value | int | - | 加载线程数 |
返回值 无
异常 ValueError - 初始化后修改或非幂等赋值时
int GlobalRegistry::num_load_workers() const
int num_load_workers() const;
功能简介 获取 DataLoader 加载线程数。
参数 无
返回值 加载线程数
异常 ValueError - 尚未设置时
void GlobalRegistry::set_num_preproc_workers(int value)
void set_num_preproc_workers(int value);
功能简介 设置 Preprocessor 预处理线程数。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| value | int | - | 预处理线程数 |
返回值 无
异常 ValueError - 初始化后修改或非幂等赋值时
int GlobalRegistry::num_preproc_workers() const
int num_preproc_workers() const;
功能简介 获取 Preprocessor 预处理线程数。
参数 无
返回值 预处理线程数
异常 ValueError - 尚未设置时
int GlobalRegistry::world_size() const
int world_size() const;
功能简介 获取分布式训练的 world size(RANK 总数)。
参数 无
返回值 world size
异常 ValueError - 尚未配置 GPU/CPU 时
int GlobalRegistry::get_local_batch_size() const
int get_local_batch_size() const;
功能简介 获取每个 RANK 的本地 batch size。
参数 无
返回值 本地 batch size
异常 ValueError - 尚未设置时
void GlobalRegistry::set_batch_size(int value)
void set_batch_size(int value);
功能简介 设置本地 batch size(fixed 变量底层 setter)。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| value | int | - | 本地 batch size 值 |
返回值 无
异常 ValueError - 初始化后修改或非幂等赋值时
注意事项 普通用户建议使用链式方法 local_batch_size(value)。
void GlobalRegistry::set_optimizer_kind(OptimizerKind kind)
void set_optimizer_kind(OptimizerKind kind);
功能简介 设置优化器类型。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| kind | OptimizerKind | - | 优化器类型枚举 |
返回值 无
异常 ValueError - 初始化后修改或非幂等赋值时
OptimizerKind GlobalRegistry::optimizer_kind() const
OptimizerKind optimizer_kind() const;
功能简介 获取优化器类型。
参数 无
返回值 当前优化器类型
异常 ValueError - 尚未设置时
int GlobalRegistry::optimizer_kind_raw() const
[[nodiscard]] int optimizer_kind_raw() const noexcept;
功能简介 获取优化器类型的原始整数值(不抛异常)。
参数 无
返回值 优化器类型原始值;-1 表示未设置
异常 无
bool GlobalRegistry::using_gpu() const
bool using_gpu() const;
功能简介 是否使用 GPU。
参数 无
返回值 GPU 模式返回 true
异常 无
const std::vector& GlobalRegistry::gpu_ids() const
const std::vector<int>& gpu_ids() const;
功能简介 获取当前配置的 GPU ID 列表。
参数 无
返回值 GPU ID 列表的常量引用
异常 无
void GlobalRegistry::set_using_gpu(bool value)
void set_using_gpu(bool value);
功能简介 设置是否使用 GPU(fixed 变量底层 setter)。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| value | bool | - | true=使用 GPU,false=使用 CPU |
返回值 无
异常 ValueError - 初始化后修改或非幂等赋值时
注意事项 普通用户建议使用链式方法 use_gpu() 或 use_cpu()。
void GlobalRegistry::set_gpu_ids(const std::vector& ids)
void set_gpu_ids(const std::vector<int>& ids);
功能简介 设置 GPU ID 列表(fixed 变量底层 setter)。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| ids | const std::vector |
- | GPU ID 列表 |
返回值 无
异常 ValueError - 初始化后修改或非幂等赋值时
注意事项 普通用户建议使用链式方法 use_gpu(const std::string&)。
bool GlobalRegistry::using_amp() const
bool using_amp() const;
功能简介 是否启用混合精度训练(AMP)。
参数 无
返回值 启用 AMP 返回 true
异常 无
bool GlobalRegistry::has_amp_set() const
bool has_amp_set() const;
功能简介 AMP 标志是否已被用户显式设置。
参数 无
返回值 已调用 amp(true/false) 返回 true
异常 无
void GlobalRegistry::set_num_train_samples(size_t count)
void set_num_train_samples(size_t count);
功能简介 设置训练集样本总数。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| count | size_t | - | 训练集样本总数 |
返回值 无
异常 ValueError - 初始化后修改或非幂等赋值时
size_t GlobalRegistry::num_train_samples() const
size_t num_train_samples() const;
功能简介 获取训练集样本总数。
参数 无
返回值 训练集样本总数
异常 ValueError - 尚未设置时
void GlobalRegistry::set_num_val_samples(size_t count)
void set_num_val_samples(size_t count);
功能简介 设置验证集样本总数。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| count | size_t | - | 验证集样本总数 |
返回值 无
异常 ValueError - 初始化后修改或非幂等赋值时
size_t GlobalRegistry::num_val_samples() const
size_t num_val_samples() const;
功能简介 获取验证集样本总数。
参数 无
返回值 验证集样本总数
异常 ValueError - 尚未设置时
int GlobalRegistry::get_train_steps() const
int get_train_steps() const;
功能简介 获取训练总 batch 数(steps)。
参数 无
返回值 训练 steps
异常 ValueError - 依赖项未设置时
int GlobalRegistry::get_val_steps() const
int get_val_steps() const;
功能简介 获取验证总 batch 数(steps)。
参数 无
返回值 验证 steps
异常 ValueError - 依赖项未设置时
其他 fixed 配置查询与设置
void GlobalRegistry::set_sdmp_factor(int value)
void set_sdmp_factor(int value);
功能简介 设置 SDMP(Spatially Distributed Multi-Path)因子。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| value | int | - | SDMP 因子 |
返回值 无
异常 ValueError - 初始化后修改或非幂等赋值时
int GlobalRegistry::sdmp_factor() const
int sdmp_factor() const;
功能简介 获取 SDMP 因子。
参数 无
返回值 SDMP 因子
异常 ValueError - 尚未设置时
void GlobalRegistry::set_using_cpvs(bool value)
void set_using_cpvs(bool value);
功能简介 设置是否使用 CPVS(Cross-Parallel Validation Strategy)。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| value | bool | - | 是否启用 CPVS |
返回值 无
异常 ValueError - 初始化后修改或非幂等赋值时
bool GlobalRegistry::using_cpvs() const
bool using_cpvs() const;
功能简介 是否使用 CPVS。
参数 无
返回值 启用返回 true
异常 无
void GlobalRegistry::set_using_drop_last(bool value)
void set_using_drop_last(bool value);
功能简介 设置是否丢弃最后不完整的 batch。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| value | bool | - | true=丢弃不完整 batch |
返回值 无
异常 ValueError - 初始化后修改或非幂等赋值时
bool GlobalRegistry::using_drop_last() const
bool using_drop_last() const;
功能简介 是否丢弃最后不完整的 batch。
参数 无
返回值 丢弃返回 true
异常 无
void GlobalRegistry::set_train_with_rhf(bool value)
void set_train_with_rhf(bool value);
功能简介 设置训练集是否包含 RandomHorizontalFlip。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| value | bool | - | true=包含水平翻转 |
返回值 无
异常 ValueError - 初始化后修改或非幂等赋值时
bool GlobalRegistry::train_with_rhf() const
bool train_with_rhf() const;
功能简介 训练集是否包含 RandomHorizontalFlip。
参数 无
返回值 包含返回 true
异常 无
void GlobalRegistry::set_val_with_rhf(bool value)
void set_val_with_rhf(bool value);
功能简介 设置验证集是否包含 RandomHorizontalFlip。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| value | bool | - | true=包含水平翻转 |
返回值 无
异常 ValueError - 初始化后修改或非幂等赋值时
bool GlobalRegistry::val_with_rhf() const
bool val_with_rhf() const;
功能简介 验证集是否包含 RandomHorizontalFlip。
参数 无
返回值 包含返回 true
异常 无
void GlobalRegistry::set_shuffle_train(bool value)
void set_shuffle_train(bool value);
功能简介 设置训练集是否洗牌。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| value | bool | - | true=洗牌 |
返回值 无
异常 ValueError - 初始化后修改或非幂等赋值时
bool GlobalRegistry::shuffle_train() const
bool shuffle_train() const;
功能简介 训练集是否洗牌。
参数 无
返回值 洗牌返回 true
异常 无
void GlobalRegistry::set_initializer_inited(bool value)
void set_initializer_inited(bool value);
功能简介 设置框架初始化标志(仅供 Initializer 内部调用)。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| value | bool | - | 是否已初始化 |
返回值 无
异常 无
注意事项 普通用户无需调用。
bool GlobalRegistry::initializer_inited() const
bool initializer_inited() const;
功能简介 框架是否已调用 Initializer::init()。
参数 无
返回值 已初始化返回 true
异常 无
void GlobalRegistry::set_is_deployment_mode(bool value)
void set_is_deployment_mode(bool value);
功能简介 设置是否为 Deployment(推理部署)模式。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| value | bool | - | true=部署模式 |
返回值 无
异常 ValueError - 初始化后修改或非幂等赋值时
bool GlobalRegistry::is_deployment_mode() const
bool is_deployment_mode() const;
功能简介 是否为 Deployment 模式。
参数 无
返回值 部署模式返回 true
异常 无
void GlobalRegistry::set_cpu_binding_enabled(bool value)
void set_cpu_binding_enabled(bool value);
功能简介 设置是否启用 CPU 绑核。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| value | bool | - | true=启用绑核 |
返回值 无
异常 ValueError - 初始化后修改或非幂等赋值时
bool GlobalRegistry::cpu_binding_enabled() const
bool cpu_binding_enabled() const;
功能简介 是否启用 CPU 绑核。
参数 无
返回值 启用返回 true
异常 无
void GlobalRegistry::set_cpu_binding_map(const std::vector& map)
void set_cpu_binding_map(const std::vector<int>& map);
功能简介 设置 CPU 绑核映射表(worker_id → CPU 核心 ID)。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| map | const std::vector |
- | 绑核映射表 |
返回值 无
异常 ValueError - 初始化后修改或非幂等赋值时
const std::vector& GlobalRegistry::cpu_binding_map() const
const std::vector<int>& cpu_binding_map() const;
功能简介 获取 CPU 绑核映射表。
参数 无
返回值 绑核映射表的常量引用
异常 无
void GlobalRegistry::set_fixed_s_original_indices(const std::vector& indices)
void set_fixed_s_original_indices(const std::vector<int>& indices);
功能简介 设置 S 区原始索引向量(用于 S 区洗牌)。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| indices | const std::vector |
- | 原始顺序索引向量 |
返回值 无
异常 ValueError - 初始化后修改或非幂等赋值时
const std::vector& GlobalRegistry::fixed_s_original_indices() const
const std::vector<int>& fixed_s_original_indices() const;
功能简介 获取 S 区原始索引向量。
参数 无
返回值 原始索引向量的常量引用
异常 无
样本统计与 last batch
int GlobalRegistry::get_last_train_batch_size() const
int get_last_train_batch_size() const;
功能简介 获取训练最后一个 batch 的本地样本数。
参数 无
返回值 最后一个 batch 样本数
异常 ValueError - 依赖项未设置时
int GlobalRegistry::get_last_val_batch_size() const
int get_last_val_batch_size() const;
功能简介 获取验证最后一个 batch 的本地样本数。
参数 无
返回值 最后一个 batch 样本数
异常 ValueError - 依赖项未设置时
size_t GlobalRegistry::padded_train_samples() const
size_t padded_train_samples() const;
功能简介 获取 pad 到 world_size 整数倍后的训练集总样本数。
参数 无
返回值 pad 后训练样本总数
异常 ValueError - 依赖项未设置时
size_t GlobalRegistry::padded_val_samples() const
size_t padded_val_samples() const;
功能简介 获取 pad 到 world_size 整数倍后的验证集总样本数。
参数 无
返回值 pad 后验证样本总数
异常 ValueError - 依赖项未设置时
size_t GlobalRegistry::train_samples_per_rank() const
size_t train_samples_per_rank() const;
功能简介 获取每个 RANK 的训练样本数(已 pad 后)。
参数 无
返回值 每 RANK 训练样本数
异常 ValueError - 依赖项未设置时
size_t GlobalRegistry::val_samples_per_rank() const
size_t val_samples_per_rank() const;
功能简介 获取每个 RANK 的验证样本数(已 pad 后)。
参数 无
返回值 每 RANK 验证样本数
异常 ValueError - 依赖项未设置时
void GlobalRegistry::set_aligned_max_output_size(size_t size)
void set_aligned_max_output_size(size_t size);
功能简介 设置 S/C 区单个样本对齐后字节数(64 字节对齐)。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| size | size_t | - | 单个样本字节数 |
返回值 无
异常 ValueError - 初始化后修改或非幂等赋值时
size_t GlobalRegistry::aligned_max_output_size() const
size_t aligned_max_output_size() const;
功能简介 获取 S/C 区单个样本对齐后字节数。
参数 无
返回值 对齐后字节数
异常 ValueError - 尚未设置时
渐进式分辨率与输出尺寸
void GlobalRegistry::set_using_progressive_resolution(bool value)
void set_using_progressive_resolution(bool value);
功能简介 设置是否启用渐进式分辨率。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| value | bool | - | true=启用渐进式分辨率 |
返回值 无
异常 ValueError - 初始化后修改或非幂等赋值时
bool GlobalRegistry::using_progressive_resolution() const
bool using_progressive_resolution() const;
功能简介 是否启用渐进式分辨率。
参数 无
返回值 启用返回 true
异常 无
int GlobalRegistry::max_sample_resolution() const
int max_sample_resolution() const;
功能简介 获取所有训练和验证分辨率中的最大值。
参数 无
返回值 最大分辨率
异常 ValueError - 尚未设置时
int GlobalRegistry::train_sample_resolution_begin() const
int train_sample_resolution_begin() const;
功能简介 获取训练起始分辨率(渐进式)。
参数 无
返回值 训练起始分辨率
异常 ValueError - 尚未设置时
int GlobalRegistry::train_sample_resolution_end() const
int train_sample_resolution_end() const;
功能简介 获取训练结束分辨率(渐进式)。
参数 无
返回值 训练结束分辨率
异常 ValueError - 尚未设置时
int GlobalRegistry::get_train_sample_resolution_by_epoch(int epoch) const
int get_train_sample_resolution_by_epoch(int epoch) const;
功能简介 根据 epoch 获取训练集分辨率(渐进式)。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| epoch | int | - | 当前 epoch |
返回值 该 epoch 对应的训练分辨率
异常 ValueError - 依赖项未设置时
int GlobalRegistry::get_val_sample_resolution() const
int get_val_sample_resolution() const;
功能简介 获取验证集分辨率。
参数 无
返回值 验证分辨率
异常 ValueError - 尚未设置时
int GlobalRegistry::boundary_epoch() const
int boundary_epoch() const;
功能简介 获取渐进式分辨率切换的边界 epoch。
参数 无
返回值 边界 epoch
异常 ValueError - 尚未设置时
int GlobalRegistry::get_train_sample_resolution_begin() const
int get_train_sample_resolution_begin() const;
功能简介 获取训练集起始分辨率(渐进式)。
参数 无
返回值 训练起始分辨率
异常 ValueError - 尚未设置时
int GlobalRegistry::get_train_sample_resolution_end() const
int get_train_sample_resolution_end() const;
功能简介 获取训练集结束分辨率(渐进式)。
参数 无
返回值 训练结束分辨率
异常 ValueError - 尚未设置时
int GlobalRegistry::val_sample_resolution() const
int val_sample_resolution() const;
功能简介 获取验证集分辨率(get_val_sample_resolution 的别名)。
参数 无
返回值 验证集分辨率
异常 ValueError - 尚未设置时
void GlobalRegistry::set_current_resolution_train(int value)
void set_current_resolution_train(int value);
功能简介 设置当前训练分辨率(alterable)。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| value | int | - | 当前训练分辨率 |
返回值 无
异常 ValueError - is_busy() 为 true 时
int GlobalRegistry::current_resolution_train() const
int current_resolution_train() const;
功能简介 获取当前训练分辨率。
参数 无
返回值 当前训练分辨率
异常 无
void GlobalRegistry::set_current_resolution_val(int value)
void set_current_resolution_val(int value);
功能简介 设置当前验证分辨率(alterable)。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| value | int | - | 当前验证分辨率 |
返回值 无
异常 ValueError - is_busy() 为 true 时
int GlobalRegistry::current_resolution_val() const
int current_resolution_val() const;
功能简介 获取当前验证分辨率。
参数 无
返回值 当前验证分辨率
异常 无
void GlobalRegistry::set_train_crop_output(int value)
void set_train_crop_output(int value);
功能简介 设置训练集 crop 输出尺寸(alterable)。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| value | int | - | crop 输出尺寸 |
返回值 无
异常 ValueError - is_busy() 为 true 时
int GlobalRegistry::train_crop_output() const
int train_crop_output() const;
功能简介 获取训练集 crop 输出尺寸。
参数 无
返回值 crop 输出尺寸
异常 无
void GlobalRegistry::set_train_resize_output(int value)
void set_train_resize_output(int value);
功能简介 设置训练集 resize 输出尺寸(alterable)。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| value | int | - | resize 输出尺寸 |
返回值 无
异常 ValueError - is_busy() 为 true 时
int GlobalRegistry::train_resize_output() const
int train_resize_output() const;
功能简介 获取训练集 resize 输出尺寸。
参数 无
返回值 resize 输出尺寸
异常 无
void GlobalRegistry::set_val_crop_output(int value)
void set_val_crop_output(int value);
功能简介 设置验证集 crop 输出尺寸(alterable)。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| value | int | - | crop 输出尺寸 |
返回值 无
异常 ValueError - is_busy() 为 true 时
int GlobalRegistry::val_crop_output() const
int val_crop_output() const;
功能简介 获取验证集 crop 输出尺寸。
参数 无
返回值 crop 输出尺寸
异常 无
void GlobalRegistry::set_val_resize_output(int value)
void set_val_resize_output(int value);
功能简介 设置验证集 resize 输出尺寸(alterable)。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| value | int | - | resize 输出尺寸 |
返回值 无
异常 ValueError - is_busy() 为 true 时
int GlobalRegistry::val_resize_output() const
int val_resize_output() const;
功能简介 获取验证集 resize 输出尺寸。
参数 无
返回值 resize 输出尺寸
异常 无
void GlobalRegistry::set_user_epoch_id(int value)
void set_user_epoch_id(int value);
功能简介 用户手动设置 Epoch ID(仅供调试)。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| value | int | - | 用户指定的 epoch ID |
返回值 无
异常 ValueError - is_busy() 为 true 时
注意事项 框架内部不应依赖此数值。
int GlobalRegistry::user_epoch_id() const
int user_epoch_id() const;
功能简介 获取用户手动设置的 Epoch ID。
参数 无
返回值 用户 epoch ID
异常 无
注意事项 仅供调试,框架代码不要依赖。
初始化策略配置
void GlobalRegistry::set_conv_init_kind(InitKind kind)
void set_conv_init_kind(InitKind kind);
功能简介 设置卷积层初始化策略。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| kind | InitKind | - | 初始化方法 |
返回值 无
异常 ValueError - 初始化后修改或非幂等赋值时
InitKind GlobalRegistry::conv_init_kind() const
InitKind conv_init_kind() const;
功能简介 获取卷积层初始化策略。
参数 无
返回值 卷积初始化策略
异常 ValueError - 尚未设置时
void GlobalRegistry::set_fc_init_kind(InitKind kind)
void set_fc_init_kind(InitKind kind);
功能简介 设置全连接层初始化策略。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| kind | InitKind | - | 初始化方法 |
返回值 无
异常 ValueError - 初始化后修改或非幂等赋值时
InitKind GlobalRegistry::fc_init_kind() const
InitKind fc_init_kind() const;
功能简介 获取全连接层初始化策略。
参数 无
返回值 全连接初始化策略
异常 ValueError - 尚未设置时
void GlobalRegistry::set_bn_init_kind(InitKind kind)
void set_bn_init_kind(InitKind kind);
功能简介 设置 BN 层初始化策略(STANDARD 或 ZERO_GAMMA)。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| kind | InitKind | - | 初始化方法 |
返回值 无
异常 ValueError - 初始化后修改或非幂等赋值时
InitKind GlobalRegistry::bn_init_kind() const
InitKind bn_init_kind() const;
功能简介 获取 BN 层初始化策略。
参数 无
返回值 BN 初始化策略
异常 ValueError - 尚未设置时
void GlobalRegistry::set_conv_search_mode(ConvSearchMode mode)
void set_conv_search_mode(ConvSearchMode mode);
功能简介 设置 cuDNN 卷积算法搜索模式。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| mode | ConvSearchMode | - | HEURISTIC_B 或 EXHAUSTIVE_C |
返回值 无
异常 ValueError - 初始化后修改或非幂等赋值时
ConvSearchMode GlobalRegistry::conv_search_mode() const
ConvSearchMode conv_search_mode() const;
功能简介 获取卷积搜索模式。
参数 无
返回值 当前搜索模式;未设置时返回 HEURISTIC_B
异常 无
void GlobalRegistry::set_fan_mode(FanMode mode)
void set_fan_mode(FanMode mode);
功能简介 设置 Kaiming/Xavier 初始化时的 fan 计算模式。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| mode | FanMode | - | FAN_IN / FAN_OUT / FAN_AVG |
返回值 无
异常 ValueError - 初始化后修改或非幂等赋值时
FanMode GlobalRegistry::fan_mode() const
FanMode fan_mode() const;
功能简介 获取 fan 计算模式。
参数 无
返回值 当前 fan 模式
异常 无
数据增强与损失参数
void GlobalRegistry::set_random_erasing_p(float value)
void set_random_erasing_p(float value);
功能简介 设置 Random Erasing 概率参数。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| value | float | - | 概率,范围 [0.0, 1.0] |
返回值 无
异常 ValueError - is_busy() 为 true 时
float GlobalRegistry::random_erasing_p() const
float random_erasing_p() const;
功能简介 获取 Random Erasing 概率。
参数 无
返回值 当前概率 [0.0, 1.0]
异常 无
void GlobalRegistry::set_label_smoothing(float value)
void set_label_smoothing(float value);
功能简介 设置 Label Smoothing 系数。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| value | float | - | 标签平滑系数,范围 [0, 0.2] |
返回值 无
异常 ValueError - 初始化后修改或非幂等赋值时
float GlobalRegistry::label_smoothing() const
[[nodiscard]] float label_smoothing() const;
功能简介 获取 Label Smoothing 系数。
参数 无
返回值 当前标签平滑系数 [0, 0.2]
异常 无
bool GlobalRegistry::has_label_smoothing_set() const
[[nodiscard]] bool has_label_smoothing_set() const;
功能简介 Label Smoothing 是否已被显式设置。
参数 无
返回值 已调用 setter 返回 true
异常 无
优化器超参数
void GlobalRegistry::set_momentum(float value)
void set_momentum(float value);
功能简介 设置优化器动量系数。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| value | float | - | 动量值 |
返回值 无
异常 无
float GlobalRegistry::momentum() const
[[nodiscard]] float momentum() const;
功能简介 获取优化器动量系数。
参数 无
返回值 当前动量值
异常 无
void GlobalRegistry::set_weight_decay(float value)
void set_weight_decay(float value);
功能简介 设置优化器权重衰减系数。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| value | float | - | 权重衰减值 |
返回值 无
异常 无
float GlobalRegistry::weight_decay() const
[[nodiscard]] float weight_decay() const;
功能简介 获取优化器权重衰减系数。
参数 无
返回值 当前权重衰减值
异常 无
void GlobalRegistry::set_trust_coefficient(float value)
void set_trust_coefficient(float value);
功能简介 设置 LARS trust coefficient。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| value | float | - | trust coefficient |
返回值 无
异常 无
float GlobalRegistry::trust_coefficient() const
[[nodiscard]] float trust_coefficient() const;
功能简介 获取 LARS trust coefficient。
参数 无
返回值 当前 trust coefficient
异常 无
void GlobalRegistry::set_eps(float value)
void set_eps(float value);
功能简介 设置优化器 epsilon(数值稳定小量)。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| value | float | - | epsilon 值 |
返回值 无
异常 无
float GlobalRegistry::eps() const
[[nodiscard]] float eps() const;
功能简介 获取优化器 epsilon。
参数 无
返回值 当前 epsilon
异常 无
void GlobalRegistry::set_beta2(float value)
void set_beta2(float value);
功能简介 设置 Adam/AdamW 的 beta2 系数。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| value | float | - | beta2 值 |
返回值 无
异常 无
float GlobalRegistry::beta2() const
[[nodiscard]] float beta2() const;
功能简介 获取 Adam/AdamW 的 beta2 系数。
参数 无
返回值 当前 beta2
异常 无
void GlobalRegistry::set_grad_clip_max_abs(float value)
void set_grad_clip_max_abs(float value);
功能简介 设置梯度裁剪的最大绝对值阈值。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| value | float | - | 最大绝对值阈值;小于 0 表示不裁剪 |
返回值 无
异常 无
float GlobalRegistry::grad_clip_max_abs() const
[[nodiscard]] float grad_clip_max_abs() const;
功能简介 获取梯度裁剪的最大绝对值阈值。
参数 无
返回值 当前阈值;小于 0 表示不裁剪
异常 无
TransferStation 指针
void GlobalRegistry::set_transfer_station_ptr(size_t index, void* ptr)
void set_transfer_station_ptr(size_t index, void* ptr);
功能简介 设置 TransferStation 指针数组中的某个元素。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| index | size_t | - | 数组索引(0-15) |
| ptr | void* | - | TransferStation 指针 |
返回值 无
异常 ValueError - is_busy() 为 true 或 index 越界时
void* GlobalRegistry::transfer_station_ptr(size_t index) const
void* transfer_station_ptr(size_t index) const;
功能简介 获取 TransferStation 指针数组中的某个元素。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| index | size_t | - | 数组索引(0-15) |
返回值 TransferStation 指针
异常 IndexError - index 越界时
std::atomic> GlobalRegistry::transfer_station_ptrs() const
std::atomic<void*>* transfer_station_ptrs() const;
功能简介 获取 TransferStation 指针数组的指针(固定大小 16)。
参数 无
返回值 指向指针数组的指针
异常 无
注意事项 该数组固定大小为 16,未使用的位置为 nullptr。
字符串命名访问
int GlobalRegistry::get_value_int(const std::string& name) const
int get_value_int(const std::string& name) const;
功能简介 通过名称获取整数值。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| name | const std::string& | - | 变量名称(如 "num_load_workers") |
返回值 变量值
异常 ValueError - 变量不存在时
float GlobalRegistry::get_value_float(const std::string& name) const
float get_value_float(const std::string& name) const;
功能简介 通过名称获取浮点数值。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| name | const std::string& | - | 变量名称 |
返回值 变量值
异常 ValueError - 变量不存在时
bool GlobalRegistry::get_value_bool(const std::string& name) const
bool get_value_bool(const std::string& name) const;
功能简介 通过名称获取布尔值。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| name | const std::string& | - | 变量名称 |
返回值 变量值
异常 ValueError - 变量不存在时
void GlobalRegistry::set_value_int(const std::string& name, int value)
void set_value_int(const std::string& name, int value);
功能简介 通过名称设置整数值。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| name | const std::string& | - | 变量名称 |
| value | int | - | 新值 |
返回值 无
异常 ValueError - 变量不存在或 is_busy() 为 true 时
void GlobalRegistry::set_value_float(const std::string& name, float value)
void set_value_float(const std::string& name, float value);
功能简介 通过名称设置浮点数值。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| name | const std::string& | - | 变量名称 |
| value | float | - | 新值 |
返回值 无
异常 ValueError - 变量不存在或 is_busy() 为 true 时
void GlobalRegistry::set_value_bool(const std::string& name, bool value)
void set_value_bool(const std::string& name, bool value);
功能简介 通过名称设置布尔值。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| name | const std::string& | - | 变量名称 |
| value | bool | - | 新值 |
返回值 无
异常 ValueError - 变量不存在或 is_busy() 为 true 时
语法糖
概述
全局注册表 GlobalRegistry 的引用与访问语法糖。
所属头文件:#include
全局注册表语法糖
the_registry
inline GlobalRegistry& the_registry = GlobalRegistry::instance();
功能简介 全局 GlobalRegistry 引用,提供更简洁的访问方式。
类型 GlobalRegistry&
示例
the_registry.use_gpu().manual_seed(42);
bool amp = the_registry.using_amp();
GLOBAL_SETTING
#define GLOBAL_SETTING (::tr::the_registry)
签名 宏定义
功能简介 进一步简化调用,提供更直观的链式配置语法。
示例
GLOBAL_SETTING.use_gpu().manual_seed(42);
GLOBAL_SETTING.use_cpu().auto_seed();
GLOBAL_SETTING.ensure_reproducibility().use_gpu("0,1,2,3").manual_seed(12345);
enum class StreamType
概述
流类型枚举,用于指定异步操作使用的 CUDA/MUSA 流。
所属头文件:#include
| 枚举值 | 说明 |
|---|---|
default_stream |
默认流(同步所有流) |
transfer_stream |
传输流(H2D/D2H 数据传输) |
compute_stream |
计算流(kernel 计算) |
comm_stream |
通信流(NCCL 集合通信) |
enum class DatasetType
概述
数据集类型枚举。
所属头文件:#include
| 枚举值 | 说明 |
|---|---|
no_dataset |
无数据集 |
imagenet |
ImageNet 数据集 |
mnist |
MNIST 数据集 |
cifar_10 |
CIFAR-10 数据集 |
cifar_100 |
CIFAR-100 数据集 |
enum class LoadMode
概述
数据加载模式枚举。
所属头文件:#include
| 枚举值 | 说明 |
|---|---|
AUTO |
自动选择(根据内存判断) |
FULLY |
全量加载 |
PARTIAL |
部分加载(环形缓冲区) |
全局配置宏
概述
常用枚举值和常量的便捷别名宏。
所属头文件:#include
以下宏为常用枚举值和常量的便捷别名:
#define TR_DEFAULT_STREAM tr::StreamType::default_stream
#define TR_TRANSFER_STREAM tr::StreamType::transfer_stream
#define TR_COMPUTE_STREAM tr::StreamType::compute_stream
#define TR_COMM_STREAM tr::StreamType::comm_stream
#define TR_NO_DATASET tr::DatasetType::no_dataset
#define TR_IMAGENET tr::DatasetType::imagenet
#define TR_MNIST tr::DatasetType::mnist
#define TR_CIFAR_10 tr::DatasetType::cifar_10
#define TR_CIFAR_100 tr::DatasetType::cifar_100
#define TR_AMP_INITIAL_SCALING 8192.0f
class Initializer
概述
Initializer 是张量初始化器,非单例值类型,负责策略推导和数学工具。
所属头文件:#include
设计定位:可复制值类型,非单例
常用使用路径:
- 链式配置初始化策略
- 通过 derive() 推导具体张量的 InitConfig
典型使用代码片段:
tr::Initializer init;
init.conv(tr::InitKind::TRUNC_NORMAL)
.fc(tr::InitKind::KAIMING_UNIFORM)
.bn(tr::InitKind::STANDARD);
tr::InitConfig config = init.derive(tr::Region::W_FIRST_CONV);
构造与赋值
Initializer::Initializer()
Initializer() = default;
功能简介 默认构造函数。
参数 无
返回值 无
异常 无
链式 API
Initializer& Initializer::conv(InitKind k)
Initializer& conv(InitKind k);
功能简介 设置卷积层初始化策略。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| k | InitKind | - | 初始化方法(MLPerf 默认 TRUNC_NORMAL) |
返回值 *this,支持链式调用
异常 无
Initializer& Initializer::fc(InitKind k, float param)
Initializer& fc(InitKind k, float param = 0.01f);
功能简介 设置全连接层初始化策略。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| k | InitKind | - | 初始化方法(默认 KAIMING_UNIFORM) |
| param | float | 0.01f | FIXED_NORMAL 时的 σ 参数;仅当 k 为 FIXED_NORMAL 时生效 |
返回值 *this,支持链式调用
异常 无
Initializer& Initializer::bn(InitKind k)
Initializer& bn(InitKind k = InitKind::STANDARD);
功能简介 设置批归一化层初始化策略。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| k | InitKind | InitKind::STANDARD | STANDARD: weight=CONSTANTS(1.0), bias=ZEROS |
返回值 *this,支持链式调用
异常 ValueError - 当 k 不是 InitKind::STANDARD 或 InitKind::ZERO_GAMMA 时
Initializer& Initializer::zero_gamma(bool on)
Initializer& zero_gamma(bool on = true);
功能简介 设置 BN ZERO_GAMMA 策略。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| on | bool | true | true=BN3→0, 其他BN→1;false=全部BN→1 |
返回值 *this,支持链式调用
异常 无
Initializer& Initializer::fan(FanMode m)
Initializer& fan(FanMode m);
功能简介 设置 fan 模式(FAN_IN/FAN_OUT/FAN_AVG)。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| m | FanMode | - | fan 计算模式 |
返回值 *this,支持链式调用
异常 无
Initializer& Initializer::scale(float s)
Initializer& scale(float s);
功能简介 设置全局 gain 倍数。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| s | float | - | 全局 gain |
返回值 *this,支持链式调用
异常 ValueError - 当 s < 0 时
Initializer& Initializer::nonlinearity(float a)
Initializer& nonlinearity(float a);
功能简介 设置 Kaiming 初始化的非线性参数 a(负斜率)。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| a | float | - | LeakyReLU 负斜率,gain = √(2/(1+a²)) |
返回值 *this,支持链式调用
异常 无
注意事项
- a=0(默认)→ gain=√2(ReLU)
- a=√5 ≈ 2.236 → gain=√(2/6)(PyTorch nn.Linear 默认)
核心方法
InitConfig Initializer::derive(Region region) const
[[nodiscard]] InitConfig derive(Region region) const;
功能简介 根据 Region 推导初始化配置。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| region | Region | - | 目标 Region |
返回值 对应的 InitConfig(8 字节)
异常 无
注意事项 穷举全部 69 Region,三段式结构:
- 非参数区 → NONE
- 偏置区 → ZEROS
- 权重区 → 按层类型分发(CONV/FC/BN)
static int64_t Initializer::compute_fan(const Shape& shape, FanMode mode)
static int64_t compute_fan(const Shape& shape, FanMode mode);
功能简介 计算卷积权重的 fan_in/fan_out。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| shape | const Shape& | - | 张量形状 |
| mode | FanMode | - | FAN_IN/FAN_OUT/FAN_AVG |
返回值 fan 值
异常 无
注意事项 Conv weight 布局 = KRSC: [K=outC, R=kH, S=kW, C=inC]
static void Initializer::apply_to_tensor(Tensor& t, const Shape& shape, InitConfig cfg)
static void apply_to_tensor(class Tensor& t, const Shape& shape, InitConfig cfg);
功能简介 按 InitConfig 填充张量(CPU 端执行)。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| t | Tensor& | - | 目标张量(CPU 端) |
| shape | const Shape& | - | 张量形状(用于 fan 计算) |
| cfg | InitConfig | - | 初始化配置 |
返回值 无
异常 无
注意事项 支持全部 InitKind,严格遵循 MLPerf 数学公式
调试方法
const char* Initializer::dump() const
[[nodiscard]] const char* dump() const;
功能简介 转储当前策略配置为字符串。
参数 无
返回值 配置字符串
异常 无
bool Initializer::is_zero_gamma() const
[[nodiscard]] bool is_zero_gamma() const noexcept;
功能简介 ZERO_GAMMA 策略是否激活。
参数 无
返回值 激活返回 true
异常 无
void Initializer::mark_bn3(int32_t id)
void mark_bn3(int32_t id);
功能简介 标记指定 DTensor 为 BN3 权重(由 Compiler 在 alloc 阶段调用)。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| id | int32_t | - | DTensor 全局 ID |
返回值 无
异常 无
注意事项 expand_block_unfused 展开 RESNET_1_3_1 时,主干的最后一个 BN 命名为 "bn3"
const std::vector& Initializer::bn3_weight_ids() const
[[nodiscard]] const std::vector<int32_t>& bn3_weight_ids() const noexcept;
功能简介 获取所有 BN3 权重 DTensor ID(只读)。
参数 无
返回值 BN3 权重 ID 列表
异常 无
class Downloader
概述
Downloader 是基于 libcurl 的文件下载器,支持主 URL 和备用 URL 自动切换、自动创建目录、文件覆盖控制。
所属头文件:#include
设计定位:工具类,禁止拷贝和移动
常用使用路径:下载数据集文件、预训练模型
典型使用代码片段:
tr::Downloader downloader;
downloader.set_url("http://example.com/file.zip", "http://backup.com/file.zip");
bool success = downloader.download_to("downloads/", "myfile.zip", false);
if (success && downloader.already_exists()) {
LOG_INFO << "File already exists, skipped download";
}
构造与析构
Downloader::Downloader()
Downloader();
功能简介 构造函数。
参数 无
返回值 无
异常 无
Downloader::~Downloader()
~Downloader();
功能简介 析构函数。
参数 无
返回值 无
异常 无
注意事项 禁止拷贝和移动
配置方法
void Downloader::set_url(const std::string& url, const std::string& spare_url)
void set_url(const std::string& url, const std::string& spare_url = "");
功能简介 设置下载 URL(主 URL 和可选备用 URL)。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| url | std::string | - | 主下载 URL |
| spare_url | std::string | "" | 备用下载 URL(空字符串表示无备用) |
返回值 无
异常 ValueError - 当 url 为空时
注意事项
- URL 必须指向有效的 HTTP/HTTPS 地址
- 重复调用会覆盖之前的 URL 设置
void Downloader::set_progress_callback(std::function callback)
void set_progress_callback(std::function<void(size_t, size_t, int)> callback);
功能简介 设置进度回调函数。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| callback | std::function |
- | 进度回调函数 |
返回值 无
异常 无
注意事项
- 回调函数参数为 (已下载字节数, 总字节数, 0~100 进度百分比)
- 如果不设置,默认使用 LOG_INFO 每 10% 打印一次进度
- 设置为 nullptr 禁用进度显示
- 回调函数在下载线程中调用,应保持轻量
下载方法
bool Downloader::download_to(const std::string& dir_name, const std::string& file_name, bool cover)
bool download_to(const std::string& dir_name,
const std::string& file_name = "",
bool cover = false);
功能简介 下载文件到指定目录。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| dir_name | std::string | - | 目标目录路径 |
| file_name | std::string | "" | 保存的文件名(空字符串表示使用 URL 中的原始文件名) |
| cover | bool | false | 是否覆盖已存在的文件 |
返回值 true 表示成功(下载完成或文件已存在且 cover=false),false 表示失败
异常 ValueError - 如果未设置 URL 或 URL 为空 ValueError - 如果无法从 URL 提取文件名且 file_name 为空
注意事项
- 目录不存在时会自动创建(包括父目录)
- 文件已存在且 cover=false 时,返回 true,already_exists() 返回 true
- 下载失败时会尝试备用 URL(如果设置了)
bool Downloader::already_exists() const
bool already_exists() const;
功能简介 查询最后一次 download_to 是否因文件已存在而跳过。
参数 无
返回值 true 表示文件已存在且 cover=false,跳过下载
异常 无
注意事项 仅在 download_to 返回 true 时有意义
class StagingBufferPool
概述
StagingBufferPool 是 NUMA 感知的 Staging Buffer 池,为多 GPU 场景提供 NUMA 感知的 Staging Buffer 分配。
所属头文件:#include
设计定位:内部工具类,禁止拷贝
常用使用路径:通过 GlobalRegistry::allocate_staging_memory() 使用
构造与析构
StagingBufferPool::StagingBufferPool(const std::vector& gpu_ids, size_t bytes_per_block)
StagingBufferPool(const std::vector<int>& gpu_ids, size_t bytes_per_block);
功能简介 构造函数,为指定 GPU 分配 Staging Buffer。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| gpu_ids | const std::vector |
- | GPU ID 列表 |
| bytes_per_block | size_t | - | 每块 Staging 内存字节数 |
返回值 无
异常 ValueError - 当 gpu_ids 为空或 bytes_per_block 为 0 时 MemoryError - 当某块 Staging 内存分配失败时
注意事项
- 多线程分配:每 GPU 独立线程,各绑定自己的 NUMA 节点
- First Touch:全文 memset 触发物理页分配
StagingBufferPool::~StagingBufferPool()
~StagingBufferPool();
功能简介 析构函数。
参数 无
返回值 无
异常 无
注意事项 禁止拷贝和赋值
数据访问
void* StagingBufferPool::ptr(int rank) const
void* ptr(int rank) const;
功能简介 获取指定 rank 的 Staging Buffer 指针。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| rank | int | - | RANK 索引(0-based) |
返回值 Staging Buffer 指针
异常 IndexError - 当 rank 越界时
int StagingBufferPool::num_blocks() const
int num_blocks() const;
功能简介 获取块数量。
参数 无
返回值 块数量
异常 无
size_t StagingBufferPool::bytes_per_block() const
size_t bytes_per_block() const;
功能简介 获取每块字节数。
参数 无
返回值 每块字节数
异常 无
int StagingBufferPool::numa_node_for_rank(int rank) const
int numa_node_for_rank(int rank) const;
功能简介 获取指定 rank 的 NUMA 节点编号。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| rank | int | - | RANK 索引 |
返回值 NUMA 节点编号,查询失败时返回 -1
异常 IndexError - 当 rank 越界时
class StagingParamPool
概述
StagingParamPool 是 Per-RANK Staging 参数区,为 RANGE_H2D_COPY_DTENSOR 算子提供 per-rank 的小参数区(256 字节 = 64 × FP32)。
所属头文件:#include
设计定位:内部工具类,禁止拷贝
常用使用路径:通过 GlobalRegistry::allocate_staging_params() 使用
构造与析构
StagingParamPool::StagingParamPool(const std::vector& gpu_ids, size_t bytes_per_rank)
StagingParamPool(const std::vector<int>& gpu_ids, size_t bytes_per_rank = 256);
功能简介 构造函数。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| gpu_ids | const std::vector |
- | GPU ID 列表 |
| bytes_per_rank | size_t | 256 | 每 rank 参数区大小 |
返回值 无
异常 DeviceError - 当 GPU 设备设置或锁页内存分配失败时 RuntimeError - 当 CPU 场景内存分配失败时
注意事项
- GPU 模式使用 cudaHostAlloc (pinned)
- CPU 模式使用 malloc
StagingParamPool::~StagingParamPool()
~StagingParamPool();
功能简介 析构函数。
参数 无
返回值 无
异常 无
注意事项 禁止拷贝和赋值
数据访问
void* StagingParamPool::ptr(int rank) const
void* ptr(int rank) const;
功能简介 获取 rank 对应的 Staging 参数区指针。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| rank | int | - | RANK 索引 |
返回值 Staging 参数区指针
异常 IndexError - 当 rank 越界时
void StagingParamPool::set_param(int rank, int slot, float value)
void set_param(int rank, int slot, float value);
功能简介 设置指定 rank 和 slot 的参数值。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| rank | int | - | RANK 索引 |
| slot | int | - | 槽位索引 |
| value | float | - | 参数值 |
返回值 无
异常 IndexError - 当 rank 或 slot 越界时
float StagingParamPool::param(int rank, int slot) const
float param(int rank, int slot) const;
功能简介 获取指定 rank 和 slot 的参数值。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| rank | int | - | RANK 索引 |
| slot | int | - | 槽位索引 |
返回值 参数值
异常 IndexError - 当 rank 或 slot 越界时
int StagingParamPool::num_ranks() const
int num_ranks() const;
功能简介 获取 rank 数量。
参数 无
返回值 rank 数量
异常 无
size_t StagingParamPool::bytes_per_rank() const
size_t bytes_per_rank() const;
功能简介 获取每 rank 字节数。
参数 无
返回值 每 rank 字节数
异常 无
预定义常量
概述
Core 模块提供的预定义常量,用于初始化配置。
所属头文件:#include
kInitNone = {1.0f, InitKind::NONE, FanMode::FAN_IN}— 不初始化kInitZeros = {0.0f, InitKind::ZEROS, FanMode::FAN_IN}— 全零初始化
独立函数
概述
Core 模块提供一些不属于任何类的自由函数,包括内存对齐、CPU 随机数生成、Philox 算法等。
所属头文件:根据具体函数分别位于 types.h、initializer.h、rng.h、philox.h 等。
设计定位:无状态辅助函数,直接调用即可。
内存对齐
所属头文件:#include
utils::align_up_256(size_t size)
constexpr inline size_t align_up_256(size_t size) noexcept;
功能简介 将给定大小向上对齐到 256 字节的最小倍数。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| size | size_t | - | 原始大小 |
返回值 对齐后的 256 字节倍数
异常 无
示例
size_t aligned = tr::utils::align_up_256(100); // 256
size_t aligned2 = tr::utils::align_up_256(512); // 512
InitConfig 相关函数
所属头文件:#include
kInitConstant(float v)
inline InitConfig kInitConstant(float v);
功能简介 创建常量初始化配置。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| v | float | - | 常数值 |
返回值 InitConfig(kind=CONSTANTS, scale=v)
异常 无
to_string(InitKind kind)
inline const char* to_string(InitKind kind) noexcept;
功能简介 将 InitKind 转换为字符串。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| kind | InitKind | - | 初始化方法 |
返回值 枚举值的字符串表示
异常 无
to_string(FanMode mode)
inline const char* to_string(FanMode mode) noexcept;
功能简介 将 FanMode 转换为字符串。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| mode | FanMode | - | fan 模式 |
返回值 枚举值的字符串表示
异常 无
Metric 位运算
所属头文件:#include
operator|(Metric a, Metric b)
inline Metric operator|(Metric a, Metric b);
功能简介 指标位掩码按位或运算,用于组合多个指标。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| a | Metric | - | 左操作数 |
| b | Metric | - | 右操作数 |
返回值 组合后的 Metric 位掩码
异常 无
示例
tr::Metric m = tr::Metric::VAL_TOP1 | tr::Metric::VAL_TOP5;
has_metric(Metric flags, Metric m)
inline bool has_metric(Metric flags, Metric m);
功能简介 判断位掩码中是否包含指定指标。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| flags | Metric | - | 组合后的指标位掩码 |
| m | Metric | - | 要检查的指标 |
返回值 true 表示 flags 包含 m
异常 无
全局生成器访问
所属头文件:#include
get_default_generator()
Generator& get_default_generator();
功能简介 获取默认全局生成器(Meyers 单例,线程安全)。
参数 无
返回值 Generator 引用
异常 无
rng_set_seed(uint64_t seed)
void rng_set_seed(uint64_t seed);
功能简介 设置全局随机种子。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| seed | uint64_t | - | 种子值 |
返回值 无
异常 无
注意事项 等价于 get_default_generator().set_seed(seed)
CPU 随机数生成函数(核心 API)
所属头文件:#include
所有函数均提供两个版本:
- 带 Generator& 参数的版本(独立生成器)
- 不带参数的便捷版本(使用默认生成器)
cpu_rand_uint64(uint64_t* ptr, size_t count, Generator& gen)
void cpu_rand_uint64(uint64_t* ptr, size_t count, Generator& gen);
功能简介 生成 N 个随机 uint64 整数。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| ptr | uint64_t* | - | 目标内存指针 [in,out] |
| count | size_t | - | 元素个数 |
| gen | Generator& | - | 生成器引用 [in] |
返回值 无
异常 无
注意事项 多线程安全且可复现
cpu_rand_bernoulli_int8(int8_t* ptr, size_t count, float prob_one, Generator& gen)
void cpu_rand_bernoulli_int8(int8_t* ptr, size_t count, float prob_one, Generator& gen);
功能简介 生成 N 个伯努利分布的 INT8(0 或 1)。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| ptr | int8_t* | - | 目标内存指针 [in,out] |
| count | size_t | - | 元素个数 |
| prob_one | float | - | "1" 的概率,范围 [0, 1] |
| gen | Generator& | - | 生成器引用 [in] |
返回值 无
异常 无
cpu_rand_uniform_int8(int8_t* ptr, size_t count, int8_t low, int8_t high, Generator& gen)
void cpu_rand_uniform_int8(int8_t* ptr, size_t count, int8_t low, int8_t high, Generator& gen);
功能简介 生成 N 个均匀分布的 INT8。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| ptr | int8_t* | - | 目标内存指针 [in,out] |
| count | size_t | - | 元素个数 |
| low | int8_t | - | 最小值(包含) |
| high | int8_t | - | 最大值(包含) |
| gen | Generator& | - | 生成器引用 [in] |
返回值 无
异常 无
cpu_rand_bernoulli_int32(int32_t* ptr, size_t count, float prob_one, Generator& gen)
void cpu_rand_bernoulli_int32(int32_t* ptr, size_t count, float prob_one, Generator& gen);
功能简介 生成 N 个伯努利分布的 INT32(0 或 1)。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| ptr | int32_t* | - | 目标内存指针 [in,out] |
| count | size_t | - | 元素个数 |
| prob_one | float | - | "1" 的概率,范围 [0, 1] |
| gen | Generator& | - | 生成器引用 [in] |
返回值 无
异常 无
cpu_rand_uniform_int32(int32_t* ptr, size_t count, int32_t low, int32_t high, Generator& gen)
void cpu_rand_uniform_int32(int32_t* ptr, size_t count, int32_t low, int32_t high, Generator& gen);
功能简介 生成 N 个均匀分布的 INT32。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| ptr | int32_t* | - | 目标内存指针 [in,out] |
| count | size_t | - | 元素个数 |
| low | int32_t | - | 最小值(包含) |
| high | int32_t | - | 最大值(不包含) |
| gen | Generator& | - | 生成器引用 [in] |
返回值 无
异常 无
注意事项 范围为 [low, high),与 Python randint 语义一致
cpu_rand_uniform_float(float* ptr, size_t count, float low, float high, Generator& gen)
void cpu_rand_uniform_float(float* ptr, size_t count, float low, float high, Generator& gen);
功能简介 生成 N 个均匀分布的 FP32。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| ptr | float* | - | 目标内存指针 [in,out] |
| count | size_t | - | 元素个数 |
| low | float | - | 最小值(包含) |
| high | float | - | 最大值(不包含) |
| gen | Generator& | - | 生成器引用 [in] |
返回值 无
异常 无
cpu_rand_normal_float(float* ptr, size_t count, float mean, float std, Generator& gen)
void cpu_rand_normal_float(float* ptr, size_t count, float mean, float std, Generator& gen);
功能简介 生成 N 个正态分布的 FP32。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| ptr | float* | - | 目标内存指针 [in,out] |
| count | size_t | - | 元素个数 |
| mean | float | - | 均值 |
| std | float | - | 标准差 |
| gen | Generator& | - | 生成器引用 [in] |
返回值 无
异常 无
便捷函数(使用默认生成器)
所属头文件:#include
以下函数使用默认全局生成器,参数列表省略 Generator& 参数:
inline void cpu_rand_uint64(uint64_t* ptr, size_t count);
inline void cpu_rand_bernoulli_int8(int8_t* ptr, size_t count, float prob_one);
inline void cpu_rand_uniform_int8(int8_t* ptr, size_t count, int8_t low, int8_t high);
inline void cpu_rand_bernoulli_int32(int32_t* ptr, size_t count, float prob_one);
inline void cpu_rand_uniform_int32(int32_t* ptr, size_t count, int32_t low, int32_t high);
inline void cpu_rand_uniform_float(float* ptr, size_t count, float low = 0.0f, float high = 1.0f);
inline void cpu_rand_normal_float(float* ptr, size_t count, float mean = 0.0f, float std = 1.0f);
Philox 算法函数(tr::detail)
所属头文件:#include
注意:以下函数位于
tr::detail命名空间,主要供框架内部 RNG 实现使用,普通用户通常不需要直接调用。
Philox4x32-10 伪随机数生成算法,Counter-Based RNG,支持 CPU/GPU 并行可复现生成。
philox4x32_round(...)
TR_HOST_DEVICE TR_FORCEINLINE
void philox4x32_round(uint32_t* ctr0, uint32_t* ctr1, uint32_t* ctr2, uint32_t* ctr3,
uint32_t key0, uint32_t key1);
功能简介 Philox4x32 单轮函数。
philox4x32_10(...)
TR_HOST_DEVICE TR_FORCEINLINE
void philox4x32_10(uint32_t* ctr0, uint32_t* ctr1, uint32_t* ctr2, uint32_t* ctr3,
uint32_t key0, uint32_t key1);
功能简介 Philox4x32-10 核心函数(10 轮迭代)。
philox_generate_4x32(...)
TR_HOST_DEVICE TR_FORCEINLINE
void philox_generate_4x32(uint64_t seed, uint64_t offset, uint32_t* out);
功能简介 从 seed 和 offset 生成 4 个 uint32 随机数。
philox_uniform_float(...)
TR_HOST_DEVICE TR_FORCEINLINE
float philox_uniform_float(uint64_t seed, uint64_t offset);
功能简介 生成 [0, 1) 范围的 float。
philox_normal_pair(...)
TR_HOST_DEVICE TR_FORCEINLINE
void philox_normal_pair(uint64_t seed, uint64_t offset, float* out0, float* out1);
功能简介 Box-Muller 变换生成标准正态分布(一次生成两个)。
philox_uint64(...)
TR_HOST_DEVICE TR_FORCEINLINE
uint64_t philox_uint64(uint64_t seed, uint64_t offset);
功能简介 生成单个 uint64 随机数。
Data
板块介绍
Data 模块是 Tech-Renaissance 框架的数据处理核心,负责数据加载、预处理增强和高效传输。该模块采用多线程流水线架构,支持 JPEG 图像的局部解码、随机数据增强、双缓冲传输等高性能优化。
核心职责:
- 数据加载:支持 MNIST、CIFAR、ImageNet 等常用数据集,提供 DTS 压缩格式和原始格式
- 图像预处理:提供完整的图像增强操作链,包括裁剪、缩放、翻转、颜色抖动等
- 高效传输:采用双缓冲区和多流架构,实现计算与传输的重叠
- 随机可复现:通过 Philox RNG 确保数据增强的随机性可精确复现
对外提供的核心能力:
- 统一的数据加载接口:
DataLoader抽象基类定义了标准的数据加载规范 - 灵活的预处理流水线:
Preprocessor和PreprocessOperation支持可组合的数据增强 - 高性能多线程处理:支持 200+ 预处理线程的并发操作
- 部署场景支持:
SampleLoader专为单样本推理场景优化
关键类和组件:
DataLoader:数据加载器抽象基类,定义统一接口Preprocessor:图像预处理器,管理多线程预处理流水线PreprocessOperation:预处理操作基类,所有数据增强操作的抽象TransferStation:双缓冲区管理器,实现 CPU-GPU 间的高效数据传输SampleInfo:样本信息结构体,用于 FULLY 模式的样本记录
关键头文件:
include/renaissance/data/data_loader.hinclude/renaissance/data/preprocessor.hinclude/renaissance/data/preprocess_operation.hinclude/renaissance/data/transfer_station.h
内部实现位置:
src/data/
DataLoader
概述
DataLoader 是数据加载器的抽象基类,定义了统一的数据加载接口规范。所有具体的数据加载器(如 MNISTLoaderDTS、CIFARLoaderDTS、ImageNetLoaderDTS 等)都必须继承此类并实现其纯虚函数。
设计特点:
- 线程安全:多个 Preprocessor worker 可并发调用
get_next_sample() - 零拷贝:返回的样本数据直接指向内部缓冲区,避免内存复制
- 三级随机性:支持导出级、Block级、样本级的随机化,保证可复现性
- 单例模式:所有子类必须实现为全局单例
所属头文件: #include
继承关系:
- 具体数据加载器继承此类,如
MNISTLoaderDTS、CIFARLoaderDTS、ImageNetLoaderDTS等
常用使用路径: 通过具体数据加载器的单例实例使用,如 MNISTLoaderDTS::instance()。
典型使用代码片段:
// 通过 Preprocessor 配置数据集时自动使用对应的 DataLoader
PREPROCESSOR_SETTING
.dataset("mnist", "/data/mnist")
.commit();
构造与析构
DataLoader::~DataLoader()
签名
virtual ~DataLoader() = default;
功能简介 虚析构函数,确保子类析构时正确释放资源。
返回值 无
异常 无
配置接口
DataLoader::configure(int, int, const std::string&, const std::string&, bool, bool, bool, bool)
签名
virtual void configure(
int num_load_workers,
int num_preproc_workers,
const std::string& train_path,
const std::string& val_path,
bool shuffle_train = true,
bool shuffle_val = false,
bool skip_first = false,
bool verify_crc = false
) = 0;
功能简介 配置 DataLoader 的运行参数,包括线程数、数据路径和随机化设置。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
num_load_workers |
int |
无 | DataLoader 线程数 N(建议值为 1/2/4/8/16) |
num_preproc_workers |
int |
无 | Preprocessor 线程数 M(范围 1~64) |
train_path |
const std::string& |
无 | 训练集路径 |
val_path |
const std::string& |
无 | 验证集路径 |
shuffle_train |
bool |
true |
训练集是否乱序 |
shuffle_val |
bool |
false |
验证集是否乱序 |
skip_first |
bool |
false |
是否跳过第一个样本(用于调试) |
verify_crc |
bool |
false |
是否验证 CRC-32 校验码 |
返回值 无
异常 ValueError:如果参数值不合法(如线程数为负数)
生命周期管理
DataLoader::begin_epoch(int, bool)
签名
virtual void begin_epoch(int epoch_id, bool is_train) = 0;
功能简介 开始一个新的 epoch,用于随机化的 epoch ID 和训练/验证模式标识。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
epoch_id |
int |
无 | Epoch 编号(用于确定性 shuffle) |
is_train |
bool |
无 | true 表示训练模式,false 表示验证模式 |
返回值 无
异常 无
DataLoader::end_epoch()
签名
virtual void end_epoch() = 0;
功能简介 结束当前 epoch,清理状态并准备下一个 epoch。
返回值 无
异常 无
DataLoader::reset_after_warmup()
签名
virtual void reset_after_warmup();
功能简介 重置 DataLoader 状态(用于 warmup 和 test_dataloader 之后),释放 FULLY 模式分配的内存并重置所有加载标记。
返回值 无
异常 无
核心数据接口
DataLoader::get_next_sample(int, int32_t&, const uint8_t*&, size_t&)
签名
virtual bool get_next_sample(
int preproc_worker_id,
int32_t& label,
const uint8_t*& data_ptr,
size_t& data_size
) = 0;
功能简介 获取下一个样本(线程安全,零拷贝)。多个 Preprocessor worker 可并发调用此方法。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
preproc_worker_id |
int |
无 | Preprocessor worker ID(范围 0 ~ M-1) |
label |
int32_t& |
无 | [out] 标签值 |
data_ptr |
const uint8_t*& |
无 | [out] 数据指针(指向内部缓冲区) |
data_size |
size_t& |
无 | [out] 数据大小(字节) |
返回值 true 表示成功获取样本,false 表示 epoch 结束。
异常 无
注意事项 返回的 data_ptr 指向 DataLoader 内部缓冲区,不应释放或修改。
状态查询
DataLoader::dataset_name()
签名
virtual const char* dataset_name() const = 0;
功能简介 获取数据集名称,用于日志和调试。
返回值 数据集名称字符串(如 "MNIST"、"CIFAR-10"、"ImageNet")。
异常 无
DataLoader::num_train_samples()
签名
virtual size_t num_train_samples() const = 0;
功能简介 获取训练集样本总数。
返回值 训练集样本数量。
异常 无
DataLoader::num_val_samples()
签名
virtual size_t num_val_samples() const = 0;
功能简介 获取验证集样本总数。
返回值 验证集样本数量。
异常 无
DataLoader::is_loaded()
签名
virtual bool is_loaded() const = 0;
功能简介 检查数据集是否已加载完成。
返回值 true 表示已加载,false 表示未加载或加载中。
异常 无
DataLoader::set_train_mode(LoadMode)
签名
virtual void set_train_mode(LoadMode mode) = 0;
功能简介 设置训练集加载模式(AUTO / FULLY / PARTIAL)。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
mode |
LoadMode |
无 | 加载模式:AUTO、FULLY 或 PARTIAL |
返回值 无
异常 无
DataLoader::set_val_mode(LoadMode)
签名
virtual void set_val_mode(LoadMode mode) = 0;
功能简介 设置验证集加载模式(AUTO / FULLY / PARTIAL)。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
mode |
LoadMode |
无 | 加载模式:AUTO、FULLY 或 PARTIAL |
返回值 无
异常 无
DataLoader::load_next_buffer()
签名
virtual void load_next_buffer();
功能简介 加载下一个缓冲区(仅 PARTIAL 模式需要)。基类默认实现抛出 std::runtime_error。
返回值 无
异常 std::runtime_error:如果子类未实现此方法。
DataLoader::has_more_buffers() const
签名
virtual bool has_more_buffers() const;
功能简介 检查是否还有更多缓冲区需要加载(仅 PARTIAL 模式需要)。基类默认实现返回 false。
返回值 true 表示还有更多缓冲区,false 表示已完成。
异常 无
数据集下载和验证
DataLoader::download(const std::string&)
签名
virtual void download(const std::string& save_path) = 0;
功能简介 下载数据集(如果尚未下载)。支持开源数据集的自动下载。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
save_path |
const std::string& |
无 | 数据集保存路径 |
返回值 无
异常
NotImplementedError:对于不支持下载的 Loader(如 SampleLoader)TRException:如果下载失败
DataLoader::extract(const std::string&)
签名
virtual void extract(const std::string& save_path);
功能简介 解压已下载的数据集压缩包。默认实现抛出 NotImplementedError,子类(如 MNIST/CIFAR Loader)可选择实现。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
save_path |
const std::string& |
无 | 数据集目录(压缩包所在位置) |
返回值 无
异常
NotImplementedError:如果子类未实现TRException:如果解压失败
DataLoader::verify(const std::string&, bool)
签名
virtual bool verify(const std::string& save_path, bool verbose = false);
功能简介 验证已下载的数据集文件完整性。对于 DTS Loader 调用 verify_dts_crc(),对于 RAW Loader 使用 CRC-32 常量验证。默认实现抛出 NotImplementedError。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
save_path |
const std::string& |
无 | 数据集目录 |
verbose |
bool |
false |
是否输出详细验证日志 |
返回值 true 表示验证通过,false 表示验证失败。
异常
NotImplementedError:如果子类未实现TRException:如果文件读取失败
DataLoader::verify_dts_crc(const std::string&)
签名
virtual bool verify_dts_crc(const std::string& file_path) const = 0;
功能简介 验证 DTS 文件的 CRC-32 校验码,确保数据完整性。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
file_path |
const std::string& |
无 | DTS 文件路径 |
返回值 true 表示验证通过,false 表示验证失败。
异常 TRException:如果文件读取失败
注意事项 CRC 计算范围从 header 之后到文件末尾(跳过 header)。
SampleLoader
概述
SampleLoader 是通用样本加载器,专为部署场景设计。与训练用 DataLoader 不同,它支持动态格式的样本输入(JPEG 文件或 NHWC Tensor),适用于单样本推理场景。
设计特点:
- 部署模式专用:支持未知新样本的实时加载
- FIFO 队列架构:生产者-消费者模式,用户加载、Preprocessor 消费
- 简化语义:所有标签固定为 0,始终为验证模式
- 零拷贝设计:
get_next_sample直接返回内部缓冲区指针
所属头文件: #include
继承关系: 继承自 DataLoader,重写了大部分接口以适应部署场景。
常用使用路径: 通过单例实例 SampleLoader::instance() 使用。
典型使用代码片段:
// 配置内存池大小
SampleLoader::instance().configure_memory_pool(512); // 512MB
// 加载 JPEG 文件
SampleLoader::instance().load_jpeg_file("/path/to/image.jpg");
// 标记输入结束
SampleLoader::instance().end();
单例管理
SampleLoader::instance()
签名
static SampleLoader& instance();
功能简介 获取 SampleLoader 的单例实例。
返回值 SampleLoader 单例引用。
异常 无
配置接口
SampleLoader::configure_memory_pool(size_t)
签名
void configure_memory_pool(size_t memory_pool_size_mb = 256);
功能简介 配置 SampleLoader 的内存池大小。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
memory_pool_size_mb |
size_t |
256 |
内存池大小(MB) |
返回值 无
异常 无
样本加载
SampleLoader::load_jpeg_file(const std::string&)
签名
void load_jpeg_file(const std::string& file_path);
功能简介 加载 JPEG 文件到内部队列。只读取文件,不解码(解码由 Preprocessor 负责)。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
file_path |
const std::string& |
无 | JPEG 文件路径 |
返回值 无
异常 无(文件读取失败时输出 warning 并跳过)
SampleLoader::end()
签名
void end();
功能简介 标记数据输入结束,通知 Preprocessor 没有更多样本。
返回值 无
异常 无
Preprocessor
概述
Preprocessor 是图像预处理器,采用 V4.0 架构设计,负责管理多线程预处理流水线。它集成了数据加载、图像解码、数据增强、双缓冲传输等功能,是 Data 模块的核心协调者。
设计特点:
- 流畅 API:通过
Setup构建器实现链式配置 - 多线程优化:支持 200+ 预处理线程的高效并发
- M worker 严格按顺序领取样本,确保数据分布均匀
- 支持渐进式分辨率和 CPVS 缓存优化
所属头文件: #include
常用使用路径: 通过单例实例 Preprocessor::instance() 或 PREPROCESSOR_SETTING 宏使用。
典型使用代码片段:
// 使用流畅 API 配置预处理器
PREPROCESSOR_SETTING
.dataset("imagenet", "/data/imagenet")
.preprocess_workers(128)
.normalization(NormMode::IMAGENET)
.train_transforms(
RandomResizedCrop(224),
RandomHorizontalFlip()
)
.val_transforms(
Resize(256),
CenterCrop(224)
)
.commit();
// 运行训练
Preprocessor::instance().train();
单例管理
Preprocessor::instance()
签名
static Preprocessor& instance();
功能简介 获取 Preprocessor 的单例实例。
返回值 Preprocessor 单例引用。
异常 无
配置接口
Preprocessor::setup()
签名
static Setup setup();
功能简介 开始配置流程,返回 Setup 构建器用于链式配置。
返回值 Setup 对象,支持链式调用。
异常 无
示例
Preprocessor::setup()
.dataset("imagenet", "/data/imagenet")
.train_transforms(RandomResizedCrop(224), RandomHorizontalFlip())
.val_transforms(Resize(256), CenterCrop(224))
.commit();
训练和验证
Preprocessor::train()
签名
void train();
功能简介 运行训练一个 epoch(内部依次调用 begin_epoch、run、end_epoch)。
返回值 无
异常 TRException:如果预处理器未正确配置
Preprocessor::val()
签名
void val();
功能简介 运行验证一个 epoch(不增加 iteration_id)。
返回值 无
异常 TRException:如果预处理器未正确配置
Preprocessor::test_dataloader()
签名
void test_dataloader();
功能简介 性能测试(训练集+验证集),总是先测试 train 再测试 val,用于验证数据加载性能。
返回值 无
异常 无
状态查询
Preprocessor::steps_per_epoch()
签名
int steps_per_epoch() const;
功能简介 获取每个 epoch 的步数(batch 数)。
返回值 每个 epoch 的步数。
异常 ValueError:如果 steps_per_epoch 未正确计算(≤ 0)
Preprocessor::is_ready()
签名
bool is_ready();
功能简介 检查预处理器是否已初始化完成。
返回值 true 表示已初始化,false 表示未初始化。
异常 无
初始化与线程管理
Preprocessor::cpu_binding(bool)
签名
void cpu_binding(bool enable = true);
功能简介 启用或禁用 CPU 绑核(GPU 模式下的性能优化)。仅在 TR_SCENE_GPU_CLOUD 场景下生效,必须在 Setup::commit() 之后调用。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
enable |
bool |
true |
是否启用 CPU 绑核 |
返回值 无
异常 TRException::ConfigError:如果设备配置未完成
Preprocessor::multi_thread_init()
签名
void multi_thread_init();
功能简介 执行多线程初始化。展开 num_preproc_workers_ 个线程,在每个线程中完成绑核等初始化操作,然后 join 所有线程。在 train() / val() 前调用一次。
返回值 无
异常 无
Preprocessor::ensure_inited()
签名
void ensure_inited();
功能简介 确保预处理器已完成初始化。如果尚未初始化,则调用 multi_thread_init()。
返回值 无
异常 无
Preprocessor::init()
签名
void init();
功能简介 Initializer 接口。当前为空实现,保留接口一致性。
返回值 无
异常 无
Preprocessor::cleanup()
签名
void cleanup();
功能简介 Initializer 接口。当前为空实现,保留接口一致性。
返回值 无
异常 无
运行与统计
Preprocessor::configure(const Config&)
签名
void configure(const Config& config);
功能简介 旧版配置接口。通过 Config 结构体配置预处理器参数,适合需要直接控制内部参数的高级用户。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
config |
const Config& |
无 | 配置参数结构体 |
返回值 无
异常 无
注意事项 推荐使用 Preprocessor::setup() 流畅 API 进行配置。
Config 结构体字段如下:
| 字段名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
num_workers |
int |
16 |
Worker 数量 M |
log_dir |
std::string |
TR_WORKSPACE |
CSV 输出目录 |
enable_logging |
bool |
false |
是否记录日志 |
simulate_delay |
bool |
false |
是否模拟预处理延迟 |
delay_us |
uint64_t |
100 |
延迟时间(微秒) |
jpeg_decode |
bool |
true |
是否执行 JPEG 解码 |
apply_crop |
bool |
true |
是否执行 RandomResizedCrop |
calc_crc |
bool |
false |
是否计算 CRC32 校验码 |
Preprocessor::run(DataLoader&)
签名
void run(DataLoader& loader);
功能简介 运行预处理,阻塞直到当前 epoch 结束。train() 和 val() 内部均调用此方法。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
loader |
DataLoader& |
无 | 数据加载器引用 |
返回值 无
异常 TRException:如果运行过程中发生错误
Preprocessor::set_pw_test_mode(bool)
签名
void set_pw_test_mode(bool enable);
功能简介 启用或禁用 PW 测试模式。测试模式下 PreprocessWorker 不需要 TransferStation,只执行第一个 PO 操作,输出固定到 A 区。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
enable |
bool |
无 | true 启用测试模式,false 正常模式 |
返回值 无
异常 无
Preprocessor::get_stats() const
签名
Stats get_stats() const;
功能简介 获取预处理统计信息,包括总样本数、处理的 buffer 数量和每个 worker 的样本数。
返回值 返回 Stats 结构体,字段如下:
| 字段名 | 类型 | 说明 |
|---|---|---|
total_samples |
size_t |
总样本数 |
buffer_count |
size_t |
处理的 buffer 数量 |
per_worker |
std::vector |
每个 Worker 的样本数 |
异常 无
Preprocessor::reset()
签名
void reset();
功能简介 重置预处理器状态。
返回值 无
异常 无
Preprocessor::calculate_steps_per_epoch()
签名
void calculate_steps_per_epoch();
功能简介 根据 world_size、local_batch_size 和训练集样本数计算每个 epoch 的步数。通常由 Setup::commit() 自动调用。
返回值 无
异常 无
PreprocessOperation
概述
PreprocessOperation 是预处理操作的抽象基类,定义了所有数据增强操作的统一接口。每个具体的操作(如 Resize、RandomCrop、RandomHorizontalFlip 等)都必须继承此类并实现其核心方法。
设计特点:
- 轻量级:仅持有参数,不持有大块内存
- 可克隆:通过
clone()深拷贝给每个 PreprocessWorker - 无状态共享:同一操作多次调用
execute()结果一致(给定相同 RNG 状态) - 性能优化:可缓存 Simd 上下文(如 Resize 缓存)
所属头文件: #include
继承关系:
- 所有数据增强操作都继承此类,如
Resize、RandomCrop、RandomHorizontalFlip等
常用使用路径: 通过 Preprocessor::train_transforms() 和 Preprocessor::val_transforms() 配置使用。
典型使用代码片段:
PREPROCESSOR_SETTING
.train_transforms(
RandomResizedCrop(224),
RandomHorizontalFlip(),
ColorJitter(0.4, 0.4, 0.4)
)
.commit();
构造与析构
PreprocessOperation::~PreprocessOperation()
签名
virtual ~PreprocessOperation() = default;
功能简介 虚析构函数,确保派生类析构时正确释放资源。
返回值 无
异常 无
核心执行接口
PreprocessOperation::execute(const uint8_t, int32_t, int32_t, size_t, uint8_t, int32_t&, int32_t&, size_t&, Generator*, bool, bool)
签名
virtual void execute(
const uint8_t* input_ptr,
int32_t input_width,
int32_t input_height,
size_t input_stride,
uint8_t* output_ptr,
int32_t& output_width,
int32_t& output_height,
size_t& output_stride,
Generator* rng = nullptr,
bool execute_from_full = false,
bool forced_compact_output = true
) = 0;
功能简介 执行预处理操作,对输入图像进行变换处理。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
input_ptr |
const uint8_t* |
无 | 输入图像数据(RGB uint8,值域 0-255) |
input_width |
int32_t |
无 | 输入宽度 |
input_height |
int32_t |
无 | 输入高度 |
input_stride |
size_t |
无 | 输入行步长(字节) |
output_ptr |
uint8_t* |
无 | 输出图像数据(预分配) |
output_width |
int32_t& |
无 | [out] 输出宽度 |
output_height |
int32_t& |
无 | [out] 输出高度 |
output_stride |
size_t& |
无 | [out] 输出行步长(字节) |
rng |
Generator* |
nullptr |
随机数生成器。默认 nullptr 仅为接口兼容性;实际运行时 PreprocessWorker 保证传入非空指针 |
execute_from_full |
bool |
false |
是否从完整解码的图像中执行 |
forced_compact_output |
bool |
true |
是否强制使用紧凑布局(无行间 padding) |
返回值 无
异常 NotImplementedError:对于不支持的操作(如 Normalize、RandomErasing)
注意事项
- 输出指针已预分配,操作内部不分配内存。
execute_from_full参数控制是从局部解码区域还是完整图像执行。- 架构契约:
rng的默认参数nullptr仅为接口兼容性。框架实际运行时,PreprocessWorker 持有成员Generator rng_并通过&rng_调用execute(),因此rng永不为nullptr。所有引入随机性的 PO 子类(如RandomResizedCrop、RandomHorizontalFlip)均依赖此契约,内部直接解引用rng而不做空指针检查。
克隆接口
PreprocessOperation::clone()
签名
virtual std::unique_ptr<PreprocessOperation> clone() const = 0;
功能简介 深拷贝当前对象,返回新的独立副本。每个 PreprocessWorker 持有独立副本,避免共享状态导致的缓存冲突。
返回值 新的独立副本(unique_ptr)。
异常 无
元信息查询
PreprocessOperation::name()
签名
virtual std::string name() const = 0;
功能简介 获取操作名称,用于日志和调试。
返回值 操作名称字符串(如 "Resize"、"RandomCrop")。
异常 无
PreprocessOperation::introduce_randomness()
签名
virtual bool introduce_randomness() const = 0;
功能简介 检查该操作是否引入随机性。
返回值 true 表示引入随机性,false 表示确定性操作。
异常 无
PreprocessOperation::inference_output_size(int)
签名
virtual int inference_output_size(int input_size);
功能简介 推断输出尺寸(基于输入尺寸)。用于 PO 链中推断中间输出尺寸。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
input_size |
int |
无 | 输入尺寸(宽度或高度,假设正方形) |
返回值 输出尺寸。
异常 NotImplementedError:对于不支持的类(如 Resize/Crop 类)
PreprocessOperation::set_output_size(int)
签名
virtual void set_output_size(int size);
功能简介 设置输出尺寸。用于动态分辨率训练或 PO 链尺寸推断阶段。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
size |
int |
无 | 输出尺寸(宽度或高度,假设正方形) |
返回值 无
异常 无
PreprocessOperation::get_output_size() const
签名
virtual int get_output_size() const;
功能简介 获取当前设置的输出尺寸。
返回值 当前输出尺寸。
异常 无
PreprocessOperation::get_decode_strategy(int32_t, int32_t, int, Generator*) const
virtual DecodeStrategy get_decode_strategy(
int32_t image_width,
int32_t image_height,
int sdmp_factor,
Generator* rng
) const;
功能简介 获取 JPEG 解码策略。仅在当前操作是预处理链(PO chain)的首个操作时被调用,用于决定是否进行局部解码、完整解码或跳过解码等优化。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
image_width |
int32_t |
无 | 原始图像宽度(已从 JPEG 头读取) |
image_height |
int32_t |
无 | 原始图像高度(已从 JPEG 头读取) |
sdmp_factor |
int |
无 | SDMP 因子 |
rng |
Generator* |
无 | 随机数生成器指针 |
返回值 返回一个 DecodeStrategy 结构体,描述推荐解码方式。
异常 基类默认实现不抛出异常,返回默认构造的 DecodeStrategy。
Resize
概述
Resize 是图像缩放操作,使用双线性插值算法和 Simd 加速,支持动态分辨率(渐进式训练)。
设计特点:
- Simd 加速:缓存 Simd Resizer 上下文,避免重复 Init/Release
- 减少重复开销:缓存命中时可避免 Simd Resizer 的重复初始化
- 支持动态分辨率:可通过
set_output_size()更新输出尺寸
所属头文件: #include
继承关系: 继承自 PreprocessOperation
常用使用路径: 通过 Preprocessor::val_transforms() 配置使用。
典型使用代码片段:
PREPROCESSOR_SETTING
.val_transforms(
Resize(256),
CenterCrop(224)
)
.commit();
构造函数
Resize::Resize(int, size_t)
签名
explicit Resize(int output_size = 224, size_t output_alignment = 0);
功能简介 构造 Resize 操作。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
output_size |
int |
224 |
输出尺寸(通常为正方形边长) |
output_alignment |
size_t |
0 |
输出对齐字节数(0=紧凑布局) |
返回值 无
异常 无
Resize::~Resize()
签名
~Resize();
功能简介 析构函数,释放缓存的 Simd Resizer 上下文。
返回值 无
异常 无
执行接口
Resize::execute(const uint8_t, int32_t, int32_t, size_t, uint8_t, int32_t&, int32_t&, size_t&, Generator*, bool, bool)
签名
void execute(
const uint8_t* input_ptr,
int32_t input_width,
int32_t input_height,
size_t input_stride,
uint8_t* output_ptr,
int32_t& output_width,
int32_t& output_height,
size_t& output_stride,
Generator* rng = nullptr,
bool execute_from_full = false,
bool forced_compact_output = true
) override;
功能简介 执行图像缩放操作。
参数 参见 PreprocessOperation::execute() 参数说明。
返回值 无
异常 无
注意事项
- 输出指针已预分配,操作内部不分配内存。
- 缓存命中时可减少 Simd Resizer 的重复创建开销。
继承自基类的公共接口
| 方法 | 继承自 |
|---|---|
execute(...) |
PreprocessOperation |
clone() |
PreprocessOperation |
name() |
PreprocessOperation |
introduce_randomness() |
PreprocessOperation |
get_decode_strategy(...) |
PreprocessOperation |
set_output_size(int) |
PreprocessOperation |
RandomResizedCrop
概述
RandomResizedCrop 是随机尺寸裁剪+缩放操作,ImageNet 训练的标准数据增强。它随机裁剪输入图像的随机区域,然后缩放到固定输出尺寸。
设计特点:
- 随机可复现:使用 Philox RNG + Generator 确保确定性
- 解码策略优化:支持局部解码(sdmp_factor=1)和完整解码(sdmp_factor>1)
- PyTorch 兼容:参数默认值与 PyTorch 一致
所属头文件: #include
继承关系: 继承自 PreprocessOperation
常用使用路径: 通过 Preprocessor::train_transforms() 配置使用。
典型使用代码片段:
PREPROCESSOR_SETTING
.train_transforms(
RandomResizedCrop(224),
RandomHorizontalFlip()
)
.commit();
构造函数
RandomResizedCrop::RandomResizedCrop(int, float, float, float, float, size_t)
签名
explicit RandomResizedCrop(
int output_size = 224,
float scale_min = 0.08f,
float scale_max = 1.0f,
float ratio_min = 3.0f / 4.0f,
float ratio_max = 4.0f / 3.0f,
size_t output_alignment = 0
);
功能简介 构造 RandomResizedCrop 操作(分开参数版本)。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
output_size |
int |
224 |
输出尺寸(通常为 224×224) |
scale_min |
float |
0.08f |
最小缩放比例(即 8%) |
scale_max |
float |
1.0f |
最大缩放比例(即 100%) |
ratio_min |
float |
0.75f |
最小长宽比(3.0/4.0) |
ratio_max |
float |
1.33f |
最大长宽比(4.0/3.0) |
output_alignment |
size_t |
0 |
输出对齐字节数(0=紧凑布局) |
返回值 无
异常 无
RandomResizedCrop::RandomResizedCrop(int, std::pair, std::pair, size_t)
签名
RandomResizedCrop(
int output_size,
std::pair<float, float> scale,
std::pair<float, float> ratio,
size_t output_alignment = 0
);
功能简介 构造 RandomResizedCrop 操作(initializer_list 版本)。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
output_size |
int |
无 | 输出尺寸 |
scale |
std::pair |
无 | 缩放范围 {min, max} |
ratio |
std::pair |
无 | 长宽比范围 {min, max} |
output_alignment |
size_t |
0 |
输出对齐字节数(0=紧凑布局) |
返回值 无
异常 无
示例
RandomResizedCrop(224, {0.08f, 1.0f}, {0.75f, 4.0f/3.0f})
执行接口
RandomResizedCrop::execute(const uint8_t, int32_t, int32_t, size_t, uint8_t, int32_t&, int32_t&, size_t&, Generator*, bool, bool)
签名
void execute(
const uint8_t* input_ptr,
int32_t input_width,
int32_t input_height,
size_t input_stride,
uint8_t* output_ptr,
int32_t& output_width,
int32_t& output_height,
size_t& output_stride,
Generator* rng = nullptr,
bool execute_from_full = false,
bool forced_compact_output = true
) override;
功能简介 执行随机裁剪+缩放操作。
参数 参见 PreprocessOperation::execute() 参数说明。
返回值 无
异常 无
注意事项
execute_from_full=false时从局部解码的 R2 区域执行 crop;execute_from_full=true时从完整解码图像执行。- 随机性由
Generator保证,相同种子和调用顺序产生相同结果。
继承自基类的公共接口
| 方法 | 继承自 |
|---|---|
execute(...) |
PreprocessOperation |
clone() |
PreprocessOperation |
name() |
PreprocessOperation |
introduce_randomness() |
PreprocessOperation |
get_decode_strategy(...) |
PreprocessOperation |
CenterCrop
概述
CenterCrop 是中心裁剪操作,从输入图像中心裁剪指定尺寸。如果输入小于输出,返回整个输入(不放大)。
设计特点:
- 纯 memcpy 实现:性能高效
- 支持局部解码:默认使用 TurboJPEG 局部解码
- 完整解码回退:支持 STB 备用解码
所属头文件: #include
继承关系: 继承自 PreprocessOperation
常用使用路径: 通过 Preprocessor::val_transforms() 配置使用。
典型使用代码片段:
PREPROCESSOR_SETTING
.val_transforms(
Resize(256),
CenterCrop(224)
)
.commit();
构造函数
CenterCrop::CenterCrop(int, size_t)
签名
explicit CenterCrop(int output_size = 224, size_t output_alignment = 0);
功能简介 构造 CenterCrop 操作。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
output_size |
int |
224 |
输出尺寸(通常为正方形边长) |
output_alignment |
size_t |
0 |
输出对齐字节数(0=紧凑布局) |
返回值 无
异常 无
执行接口
CenterCrop::execute(const uint8_t, int32_t, int32_t, size_t, uint8_t, int32_t&, int32_t&, size_t&, Generator*, bool, bool)
签名
void execute(
const uint8_t* input_ptr,
int32_t input_width,
int32_t input_height,
size_t input_stride,
uint8_t* output_ptr,
int32_t& output_width,
int32_t& output_height,
size_t& output_stride,
Generator* rng = nullptr,
bool execute_from_full = false,
bool forced_compact_output = true
) override;
功能简介 执行中心裁剪操作。
参数 参见 PreprocessOperation::execute() 参数说明。
返回值 无
异常 无
注意事项
- 输出指针已预分配,操作内部不分配内存。
- 支持局部解码优先,失败时回退到完整解码。
继承自基类的公共接口
| 方法 | 继承自 |
|---|---|
execute(...) |
PreprocessOperation |
clone() |
PreprocessOperation |
name() |
PreprocessOperation |
introduce_randomness() |
PreprocessOperation |
get_decode_strategy(...) |
PreprocessOperation |
RandomCrop
概述
RandomCrop 是随机裁剪操作,在随机位置裁剪图像到指定尺寸。支持先 padding 后裁剪,避免图像过小无法裁剪。
设计特点:
- PyTorch 兼容:参数和算法与 PyTorch 一致
- 随机可复现:使用 Philox RNG 确保确定性
- 支持填充模式:constant/edge/reflect/symmetric
所属头文件: #include
继承关系: 继承自 PreprocessOperation
常用使用路径: 通过 Preprocessor::train_transforms() 配置使用。
典型使用代码片段:
PREPROCESSOR_SETTING
.train_transforms(
Pad(2),
RandomCrop(28),
RandomRotation(20.0f, 0),
RandomScale(0.8f, 1.2f)
)
.commit();
构造函数
RandomCrop::RandomCrop(int, size_t)
签名
explicit RandomCrop(
int size,
size_t output_alignment = 0
);
功能简介 构造 RandomCrop 操作。当前公开构造函数仅暴露 size 和 output_alignment,其余参数(padding、pad_if_needed、fill、padding_mode)使用内部固定默认值。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
size |
int |
无 | 输出尺寸(必须指定,通常为 28 或 224) |
output_alignment |
size_t |
0 |
输出对齐字节数(0=紧凑布局) |
返回值 无
异常 无
注意事项
- 当前版本未公开
padding、fill、padding_mode等参数,内部固定为:无 padding、pad_if_needed=true、fill=0、PaddingMode::CONSTANT。 - 如需自定义 padding 行为,请组合使用
Pad+RandomCrop。
执行接口
RandomCrop::execute(const uint8_t, int32_t, int32_t, size_t, uint8_t, int32_t&, int32_t&, size_t&, Generator*, bool, bool)
签名
void execute(
const uint8_t* input_ptr,
int32_t input_width,
int32_t input_height,
size_t input_stride,
uint8_t* output_ptr,
int32_t& output_width,
int32_t& output_height,
size_t& output_stride,
Generator* rng = nullptr,
bool execute_from_full = false,
bool forced_compact_output = true
) override;
功能简介 执行随机裁剪操作。
参数 参见 PreprocessOperation::execute() 参数说明。
返回值 无
异常 无
注意事项
- 随机裁剪位置由
Generator决定,确保可复现性。 - 当输入图像小于
size且pad_if_needed=true时会自动填充。
继承自基类的公共接口
| 方法 | 继承自 |
|---|---|
execute(...) |
PreprocessOperation |
clone() |
PreprocessOperation |
name() |
PreprocessOperation |
introduce_randomness() |
PreprocessOperation |
get_decode_strategy(...) |
PreprocessOperation |
RandomHorizontalFlip
概述
RandomHorizontalFlip 是随机水平翻转操作,以 50% 概率水平翻转图像。
设计特点:
- 占位记录类:实际翻转逻辑已融合进
FusedNormalization::execute() - V4.0 Fusion:本类已降级为参数传递类
- 随机可复现:使用 Philox RNG 确保确定性
所属头文件: #include
继承关系: 继承自 PreprocessOperation
常用使用路径: 通过 Preprocessor::train_transforms() 配置使用。
典型使用代码片段:
PREPROCESSOR_SETTING
.train_transforms(
RandomResizedCrop(224),
RandomHorizontalFlip()
)
.commit();
构造函数
RandomHorizontalFlip::RandomHorizontalFlip(float, size_t)
签名
explicit RandomHorizontalFlip(float prob = 0.5f, size_t output_alignment = 0);
功能简介 构造 RandomHorizontalFlip 操作。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
prob |
float |
0.5f |
翻转概率(默认 0.5,即 50% 概率翻转) |
output_alignment |
size_t |
0 |
输出对齐字节数(0=紧凑布局) |
返回值 无
异常 无
预判接口
RandomHorizontalFlip::should_flip(Generator*)
签名
bool should_flip(Generator* rng) override;
功能简介 预判是否需要翻转(保留接口完整性)。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
rng |
Generator* |
无 | 随机数生成器 |
返回值 true 表示需要翻转,false 表示不需要。
异常 无
注意事项 PreprocessWorker 中相关分支已移除,此方法保留以保证 API 完整性。实际翻转由 FusedNormalization::execute() 完成。
继承自基类的公共接口
| 方法 | 继承自 |
|---|---|
execute(...) |
PreprocessOperation |
clone() |
PreprocessOperation |
name() |
PreprocessOperation |
introduce_randomness() |
PreprocessOperation |
inference_output_size(int) |
PreprocessOperation |
should_flip(Generator*) |
RandomHorizontalFlip(重写基类默认实现) |
Normalize
概述
Normalize 是归一化占位操作,仅用于记录归一化预设参数(NormMode 枚举)。实际归一化逻辑由 FusedNormalization 的 execute() 融合完成。
设计特点:
- 占位操作:仅记录参数,不执行实际处理
- 不支持自定义:只支持预设枚举(MLPERF/IMAGENET/MNIST/CIFAR)
- 自动注入:框架会自动注入 FusedNormalization 完成实际归一化
所属头文件: #include
继承关系: 继承自 PreprocessOperation
常用使用路径: 通过 Preprocessor::normalization() 配置使用,不应直接传递给 train_transforms()。
典型使用代码片段:
PREPROCESSOR_SETTING
.normalization(NormMode::IMAGENET)
.train_transforms(
RandomResizedCrop(224),
RandomHorizontalFlip()
)
.commit();
构造函数
Normalize::Normalize(NormMode)
签名
explicit Normalize(NormMode mode = NormMode::NO_NORM);
功能简介 构造 Normalize 操作。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
mode |
NormMode |
NormMode::NO_NORM |
归一化预设枚举 |
返回值 无
异常 无
注意事项 不能显式传递给 .train_transforms() 或 .val_transforms(),必须使用 .normalization() 配置。
查询接口
Normalize::mode()
签名
NormMode mode() const;
功能简介 获取归一化预设模式。
返回值 归一化预设枚举值。
异常 无
继承自基类的公共接口
| 方法 | 继承自 |
|---|---|
execute(...) |
PreprocessOperation |
clone() |
PreprocessOperation |
name() |
PreprocessOperation |
introduce_randomness() |
PreprocessOperation |
inference_output_size(int) |
PreprocessOperation |
RandomErasing
概述
RandomErasing 是随机擦除占位操作,仅记录参数供 GPU 端实现使用。实际擦除逻辑在 FusedNormalization::execute() 中完成。
设计特点:
- 占位操作:仅记录参数,CPU 端不执行处理
- GPU 实现:实际擦除在 DeepLearningEngine 中完成
- 训练专用:不允许用于验证集变换
所属头文件: #include
继承关系: 继承自 PreprocessOperation
常用使用路径: 通过 Preprocessor::train_transforms() 配置使用。
典型使用代码片段:
PREPROCESSOR_SETTING
.train_transforms(
RandomResizedCrop(224),
RandomHorizontalFlip(),
RandomErasing(0.5f)
)
.commit();
构造函数
RandomErasing::RandomErasing(float, size_t)
签名
explicit RandomErasing(
float p,
size_t output_alignment = 0
);
功能简介 构造 RandomErasing 操作(简化版)。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
p |
float |
无 | 擦除概率(必须显式指定,范围 [0.0, 1.0]) |
output_alignment |
size_t |
0 |
输出对齐字节数(0=紧凑布局) |
返回值 无
异常 无
典型值
- p=0.5:50% 概率擦除(PyTorch 默认)
RandomErasing::RandomErasing(float, std::pair, std::pair, size_t)
签名
RandomErasing(
float p,
std::pair<float, float> scale,
std::pair<float, float> ratio,
size_t output_alignment = 0
);
功能简介 构造 RandomErasing 操作(完整参数版)。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
p |
float |
无 | 擦除概率 |
scale |
std::pair |
无 | 擦除区域面积比例范围 {min, max} |
ratio |
std::pair |
无 | 擦除区域长宽比范围 {min, max} |
output_alignment |
size_t |
0 |
输出对齐字节数(0=紧凑布局) |
返回值 无
异常 无
示例
RandomErasing(0.5f, {0.05f, 0.4f}, {0.3f, 3.3f})
RandomErasing::~RandomErasing()
签名
~RandomErasing() = default;
功能简介 默认析构函数。
返回值 无
异常 无
查询接口
RandomErasing::get_p()
签名
float get_p() const;
功能简介 获取擦除概率参数。
返回值 擦除概率值(范围 [0.0, 1.0])。
异常 无
RandomErasing::scale_min()
签名
float scale_min() const;
功能简介 获取擦除区域面积比例下界。
返回值 面积比例下界(默认 0.02)。
异常 无
RandomErasing::scale_max()
签名
float scale_max() const;
功能简介 获取擦除区域面积比例上界。
返回值 面积比例上界(默认 0.33)。
异常 无
RandomErasing::ratio_min()
签名
float ratio_min() const;
功能简介 获取擦除区域长宽比下界。
返回值 长宽比下界(默认 0.3)。
异常 无
RandomErasing::ratio_max()
签名
float ratio_max() const;
功能简介 获取擦除区域长宽比上界。
返回值 长宽比上界(默认 3.3)。
异常 无
继承自基类的公共接口
| 方法 | 继承自 |
|---|---|
execute(...) |
PreprocessOperation |
clone() |
PreprocessOperation |
name() |
PreprocessOperation |
introduce_randomness() |
PreprocessOperation |
inference_output_size(int) |
PreprocessOperation |
TransferStation
概述
TransferStation 是双缓冲区管理器,实现 CPU-GPU 间的高效数据传输。它采用双缓冲架构,支持预处理器写入和深度学习引擎读取的并行操作。
设计特点:
- 双缓冲架构:两个缓冲区交替使用,实现写入和传输的重叠
- 256 字节对齐:与 GPU 端 DTensor 内存布局兼容
- 原子操作:使用原子变量和条件变量实现高效同步
- 线程安全:多个预处理器 worker 可并发写入
所属头文件: #include
常用使用路径: 由 Preprocessor 内部管理,用户通常不直接操作。
典型使用代码片段: TransferStation 通常由框架自动管理,用户无需直接调用。
配置接口
TransferStation::configure(int, size_t, size_t, int, int)
签名
void configure(
int local_batch_size,
size_t max_train_sample_bytes,
size_t max_val_sample_bytes,
int num_workers_per_engine,
int engine_id
);
功能简介 配置 TransferStation 的运行参数。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
local_batch_size |
int |
无 | 本地 batch 大小 |
max_train_sample_bytes |
size_t |
无 | 训练样本最大字节数 |
max_val_sample_bytes |
size_t |
无 | 验证样本最大字节数 |
num_workers_per_engine |
int |
无 | 每个 Engine 的 worker 数 |
engine_id |
int |
无 | Engine ID |
返回值 无
异常 无
复位接口
TransferStation::reset_and_update()
签名
void reset_and_update();
功能简介 复位所有状态并更新 phase 配置。复位所有计数器和状态变量,memset 清空所有内存,从 GlobalRegistry 更新 phase 相关配置。
返回值 无
异常 无
注意事项 不复位已分配的内存和 configure 时设置的参数。
写入接口
TransferStation::request_write_slot(int, int, int32_t)
签名
uint8_t* request_write_slot(int position, int batch_id, int32_t label);
功能简介 申请写入位置(零拷贝)。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
position |
int |
无 | Batch 内位置(范围 0 ~ local_batch_size-1) |
batch_id |
int |
无 | 逻辑 Batch ID |
label |
int32_t |
无 | 标签 |
返回值 数据写入位置指针,如果已停止返回 nullptr。
异常 无
TransferStation::notify_sample_written()
签名
bool notify_sample_written();
功能简介 通知一个样本写入完成。
返回值 true 表示触发了传输,false 表示未触发。
异常 无
TransferStation::no_more_samples(int)
签名
void no_more_samples(int worker_id);
功能简介 Worker 报告没有更多样本。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
worker_id |
int |
无 | Worker ID(范围 0 ~ num_workers-1) |
返回值 无
异常 无
注意事项 每个 Worker 只能调用一次。
状态查询
TransferStation::total_samples_transferred()
签名
size_t total_samples_transferred() const;
功能简介 获取已传输的样本总数。
返回值 已传输样本数。
异常 无
TransferStation::current_buffer_id()
签名
int current_buffer_id() const;
功能简介 获取当前缓冲区 ID。
返回值 当前缓冲区 ID(0 或 1)。
异常 无
TransferStation::is_finished()
签名
bool is_finished() const;
功能简介 检查是否所有样本处理完成。
返回值 true 表示已完成,false 表示未完成。
异常 无
缓冲区状态管理
TransferStation::set_buffer_readable(int, bool)
签名
void set_buffer_readable(int buffer_id, bool readable_flag);
功能简介 设置缓冲区可读状态(深度学习引擎读取完毕后必须调用)。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
buffer_id |
int |
无 | 缓冲区 ID(0 或 1) |
readable_flag |
bool |
无 | 可读标志 |
返回值 无
异常 无
注意事项 深度学习引擎读取 buffer 完毕后必须将 buffer 设为不可读,否则可能重复读入。
TransferStation::set_buffer_writeable(int, bool)
签名
void set_buffer_writeable(int buffer_id, bool writeable_flag);
功能简介 设置缓冲区可写状态。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
buffer_id |
int |
无 | 缓冲区 ID(0 或 1) |
writeable_flag |
bool |
无 | 可写标志 |
返回值 无
异常 无
TransferStation::buffer_is_readable(int)
签名
bool buffer_is_readable(int buffer_id);
功能简介 查询缓冲区是否可读(仅供深度学习引擎调用)。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
buffer_id |
int |
无 | 缓冲区 ID(0 或 1) |
返回值 true 表示可读,false 表示不可读。
异常 无
TransferStation::buffer_is_writeable(int)
签名
bool buffer_is_writeable(int buffer_id);
功能简介 查询缓冲区是否可写。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
buffer_id |
int |
无 | 缓冲区 ID(0 或 1) |
返回值 true 表示可写,false 表示不可写。
异常 无
TransferStation::both_buffers_writeable()
签名
bool both_buffers_writeable() const;
功能简介 查询两个缓冲区是否都可写(供 Preprocessor 检查 phase 结束条件)。
返回值 true 表示都可写,false 表示至少有一个不可写。
异常 无
等待接口
TransferStation::wait_buffer_readable(int)
签名
void wait_buffer_readable(int buffer_id);
功能简介 GPU 侧:阻塞直到 buffer 可读(condition_variable,替换忙轮询)。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
buffer_id |
int |
无 | 缓冲区 ID(0 或 1) |
返回值 无
异常 无
TransferStation::wait_buffer_writeable(int)
签名
void wait_buffer_writeable(int buffer_id);
功能简介 Preprocessor 侧:阻塞直到 buffer 可写。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
buffer_id |
int |
无 | 缓冲区 ID(0 或 1) |
返回值 无
异常 无
数据访问
TransferStation::get_buffer_ptr(int)
签名
uint8_t* get_buffer_ptr(int buffer_id);
功能简介 获取 buffer 的起始位置指针(仅供深度学习引擎调用)。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
buffer_id |
int |
无 | 缓冲区 ID(0 或 1) |
返回值 buffer 起始位置指针(注意:是 buffer_labels_ 而不是 buffer_data_)。
异常 无
TransferStation::get_image_data_ptr(int)
签名
uint8_t* get_image_data_ptr(int buffer_id) const;
功能简介 获取 image data 区的起始位置指针(仅供深度学习引擎调用)。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
buffer_id |
int |
无 | 缓冲区 ID(0 或 1) |
返回值 image data 区起始位置指针。
异常 无
TransferStation::get_buffer_actual_transfer_bytes(int)
签名
size_t get_buffer_actual_transfer_bytes(int buffer_id);
功能简介 获取 buffer 实际传输字节数(仅供深度学习引擎调用)。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
buffer_id |
int |
无 | 缓冲区 ID(0 或 1) |
返回值 实际传输字节数(包含整个 buffer_labels_ 区和实际图像字节)。
异常 无
TransferStation::get_buffer_actual_transfer_samples_(int)
签名
int get_buffer_actual_transfer_samples_(int buffer_id);
功能简介 获取 buffer 实际传输的样本数(仅供深度学习引擎调用)。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
buffer_id |
int |
无 | 缓冲区 ID(0 或 1) |
返回值 实际传输样本数。
异常 无
构造与析构
TransferStation::TransferStation()
签名
TransferStation();
功能简介 默认构造函数,初始化双缓冲状态。
返回值 无
异常 无
TransferStation::~TransferStation()
签名
~TransferStation();
功能简介 析构函数,释放相关资源。
返回值 无
异常 无
SampleInfo
概述
SampleInfo 是样本信息结构体,用于 FULLY 模式第二个 epoch 及以后的样本记录和重放。它存储标签、数据指针和数据大小,用于 FULLY 模式的样本记录。
设计特点:
- 64 字节对齐:避免 false sharing(多个线程访问相邻元素时的缓存行竞争)
- 简洁结构:仅包含必要的样本信息
- 高效布局:优化内存访问性能
所属头文件: #include
常用使用路径: 由 DataLoader 内部管理,用户通常不直接操作。
成员
| 字段名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
label |
int32_t |
无 | 标签 |
data_ptr |
const uint8_t* |
无 | 数据指针(指向 full_arena 或 buffer) |
data_size |
size_t |
无 | 数据大小 |
注意事项
- 结构体采用 64 字节对齐,确保缓存行对齐
- 用于 FULLY 模式的样本记录和重放
- 仅在 FULLY 模式第二个 epoch 及以后使用
DecodeStrategy
概述
DecodeStrategy 是 JPEG 解码策略封装,用于控制图像解码方式(局部解码 vs 完整解码)。
设计特点:
- MCU 对齐:解码窗口按 16×16 MCU 对齐
- 性能优化:局部解码减少解码开销
- 灵活策略:根据 sdmp_factor 自动选择解码方式
所属头文件: #include
常用使用路径: 由 PreprocessWorker 内部管理,用户通常不直接操作。
成员
| 字段名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
need_decode |
bool |
false |
是否需要解码(非 ImageNet 为 false) |
use_partial |
bool |
false |
局部解码 vs 完整解码 |
decode_x |
int32_t |
0 |
解码起始 X(MCU 对齐,向下取整) |
decode_y |
int32_t |
0 |
解码起始 Y(MCU 对齐,向下取整) |
decode_w |
int32_t |
0 |
解码宽度(MCU 对齐,向上取整) |
decode_h |
int32_t |
0 |
解码高度(MCU 对齐,向上取整) |
注意事项
- 坐标系统:R2(MCU 对齐解码区域)为相对于完整图像的绝对坐标
- R1(实际裁剪区域)由 PO 内部管理,不包含在此结构体中
- PW 职责:根据
use_partial选择完整解码或局部解码 R2 到 D 区
enum class PaddingMode
概述
PaddingMode 定义图像填充模式,用于 Pad 和 RandomCrop 等操作。定义在 include/renaissance/data/padding_mode.h。
| 枚举值 | 说明 |
|---|---|
CONSTANT |
常数填充,使用指定的 fill 值 |
EDGE |
边缘填充,重复图像边缘像素 |
REFLECT |
反射填充,以边缘为轴镜像反射(不重复边缘像素) |
SYMMETRIC |
对称填充,以边缘为轴镜像反射(重复边缘像素) |
enum class NormMode
概述
NormMode 定义归一化预设模式,用于 Setup::normalization(NormMode) 和 Normalize。该枚举定义在 include/renaissance/core/types.h,在 Data 模块中频繁使用。
| 枚举值 | 说明 |
|---|---|
NO_NORM |
不归一化,仅做 ToTensor(除以 255) |
MLPERF |
MLPerf 标准归一化 |
IMAGENET |
ImageNet 标准归一化:mean=(0.485,0.456,0.406),std=(0.229,0.224,0.225) |
MNIST |
MNIST 标准归一化:mean=(0.1307,),std=(0.3081,) |
CIFAR |
CIFAR 标准归一化:mean=(0.4914,0.4822,0.4465),std=(0.2470,0.2435,0.2616) |
enum class NormalizePreset
概述
NormalizePreset 定义融合归一化操作的归一化预设,与 NormMode 类似但专用于 FusedNormalization。该枚举定义在 include/renaissance/core/types.h。实际使用中,框架会根据 Setup::normalization() 设置的 NormMode 自动映射为对应的 NormalizePreset。
| 枚举值 | 说明 |
|---|---|
NO_NORM |
不归一化 |
MNIST |
MNIST 预设 |
CIFAR |
CIFAR 预设 |
IMAGENET |
ImageNet 预设 |
MLPERF |
MLPerf 预设 |
enum class LoadMode
概述
LoadMode 定义数据加载模式,用于 DataLoader::set_train_mode(LoadMode) 和 DataLoader::set_val_mode(LoadMode)。该枚举定义在 include/renaissance/core/global_config.h,在 Data 模块中频繁使用。
| 枚举值 | 说明 |
|---|---|
AUTO |
自动选择加载模式(框架根据内存判断) |
FULLY |
全量加载:整个数据集一次性加载到内存 |
PARTIAL |
部分加载:使用环形缓冲区循环加载 |
Setup
概述
Setup 是 Preprocessor 的配置构建器,提供流畅的链式 API。它支持数据集配置、计算参数配置、Transforms 配置等,用于简化 Preprocessor 的配置流程。
设计特点:
- 流畅 API:支持链式调用,配置清晰直观
- 状态机验证:自动验证配置完整性和参数合法性
- 类型安全:编译时类型检查,减少配置错误
所属头文件: #include
常用使用路径: 通过 Preprocessor::setup() 获取实例。
典型使用代码片段:
Preprocessor::setup()
.dataset("imagenet", "/data/imagenet")
.preprocess_workers(128)
.normalization(NormMode::IMAGENET)
.train_transforms(
RandomResizedCrop(224),
RandomHorizontalFlip()
)
.val_transforms(
Resize(256),
CenterCrop(224)
)
.commit();
构造与析构
Setup::Setup()
签名
Setup();
功能简介 默认构造函数,创建一个新的 Setup 实例。
返回值 无
异常 无
Setup::~Setup()
签名
~Setup();
功能简介 析构函数,释放内部状态。
返回值 无
异常 无
Setup::Setup(Setup&&)
签名
Setup(Setup&&) noexcept;
功能简介 移动构造函数。Setup 禁止拷贝,但支持移动。
返回值 无
异常 无
Setup::operator=(Setup&&)
签名
Setup& operator=(Setup&&) noexcept;
功能简介 移动赋值运算符。Setup 禁止拷贝赋值,但支持移动赋值。
返回值 Setup 引用,支持链式调用。
异常 无
数据集配置
Setup::dataset(const std::string&, const std::string&)
签名
Setup& dataset(const std::string& name, const std::string& path);
功能简介 配置数据集(数据集名称和路径)。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
name |
const std::string& |
无 | 数据集名称("mnist"/"cifar10"/"imagenet") |
path |
const std::string& |
无 | 数据集路径 |
返回值 Setup 引用,支持链式调用。
异常 无
计算参数配置
Setup::color_channels(int)
签名
Setup& color_channels(int ch);
功能简介 配置颜色通道数(对于内置数据集会自动设置,无需调用)。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
ch |
int |
无 | 颜色通道数(1=灰度,3=RGB) |
返回值 Setup 引用,支持链式调用。
异常 无
Setup::load_workers(int)
签名
Setup& load_workers(int num);
功能简介 配置数据加载线程数。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
num |
int |
无 | 加载线程数(建议值 1/2/4/8/16) |
返回值 Setup 引用,支持链式调用。
异常 无
Setup::preprocess_workers(int)
签名
Setup& preprocess_workers(int num);
功能简介 配置预处理 worker 总数(跨所有 GPU)。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
num |
int |
无 | 总预处理线程数 |
返回值 Setup 引用,支持链式调用。
异常 无
注意事项 与 PyTorch DataLoader num_workers 的换算关系:preprocess_workers = num_workers × world_size
Setup::using_dts_format(bool, int)
签名
Setup& using_dts_format(bool dts = true, int level = 0);
功能简介 配置 DTS 压缩级别(0-3,仅 DTS 格式有效)。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
dts |
bool |
true |
是否使用 DTS 格式 |
level |
int |
0 |
压缩级别(0-3) |
返回值 Setup 引用,支持链式调用。
异常 无
Setup::fully_mode(bool)
签名
Setup& fully_mode(bool fully = true);
功能简介 配置数据加载模式(PARTIAL vs FULLY)。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
fully |
bool |
true |
true 表示 FULLY 模式,false 表示 PARTIAL 模式 |
返回值 Setup 引用,支持链式调用。
异常 无
Setup::partial_mode(bool)
签名
Setup& partial_mode(bool partial = true);
功能简介 配置数据加载模式(PARTIAL vs FULLY)。与 fully_mode() 互为反向接口,默认启用 PARTIAL 模式。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
partial |
bool |
true |
true 表示 PARTIAL 模式,false 表示 FULLY 模式 |
返回值 Setup 引用,支持链式调用。
异常 无
注意事项 不建议使用此 API,建议使用 fully_mode() 来配置,因为默认即为 PARTIAL 模式。
Setup::shuffle_train(bool)
签名
Setup& shuffle_train(bool shuffle = true);
功能简介 配置是否打乱训练集数据。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
shuffle |
bool |
true |
是否打乱训练集 |
返回值 Setup 引用,支持链式调用。
异常 无
Setup::download(bool)
签名
Setup& download(bool enable = true);
功能简介 配置是否自动下载数据集。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
enable |
bool |
true |
是否自动下载 |
返回值 Setup 引用,支持链式调用。
异常 无
Setup::sdmp_factor(int)
签名
Setup& sdmp_factor(int factor);
功能简介 配置 SDMP(Single Decode Multiple Preprocess)因子,控制局部解码与完整解码的权衡。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
factor |
int |
无 | SDMP 因子。1 表示优先局部解码,>1 表示使用 SDMP 缓存 |
返回值 Setup 引用,支持链式调用。
异常 无
Setup::using_cpvs(bool)
签名
Setup& using_cpvs(bool enable = true);
功能简介 配置是否使用 CPVS(Cached Preprocessed Validation Set),用于加速验证集预处理。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
enable |
bool |
true |
是否启用 CPVS |
返回值 Setup 引用,支持链式调用。
异常 无
Setup::max_intermediate_resolution(int)
签名
Setup& max_intermediate_resolution(int res);
功能简介 配置渐进式分辨率训练中的最大中间分辨率。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
res |
int |
无 | 最大中间分辨率。-1 表示自动计算 |
返回值 Setup 引用,支持链式调用。
异常 无
Setup::drop_last(bool)
签名
Setup& drop_last(bool enable = true);
功能简介 配置是否丢弃最后一个不完整的 batch。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
enable |
bool |
true |
true 表示丢弃不完整 batch |
返回值 Setup 引用,支持链式调用。
异常 无
Setup::cpu_binding(bool)
签名
Setup& cpu_binding(bool enable = true);
功能简介 配置是否启用 CPU 绑核(GPU 云场景下的性能优化)。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
enable |
bool |
true |
是否启用 CPU 绑核 |
返回值 Setup 引用,支持链式调用。
异常 无
Setup::normalization(NormMode)
签名
Setup& normalization(NormMode mode);
功能简介 配置归一化模式(NormMode 枚举)。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
mode |
NormMode |
无 | 归一化模式,参见 enum class NormMode |
返回值 Setup 引用,支持链式调用。
异常 无
注意事项 框架会自动设置对应的均值和标准差。不能通过 .train_transforms() 显式传递 Normalize PO。
Transforms 配置
Setup::train_transforms(Ops&&...)
签名
template<typename... Ops>
Setup& train_transforms(Ops&&... ops);
功能简介 配置训练集数据变换。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
ops |
Ops&&... |
无 | PreprocessOperation 类型(自动推导) |
返回值 Setup 引用,支持链式调用。
异常 TypeError:如果传递了 Normalize 或 FusedNormalization
注意事项 不能显式传递 Normalize,必须使用 .normalization() 配置。
Setup::val_transforms(Ops&&...)
签名
template<typename... Ops>
Setup& val_transforms(Ops&&... ops);
功能简介 配置验证集数据变换。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
ops |
Ops&&... |
无 | PreprocessOperation 类型(自动推导) |
返回值 Setup 引用,支持链式调用。
异常 TypeError:如果传递了 Normalize 或 FusedNormalization
提交配置
Setup::commit()
签名
void commit();
功能简介 验证配置完整性,并按内部状态机正确顺序一次性应用所有配置。
返回值 无
异常 TRException::ConfigError:如果配置不完整或参数非法
注意事项 必须在配置完所有参数后调用,触发实际的配置应用。
除上述核心预处理操作外,Data 模块还提供以下常用数据增强操作类。它们均继承自 PreprocessOperation,通过 Preprocessor::train_transforms() 配置使用。
ColorJitter
概述
ColorJitter 是颜色抖动操作,随机调整图像的亮度、对比度、饱和度和色调。
所属头文件: #include
继承关系: 继承自 PreprocessOperation
常用使用路径: 通过 Preprocessor::train_transforms() 配置使用。
典型使用代码片段:
PREPROCESSOR_SETTING
.train_transforms(
RandomResizedCrop(224),
ColorJitter(0.4, 0.4, 0.4, 0.1)
)
.commit();
构造函数
ColorJitter::ColorJitter(float, float, float, float, size_t)
签名
explicit ColorJitter(
float brightness = 0.0f,
float contrast = 0.0f,
float saturation = 0.0f,
float hue = 0.0f,
size_t output_alignment = 0
);
功能简介 构造 ColorJitter 操作。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
brightness |
float |
0.0f |
亮度调整幅度。0.2 表示亮度系数从 [max(0, 0.8), 1.2] 均匀采样 |
contrast |
float |
0.0f |
对比度调整幅度。0.3 表示对比度系数从 [max(0, 0.7), 1.3] 均匀采样 |
saturation |
float |
0.0f |
饱和度调整幅度。0.4 表示饱和度系数从 [max(0, 0.6), 1.4] 均匀采样 |
hue |
float |
0.0f |
色调调整幅度,范围 [0, 0.5]。0.1 表示色调偏移从 [-0.1, 0.1] 均匀采样 |
output_alignment |
size_t |
0 |
输出对齐字节数(0=紧凑布局) |
返回值 无
异常 无
注意事项
- 仅支持 RGB 图像(3 通道)。
- 每次调用时随机打乱 4 个变换的执行顺序。
继承自基类的公共接口
| 方法 | 继承自 |
|---|---|
execute(...) |
PreprocessOperation |
clone() |
PreprocessOperation |
name() |
PreprocessOperation |
introduce_randomness() |
PreprocessOperation |
inference_output_size(int) |
PreprocessOperation |
GaussianBlur
概述
GaussianBlur 是高斯模糊操作,使用高斯核对图像进行模糊处理。
所属头文件: #include
继承关系: 继承自 PreprocessOperation
常用使用路径: 通过 Preprocessor::train_transforms() 配置使用。
典型使用代码片段:
PREPROCESSOR_SETTING
.train_transforms(
RandomResizedCrop(224),
GaussianBlur()
)
.commit();
构造函数
GaussianBlur::GaussianBlur(float, float, size_t)
签名
explicit GaussianBlur(
float sigma_min = 0.1f,
float sigma_max = 2.0f,
size_t output_alignment = 0
);
功能简介 构造 GaussianBlur 操作。Sigma 范围决定模糊强度,Simd 库会根据 sigma 自动计算合适的核大小。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
sigma_min |
float |
0.1f |
最小高斯 sigma |
sigma_max |
float |
2.0f |
最大高斯 sigma(必须 >= sigma_min) |
output_alignment |
size_t |
0 |
输出对齐字节数(0=紧凑布局) |
返回值 无
异常 无
GaussianBlur::~GaussianBlur()
签名
~GaussianBlur();
功能简介 析构函数,释放内部资源。
返回值 无
异常 无
继承自基类的公共接口
| 方法 | 继承自 |
|---|---|
execute(...) |
PreprocessOperation |
clone() |
PreprocessOperation |
name() |
PreprocessOperation |
introduce_randomness() |
PreprocessOperation |
inference_output_size(int) |
PreprocessOperation |
GaussianNoise
概述
GaussianNoise 是高斯噪声操作,向图像添加高斯噪声。
所属头文件: #include
继承关系: 继承自 PreprocessOperation
常用使用路径: 通过 Preprocessor::train_transforms() 配置使用。
典型使用代码片段:
PREPROCESSOR_SETTING
.train_transforms(
RandomResizedCrop(224),
GaussianNoise()
)
.commit();
构造函数
GaussianNoise::GaussianNoise(float, float, bool, int, size_t)
签名
explicit GaussianNoise(
float mean = 0.0f,
float sigma = 25.5f,
bool clip = true,
int cache_size = 2048,
size_t output_alignment = 0
);
功能简介 构造 GaussianNoise 操作。向图像添加高斯分布的随机噪声。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
mean |
float |
0.0f |
噪声均值 |
sigma |
float |
25.5f |
噪声标准差,推荐范围 [10, 50] |
clip |
bool |
true |
是否将结果裁剪到 [0, 255] |
cache_size |
int |
2048 |
嵌入式缓存大小,推荐范围 [256, 8192] |
output_alignment |
size_t |
0 |
输出对齐字节数(0=紧凑布局) |
返回值 无
异常 无
继承自基类的公共接口
| 方法 | 继承自 |
|---|---|
execute(...) |
PreprocessOperation |
clone() |
PreprocessOperation |
name() |
PreprocessOperation |
introduce_randomness() |
PreprocessOperation |
inference_output_size(int) |
PreprocessOperation |
RandomRotation
概述
RandomRotation 是随机旋转操作,随机旋转图像指定角度。
所属头文件: #include
继承关系: 继承自 PreprocessOperation
常用使用路径: 通过 Preprocessor::train_transforms() 配置使用。
典型使用代码片段:
PREPROCESSOR_SETTING
.train_transforms(
Pad(2),
RandomCrop(28),
RandomRotation(20.0f, 0)
)
.commit();
构造函数
RandomRotation::RandomRotation(float, uint8_t, size_t)
签名
explicit RandomRotation(
float degrees = 30.0f,
uint8_t fill = 0,
size_t output_alignment = 0
);
功能简介 构造 RandomRotation 操作。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
degrees |
float |
30.0f |
旋转角度范围,旋转角度从 [-degrees, degrees] 均匀采样 |
fill |
uint8_t |
0 |
边界填充值(0=黑色,128=灰色) |
output_alignment |
size_t |
0 |
输出对齐字节数(0=紧凑布局) |
返回值 无
异常 无
继承自基类的公共接口
| 方法 | 继承自 |
|---|---|
execute(...) |
PreprocessOperation |
clone() |
PreprocessOperation |
name() |
PreprocessOperation |
introduce_randomness() |
PreprocessOperation |
inference_output_size(int) |
PreprocessOperation |
RandomScale
概述
RandomScale 是随机缩放操作,随机缩放图像到指定尺寸。
所属头文件: #include
继承关系: 继承自 PreprocessOperation
常用使用路径: 通过 Preprocessor::train_transforms() 配置使用。
典型使用代码片段:
PREPROCESSOR_SETTING
.train_transforms(
Pad(2),
RandomCrop(28),
RandomScale(0.8f, 1.2f)
)
.commit();
构造函数
RandomScale::RandomScale(float, float, size_t)
签名
explicit RandomScale(
float min_scale,
float max_scale,
size_t output_alignment = 0
);
功能简介 构造 RandomScale 操作。输出尺寸与输入尺寸相同,空缺区域零填充。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
min_scale |
float |
无 | 最小缩放比例(必须 > 0,如 0.5 表示 50%) |
max_scale |
float |
无 | 最大缩放比例(必须 >= min_scale) |
output_alignment |
size_t |
0 |
输出对齐字节数(0=紧凑布局) |
返回值 无
异常 无
继承自基类的公共接口
| 方法 | 继承自 |
|---|---|
execute(...) |
PreprocessOperation |
clone() |
PreprocessOperation |
name() |
PreprocessOperation |
introduce_randomness() |
PreprocessOperation |
inference_output_size(int) |
PreprocessOperation |
Pad
概述
Pad 是填充操作,在图像周围填充指定像素数。
所属头文件: #include
继承关系: 继承自 PreprocessOperation
常用使用路径: 通过 Preprocessor::train_transforms() 配置使用。
典型使用代码片段:
PREPROCESSOR_SETTING
.train_transforms(
Pad(2),
RandomCrop(28)
)
.commit();
构造函数
Pad::Pad(int, const std::vector&, PaddingMode, size_t)
签名
explicit Pad(
int padding = 0,
const std::vector<int>& fill = {0},
PaddingMode padding_mode = PaddingMode::CONSTANT,
size_t output_alignment = 0
);
功能简介 构造 Pad 操作。在图像四周填充指定像素数,输出尺寸 = 输入尺寸 + 2×padding。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
padding |
int |
0 |
四周填充像素数(必须 >= 0) |
fill |
const std::vector |
{0} |
常数填充值。单值表示所有通道相同;三个值表示 [R, G, B](仅 RGB) |
padding_mode |
PaddingMode |
PaddingMode::CONSTANT |
填充模式,参见 enum class PaddingMode |
output_alignment |
size_t |
0 |
输出对齐字节数(0=紧凑布局) |
返回值 无
异常 无
继承自基类的公共接口
| 方法 | 继承自 |
|---|---|
execute(...) |
PreprocessOperation |
clone() |
PreprocessOperation |
name() |
PreprocessOperation |
introduce_randomness() |
PreprocessOperation |
inference_output_size(int) |
PreprocessOperation |
FastRandomResizedCrop
概述
FastRandomResizedCrop 是快速随机裁剪+缩放操作,针对性能优化版本。
所属头文件: #include
继承关系: 继承自 PreprocessOperation
常用使用路径: 通过 Preprocessor::train_transforms() 配置使用。
构造函数
FastRandomResizedCrop::FastRandomResizedCrop(int, float, float, float, float, size_t)
签名
explicit FastRandomResizedCrop(
int output_size = 224,
float scale_min = 0.08f,
float scale_max = 1.0f,
float ratio_min = 3.0f / 4.0f,
float ratio_max = 4.0f / 3.0f,
size_t output_alignment = 0
);
功能简介 构造 FastRandomResizedCrop 操作(分开参数版本)。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
output_size |
int |
224 |
输出尺寸 |
scale_min |
float |
0.08f |
最小缩放比例 |
scale_max |
float |
1.0f |
最大缩放比例 |
ratio_min |
float |
0.75f |
最小长宽比(3.0/4.0) |
ratio_max |
float |
1.33f |
最大长宽比(4.0/3.0) |
output_alignment |
size_t |
0 |
输出对齐字节数(0=紧凑布局) |
返回值 无
异常 无
FastRandomResizedCrop::FastRandomResizedCrop(int, std::pair, std::pair, size_t)
签名
FastRandomResizedCrop(
int output_size,
std::pair<float, float> scale,
std::pair<float, float> ratio,
size_t output_alignment = 0
);
功能简介 构造 FastRandomResizedCrop 操作(initializer_list 版本)。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
output_size |
int |
无 | 输出尺寸 |
scale |
std::pair |
无 | 缩放范围 {min, max} |
ratio |
std::pair |
无 | 长宽比范围 {min, max} |
output_alignment |
size_t |
0 |
输出对齐字节数(0=紧凑布局) |
返回值 无
异常 无
示例
FastRandomResizedCrop(224, {0.08f, 1.0f}, {0.75f, 4.0f/3.0f})
继承自基类的公共接口
| 方法 | 继承自 |
|---|---|
execute(...) |
PreprocessOperation |
clone() |
PreprocessOperation |
name() |
PreprocessOperation |
introduce_randomness() |
PreprocessOperation |
get_decode_strategy(...) |
PreprocessOperation |
RandomAutocontrast
概述
RandomAutocontrast 是随机自动对比度操作。
所属头文件: #include
继承关系: 继承自 PreprocessOperation
常用使用路径: 通过 Preprocessor::train_transforms() 配置使用。
构造函数
RandomAutocontrast::RandomAutocontrast(float, size_t)
签名
explicit RandomAutocontrast(
float p = 0.5f,
size_t output_alignment = 0
);
功能简介 构造 RandomAutocontrast 操作。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
p |
float |
0.5f |
应用自动对比度的概率,必须在 [0.0, 1.0] 范围内 |
output_alignment |
size_t |
0 |
输出对齐字节数(0=紧凑布局) |
返回值 无
异常 无
决策接口
RandomAutocontrast::should_apply(Generator*)
签名
virtual bool should_apply(Generator* rng);
功能简介 提前决策是否应用自动对比度增强。如果返回 false,预处理 worker 可跳过 execute() 直接返回输入。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
rng |
Generator* |
无 | 随机数生成器指针 |
返回值 true 表示应用增强,false 表示跳过。
异常 无
继承自基类的公共接口
| 方法 | 继承自 |
|---|---|
execute(...) |
PreprocessOperation |
clone() |
PreprocessOperation |
name() |
PreprocessOperation |
introduce_randomness() |
PreprocessOperation |
inference_output_size(int) |
PreprocessOperation |
RandomGrayscale
概述
RandomGrayscale 是随机灰度化操作,以一定概率将图像转换为灰度。
所属头文件: #include
继承关系: 继承自 PreprocessOperation
常用使用路径: 通过 Preprocessor::train_transforms() 配置使用。
构造函数
RandomGrayscale::RandomGrayscale(float, size_t)
签名
explicit RandomGrayscale(
float prob = 0.1f,
size_t output_alignment = 0
);
功能简介 构造 RandomGrayscale 操作。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
prob |
float |
0.1f |
灰度化概率 |
output_alignment |
size_t |
0 |
输出对齐字节数(0=紧凑布局) |
返回值 无
异常 无
决策接口
RandomGrayscale::should_apply(Generator*)
签名
virtual bool should_apply(Generator* rng);
功能简介 提前决策是否将图像转换为灰度。如果返回 false,预处理 worker 可跳过 execute() 直接返回输入。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
rng |
Generator* |
无 | 随机数生成器指针 |
返回值 true 表示应用灰度化,false 表示跳过。
异常 无
继承自基类的公共接口
| 方法 | 继承自 |
|---|---|
execute(...) |
PreprocessOperation |
clone() |
PreprocessOperation |
name() |
PreprocessOperation |
introduce_randomness() |
PreprocessOperation |
inference_output_size(int) |
PreprocessOperation |
DoNothing
概述
DoNothing 是空操作,不进行任何处理,用于测试或占位。
所属头文件: #include
继承关系: 继承自 PreprocessOperation
常用使用路径: 用于测试场景。
构造函数
DoNothing::DoNothing(size_t)
签名
explicit DoNothing(size_t output_alignment = 0);
功能简介 构造 DoNothing 操作。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
output_alignment |
size_t |
0 |
输出对齐字节数(0=紧凑布局) |
返回值 无
异常 无
继承自基类的公共接口
| 方法 | 继承自 |
|---|---|
execute(...) |
PreprocessOperation |
clone() |
PreprocessOperation |
name() |
PreprocessOperation |
introduce_randomness() |
PreprocessOperation |
inference_output_size(int) |
PreprocessOperation |
FusedNormalization
概述
FusedNormalization 是融合归一化操作,将归一化、随机翻转、Random Erasing 等操作融合在一起执行,提高性能。
所属头文件: #include
继承关系: 继承自 PreprocessOperation
常用使用路径: 由框架自动注入,用户通常不直接使用。
构造函数
FusedNormalization::FusedNormalization(NormalizePreset, bool, bool, bool, float, float, float, float, float, size_t)
签名
FusedNormalization(
NormalizePreset preset = NormalizePreset::IMAGENET,
bool use_amp = false,
bool flip_enabled = false,
bool erase_enabled = false,
float erase_p = 0.5f,
float erase_scale_min = 0.02f,
float erase_scale_max = 0.33f,
float erase_ratio_min = 0.3f,
float erase_ratio_max = 3.3f,
size_t output_alignment = 0
);
功能简介 构造 FusedNormalization 操作。该操作将 ToTensor(uint8 → float/FP16)、RandomHorizontalFlip、Normalize 和 RandomErasing 融合为一次内存遍历,是 TR4 数据管道的核心步骤。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
preset |
NormalizePreset |
NormalizePreset::IMAGENET |
归一化预设,决定 mean/std,参见 enum class NormalizePreset |
use_amp |
bool |
false |
是否使用 AMP/FP16 输出。true 时输出为 FP16 并强制 4 通道 padding |
flip_enabled |
bool |
false |
是否启用随机水平翻转 |
erase_enabled |
bool |
false |
是否启用 Random Erasing |
erase_p |
float |
0.5f |
触发 Random Erasing 的概率(仅在 erase_enabled=true 时有效) |
erase_scale_min |
float |
0.02f |
擦除区域面积占原图面积的最小比例 |
erase_scale_max |
float |
0.33f |
擦除区域面积占原图面积的最大比例 |
erase_ratio_min |
float |
0.3f |
擦除区域长宽比最小值 |
erase_ratio_max |
float |
3.3f |
擦除区域长宽比最大值 |
output_alignment |
size_t |
0 |
保留参数,实际由输出数据类型决定 stride,用户传入无效 |
返回值 无
异常 无
注意事项
- 此操作由框架自动注入到 PO 链末尾,用户通常不应直接构造。
- 输出数据类型不再是
uint8_t:FP32 模式下为float,AMP 模式下为uint16_t(FP16),因此output_stride会显著膨胀。 output_alignment对本操作无实际意义,calculate_stride()直接按数据类型计算 stride。
FusedNormalization::~FusedNormalization()
签名
~FusedNormalization();
功能简介 析构函数,释放内部翻转缓冲区等资源。
返回值 无
异常 无
内存布局
FusedNormalization::calculate_stride()
签名
size_t calculate_stride() override;
功能简介 计算输出 stride(字节)。与基类不同,本操作的 stride 由输出数据类型决定,而非 uint8_t 布局。
返回值 输出图像每行占用的字节数。
异常 无
注意事项
- FP32:
stride = output_size_ num_channels_ sizeof(float) - AMP/FP16:
stride = output_size_ 4 sizeof(uint16_t)(强制 4 通道 padding)
通道配置
FusedNormalization::set_num_channels(int)
签名
void set_num_channels(int num_channels) override;
功能简介 设置通道数,并校验与 preset 暗示的通道数是否一致。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
num_channels |
int |
无 | 通道数(1 或 3) |
返回值 无
异常 ValueError:如果传入的通道数与所选 NormalizePreset 冲突。
继承自基类的公共接口
| 方法 | 继承自 |
|---|---|
execute(...) |
PreprocessOperation |
clone() |
PreprocessOperation |
name() |
PreprocessOperation |
introduce_randomness() |
PreprocessOperation |
inference_output_size(int) |
PreprocessOperation |
set_output_size(int) |
PreprocessOperation |
宏 PREPROCESSOR_SETTING
概述
简化 Preprocessor::setup() 调用的语法糖宏,提供更直观的链式配置语法。
签名
#define PREPROCESSOR_SETTING (::tr::Preprocessor::setup())
示例
PREPROCESSOR_SETTING.dataset("imagenet", "/data/imagenet").train_transforms(...).commit();
注意事项 此宏仅用于简化调用,功能与 Preprocessor::setup() 完全相同。
Tensor
板块介绍
Tensor 板块提供 CPU 端数据容器,主要用于主机-设备间数据搬运(H2D/D2H)。该板块包含两个核心数据结构:Tensor(紧凑布局的 CPU 端张量)和 DTensor(分布式张量描述符)。Tensor 强制紧凑布局,所有数据按 NHWC 顺序连续存储,基址 256 字节对齐。DTensor 为纯虚拟概念,描述单张量在多卡上的统一内存视图,不持有实际内存。
核心能力:
- CPU 端数据容器的创建、移动、深拷贝和序列化
- 支持多种数据类型(FP32、FP16、INT8、INT32)的随机初始化
- TSR-V4.20 格式的张量导入导出,支持 RAW 和 ZLIB 压缩
- 分布式张量的内存布局描述、对齐计算和槽位大小管理
主要类型:
Tensor:CPU 端数据容器类,移动语义,禁用拷贝DistributedTensor(别名DTensor):分布式张量结构体
关键头文件:
include/renaissance/tensor/tensor.hinclude/renaissance/tensor/distributed_tensor.h
内部实现:
src/tensor/tensor.cpp
Tensor
概述
CPU 端数据容器,主要用于主机-设备间数据搬运(H2D/D2H)。Tensor 内部使用页锁定内存(GPU 模式)或 256 字节对齐内存(CPU 模式),强制紧凑布局,所有数据按 NHWC 顺序连续存储。不包含任何计算功能,所有数学运算均通过框架后端执行。
头文件: #include
设计定位:
- 作为计算图与外部数据源之间的桥梁
- 仅用于数据搬运,不参与 GPU 计算
- 采用移动语义避免不必要的内存拷贝
- 禁用拷贝构造和拷贝赋值,仅支持显式深拷贝(
clone())
状态:
- 有状态(持有内存缓冲区)
- 移动后源对象置空
常用使用路径:
- 通过工厂方法创建(
Tensor::zeros()、Tensor::fill()等) - 数据预处理后 H2D 传输到 GPU
- GPU 计算结果 D2H 取回后进行验证或导出
典型使用代码:
#include <renaissance.h>
using namespace tr;
// 创建全零张量
Tensor tensor = Tensor::zeros(Shape{4, 224, 224, 3}, DType::FP32);
// 常数填充
tensor.fill(1.0f);
// 深拷贝(仅调试/序列化场景)
Tensor debug_copy = tensor.clone();
// 移动语义传递(零开销)
process_tensor(std::move(tensor));
// 注意:移动后 tensor 已置空,valid() == false
构造与赋值
Tensor::Tensor()
Tensor() = default;
功能简介
默认构造函数,创建一个无效的空 Tensor(内部指针为 nullptr,nbytes_ 和 elem_size_ 均为 0)。常用于先声明变量、稍后通过移动赋值或工厂函数接收数据。
参数
无
返回值
无(构造函数)
异常
无
注意事项
- 空 Tensor 的
valid()返回false,对空 Tensor 调用fill()、clone()等会抛出RuntimeError - 移动赋值后可变为有效状态
Tensor::Tensor(const Tensor&)
Tensor(const Tensor&) = delete;
功能简介
拷贝构造函数已显式删除,禁止隐式拷贝。Tensor 只支持移动语义和显式深拷贝(clone())。
参数
无
返回值
无
异常
无
注意事项
- 需要副本时请使用
clone(),但应避免在性能关键路径使用 - 删除拷贝构造可防止函数传参、容器扩容等场景下的意外深拷贝
Tensor::operator=(const Tensor&)
Tensor& operator=(const Tensor&) = delete;
功能简介
拷贝赋值运算符已显式删除,禁止隐式拷贝赋值。
参数
无
返回值
无
异常
无
注意事项
- 需要副本时请使用
clone() - 只支持移动赋值
operator=(Tensor&&)
Tensor::Tensor(const Shape&, DType)
explicit Tensor(const Shape& shape, DType dtype = DType::FP32);
功能简介
构造并分配指定形状和数据类型的内存。Tensor 强制紧凑布局,实际分配的内存大小严格等于 shape.numel() * sizeof(dtype),无任何行尾 padding。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| shape | const Shape& | - | NHWC 逻辑形状 [in] |
| dtype | DType | DType::FP32 | 数据类型 [in] |
返回值
无(构造函数)
异常
MemoryError:内存分配失败ValueError:shape 的元素总数 ≤ 0
注意事项
- V4.21 版本开始强制紧凑布局,移除所有 padding 逻辑
- 首地址保证 256 字节对齐
- 构造后缓冲区自动清零
Tensor::~Tensor()
~Tensor();
功能简介
析构函数,释放底层内存(页锁定内存或 mimalloc 对齐内存)。
参数
无
返回值
无
异常
无
Tensor::Tensor(Tensor&&)
Tensor(Tensor&& other) noexcept;
功能简介
移动构造函数,接管源对象的内存缓冲区。移动后源对象的内部指针置空,变为无效状态。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| other | Tensor&& | - | 源 Tensor [in,out] |
返回值
无(构造函数)
异常
无
注意事项
- 移动后
other.ptr_置为 nullptr,other.nbytes_和other.elem_size_置为 0 - 性能关键路径推荐使用移动语义避免拷贝开销
Tensor::operator=(Tensor&&)
Tensor& operator=(Tensor&& other) noexcept;
功能简介
移动赋值运算符,先释放当前持有的资源,再接管源对象的内存缓冲区。移动后源对象置空。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| other | Tensor&& | - | 源 Tensor [in,out] |
返回值
返回 *this,支持链式调用
异常
无
注意事项
- 自我赋值安全(
this != &other检查) - 移动后源对象处于有效但空的状态
数据访问
Tensor::data()
void* data() noexcept;
const void* data() const noexcept;
功能简介
获取原始数据指针(非 const 或 const 版本)。
参数
无
返回值
void/const void:指向内部缓冲区的指针
异常
无
Tensor::data()
template<typename T>
T* data() noexcept;
template<typename T>
const T* data() const noexcept;
功能简介
模板方法:以指定类型指针访问数据。模板参数 T 应与 Tensor 的 dtype 匹配。
参数
无
返回值
T/const T:类型化指针
异常
无
注意事项
- 类型安全性由用户保证,框架不检查
T与dtype的匹配关系
示例
#include <renaissance.h>
using namespace tr;
Tensor label = Tensor::zeros(Shape{4, 1, 1, 1}, DType::INT32);
int32_t* ptr = label.data<int32_t>();
for (int i = 0; i < 4; ++i) {
ptr[i] = i * 10 + 7; // 直接写入标签值
}
Tensor fp16 = Tensor::zeros(Shape{2, 8, 8, 3}, DType::FP16);
const uint16_t* src = fp16.data<uint16_t>();
int64_t numel = fp16.numel();
std::vector<uint16_t> copy(src, src + numel); // 复制到 std::vector
Tensor::shape()
const Shape& shape() const noexcept;
功能简介
获取 NHWC 逻辑形状。
参数
无
返回值
const Shape&:形状对象的常量引用
异常
无
Tensor::dtype()
DType dtype() const noexcept;
功能简介
获取数据类型。
参数
无
返回值
DType:数据类型枚举值
异常
无
Tensor::nbytes()
size_t nbytes() const noexcept;
功能简介
获取总分配字节数。紧凑布局下 nbytes = numel() * sizeof(dtype)。
参数
无
返回值
size_t:缓冲区总字节大小
异常
无
Tensor::numel()
int64_t numel() const noexcept;
功能简介
获取元素总数(N × H × W × C)。
参数
无
返回值
int64_t:元素总数
异常
无
Tensor::row_stride()
size_t row_stride() const noexcept;
功能简介
获取紧凑布局的行字节数(W × C × sizeof(dtype))。V4.21 后 Tensor 强制紧凑,此函数保留兼容性。
参数
无
返回值
size_t:行字节数
异常
无
注意事项
【已废弃】V4.21 后 Tensor 强制紧凑,此函数仅保留兼容性。Tensor 类永远紧凑,行步幅实时计算。
Tensor::elem_size()
size_t elem_size() const noexcept;
功能简介
获取单个元素字节数。
参数
无
返回值
size_t:元素字节数(FP16=2、FP32=4、INT8=1、INT32=4)
异常
无
Tensor::valid()
[[nodiscard]] bool valid() const noexcept;
功能简介
检查 Tensor 是否持有有效内存(ptr_ != nullptr)。
参数
无
返回值
bool:true 如果持有有效内存,否则 false
异常
无
初始化
Tensor::fill_zero()
void fill_zero();
功能简介
全零初始化,将整个缓冲区填充为 0。
参数
无
返回值
无
异常
RuntimeError:Tensor 无效(ptr_ == nullptr)
Tensor::fill(int8_t)
void fill(int8_t value);
功能简介
常数填充(INT8)。将所有元素设置为指定常数值。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| value | int8_t | - | 常数值,范围 [-128, 127] [in] |
返回值
无
异常
RuntimeError:Tensor 无效TypeError:dtype 不是 INT8
Tensor::fill(int32_t)
void fill(int32_t value);
功能简介
常数填充(INT32)。将所有元素设置为指定常数值。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| value | int32_t | - | 常数值 [in] |
返回值
无
异常
RuntimeError:Tensor 无效TypeError:dtype 不是 INT32
Tensor::fill(float)
void fill(float value);
功能简介
常数填充(FP32)。将所有元素设置为指定常数值。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| value | float | - | 常数值 [in] |
返回值
无
异常
RuntimeError:Tensor 无效TypeError:dtype 不是 FP32
Tensor::fill_fp16(float)
void fill_fp16(float value);
功能简介
常数填充(FP16)。将 FP32 值转换为 FP16 后填充所有元素。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| value | float | - | 常数值(会转换为 FP16)[in] |
返回值
无
异常
RuntimeError:Tensor 无效TypeError:dtype 不是 FP16RuntimeError:CPU 不支持 AVX2(x86-64 要求)
Tensor::uniform_int(int8_t, int8_t)
void uniform_int(int8_t lower, int8_t upper);
功能简介
均匀分布随机整数(INT8)。生成 [lower, upper] 范围内的均匀分布随机整数。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| lower | int8_t | - | 下限,范围 [-128, 127] [in] |
| upper | int8_t | - | 上限,范围 [-128, 127] [in] |
返回值
无
异常
RuntimeError:Tensor 无效TypeError:dtype 不是 INT8ValueError:范围无效(lower > upper或超出 INT8 范围)
Tensor::uniform_int(int32_t, int32_t)
void uniform_int(int32_t lower, int32_t upper);
功能简介
均匀分布随机整数(INT32)。生成 [lower, upper] 范围内的均匀分布随机整数。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| lower | int32_t | - | 下限 [in] |
| upper | int32_t | - | 上限 [in] |
返回值
无
异常
RuntimeError:Tensor 无效TypeError:dtype 不是 INT32ValueError:范围无效(lower > upper)
Tensor::uniform(float, float)
void uniform(float lower, float upper);
功能简介
均匀分布随机数(FP32)。生成 [lower, upper] 范围内的均匀分布随机浮点数。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| lower | float | - | 下限 [in] |
| upper | float | - | 上限 [in] |
返回值
无
异常
RuntimeError:Tensor 无效TypeError:dtype 不是 FP32ValueError:范围无效(lower > upper)
Tensor::uniform_fp16(float, float)
void uniform_fp16(float lower, float upper);
功能简介
均匀分布随机数(FP16)。生成 [lower, upper] 范围内的均匀分布随机浮点数(FP32 生成后转换为 FP16)。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| lower | float | - | 下限 [in] |
| upper | float | - | 上限 [in] |
返回值
无
异常
RuntimeError:Tensor 无效TypeError:dtype 不是 FP16ValueError:范围无效(lower > upper)RuntimeError:CPU 不支持 AVX2(x86-64 要求)
Tensor::normal(float, float)
void normal(float mean, float stddev);
功能简介
正态分布随机数(FP32)。生成指定均值和标准差的正态分布随机浮点数。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| mean | float | - | 均值 [in] |
| stddev | float | - | 标准差 [in] |
返回值
无
异常
RuntimeError:Tensor 无效TypeError:dtype 不是 FP32
Tensor::randn(float, float)
void randn(float mean, float stddev) { normal(mean, stddev); }
功能简介
正态分布随机数(FP32),normal() 的别名函数。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| mean | float | - | 均值 [in] |
| stddev | float | - | 标准差 [in] |
返回值
无
异常
RuntimeError:Tensor 无效TypeError:dtype 不是 FP32
Tensor::normal_fp16(float, float)
void normal_fp16(float mean, float stddev);
功能简介
正态分布随机数(FP16)。生成指定均值和标准差的正态分布随机浮点数(FP32 生成后转换为 FP16)。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| mean | float | - | 均值 [in] |
| stddev | float | - | 标准差 [in] |
返回值
无
异常
RuntimeError:Tensor 无效TypeError:dtype 不是 FP16RuntimeError:CPU 不支持 AVX2(x86-64 要求)
Tensor::randn_fp16(float, float)
void randn_fp16(float mean, float stddev) { normal_fp16(mean, stddev); }
功能简介
正态分布随机数(FP16),normal_fp16() 的别名函数。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| mean | float | - | 均值 [in] |
| stddev | float | - | 标准差 [in] |
返回值
无
异常
RuntimeError:Tensor 无效TypeError:dtype 不是 FP16RuntimeError:CPU 不支持 AVX2(x86-64 要求)
Tensor::truncated_normal(float, float, float, float)
void truncated_normal(float mean, float stddev, float lower_limit, float upper_limit);
功能简介
截断正态分布随机数(FP32)。生成指定均值和标准差的正态分布随机数,超出上下限的样本会被拒绝重新采样。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| mean | float | - | 均值 [in] |
| stddev | float | - | 标准差 [in] |
| lower_limit | float | - | 下限 [in] |
| upper_limit | float | - | 上限 [in] |
返回值
无
异常
RuntimeError:Tensor 无效TypeError:dtype 不是 FP32ValueError:范围无效(lower_limit >= upper_limit)
Tensor::truncated_normal_fp16(float, float, float, float)
void truncated_normal_fp16(float mean, float stddev, float lower_limit, float upper_limit);
功能简介
截断正态分布随机数(FP16)。生成指定均值和标准差的正态分布随机数(FP32 生成后转换为 FP16),超出上下限的样本会被拒绝重新采样。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| mean | float | - | 均值 [in] |
| stddev | float | - | 标准差 [in] |
| lower_limit | float | - | 下限 [in] |
| upper_limit | float | - | 上限 [in] |
返回值
无
异常
RuntimeError:Tensor 无效TypeError:dtype 不是 FP16ValueError:范围无效(lower_limit >= upper_limit)RuntimeError:CPU 不支持 AVX2(x86-64 要求)
深拷贝接口
Tensor::clone()
Tensor clone() const;
功能简介
显式深拷贝,创建包含数据完整副本的新 Tensor。
参数
无
返回值
Tensor:新的 Tensor,形状、数据类型、对齐方式与原 Tensor 完全相同
异常
RuntimeError:当前 Tensor 无效MemoryError:内存分配失败
注意事项
【性能敏感】涉及内存分配和数据复制,仅用于调试、序列化、数据增强、单元测试等场景。严禁在性能关键路径(如训练循环中频繁 clone)使用。
示例
// [正确] 数据预处理
Tensor original = load_image("input.jpg");
Tensor augmented = original.clone(); // 明确的拷贝语义
apply_augmentation(augmented);
// [正确] 调试检查
Tensor intermediate = compute_something();
Tensor debug_copy = intermediate.clone(); // 保存用于调试
intermediate = compute_next_step(intermediate);
// [错误] 性能关键路径
for (int epoch = 0; epoch < 100; ++epoch) {
Tensor batch = get_batch();
Tensor backup = batch.clone(); // 每个batch都拷贝,性能灾难
train(batch);
}
// [正确] 使用移动语义替代
for (int epoch = 0; epoch < 100; ++epoch) {
Tensor batch = get_batch();
train(std::move(batch)); // 零开销转移
}
工厂方法
Tensor::zeros(const Shape&, DType)
static Tensor zeros(const Shape& shape, DType dtype);
功能简介
创建全零张量。构造后自动调用 fill_zero() 初始化。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| shape | const Shape& | - | 形状 [in] |
| dtype | DType | - | 数据类型 [in] |
返回值
Tensor:全零张量,移动返回(RVO 优化)
异常
MemoryError:内存分配失败
Tensor::fill(const Shape&, DType, float)
static Tensor fill(const Shape& shape, DType dtype, float value);
功能简介
创建常数填充张量(FP32/FP16/INT8/INT32 统一接口)。根据 dtype 自动选择对应类型和转换逻辑。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| shape | const Shape& | - | 形状 [in] |
| dtype | DType | - | 数据类型(FP32/FP16/INT8/INT32)[in] |
| value | float | - | 常数值(浮点数用于 FP32/FP16,会转换为整数用于 INT8/INT32)[in] |
返回值
Tensor:常数填充张量,移动返回(RVO 优化)
异常
MemoryError:内存分配失败TypeError:dtype 不是 FP32/FP16/INT8/INT32ValueError:INT8 填充值超出范围 [-128, 127]
Tensor::uniform_int(const Shape&, DType, int32_t, int32_t)
static Tensor uniform_int(const Shape& shape, DType dtype, int32_t lower, int32_t upper);
功能简介
创建均匀分布随机整数张量(INT8/INT32 统一接口)。根据 dtype 自动选择对应的整数类型,INT8 时会检查范围并转换。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| shape | const Shape& | - | 形状 [in] |
| dtype | DType | - | 数据类型(INT8 或 INT32)[in] |
| lower | int32_t | - | 下限(INT8 范围:[-128, 127],INT32 范围:任意)[in] |
| upper | int32_t | - | 上限 [in] |
返回值
Tensor:均匀分布随机整数张量,移动返回(RVO 优化)
异常
MemoryError:内存分配失败TypeError:dtype 不是 INT8 或 INT32ValueError:范围无效(lower > upper或 INT8 超出范围)
示例
#include <renaissance.h>
using namespace tr;
const int batch = 128;
const int num_classes = 10;
Tensor h_labels = Tensor::uniform_int(
Shape{batch, 1, 1, 1}, DType::INT32, 0, num_classes - 1);
Tensor::uniform(const Shape&, DType, float, float)
static Tensor uniform(const Shape& shape, DType dtype, float lower, float upper);
功能简介
创建均匀分布随机数张量(FP32)。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| shape | const Shape& | - | 形状 [in] |
| dtype | DType | - | 数据类型(必须是 FP32)[in] |
| lower | float | - | 下限 [in] |
| upper | float | - | 上限 [in] |
返回值
Tensor:均匀分布随机数张量,移动返回(RVO 优化)
异常
MemoryError:内存分配失败TypeError:dtype 不是 FP32ValueError:范围无效(lower > upper)
Tensor::uniform_fp16(const Shape&, DType, float, float)
static Tensor uniform_fp16(const Shape& shape, DType dtype, float lower, float upper);
功能简介
创建均匀分布随机数张量(FP16)。FP32 生成后转换为 FP16。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| shape | const Shape& | - | 形状 [in] |
| dtype | DType | - | 数据类型(必须是 FP16)[in] |
| lower | float | - | 下限 [in] |
| upper | float | - | 上限 [in] |
返回值
Tensor:均匀分布随机数张量,移动返回(RVO 优化)
异常
MemoryError:内存分配失败TypeError:dtype 不是 FP16ValueError:范围无效(lower > upper)RuntimeError:CPU 不支持 AVX2(x86-64 要求)
Tensor::normal(const Shape&, DType, float, float)
static Tensor normal(const Shape& shape, DType dtype, float mean, float stddev);
功能简介
创建正态分布随机数张量(FP32)。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| shape | const Shape& | - | 形状 [in] |
| dtype | DType | - | 数据类型(必须是 FP32)[in] |
| mean | float | - | 均值 [in] |
| stddev | float | - | 标准差 [in] |
返回值
Tensor:正态分布随机数张量,移动返回(RVO 优化)
异常
MemoryError:内存分配失败TypeError:dtype 不是 FP32
Tensor::randn(const Shape&, DType, float, float)
static Tensor randn(const Shape& shape, DType dtype, float mean, float stddev);
功能简介
创建正态分布随机数张量(FP32),normal() 的别名函数。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| shape | const Shape& | - | 形状 [in] |
| dtype | DType | - | 数据类型(必须是 FP32)[in] |
| mean | float | - | 均值 [in] |
| stddev | float | - | 标准差 [in] |
返回值
Tensor:正态分布随机数张量,移动返回(RVO 优化)
异常
MemoryError:内存分配失败TypeError:dtype 不是 FP32
示例
#include <renaissance.h>
using namespace tr;
// 生成分类 logits:batch=128,num_classes=10
Tensor h_logits = Tensor::randn(Shape{128, 1, 1, 10}, DType::FP32, 0.0f, 1.0f);
Tensor::normal_fp16(const Shape&, DType, float, float)
static Tensor normal_fp16(const Shape& shape, DType dtype, float mean, float stddev);
功能简介
创建正态分布随机数张量(FP16)。FP32 生成后转换为 FP16。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| shape | const Shape& | - | 形状 [in] |
| dtype | DType | - | 数据类型(必须是 FP16)[in] |
| mean | float | - | 均值 [in] |
| stddev | float | - | 标准差 [in] |
返回值
Tensor:正态分布随机数张量,移动返回(RVO 优化)
异常
MemoryError:内存分配失败TypeError:dtype 不是 FP16RuntimeError:CPU 不支持 AVX2(x86-64 要求)
Tensor::randn_fp16(const Shape&, DType, float, float)
static Tensor randn_fp16(const Shape& shape, DType dtype, float mean, float stddev);
功能简介
创建正态分布随机数张量(FP16),normal_fp16() 的别名函数。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| shape | const Shape& | - | 形状 [in] |
| dtype | DType | - | 数据类型(必须是 FP16)[in] |
| mean | float | - | 均值 [in] |
| stddev | float | - | 标准差 [in] |
返回值
Tensor:正态分布随机数张量,移动返回(RVO 优化)
异常
MemoryError:内存分配失败TypeError:dtype 不是 FP16RuntimeError:CPU 不支持 AVX2(x86-64 要求)
Tensor::truncated_normal(const Shape&, DType, float, float, float, float)
static Tensor truncated_normal(const Shape& shape, DType dtype, float mean, float stddev, float lower_limit, float upper_limit);
功能简介
创建截断正态分布随机数张量(FP32)。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| shape | const Shape& | - | 形状 [in] |
| dtype | DType | - | 数据类型(必须是 FP32)[in] |
| mean | float | - | 均值 [in] |
| stddev | float | - | 标准差 [in] |
| lower_limit | float | - | 下限 [in] |
| upper_limit | float | - | 上限 [in] |
返回值
Tensor:截断正态分布随机数张量,移动返回(RVO 优化)
异常
MemoryError:内存分配失败TypeError:dtype 不是 FP32ValueError:范围无效(lower_limit >= upper_limit)
Tensor::truncated_normal_fp16(const Shape&, DType, float, float, float, float)
static Tensor truncated_normal_fp16(const Shape& shape, DType dtype, float mean, float stddev, float lower_limit, float upper_limit);
功能简介
创建截断正态分布随机数张量(FP16)。FP32 生成后转换为 FP16。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| shape | const Shape& | - | 形状 [in] |
| dtype | DType | - | 数据类型(必须是 FP16)[in] |
| mean | float | - | 均值 [in] |
| stddev | float | - | 标准差 [in] |
| lower_limit | float | - | 下限 [in] |
| upper_limit | float | - | 上限 [in] |
返回值
Tensor:截断正态分布随机数张量,移动返回(RVO 优化)
异常
MemoryError:内存分配失败TypeError:dtype 不是 FP16ValueError:范围无效(lower_limit >= upper_limit)RuntimeError:CPU 不支持 AVX2(x86-64 要求)
序列化
Tensor::save_tensor(const Tensor&, const std::string&, bool)
static void save_tensor(const Tensor& tensor, const std::string& filename, bool compress = false);
功能简介
保存单个张量到 TSR 文件(文件内仅含 1 个张量)。内部调用 save_tensors 实现;V4.21 后 Tensor 强制紧凑布局,直接写入有效数据并计算 CRC32。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| tensor | const Tensor& | - | 要保存的张量 [in] |
| filename | const std::string& | - | 目标文件路径 [in] |
| compress | bool | false | 是否使用 ZLIB 压缩(false=RAW 模式)[in] |
返回值
无
异常
ValueError:tensor 无效或形状不是 4D NHWCShapeError:形状不是 4D NHWCFileNotFoundError:临时文件创建失败ValueError:ZLIB 压缩失败RuntimeError:I/O 错误、临时文件删除/重命名失败
注意事项
- RAW 模式:数据区 256 字节对齐,payload_size = nbytes
- ZLIB 模式:数据区紧密排列,payload_size 为压缩后大小
- 使用原子写入策略:先写入
.tmp临时文件,成功后原子重命名
Tensor::save_tensors(const std::vector&, const std::string&, bool)
static void save_tensors(const std::vector<const Tensor*>& tensors, const std::string& filename, bool compress = false);
功能简介
保存多个张量到 TSR 文件(指针版本,零拷贝传参)。V4.21 后 Tensor 强制紧凑布局,直接写入有效数据并计算 CRC32。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| tensors | const std::vector |
- | 张量指针数组 [in] |
| filename | const std::string& | - | 目标文件路径 [in] |
| compress | bool | false | 是否使用 ZLIB 压缩(false=RAW 模式)[in] |
返回值
无
异常
ValueError:tensors 为空、包含 nullptr、包含无效张量或形状不是 4D NHWCShapeError:某张量形状不是 4D NHWCFileNotFoundError:临时文件创建失败ValueError:ZLIB 压缩失败RuntimeError:I/O 错误、临时文件删除/重命名失败
Tensor::save_tensors(const std::vector&, const std::string&, bool)
static void save_tensors(const std::vector<Tensor>& tensors, const std::string& filename, bool compress = false);
功能简介
保存多个张量到 TSR 文件(值引用版本)。内部将引用转换为指针后调用指针版本。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| tensors | const std::vector |
- | 张量数组 [in] |
| filename | const std::string& | - | 目标文件路径 [in] |
| compress | bool | false | 是否使用 ZLIB 压缩(false=RAW 模式)[in] |
返回值
无
异常
ValueError:tensors 为空、包含无效张量或形状不是 4D NHWCShapeError:某张量形状不是 4D NHWCFileNotFoundError:临时文件创建失败ValueError:ZLIB 压缩失败RuntimeError:I/O 错误、临时文件删除/重命名失败
Tensor::load_tensors(const std::string&)
static std::vector<Tensor> load_tensors(const std::string& filename);
功能简介
加载 TSR 文件中的所有张量。完整验证文件格式、版本、CRC32、数据完整性。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| filename | const std::string& | - | TSR 文件路径 [in] |
返回值
std::vector:按索引顺序返回的张量数组,移动返回
异常
FileNotFoundError:文件不存在或打开失败ValueError:文件格式错误(魔数、版本、头部大小、张量数量、模式、目录项大小、dir_offset、保留字段、头部 CRC32、Shape 维度、numel 冗余校验、RAW 模式对齐、nbytes 一致性、数据 CRC32、文件总大小)
Tensor::load_first_tensor(const std::string&)
static Tensor load_first_tensor(const std::string& filename);
功能简介
加载 TSR 文件中的首个张量(索引 0)。不检查文件内张量总数,直接返回首个张量。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| filename | const std::string& | - | TSR 文件路径 [in] |
返回值
Tensor:索引 0 处的张量,移动返回
异常
FileNotFoundError:文件不存在或打开失败ValueError:文件格式错误、数据校验失败
Tensor::load_tensor(const std::string&)
static Tensor load_tensor(const std::string& filename);
功能简介
严格加载单个张量文件。要求文件内必须且只能包含 1 个张量。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| filename | const std::string& | - | TSR 文件路径 [in] |
返回值
Tensor:唯一张量,移动返回
异常
FileNotFoundError:文件不存在或打开失败ValueError:文件内张量数量 ≠ 1 或任何校验失败
示例
#include <renaissance.h>
using namespace tr;
// 从 TSR 文件加载单个参考张量
Tensor h_logits = Tensor::load_tensor("reference/logits_fp32.tsr");
Tensor h_labels = Tensor::load_tensor("reference/labels_int32.tsr");
比较验证
Tensor::is_close(const Tensor&, const Tensor&, float)
static bool is_close(const Tensor& a, const Tensor& b, float tolerance = 1e-3f);
功能简介
判断两个张量是否数值接近。检查形状和数据类型是否完全相同,对于 INT8/INT32 严格相等比较,对于 FP16/FP32 容忍误差比较(FP16 转 FP32 后再比较)。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| a | const Tensor& | - | 第一个张量 [in] |
| b | const Tensor& | - | 第二个张量 [in] |
| tolerance | float | 1e-3f | 容忍误差(仅对 FP16/FP32 有效)[in] |
返回值
bool:true 如果形状和数据类型相同且所有元素接近
异常
无
示例
#include <renaissance.h>
using namespace tr;
Tensor a = Tensor::fill(Shape{2, 2, 2, 2}, DType::FP32, 1.0f);
Tensor b = Tensor::fill(Shape{2, 2, 2, 2}, DType::FP32, 1.0005f);
bool close = Tensor::is_close(a, b, 1e-3f); // false,差值 0.0005 > 1e-3
bool close2 = Tensor::is_close(a, b, 1e-2f); // true
打印输出
Tensor::to_string()
std::string to_string() const;
功能简介
转换为字符串描述(包含摘要信息)。格式:Tensor(shape=[N,H,W,C], dtype=FP32, numel=1000, data=[...])。小张量(≤16 元素)会显示完整数据,大张量只显示摘要。
参数
无
返回值
std::string:字符串描述
异常
无
Tensor::print(const char*, int)
void print(const char* name = nullptr, int precision = 4) const;
功能简介
打印张量内容(PyTorch 风格)。输出格式完全参照 PyTorch,支持 0D-4D 张量的美观打印。V4.21 版本 Tensor 强制紧凑,自动处理 NHWC 布局。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| name | const char* | nullptr | 张量名称(可为 nullptr)[in] |
| precision | int | 4 | 浮点数精度(小数位数)[in] |
返回值
无
异常
无
Tensor::summary()
void summary() const;
功能简介
打印张量摘要信息,显示形状、数据类型、元素数量、内存占用、row_stride 等关键信息。
参数
无
返回值
无
异常
无
class DistributedTensor
概述
分布式张量 —— "一张图纸,八卡共享"的内存抽象。DTensor 是一个纯虚拟概念:只存形状/偏移量/stride,不持有内存、不存指针。同一个 DTensor 指代所有卡上相同的物理内存区域,布局完全相同,但数据可以有别。
头文件: #include
设计定位:
- 描述单张量在多卡上的统一内存视图
- 配合
MemoryPlan分配 DTensor、计算偏移、确保无间隙和 256B 对齐 - 配合
DeviceContext将 DTensor.offset 解析为真实 GPU/CPU 指针
状态:
- 无状态(不持有内存)
- 创建后 id/shape/dtype/region 不可变
常用使用路径:
- 通过
SimpleTask::alloc()或DeepLearningTask的内存规划系统创建 MemoryPlan::finalize后才能访问 offset
关键约定:
- 全部 4D NHWC 物理布局,Shape 存逻辑维度(padding 前)
- 首地址必定 256 字节对齐,slot_bytes() 必定为 256 的整数倍
- 创建后 id/shape/dtype/region 不可变
- offset_ 由 MemoryPlan::finalize 赋值,此前恒为 -1(哨兵)
- stride 由 shape + dtype 计算,创建后不可变
多变体设计(V4.20.2):
- slot_bytes_ 与 shape 解耦:跨变体取 max 保证 offset 一致
- stride 严格按自身 shape 计算,不存在 "max shape" 概念
- 双构造函数:标准(自动算 slot_bytes)+ 变体(显式传入 max_slot_bytes)
典型使用代码:
#include <renaissance.h>
using namespace tr;
SimpleTask task;
// 标准 DTensor(slot_bytes 自动推导)
DTensor d_label = task.alloc(Shape{4, 1, 1, 1}, DType::INT32, Region::I_A_LABEL);
DTensor d_data = task.alloc(Shape{4, 224, 224, 3}, DType::FP16, Region::I_A_DATA);
// 访问属性(finalize 前可访问)
int32_t batch_size = d_label.n();
int64_t num_elements = d_data.numel();
bool is_compact = d_data.is_compact();
// 访问 offset(finalize 后才能访问)
// task.compile(); // 触发 MemoryPlan::finalize
// uint64_t byte_offset = d_data.offset();
基本属性
DistributedTensor::n()
int32_t n() const noexcept;
功能简介
获取 N 维度(批次大小)。返回 shape.n() 的缓存值,提供 O(1) 访问且避免 shape 对象构造。
参数
无
返回值
int32_t:N 维度值
异常
无
注意事项
- n_ 成员变量严格跟随 shape 变化,shape 赋值时自动同步,不可单独修改
DistributedTensor::h()
int32_t h() const noexcept;
功能简介
获取 H 维度(高度)。返回 shape.h() 的缓存值。
参数
无
返回值
int32_t:H 维度值
异常
无
DistributedTensor::w()
int32_t w() const noexcept;
功能简介
获取 W 维度(宽度)。返回 shape.w() 的缓存值。
参数
无
返回值
int32_t:W 维度值
异常
无
DistributedTensor::c()
int32_t c() const noexcept;
功能简介
获取 C 维度(通道数)。返回 shape.c() 的缓存值。
参数
无
返回值
int32_t:C 维度值
异常
无
DistributedTensor::numel()
int64_t numel() const noexcept;
功能简介
获取元素总数(N × H × W × C)。
参数
无
返回值
int64_t:元素总数
异常
无
DistributedTensor::nbytes()
uint64_t nbytes() const noexcept;
功能简介
获取有效数据的逻辑字节数(不含 padding)。恒等关系:nbytes = N × H × W × C × sizeof(dtype)。用于数据拷贝、CRC 校验等需要精确数据长度的场景。
参数
无
返回值
uint64_t:逻辑字节数
异常
无
注意事项
- 与 slot_bytes() 不同:slot_bytes 含 C 通道填充 + 16B 预留 + 256B 对齐
DistributedTensor::valid()
bool valid() const noexcept;
功能简介
判断该 DTensor 是否有效(id ≥ 0)。
参数
无
返回值
bool:true 如果有效,否则 false
异常
无
DistributedTensor::is_compact()
bool is_compact() const noexcept;
功能简介
判断该 DTensor 是否为紧凑布局。紧凑的 DTensor 与 Tensor 具有完全相同的内存排布,可直接 memcpy。
参数
无
返回值
bool:true 当且仅当 padded_c == shape.c()
异常
无
注意事项
- 非紧凑时(FP16 + 特定 Region,且 c 不是 alignment 的倍数),C 通道有 padding,需要 layout conversion
DistributedTensor::dsize(DType)
static constexpr size_t dsize(DType dt) noexcept;
功能简介
静态工具函数:根据 DType 返回单个元素的字节数。INT8 返回 1,FP16 返回 2,FP32 和 INT32 返回 4。主要用于 nbytes()、padded_bytes() 等内部计算,也可在需要按 dtype 换算字节大小时调用。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| dt | DType | - | 数据类型 [in] |
返回值
size_t:该 dtype 单个元素的字节数
异常
无
注意事项
- 传入未知
DType时返回 4(防御性兜底),但正常业务中不应出现
stride 访问
DistributedTensor::n_stride_cuda()
int64_t n_stride_cuda() const noexcept;
功能简介
CUDA 对齐 stride — 由 padded_c()(cuda_alignment)推导。非紧凑时(FP16+I_A_DATA 等),c_stride_cuda=1, w_stride_cuda=padded_c(>C), h_stride_cuda=padded_cW, n_stride_cuda=padded_cW*H。仅 CUDA 路径使用。
参数
无
返回值
int64_t:N 维度的 CUDA stride
异常
无
注意事项
- CPU 路径不应调用此系列——CPU 上 DTensor 必定紧凑
DistributedTensor::h_stride_cuda()
int64_t h_stride_cuda() const noexcept;
功能简介
CUDA 对齐的 H 维度 stride。
参数
无
返回值
int64_t:H 维度的 CUDA stride
异常
无
DistributedTensor::w_stride_cuda()
int64_t w_stride_cuda() const noexcept;
功能简介
CUDA 对齐的 W 维度 stride。
参数
无
返回值
int64_t:W 维度的 CUDA stride
异常
无
DistributedTensor::c_stride_cuda()
int64_t c_stride_cuda() const noexcept;
功能简介
CUDA 对齐的 C 维度 stride(恒为 1,NHWC 最内层)。
参数
无
返回值
int64_t:C 维度的 CUDA stride
异常
无
DistributedTensor::n_stride_cpu()
int64_t n_stride_cpu() const noexcept;
功能简介
CPU 紧凑 stride — 框架保证 CPU 上所有 DTensor 必定紧凑。恒为 HWC / W*C / C / 1,与 cuda_alignment 无关。CPU capture、CPU 算子、oneDNN 路径使用此系列。
参数
无
返回值
int64_t:N 维度的 CPU stride
异常
无
DistributedTensor::h_stride_cpu()
int64_t h_stride_cpu() const noexcept;
功能简介
CPU 紧凑的 H 维度 stride(恒为 W*C)。
参数
无
返回值
int64_t:H 维度的 CPU stride
异常
无
DistributedTensor::w_stride_cpu()
int64_t w_stride_cpu() const noexcept;
功能简介
CPU 紧凑的 W 维度 stride(恒为 C)。
参数
无
返回值
int64_t:W 维度的 CPU stride
异常
无
DistributedTensor::c_stride_cpu()
int64_t c_stride_cpu() const noexcept;
功能简介
CPU 紧凑的 C 维度 stride(恒为 1)。
参数
无
返回值
int64_t:C 维度的 CPU stride
异常
无
对齐推导
DistributedTensor::cuda_alignment()
uint8_t cuda_alignment() const noexcept;
功能简介
C 通道对齐因子(1/4/8)。完全由 dtype + region 决定,不依赖运行时环境。
参数
无
返回值
uint8_t:对齐因子(1、4 或 8)
异常
无
注意事项
对齐规则:
- 非 FP16:一律 1(紧凑)
- FP16 + 输入缓冲区(I_A_DATA/I_B_DATA):4
- FP16 + 特征图区(F_FEATURE_FP16/F_GRAD_SLOT_FP16)(仅 CUDA):8
- 其余 FP16 情形:1
- CPU 场景下 cuda_alignment 永远为 1
DistributedTensor::padded_c()
int64_t padded_c() const noexcept;
功能简介
padding 之后的 C 通道元素数。padded_c = align_up(C, cuda_alignment)。w_stride / h_stride / n_stride 均基于此值。
参数
无
返回值
int64_t:padding 后的 C 通道数
异常
无
槽位大小
DistributedTensor::slot_bytes()
uint64_t slot_bytes() const noexcept;
功能简介
MemoryPlan 划分该 DTensor 所需的最小字节槽位。V4.20.2 关键修改:slot_bytes() 不再根据当前 shape/dtype 实时计算,而是返回构造时存储的常数 slot_bytes_。这保证了跨变体的 offset 一致性。
参数
无
返回值
uint64_t:槽位字节数
异常
无
注意事项
公式:
- FP16/INT8: slot = align_up_256(padded_bytes() + 16)
- FP32/INT32: slot = 2 × align_up_256(FP16 等效 padded_bytes + 16)
DistributedTensor::compute_slot_bytes(const Shape&, DType, Region)
static uint64_t compute_slot_bytes(const Shape& shape, DType dtype, Region region) noexcept;
功能简介
静态纯函数 —— 计算指定 Shape/DType/Region 对应的槽位字节数。不依赖 this,可供 MemoryPlan 和 Compiler 在分配前任意调用。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| shape | const Shape& | - | 逻辑形状 [in] |
| dtype | DType | - | 数据类型 [in] |
| region | Region | - | 所在显存区域 [in] |
返回值
uint64_t:槽位字节数
异常
无
示例
#include <renaissance.h>
using namespace tr;
const int batch_size = 4;
// 计算 I_A_LABEL 区域 INT32 标量标签的槽位字节数
size_t label_slot = static_cast<size_t>(DistributedTensor::compute_slot_bytes(
Shape{batch_size, 1, 1, 1}, DType::INT32, Region::I_A_LABEL));
cuDNN 接口
DistributedTensor::cudnn_dim(int)
int64_t cudnn_dim(int dim_index) const noexcept;
功能简介
以 cuDNN 的 NCHW API 顺序返回逻辑维度。dim_index: 0→N, 1→C, 2→H, 3→W。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| dim_index | int | - | 维度索引(0-3)[in] |
返回值
int64_t:对应维度的值
异常
无
注意事项
- cuDNN API 期望 NCHW 顺序,但物理布局是 NHWC。此方法填正确值即可——cuDNN 通过 cudnn_stride(1)==1 自动识别 NHWC
DistributedTensor::cudnn_stride(int)
int64_t cudnn_stride(int dim_index) const noexcept;
功能简介
以 cuDNN 的 NCHW API 顺序返回 stride。dim_index: 0→n_stride, 1→c_stride, 2→h_stride, 3→w_stride。cudnn_stride(1) 返回 c_stride=1——cuDNN 由此知道 C 在最内层 = NHWC。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| dim_index | int | - | 维度索引(0-3)[in] |
返回值
int64_t:对应维度的 stride
异常
无
内存偏移
DistributedTensor::offset()
uint64_t offset() const;
功能简介
获取 MemoryPlan 中的字节偏移。finalize 后才能访问,否则抛出异常。
参数
无
返回值
uint64_t:字节偏移
异常
RuntimeError:MemoryPlan::finalize 前访问
注意事项
- offset_ 由 MemoryPlan::finalize 赋值,此前恒为 -1(哨兵)
构造
DistributedTensor::DistributedTensor()
DistributedTensor() = default;
功能简介
默认构造函数,创建无效的 DTensor(id = -1)。
参数
无
返回值
无
异常
无
DistributedTensor::DistributedTensor(int32_t, Shape, DType, Region)
DistributedTensor(int32_t i, Shape s, DType d, Region r);
功能简介
标准构造函数 —— slot_bytes 从 shape 自动推导。适用于 base 变体 MemoryPlan 的第一次分配。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| i | int32_t | - | 全局 ID(由 MemoryPlan 分配)[in] |
| s | Shape | - | 逻辑形状 [N, H, W, C] [in] |
| d | DType | - | 数据类型 [in] |
| r | Region | - | 所在显存区域(决定 cuda_alignment)[in] |
返回值
无
异常
无
注意事项
- slot_bytes_ 由 compute_slot_bytes(s, d, r) 自动计算
DistributedTensor::DistributedTensor(int32_t, Shape, DType, Region, uint64_t)
DistributedTensor(int32_t i, Shape s, DType d, Region r, uint64_t sb);
功能简介
变体构造函数 —— slot_bytes 由 Compiler 显式传入。stride 仍按 s(自身 shape)计算——与 slot_bytes_ 无关。仅 Compiler 通过 MemoryPlan 的私有 alloc 重载调用。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| i | int32_t | - | 全局 ID [in] |
| s | Shape | - | 逻辑形状(该变体的实际 shape,用于 stride 推导)[in] |
| d | DType | - | 数据类型 [in] |
| r | Region | - | 所在显存区域 [in] |
| sb | uint64_t | - | 跨变体最大 slot_bytes(保证 offset 一致)[in] |
返回值
无
异常
无
注意事项
- slot_bytes_ = sb(不是从 shape 推导!)
填充计算
DistributedTensor::padded_elems()
uint64_t padded_elems() const noexcept;
功能简介
padding 之后的总元素数(不含 dtype 转换)。padded_elems = N × H × W × padded_c。用于 cuDNN setDim 维度传入、slot_bytes 的 FP16 基准计算、stride 逻辑校验。
参数
无
返回值
uint64_t:填充后的总元素数
异常
无
DistributedTensor::padded_bytes()
uint64_t padded_bytes() const noexcept;
功能简介
padding 之后的总字节数。padded_bytes = N × H × W × padded_c × sizeof(dtype)。用于 cuDNN workspace 大小、CUDA 显存需求估算、slot_bytes 计算输入。
参数
无
返回值
uint64_t:填充后的总字节数
异常
无
DistributedTensor::cudnn_bytes()
uint64_t cudnn_bytes() const noexcept;
功能简介
同 padded_bytes(),对接 cuDNN API 时的推荐方法名。
参数
无
返回值
uint64_t:填充后的总字节数
异常
无
DistributedTensor::cuda_bytes()
uint64_t cuda_bytes() const noexcept;
功能简介
同 padded_bytes(),对接 CUDA API 时的推荐方法名。
参数
无
返回值
uint64_t:填充后的总字节数
异常
无
成员字段
DistributedTensor 为结构体,包含以下公开字段:
| 字段名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| id | int32_t | -1 | 全局 ID(由 MemoryPlan 分配) |
| shape | Shape | Shape{1,1,1,1} | 逻辑形状 [N, H, W, C] |
| dtype | DType | DType::FP32 | 数据类型 |
| region | Region | Region::DEFAULT | 所在显存区域 |
| n_ | int32_t | 1 | shape.n() 的缓存值 |
| h_ | int32_t | 1 | shape.h() 的缓存值 |
| w_ | int32_t | 1 | shape.w() 的缓存值 |
| c_ | int32_t | 1 | shape.c() 的缓存值 |
| init_config | InitConfig | InitConfig{} | 初始化配置(V4.20.3 新增) |
注意事项
- 快速访问成员变量(n_/h_/w_/c_)紧跟 shape 变化,不可单独赋值
- 内部方法 sync_shape_from() 仅在 MemoryPlan 等内部模块中调用,外部不应直接修改 shape
Graph
板块介绍
Graph 模块是 Tech-Renaissance 的计算图编译与捕获系统,负责从高层模型定义生成可执行的计算图。该模块实现了模型定义 DSL、五阶段编译器、多流 CUDA Graph 捕获、显存布局规划和去重机制。
核心能力包括:
- 提供
BluePrintDSL,用简洁的函数式语法定义复杂神经网络模型 - 实现五阶段编译管线,从模型架构生成优化的计算图和显存布局
- 支持多流 CUDA Graph 捕获,实现训练/推理图的零开销执行
- 基于 69-Region 规范的显存布局引擎,支持多变体共享和去重
- 提供
GraphAtlas映射表,实现 6 变体 × 33 槽位的高效索引(对应GraphId::COUNT = 33,其中 32 个为有效子图标识)
该模块包含以下主要组件:
- 模型定义:
BluePrint、Layer、工厂函数(conv、bn、relu等) - 编译系统:
ArchPlan、Compiler、CompileSpec、LayerDescriptor - 计算图:
ComputationGraph、GraphNode、GraphId - 捕获执行:
CapturedGraph、CaptureMultiStream、GraphAtlas - 显存布局:
MemoryPlan、Region、DTensor分配 - 算子定义:
ComputeOp、RangeOp、OpParams
关键头文件:
include/renaissance/graph/blueprint.h— 模型定义 DSLinclude/renaissance/graph/compiler.h— 五阶段编译器include/renaissance/graph/computation_graph.h— 计算图容器include/renaissance/graph/captured_graph.h— 可执行捕获图include/renaissance/graph/memory_plan.h— 显存布局引擎include/renaissance/graph/op_kind.h— 算子类型定义
内部实现位于:src/graph/
BluePrint
概述
BluePrint 是模型定义的门面类,持有 Layer 树的根节点。它提供了简洁的 DSL 来定义神经网络模型,支持链式组合和高层块定义。
所属头文件:#include
设计定位:BluePrint 是用户定义模型的唯一入口。通常通过 DeepLearningTask::model() 传入后由框架自动调用 ArchPlan::from_blueprint() 与 Compiler::compile() 完成编译;也可在高级场景中手动调用 ArchPlan::from_blueprint(blueprint) 获取架构规划。
是否有状态:BluePrint 本身只持有根 Layer,不维护可变状态。其持有的 Layer 对象不可变。
继承关系:无继承。
典型使用路径:用户通过工厂函数定义模型 → 构造 BluePrint → 传递给 DeepLearningTask::model() → 自动编译为可执行图。
典型使用代码:
// 定义 4 层 MLP
BluePrint mlp = seq(
fc(1024, true), relu(),
fc(512, true), relu(),
fc(256, true), relu(),
fc(10, true)
);
// 定义 ResNet-50 风格模型
BluePrint resnet = seq(
conv(64, 7, 2, 3), maxpool(3, 2, 1),
block(64, 256, BlockStyle::RESNET_1_3_1),
block(128, 512, BlockStyle::RESNET_1_3_1_DS),
// ...
gap_fc(1000, true)
);
构造与赋值
BluePrint::BluePrint() = default
签名
BluePrint() = default;
功能简介 默认构造函数,创建空的模型定义。
参数 无
返回值 无
异常 无
BluePrint::BluePrint(Layer root)
签名
BluePrint(Layer root);
功能简介 从 Layer 树构造模型定义(移除了 explicit,允许隐式转换)。
参数 | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | root | Layer | 无 | 模型的根层节点 [in] |
返回值 无
异常 无
BluePrint::operator=(Layer root)
签名
BluePrint& operator=(Layer root);
功能简介 赋值 Layer 树,常用于重新定义模型。
参数 | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | root | Layer | 无 | 新的模型根层节点 [in] |
返回值 返回 *this,支持链式调用
异常 无
查询接口
BluePrint::empty() const noexcept
签名
bool empty() const noexcept;
功能简介 检查模型定义是否为空。
参数 无
返回值 返回 true 表示模型定义为空,false 表示有内容
异常 无
Layer
概述
Layer 是模型树中的节点,轻量级不可变对象。它既可以表示单个网络层(卷积、池化、全连接、激活等),也可以表示容器(seq、add2、repeat),因此既可能是叶子节点也可能是内部节点。
所属头文件:#include
设计定位:Layer 采用 Pimpl 模式,内部使用 std::shared_ptr 共享不可变数据,支持高效的拷贝和组合。
是否有状态:无状态(stateless),所有 Layer 对象都是不可变的。
继承关系:无继承。
典型使用路径:通过工厂函数创建 → 组合为 Layer 树 → 构造 BluePrint。
典型使用代码:
// 基础层
Layer conv1 = conv(64, 3, 1, 1);
Layer bn1 = bn(0.1, 1e-5);
Layer relu1 = relu();
// 组合为序列
Layer seq1 = seq(conv1, bn1, relu1);
// 高层块(需使用 BlockStyle 枚举作用域)
Layer bottleneck = block(64, 256, BlockStyle::RESNET_1_3_1);
查询接口
Layer::valid() const noexcept
签名
bool valid() const noexcept;
功能简介 检查 Layer 对象是否有效(非空)。
参数 无
返回值 返回 true 表示 Layer 有效,false 表示为空
异常 无
enum class Precision
概述
Precision 是精度枚举,目前保留用于未来扩展。
所属头文件:#include
设计定位:精度标识,用于后续支持 FP32 / FP16 显式精度选择。
是否有状态:无状态(stateless)。
继承关系:无继承。
| 枚举值 | 说明 |
|---|---|
FP32 |
32 位浮点精度 |
FP16 |
16 位浮点精度 |
enum class BlockStyle
概述
高层块样式枚举,用于指定 block() 函数创建的块类型。支持 ResNet Bottleneck、BasicBlock 和 MobileNetV2 倒残差块。
所属头文件:#include
设计定位:类型安全的块样式标识,用于工厂函数的参数。
是否有状态:无状态(stateless)。
继承关系:无继承。
| 枚举值 | 说明 |
|---|---|
RESNET_1_3_1 |
ResNet Bottleneck(1x1-3x3-1x1) |
RESNET_1_3_1_DS |
ResNet Bottleneck with downsample |
RESNET_3_3 |
ResNet BasicBlock(3x3-3x3) |
RESNET_3_3_DS |
ResNet BasicBlock with downsample |
MB_E1_K3 |
MobileNetV2 expand=1, kernel=3 |
MB_E1_K3_DS |
MobileNetV2 expand=1, kernel=3, downsample |
MB_E6_K3 |
MobileNetV2 expand=6, kernel=3 |
MB_E6_K3_DS |
MobileNetV2 expand=6, kernel=3, downsample |
enum class LayerKind
概述
LayerKind 是架构规划阶段的层类型枚举,标识 ArchLayer 的算子类别。它与 BluePrint 中的 Layer 不同:LayerKind 出现在 ArchPlan 中,表示已经过归一化/融合后的层类型。
所属头文件:#include
设计定位:编译器内部使用的层类型标识,也用于 LayerDescriptor 注册表索引。
是否有状态:无状态(stateless)。
继承关系:无继承。
| 枚举值 | 说明 |
|---|---|
Conv |
卷积层 |
Bn1d |
1D BatchNorm |
Bn2d |
2D BatchNorm |
ReLU |
ReLU 激活 |
Tanh |
Tanh 激活 |
SiLU |
SiLU 激活 |
ReLU6 |
ReLU6 激活 |
LeakyReLU |
LeakyReLU 激活 |
Hardswish |
Hardswish 激活 |
ELU |
ELU 激活 |
Sigmoid |
Sigmoid 激活 |
MaxPool |
最大池化 |
AvgPool |
平均池化 |
GAP |
全局平均池化 |
FC |
全连接层 |
Flatten |
展平层 |
ChannelPadding |
通道填充 |
Identity |
恒等映射 |
SoftmaxCE |
Softmax 交叉熵损失 |
Dropout |
Dropout |
Add2Start |
Add2 结构起点 |
Add2ShortcutEnd |
Add2 shortcut 结束 |
Add2End |
Add2 结构终点 |
BottleneckProjection |
Bottleneck 带下采样投影 |
BottleneckIdentity |
Bottleneck 恒等连接 |
BasicBlockProjection |
BasicBlock 带下采样投影 |
BasicBlockIdentity |
BasicBlock 恒等连接 |
InvResidualNoShortcut |
MobileNetV2 倒残差无 shortcut |
InvResidualIdentity |
MobileNetV2 倒残差恒等连接 |
GapFC |
GAP + FC 融合 |
CBR |
Conv + BN + ReLU 融合 |
层参数结构体
概述
arch_plan.h 中定义了一组轻量级参数结构体,用于承载 ArchLayer 中各 LayerKind 所需的配置。这些结构体全部可比较(实现了 operator==),并被聚合到 LayerParam std::variant 中。
所属头文件:#include
设计定位:ArchLayer 的参数字段,由 ArchPlan 在模型展开与融合过程中填充。
是否有状态:无状态(stateless)。
继承关系:无继承。
结构体字段
| 结构体 | 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|---|
ConvLayerParams |
out_ch |
int | 0 | 输出通道数 |
k |
int | 0 | 卷积核大小 | |
s |
int | 0 | 步长 | |
p |
int | 0 | 填充 | |
PoolLayerParams |
k |
int | 0 | 池化核大小 |
s |
int | 0 | 步长 | |
p |
int | 0 | 填充 | |
FCLayerParams |
out_features |
int | 0 | 输出特征数 |
bias |
bool | true | 是否使用偏置 | |
DropoutLayerParams |
p |
float | 0.5f | 丢弃率 |
SoftmaxCELayerParams |
num_classes |
int | 0 | 类别数 |
BottleneckIdentityLayerParams |
bottleneck_ch |
int | 0 | Bottleneck 中间通道数 |
BottleneckProjectionLayerParams |
bottleneck_ch |
int | 0 | Bottleneck 中间通道数 |
out_ch |
int | 0 | 输出通道数 | |
stride |
int | 0 | 步长 | |
BasicBlockIdentityLayerParams |
out_ch |
int | 0 | 输出通道数 |
BasicBlockProjectionLayerParams |
out_ch |
int | 0 | 输出通道数 |
stride |
int | 0 | 步长 | |
InvResidualLayerParams |
expand_ch |
int | 0 | 扩展通道数 |
out_ch |
int | 0 | 输出通道数 | |
stride |
int | 0 | 步长 | |
has_shortcut |
bool | 无 | 是否存在 shortcut | |
GapFCLayerParams |
out_features |
int | 0 | 输出特征数 |
bias |
bool | true | 是否使用偏置 | |
CbrLayerParams |
out_ch |
int | 0 | 输出通道数 |
k |
int | 0 | 卷积核大小 | |
s |
int | 0 | 步长 | |
p |
int | 0 | 填充 | |
eps |
float | 1e-5f | BN epsilon | |
momentum |
float | 0.1f | BN 动量 | |
EmptyParams |
(无字段) | — | — | 空参数占位 |
using LayerParam
概述
LayerParam 是 ArchLayer 的参数联合体,使用 std::variant 承载上述所有层参数结构体。
所属头文件:#include
设计定位:类型安全的 ArchLayer 参数字段。
是否有状态:无状态(stateless)。
继承关系:无继承。
包含的备选类型:
ConvLayerParams、PoolLayerParams、FCLayerParams、SoftmaxCELayerParams、DropoutLayerParams、BNParams、BottleneckIdentityLayerParams、BottleneckProjectionLayerParams、BasicBlockIdentityLayerParams、BasicBlockProjectionLayerParams、InvResidualLayerParams、GapFCLayerParams、CbrLayerParams、EmptyParams
struct ArchLayer
概述
ArchLayer 是 ArchPlan 中的单层描述,包含层类型、参数、名称、输入/输出形状以及融合相关的标记。
所属头文件:#include
设计定位:ArchPlan 的内部元素,表示经过展开、归一化、融合后的单个层。
是否有状态:无状态(stateless)。
继承关系:无继承。
成员
| 字段名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
kind |
LayerKind |
无 | 层类型 |
params |
LayerParam |
无 | 层参数 |
name |
std::string |
空 | 层名称 |
in_shape |
Shape |
{1, 224, 224, 3} |
输入形状 |
out_shape |
Shape |
{1, 224, 224, 3} |
输出形状 |
in_compact |
bool | false | 输入是否为 compact 布局 |
is_first_layer |
bool | false | 是否为首层 |
src_id |
int | -1 | 源层索引(用于 Add2 等结构) |
ArchPlan
概述
ArchPlan 是架构规划类,从 BluePrint 接收模型定义,经 9 步管线(step2–step10)生成标准化、全融合的架构描述,支持 YAML 序列化往返。
所属头文件:#include
设计定位:ArchPlan 是编译的中间表示,连接高层模型定义和底层计算图。
是否有状态:有状态(stateful),持有层序列和输入形状。
继承关系:无继承。
典型使用路径:用户无需直接使用,由 Compiler::from_blueprint() 内部调用。
典型使用代码:
// 用户通常不直接创建 ArchPlan
// 通过 Compiler::from_blueprint() 自动生成
auto arch = ArchPlan::from_blueprint(blueprint, input_spec);
arch.build(num_classes);
auto yaml = arch.to_yaml();
生命周期
ArchPlan::from_blueprint(const BluePrint& bp, const InputSpec& input = {1, 3, 224, 224}, bool fuse = true)
签名
static ArchPlan from_blueprint(const BluePrint& bp,
const InputSpec& input = {1, 3, 224, 224},
bool fuse = true);
功能简介 从 BluePrint 创建 ArchPlan,执行模型展开和归一化。
参数 | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | bp | const BluePrint& | 无 | 模型定义 [in] | | input | const InputSpec& | {1, 3, 224, 224} | 输入规格 [in] | | fuse | bool | true | 是否启用融合 [in] |
返回值 返回构造好的 ArchPlan 对象
异常 无
ArchPlan::build(int num_classes = 1000)
签名
void build(int num_classes = 1000);
功能简介 执行 9 步编译管线(step2–step10),生成最终的架构描述。
参数 | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | num_classes | int | 1000 | 分类数量 [in] |
返回值 无
异常 无
注意事项 该方法依次调用内部处理步骤:重命名、归一化、形状推导、块融合等。
编译管线步骤
以下方法对应 build() 内部依次执行的 9 步管线(step2–step10)。普通用户通常只需调用 build(),无需单独调用这些步骤;高级调试场景可单独调用以观察中间状态。
ArchPlan::step2_rename_bn()
签名
void step2_rename_bn();
功能简介 重命名 BatchNorm 层,统一命名规范。
参数 无
返回值 无
异常 无
ArchPlan::step3_normalize_softmax_ce(int num_classes)
签名
void step3_normalize_softmax_ce(int num_classes);
功能简介 归一化 SoftmaxCE 层,将其参数化。
参数 | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | num_classes | int | 无 | 类别数量 [in] |
返回值 无
异常 无
ArchPlan::step4_normalize_identity()
签名
void step4_normalize_identity();
功能简介 归一化 Identity 层。
参数 无
返回值 无
异常 无
ArchPlan::step5_normalize_flatten()
签名
void step5_normalize_flatten();
功能简介 归一化 Flatten 层。
参数 无
返回值 无
异常 无
ArchPlan::step6_deduce_shapes()
签名
void step6_deduce_shapes();
功能简介 推导各层的输入/输出形状。
参数 无
返回值 无
异常 无
ArchPlan::step7_merge_blocks()
签名
void step7_merge_blocks();
功能简介 识别并融合 Bottleneck / BasicBlock / InvResidual 块。
参数 无
返回值 无
异常 无
ArchPlan::step8_merge_quadruple()
签名
void step8_merge_quadruple();
功能简介 融合四元模式(如 Add2 相关结构)。
参数 无
返回值 无
异常 无
ArchPlan::step9_merge_triple()
签名
void step9_merge_triple();
功能简介 融合三元模式(如 CBR 等)。
参数 无
返回值 无
异常 无
ArchPlan::step10_merge_binary_and_mark()
签名
void step10_merge_binary_and_mark();
功能简介 融合二元模式并标记首层。
参数 无
返回值 无
异常 无
查询接口
ArchPlan::layers() const
签名
const std::vector<ArchLayer>& layers() const;
功能简介 获取架构中的所有层。
参数 无
返回值 返回 ArchLayer 向量的常量引用
异常 无
ArchPlan::first_layer_index() const
签名
int first_layer_index() const;
功能简介 获取首层索引。
参数 无
返回值 返回首层的索引值
异常 无
序列化
ArchPlan::to_yaml() const
签名
std::string to_yaml() const;
功能简介 将架构规划序列化为 YAML 字符串。
参数 无
返回值 返回 YAML 格式的字符串
异常 无
ArchPlan::from_yaml(const std::string& yaml)
签名
static ArchPlan from_yaml(const std::string& yaml);
功能简介 从 YAML 字符串反序列化架构规划。
参数 | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | yaml | const std::string& | 无 | YAML 格式的字符串 [in] |
返回值 返回构造好的 ArchPlan 对象
异常 无
ArchPlan::to_string() const
签名
std::string to_string() const;
功能简介 将架构规划转换为可读字符串(用于调试)。
参数 无
返回值 返回架构的字符串表示
异常 无
Compiler
概述
Compiler 是五阶段编译编排器,从 ArchPlan 编译生成 MemoryPlan 和 ComputationGraph。它实现了形状推导、显存布局、计算图构建和变体共享。
所属头文件:#include
设计定位:Compiler 是模型编译的核心,负责从高层架构到底层执行图的完整转换。
是否有状态:无状态(stateless),所有方法都是静态的。
继承关系:无继承。
典型使用路径:用户无需直接调用,由 DeepLearningTask::compile() 内部调用。
典型使用代码:
// 用户通常不直接使用 Compiler
// 通过 DeepLearningTask::compile() 自动调用
auto arch = ArchPlan::from_blueprint(bp);
auto base_spec = CompileSpec::from_global_registry();
auto result = Compiler::compile(arch, base_spec, plan_config, variant_specs);
编译接口
Compiler::compile(const ArchPlan& arch, const CompileSpec& base_spec, const PlanConfig& plan_config = PlanConfig{}, const std::vector& variant_specs = {})
签名
static Result compile(const ArchPlan& arch,
const CompileSpec& base_spec,
const PlanConfig& plan_config = PlanConfig{},
const std::vector<CompileSpec>& variant_specs = {});
功能简介 执行五阶段编译流程,从架构规划生成完整的编译结果。
参数 | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | arch | const ArchPlan& | 无 | 模型架构规划 [in] | | base_spec | const CompileSpec& | 无 | 基准编译参数(train_base) [in] | | plan_config | const PlanConfig& | {} | 内存规划配置 [in] | | variant_specs | const std::vector
返回值 返回包含 6 个 Variant 和共享 ComputationGraph 的 Result
异常 无
注意事项 该方法的五阶段包括:形状推导、最大槽位计算、显存规划创建、计算图构建、指针共享。
Compiler::compile(const ArchPlan& arch, const CompileSpec& base_spec, const PlanConfig& plan_config, Initializer& initializer, const std::vector& variant_specs = {})
签名
static Result compile(const ArchPlan& arch,
const CompileSpec& base_spec,
const PlanConfig& plan_config,
Initializer& initializer,
const std::vector<CompileSpec>& variant_specs = {});
功能简介 五阶段编译流程(带 Initializer,支持 ZERO_GAMMA 等初始化策略)。
参数 | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | arch | const ArchPlan& | 无 | 模型架构规划 [in] | | base_spec | const CompileSpec& | 无 | 基准编译参数 [in] | | plan_config | const PlanConfig& | 无 | 内存规划配置 [in] | | initializer | Initializer& | 无 | 初始化器引用 [in,out] | | variant_specs | const std::vector
返回值 返回包含 6 个 Variant 和共享 ComputationGraph 的 Result
异常 无
struct Compiler::Result
概述
Compiler::Result 是编译结果的完整输出,包含 6 个编译变体和共享的计算图。
所属头文件:#include
设计定位:编译输出的数据结构,持有所有变体的 MemoryPlan 和共享的 ComputationGraph。
是否有状态:有状态(stateful),持有编译产出的所有权。
继承关系:无继承。
典型使用路径:由 Compiler::compile() 返回,传递给 GraphAtlas::build()。
成员
| 字段名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| variants | std::vector |
无 | 6 个编译变体 |
| train_cg | ComputationGraph | 无 | 训练计算图(共享) |
| infer_cg | ComputationGraph | 无 | 推理计算图(共享) |
注意事项 禁止拷贝,允许移动,确保计算图的生命周期安全。
struct Compiler::Variant
概述
Compiler::Variant 是单个编译变体,持有独立的 MemoryPlan 和指向共享计算图的指针。
所属头文件:#include
设计定位:变体数据结构,支持多 shape 和多场景的编译优化。
是否有状态:有状态(stateful),持有独立的 MemoryPlan。
继承关系:无继承。
典型使用路径:由 Compiler::Result 持有,用于 GraphAtlas 构建。
成员
| 字段名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| name | std::string | 无 | 变体名称 |
| memory_plan | std::unique_ptr |
无 | 独立显存规划 |
| train | const ComputationGraph* | nullptr | 指向训练图的指针 |
| inference | const ComputationGraph* | nullptr | 指向推理图的指针 |
注意事项 train 和 inference 是非拥有指针,指向 Result::train_cg 和 Result::infer_cg。
CompileSpec
概述
CompileSpec 是单个编译变体的参数集,描述影响形状和拓扑的编译参数。
所属头文件:#include
设计定位:编译参数容器,用于区分不同输入 shape 和配置的编译变体。
是否有状态:无状态(stateless),纯数据结构。
继承关系:无继承。
典型使用路径:由 GlobalRegistry 生成或手动构造,传递给 Compiler::compile()。
典型使用代码:
// 从全局配置生成
auto spec = CompileSpec::from_global_registry();
// 手动构造
CompileSpec spec;
spec.amp_enabled = true;
spec.batch_size = 32;
spec.actual_resolution = 224;
spec.num_color_channels = 3;
成员
| 字段名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| amp_enabled | bool | false | 混合精度 |
| max_sample_resolution | int | 0 | MemoryPlan 最大槽位预留 |
| actual_resolution | int | 0 | 该变体的形状推导分辨率 |
| batch_size | int | 0 | 批次大小 |
| num_color_channels | int | 0 | 颜色通道数 |
| freeze_first_layer | bool | false | 运行时标志,不影响 MemoryPlan/ComputationGraph |
工厂方法
CompileSpec::from_global_registry()
签名
static CompileSpec from_global_registry();
功能简介 从 GlobalRegistry 构造 CompileSpec,自动填充各字段。
参数 无
返回值 返回填充好的 CompileSpec 对象
异常 无
查询接口
CompileSpec::get_shape_id() const noexcept
签名
ShapeId get_shape_id() const noexcept;
功能简介 转换为 ShapeId 四元组,用作 Phase B 的 CapturedGraph 去重键。
参数 无
返回值 返回 {batch_size, actual_resolution, actual_resolution, num_color_channels} 的 ShapeId
异常 无
ComputationGraph
概述
ComputationGraph 是纯算子拓扑容器,零形状信息,支持多变体共享。它存储图节点序列,供 CapturedGraph 捕获使用。
所属头文件:#include
设计定位:计算图的中间表示,只存储拓扑信息,形状和显存布局由 MemoryPlan 管理。
是否有状态:有状态(stateful),持有图节点序列。
继承关系:无继承。
典型使用路径:由 Compiler 构建,传递给 CapturedGraph::capture()。
典型使用代码:
// 用户通常不直接操作 ComputationGraph
// 由 Compiler 自动构建和使用
ComputationGraph cg;
cg.append(GraphId::DEEP_FWD_BWD, node);
auto nodes = cg.nodes(GraphId::DEEP_FWD_BWD);
构造与赋值
ComputationGraph::ComputationGraph() = default
签名
ComputationGraph() = default;
功能简介 默认构造函数,创建空计算图。
参数 无
返回值 无
异常 无
ComputationGraph::ComputationGraph(const ComputationGraph&) = delete
签名
ComputationGraph(const ComputationGraph&) = delete;
功能简介 拷贝构造函数(已删除)。
参数 无
返回值 无
异常 无
注意事项 禁止拷贝,只允许移动。
ComputationGraph::operator=(const ComputationGraph&) = delete
签名
ComputationGraph& operator=(const ComputationGraph&) = delete;
功能简介 拷贝赋值运算符(已删除)。
参数 无
返回值 无
异常 无
注意事项 禁止拷贝,只允许移动。
ComputationGraph::ComputationGraph(ComputationGraph&&) = default
签名
ComputationGraph(ComputationGraph&&) = default;
功能简介 移动构造函数。
参数 无
返回值 无
异常 无
ComputationGraph::operator=(ComputationGraph&&) = default
签名
ComputationGraph& operator=(ComputationGraph&&) = default;
功能简介 移动赋值运算符。
参数 无
返回值 返回 *this,支持链式调用
异常 无
修改接口
ComputationGraph::append(GraphId gid, GraphNode node)
签名
void append(GraphId gid, GraphNode node);
功能简介 向指定 GraphId 桶追加一个节点。
参数 | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | gid | GraphId | 无 | 目标子图标识 [in] | | node | GraphNode | 无 | 待追加的图节点 [in] |
返回值 无
异常 无
ComputationGraph::append(GraphId gid, const std::vector& nodes)
签名
void append(GraphId gid, const std::vector<GraphNode>& nodes);
功能简介 向指定 GraphId 桶批量追加节点。
参数 | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | gid | GraphId | 无 | 目标子图标识 [in] | | nodes | const std::vector
返回值 无
异常 无
ComputationGraph::append(GraphNode node)
签名
void append(GraphNode node);
功能简介 手动绘图模式:向线性节点列表追加节点(SimpleTask 专用)。
参数 | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | node | GraphNode | 无 | 待追加的图节点 [in] |
返回值 无
异常 无
注意事项 与 Compiler 自动构图的 GraphId 桶模式物理隔离。
ComputationGraph::append(ComputeOp op, std::vector input_ids, std::vector output_ids, OpParams params = {})
签名
void append(ComputeOp op,
std::vector<int32_t> input_ids,
std::vector<int32_t> output_ids,
OpParams params = {});
功能简介 标准式 append:自动包装为 COMPUTE 节点。
参数 | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | op | ComputeOp | 无 | 算子类型 [in] | | input_ids | std::vector
返回值 无
异常 无
ComputationGraph::append_range(GraphId gid, RangeOp op, std::vector inputs, std::vector outputs, OpParams params = {})
签名
void append_range(GraphId gid, RangeOp op,
std::vector<MemRange> inputs,
std::vector<MemRange> outputs,
OpParams params = {});
功能简介 RangeOp 便捷构图接口(V4.21 新增)。
参数 | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | gid | GraphId | 无 | 目标子图标识 [in] | | op | RangeOp | 无 | RangeOp 算子 [in] | | inputs | std::vectorMemRange 列表(延迟态) [in] | | outputs | std::vectorMemRange 列表(延迟态) [in] | | params | OpParams | {} | 算子参数 [in] |
返回值 无
异常 无
查询接口
ComputationGraph::nodes(GraphId gid) const
签名
const std::vector<GraphNode>& nodes(GraphId gid) const;
功能简介 获取指定 GraphId 桶的所有节点(只读)。
参数 | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | gid | GraphId | 无 | 子图标识 [in] |
返回值 返回节点序列的常量引用
异常 无
ComputationGraph::linear_nodes() const
签名
const std::vector<GraphNode>& linear_nodes() const;
功能简介 获取手动绘图线性节点列表。
参数 无
返回值 返回线性节点列表的常量引用
异常 无
ComputationGraph::total_node_count() const noexcept
签名
size_t total_node_count() const noexcept;
功能简介 获取图中全部节点总数。
参数 无
返回值 返回节点总数
异常 无
ComputationGraph::has_nccl_ops() const
签名
bool has_nccl_ops() const;
功能简介 检测图中是否包含 NCCL 集合操作(AllReduce 系列)。
参数 无
返回值 返回 true 表示包含 NCCL 操作,false 表示不包含
异常 无
ComputationGraph::has_nccl_ops(GraphId gid) const
签名
bool has_nccl_ops(GraphId gid) const;
功能简介 检测指定 GraphId 子图中是否包含 NCCL 集合操作。
参数 | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | gid | GraphId | 无 | 子图标识 [in] |
返回值 返回 true 表示包含 NCCL 操作,false 表示不包含
异常 无
调试接口
ComputationGraph::debug_dump(bool skip_empty = false) const
签名
std::string debug_dump(bool skip_empty = false) const;
功能简介 调试打印:遍历 GraphId 桶 + linear_nodes_。
参数 | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | skip_empty | bool | false | 为 true 时跳过空的 GraphId 桶 [in] |
返回值 返回调试信息字符串
异常 无
ComputationGraph::debug_dump_with_regions(bool skip_empty = false) const
签名
std::string debug_dump_with_regions(bool skip_empty = false) const;
功能简介 带 Region 信息的调试打印。与 debug_dump() 类似,但在输出 RANGE 节点时使用 MemRange 中存储的 Region ID,便于查看内存布局。
参数 | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | skip_empty | bool | false | 为 true 时跳过空的 GraphId 桶 [in] |
返回值 返回带 Region 信息的调试字符串
异常 无
GraphNode
概述
GraphNode 是计算图的统一节点类型,支持 COMPUTE(DTensor 级)和 RANGE(Region 级)两种操作模式。
所属头文件:#include
设计定位:图节点的统一表示,通过 Kind 区分不同操作模式。compute_op 与 range_op 以 union 形式共享存储空间,具体哪个字段有效由 kind 决定。
是否有状态:有状态(stateful),存储算子、参数和张量 ID。
继承关系:无继承。
典型使用路径:由 Compiler 构建,存储在 ComputationGraph 中。用户通常不直接构造 GraphNode,而是通过 ComputationGraph::append() 系列接口间接创建。
成员
| 字段名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| kind | Kind | Kind::COMPUTE | 节点类型 |
| compute_op | ComputeOp | - | DTensor 级操作(COMPUTE 态有效) |
| range_op | RangeOp | - | Region 级操作(RANGE 态有效) |
| params | OpParams | - | 算子参数 |
| input_ids | std::vector |
- | COMPUTE 态:输入 DTensor ID |
| output_ids | std::vector |
- | COMPUTE 态:输出 DTensor ID |
| input_ranges | std::vector |
- | RANGE 态:输入内存范围 |
| output_ranges | std::vector |
- | RANGE 态:输出内存范围 |
enum class GraphNode::Kind
概述
GraphNode::Kind 是节点类型枚举,区分 DTensor 级操作和 Region 级批量操作。
所属头文件:#include
设计定位:节点类型的类型安全标识。
是否有状态:无状态(stateless)。
继承关系:无继承。
| 枚举值 | 说明 |
|---|---|
COMPUTE |
DTensor 级操作 |
RANGE |
Region 级批量操作 |
enum class GraphId
概述
GraphId 是子图标识枚举,定义了 33 张有效子图的标识。
所属头文件:#include
设计定位:子图的类型安全标识,用于图索引和多流管理。
是否有状态:无状态(stateless)。
继承关系:无继承。
| 枚举值 | 说明 |
|---|---|
TRANSFER_A |
H2D 异步传输 A 区(双缓冲前半) |
TRANSFER_B |
H2D 异步传输 B 区(双缓冲后半) |
FIRST_LAYER_FWD_A |
首层前向 A(低分辨率) |
FIRST_LAYER_FWD_B |
首层前向 B(高分辨率) |
DEEP_FWD_BWD |
深层前向+反向融合 |
ZERO_GRAD |
梯度清零(前反向之间) |
FIRST_LAYER_BWD_A |
首层反向 A(写回 I_A_DATA) |
FIRST_LAYER_BWD_B |
首层反向 B(写回 I_B_DATA) |
FIRST_COMM |
首层梯度通信(桶2,仅 AllReduce) |
DEEP_COMM |
深层梯度通信(桶1,仅 AllReduce) |
CAST_DEEP_GRAD_FP16_TO_FP32 |
AMP 深层卷积梯度 FP16→FP32 |
CAST_FIRST_GRAD_FP16_TO_FP32 |
AMP 首层卷积梯度 FP16→FP32 |
NAN_CHECK_AND_GRAD_SCALING |
AMP NaN 检查 + 梯度缩放 |
STATS_COMM |
BN 统计量通信(仅同步 next_mean/next_var) |
UPDATE_STATS |
将同步后的 next 统计量复制到 prev |
OPTIMIZER |
优化器参数更新 |
EMA_UPDATE |
EMA 参数更新 |
INF_MAIN_A |
主模型推理 A |
INF_MAIN_B |
主模型推理 B |
INF_EMA_A |
EMA 模型推理 A |
INF_EMA_B |
EMA 模型推理 B |
CAST_MAIN_FP32_TO_FP16 |
主模型 FP32 权重转 FP16(shape 无关) |
CAST_EMA_FP32_TO_FP16 |
EMA 模型 FP32 权重转 FP16(shape 无关) |
ACCUM_METRICS |
常规 batch 累积 |
ACCUM_METRICS_TRAIN_LAST |
训练末 batch 累积 |
ACCUM_METRICS_VAL_LAST |
验证末 batch 累积 |
VAL_RESULT_COMM |
验证集 R_RESULT_ACCUMULATED AllReduce |
CLEAR_METRICS |
累积区清零 |
SIMPLE_TASK_GRAPH |
SimpleTask 通用图 ID |
LARS_FC_OPT |
FC 权重 LARS 优化 |
LARS_FIRST_CONV_OPT |
首层卷积 LARS 优化 |
LARS_DEEP_CONV_OPT |
深层卷积 LARS 优化 |
UPDATE_BN_INF_PARAMS |
训练后更新 BN 推理参数 |
COUNT |
哨兵值,总数 |
using NativeGraph
概述
NativeGraph 是 CUDA 后端图句柄的类型别名,使用 void* 避免在头文件中直接依赖 CUDA 运行时头文件。
所属头文件:#include
设计定位:CUDA Graph 执行句柄的跨平台不透明指针。
是否有状态:无状态(stateless)。
继承关系:无继承。
定义
using NativeGraph = void*;
struct CpuOp
概述
CpuOp 是 CPU 后端单个操作的描述,使用裸函数指针替代 std::function,栈分配且零虚调用。
所属头文件:#include
设计定位:CPU 后端函数队列的元素。
是否有状态:无状态(stateless)。
继承关系:无继承。
成员
| 字段名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
fn |
void ()(CpuOpContext) |
nullptr | 操作函数指针 |
ctx |
void* |
nullptr | 操作上下文指针 |
CapturedGraph
概述
CapturedGraph 是双后端可执行图,统一封装 CUDA Graph 和 CPU 函数队列。它提供了捕获和启动计算图的接口。
所属头文件:#include
设计定位:可执行图的统一表示,支持 CUDA 和 CPU 双后端。CUDA 后端使用 NativeGraph(即 void* 封装的 cudaGraphExec_t)按 rank 存储执行句柄;CPU 后端使用 std::vector 存储裸函数指针队列。
是否有状态:有状态(stateful),持有捕获的执行句柄。
继承关系:无继承。
典型使用路径:由 pre_capture() 创建,通过 GraphAtlas 索引,在运行时启动。
典型使用代码:
// 用户通常不直接操作 CapturedGraph
// 由 pre_capture() 自动创建和管理
auto graph = CapturedGraph::capture(cg, mp, gid, shape_id, stream, ctx);
graph.launch(rank, stream);
构造与析构
CapturedGraph::CapturedGraph() = default
签名
CapturedGraph() = default;
功能简介 默认构造函数,创建空捕获图。
参数 无
返回值 无
异常 无
CapturedGraph::~CapturedGraph()
签名
~CapturedGraph();
功能简介 析构函数,释放捕获的执行资源。
参数 无
返回值 无
异常 无
CapturedGraph::CapturedGraph(const CapturedGraph&) = delete
签名
CapturedGraph(const CapturedGraph&) = delete;
功能简介 拷贝构造函数(已删除)。
参数 无
返回值 无
异常 无
注意事项 禁止拷贝。
CapturedGraph::CapturedGraph(CapturedGraph&&) noexcept = default
签名
CapturedGraph(CapturedGraph&&) noexcept = default;
功能简介 移动构造函数。
参数 无
返回值 无
异常 无
捕获接口
CapturedGraph::capture(const ComputationGraph& cg, const MemoryPlan& mp, GraphId gid, ShapeId shape_id, StreamKind stream_kind, const DeviceContext& ctx)
签名
static CapturedGraph capture(const ComputationGraph& cg,
const MemoryPlan& mp,
GraphId gid,
ShapeId shape_id,
StreamKind stream_kind,
const DeviceContext& ctx);
功能简介 单 rank 捕获入口,创建并实例化可执行捕获图。
参数 | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | cg | const ComputationGraph& | 无 | 纯算子拓扑 [in] | | mp | const MemoryPlan& | 无 | 该变体的 MemoryPlan [in] | | gid | GraphId | 无 | 目标子图标识 [in] | | shape_id | ShapeId | 无 | 输入形状去重键 [in] | | stream_kind | StreamKind | 无 | 流类型 [in] | | ctx | const DeviceContext& | 无 | 设备上下文 [in] |
返回值 返回创建并实例化的可执行捕获图
异常 无
注意事项 per_rank_execs_ 已 resize(1)。
CapturedGraph::capture(const ComputationGraph& cg, const MemoryPlan& mp, GraphId gid, StreamKind stream, const DeviceContext& ctx)
签名
static CapturedGraph capture(const ComputationGraph& cg,
const MemoryPlan& mp,
GraphId gid,
StreamKind stream,
const DeviceContext& ctx);
功能简介 SimpleTask 专用简化捕获接口。
参数 | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | cg | const ComputationGraph& | 无 | 纯算子拓扑 [in] | | mp | const MemoryPlan& | 无 | MemoryPlan [in] | | gid | GraphId | 无 | 图 ID(必须是 SIMPLE_TASK_GRAPH + N) [in] | | stream | StreamKind | 无 | 执行流 [in] | | ctx | const DeviceContext& | 无 | 设备上下文 [in] |
返回值 返回创建并实例化的可执行捕获图
异常 无
注意事项 SimpleTask 必须使用 GraphId::SIMPLE_TASK_GRAPH 作为起始 ID。
执行接口
CapturedGraph::launch(int rank, void* stream) const
签名
void launch(int rank, void* stream) const;
功能简介 运行时启动该捕获图在指定 rank 上的执行。
参数 | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | rank | int | 无 | 目标 GPU rank [in] | | stream | void* | 无 | CUDA 流(CPU 后端忽略) [in] |
返回值 无
异常 无
查询接口
CapturedGraph::is_cuda() const noexcept
签名
[[nodiscard]] bool is_cuda() const noexcept;
功能简介 检查是否为 CUDA 后端。
参数 无
返回值 返回 true 表示 CUDA 后端,false 表示 CPU 后端
异常 无
CapturedGraph::key() const noexcept
签名
[[nodiscard]] const Key& key() const noexcept;
功能简介 获取捕获图的去重键。
参数 无
返回值 返回 Key 结构的常量引用
异常 无
CapturedGraph::num_ranks() const noexcept
签名
[[nodiscard]] size_t num_ranks() const noexcept;
功能简介 获取 rank 数量。
参数 无
返回值 返回 rank 数量
异常 无
调试接口
CapturedGraph::debug_dump() const
签名
std::string debug_dump() const;
功能简介 调试打印捕获图信息。
参数 无
返回值 返回调试信息字符串
异常 无
struct CapturedGraph::Key
概述
CapturedGraph::Key 是捕获图的去重键,用于 Phase B 的去重和索引。
所属头文件:#include
设计定位:去重键数据结构,用于捕获图的哈希和比较。
是否有状态:无状态(stateless)。
继承关系:无继承。
成员
| 字段名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| cg | const ComputationGraph* | nullptr | 计算图指针 |
| gid | GraphId | GraphId::TRANSFER_A | 子图标识 |
| shape | ShapeId | {} | 形状标识 |
运算符重载
CapturedGraph::Key::operator==(const Key& o) const noexcept
签名
bool operator==(const Key& o) const noexcept;
功能简介 比较两个去重键是否相等。
参数 | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | o | const Key& | 无 | 另一个去重键 [in] |
返回值 返回 true 表示相等,false 表示不等
异常 无
struct CapturedGraph::KeyHash
概述
CapturedGraph::KeyHash 是 CapturedGraph::Key 的哈希函数对象,用于 unordered_map 去重。
所属头文件:#include
设计定位:为去重键提供哈希支持。
是否有状态:无状态(stateless)。
继承关系:无继承。
成员
CapturedGraph::KeyHash::operator()(const Key& k) const noexcept
签名
size_t operator()(const Key& k) const noexcept;
功能简介 计算 Key 的哈希值。
参数 | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | k | const Key& | 无 | 去重键 [in] |
返回值 返回哈希值
异常 无
GraphAtlas
概述
GraphAtlas 是图集映射表,提供 6 变体 × 33 子图的三阶段桥梁。它实现了编译期、预演期和运行期的无缝衔接。
所属头文件:#include
设计定位:图集映射表,连接编译、捕获和执行三个阶段。
是否有状态:有状态(stateful),持有映射表。
继承关系:无继承。
典型使用路径:由 GraphAtlas::build() 构建,传递给 pre_capture(),在运行时索引。
典型使用代码:
// Phase A: 构建图集
auto atlas = GraphAtlas::build(result, input_shapes);
// Phase B: 填充捕获索引
auto pre_result = pre_capture(atlas, contexts);
// Phase C: 运行时索引
int32_t idx = atlas.index(variant, gid);
if (idx >= 0) {
captured_graphs[idx].launch(rank, stream);
}
Phase A 接口
GraphAtlas::build(const Compiler::Result& result, const std::array& input_shapes)
签名
static GraphAtlas build(const Compiler::Result& result,
const std::array<ShapeId, 6>& input_shapes);
功能简介 构建图集 —— 填入 cg / mp / shape_id。
参数 | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | result | const Compiler::Result& | 无 | 编译结果 [in] | | input_shapes | const std::array
返回值 返回已填入逻辑归属的 GraphAtlas
异常 无
注意事项 shape 无关图全部变体指向 base MemoryPlan,shape 相关训练图 4 个训练变体各自 MemoryPlan,val 变体不填训练图,train 变体不填推理图。
Phase A / B 共享接口
GraphAtlas::slot(size_t variant_idx, uint8_t graph_id_idx)
签名
Slot& slot(size_t variant_idx, uint8_t graph_id_idx) noexcept;
const Slot& slot(size_t variant_idx, uint8_t graph_id_idx) const noexcept;
功能简介 获取指定槽位的读写引用。
参数 | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | variant_idx | size_t | 无 | 变体索引 [in] | | graph_id_idx | uint8_t | 无 | 图 ID 索引 [in] |
返回值 返回槽位的引用
异常 无
注意事项 Phase A(build)和 Phase B(pre_capture)都需要修改 Slot 不同字段。
Phase C 接口
GraphAtlas::index(size_t variant, GraphId gid) const noexcept
签名
int32_t index(size_t variant, GraphId gid) const noexcept;
功能简介 Phase C 运行时 —— O(1) 数组访问。
参数 | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | variant | size_t | 无 | 变体索引 0~5 [in] | | gid | GraphId | 无 | 子图标识 [in] |
返回值 返回 captured_ vector 中的索引,-1 表示未捕获/不适用
异常 无
注意事项 纯数组索引操作,零 hash,零分支,零捕获。
struct GraphAtlas::Slot
概述
GraphAtlas::Slot 是图集中的一格,存储逻辑归属和捕获索引。
所属头文件:#include
设计定位:槽位数据结构,在三阶段中逐步填充。
是否有状态:有状态(stateful)。
继承关系:无继承。
成员
| 字段名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| cg | const ComputationGraph* | nullptr | Phase A: 共享拓扑指针 |
| mp | const MemoryPlan* | nullptr | Phase A: 变体特有 MemoryPlan |
| shape_id | ShapeId | {} | Phase A: 去重键 |
| stream_kind | StreamKind | StreamKind::COMP_1 | 流类型 |
| captured_idx | int32_t | -1 | Phase B: captured_ 中的索引 |
注意事项 Phase A(编译期):填入 cg, mp, shape_id。Phase B(预演期):填入 captured_idx。
MemoryPlan
概述
MemoryPlan 是基于 69-Region 规范的显存布局引擎,提供一遍线性累加布局和语义化分配接口。它是显存管理的唯一权威。
所属头文件:#include
设计定位:显存布局引擎,负责所有 DTensor 的分配和布局。
是否有状态:有状态(stateful),管理显存分配和 DTensor 映射。
继承关系:无继承。
典型使用路径:由 Compiler 构建,传递给 CapturedGraph 和执行器。
典型使用代码:
// 用户通常不直接操作 MemoryPlan
// 由 Compiler 自动创建和管理
MemoryPlan mp(config);
mp.alloc_baseline_dtensors(label_shape, data_shape, dtype, opt);
auto w = mp.alloc_first_conv_weight(shape);
mp.finalize();
构造与析构
MemoryPlan::MemoryPlan(const PlanConfig& config)
签名
explicit MemoryPlan(const PlanConfig& config);
功能简介 构造显存规划器。
参数 | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | config | const PlanConfig& | 无 | 规划配置 [in] |
返回值 无
异常 无
MemoryPlan::~MemoryPlan()
签名
~MemoryPlan();
功能简介 析构函数,释放显存规划资源。
参数 无
返回值 无
异常 无
注意事项 禁止拷贝,允许移动。
语义化分配接口
MemoryPlan::alloc_bn_stats(const Shape& shape)
签名
BNStatsBuffers alloc_bn_stats(const Shape& shape);
功能简介 分配 BN 统计量缓冲区(4 个 Region)。
参数 | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | shape | const Shape& | 无 | 统计量形状 [in] |
返回值 返回包含 4 个 DTensor 的 BNStatsBuffers 结构
异常 无
注意事项 一次性分配 4 个 Region(prev_mean, prev_var, next_mean, next_var),Shape 必须一致。
MemoryPlan::alloc_eq_bias(const Shape& shape)
签名
DTensor alloc_eq_bias(const Shape& shape);
功能简介 分配 BN 等效偏置(W_EQ_BIAS Region)。
参数 | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | shape | const Shape& | 无 | 偏置形状 [in] |
返回值 返回分配的 DTensor
异常 无
MemoryPlan::alloc_eq_scale(const Shape& shape)
签名
DTensor alloc_eq_scale(const Shape& shape);
功能简介 分配 BN 等效缩放(W_EQ_SCALE Region)。
参数 | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | shape | const Shape& | 无 | 缩放形状 [in] |
返回值 返回分配的 DTensor
异常 无
MemoryPlan::alloc_bn_bias(const Shape& shape)
签名
DTensor alloc_bn_bias(const Shape& shape);
功能简介 分配 BN 偏置参数(W_BN_BIAS Region)。
参数 | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | shape | const Shape& | 无 | 偏置形状 [in] |
返回值 返回分配的 DTensor
异常 无
MemoryPlan::alloc_bn_weight(const Shape& shape)
签名
DTensor alloc_bn_weight(const Shape& shape);
功能简介 分配 BN 权重参数(W_BN_WEIGHT Region)。
参数 | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | shape | const Shape& | 无 | 权重形状 [in] |
返回值 返回分配的 DTensor
异常 无
MemoryPlan::alloc_fc_bias(const Shape& shape)
签名
DTensor alloc_fc_bias(const Shape& shape);
功能简介 分配全连接层偏置(W_FC_BIAS Region)。
参数 | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | shape | const Shape& | 无 | 偏置形状 [in] |
返回值 返回分配的 DTensor
异常 无
MemoryPlan::alloc_first_conv_weight(const Shape& shape)
签名
DTensor alloc_first_conv_weight(const Shape& shape);
功能简介 分配首层卷积权重(W_FIRST_CONV)。
参数 | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | shape | const Shape& | 无 | 权重形状 [in] |
返回值 返回分配的 DTensor
异常 无
MemoryPlan::alloc_deep_conv_weight(const Shape& shape)
签名
DTensor alloc_deep_conv_weight(const Shape& shape);
功能简介 分配深层卷积权重(W_DEEP_CONV)。
参数 | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | shape | const Shape& | 无 | 权重形状 [in] |
返回值 返回分配的 DTensor
异常 无
MemoryPlan::alloc_fc_weight(const Shape& shape)
签名
DTensor alloc_fc_weight(const Shape& shape);
功能简介 分配全连接层权重(W_FC_WEIGHT)。
参数 | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | shape | const Shape& | 无 | 权重形状 [in] |
返回值 返回分配的 DTensor
异常 无
EMA 权重分配接口
| 方法 | 签名 | 说明 |
|---|---|---|
alloc_ema_bn_bias() |
DTensor alloc_ema_bn_bias(const Shape& shape) |
分配 EMA BN 偏置(E 系列 Region) |
alloc_ema_bn_weight() |
DTensor alloc_ema_bn_weight(const Shape& shape) |
分配 EMA BN 权重 |
alloc_ema_fc_bias() |
DTensor alloc_ema_fc_bias(const Shape& shape) |
分配 EMA FC 偏置 |
alloc_ema_fc_weight() |
DTensor alloc_ema_fc_weight(const Shape& shape) |
分配 EMA FC 权重 |
alloc_ema_first_conv() |
DTensor alloc_ema_first_conv(const Shape& shape) |
分配 EMA 首层卷积权重 |
alloc_ema_deep_conv() |
DTensor alloc_ema_deep_conv(const Shape& shape) |
分配 EMA 深层卷积权重 |
alloc_ema_fc_weight_fp16() |
DTensor alloc_ema_fc_weight_fp16(const Shape& shape) |
分配 EMA FC FP16 权重 |
alloc_ema_first_conv_fp16() |
DTensor alloc_ema_first_conv_fp16(const Shape& shape) |
分配 EMA 首层卷积 FP16 权重 |
alloc_ema_deep_conv_fp16() |
DTensor alloc_ema_deep_conv_fp16(const Shape& shape) |
分配 EMA 深层卷积 FP16 权重 |
参数 | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | shape | const Shape& | 无 | 目标张量形状 [in] |
返回值 返回分配的 DTensor
异常 无
AMP FP16 权重分配接口
| 方法 | 签名 | 说明 |
|---|---|---|
alloc_amp_fc_weight() |
DTensor alloc_amp_fc_weight(const Shape& shape) |
分配 AMP FC 权重(A 系列 Region) |
alloc_amp_first_conv() |
DTensor alloc_amp_first_conv(const Shape& shape) |
分配 AMP 首层卷积权重 |
alloc_amp_deep_conv() |
DTensor alloc_amp_deep_conv(const Shape& shape) |
分配 AMP 深层卷积权重 |
参数 | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | shape | const Shape& | 无 | 目标张量形状 [in] |
返回值 返回分配的 DTensor
异常 无
梯度分配接口
| 方法 | 签名 | 说明 |
|---|---|---|
alloc_grad_bn_bias() |
DTensor alloc_grad_bn_bias(const Shape& shape) |
分配 BN 偏置梯度(G 系列 Region) |
alloc_grad_bn_weight() |
DTensor alloc_grad_bn_weight(const Shape& shape) |
分配 BN 权重梯度 |
alloc_grad_fc_bias() |
DTensor alloc_grad_fc_bias(const Shape& shape) |
分配 FC 偏置梯度 |
alloc_grad_fc_weight() |
DTensor alloc_grad_fc_weight(const Shape& shape) |
分配 FC 权重梯度 |
alloc_grad_first_conv() |
DTensor alloc_grad_first_conv(const Shape& shape) |
分配首层卷积梯度 |
alloc_grad_deep_conv() |
DTensor alloc_grad_deep_conv(const Shape& shape) |
分配深层卷积梯度 |
alloc_grad_fc_weight_fp16() |
DTensor alloc_grad_fc_weight_fp16(const Shape& shape) |
分配 FC 权重 FP16 梯度 |
alloc_grad_first_conv_fp16() |
DTensor alloc_grad_first_conv_fp16(const Shape& shape) |
分配首层卷积 FP16 梯度 |
alloc_grad_deep_conv_fp16() |
DTensor alloc_grad_deep_conv_fp16(const Shape& shape) |
分配深层卷积 FP16 梯度 |
参数 | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | shape | const Shape& | 无 | 目标张量形状 [in] |
返回值 返回分配的 DTensor
异常 无
MemoryPlan::alloc_feature(const Shape& shape, DType dtype)
签名
DTensor alloc_feature(const Shape& shape, DType dtype);
功能简介 分配特征图(F 特征图 Region)。
参数 | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | shape | const Shape& | 无 | 特征图形状 [in] | | dtype | DType | 无 | 数据类型 [in] |
返回值 返回分配的 DTensor
异常 无
MemoryPlan::alloc_grad_slot(const Shape& shape, DType dtype, int slot_idx)
签名
DTensor alloc_grad_slot(const Shape& shape, DType dtype, int slot_idx);
功能简介 分配梯度槽(G 梯度 Region)。
参数 | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | shape | const Shape& | 无 | 梯度形状 [in] | | dtype | DType | 无 | 数据类型 [in] | | slot_idx | int | 无 | 槽索引 [in] |
返回值 返回分配的 DTensor
异常 无
一阶动量分配接口
| 方法 | 签名 | 说明 |
|---|---|---|
alloc_momentum_bn_bias() |
DTensor alloc_momentum_bn_bias(const Shape& shape) |
分配 BN 偏置一阶动量(M 系列 Region) |
alloc_momentum_bn_weight() |
DTensor alloc_momentum_bn_weight(const Shape& shape) |
分配 BN 权重一阶动量 |
alloc_momentum_fc_bias() |
DTensor alloc_momentum_fc_bias(const Shape& shape) |
分配 FC 偏置一阶动量 |
alloc_momentum_fc_weight() |
DTensor alloc_momentum_fc_weight(const Shape& shape) |
分配 FC 权重一阶动量 |
alloc_momentum_first_conv() |
DTensor alloc_momentum_first_conv(const Shape& shape) |
分配首层卷积一阶动量 |
alloc_momentum_deep_conv() |
DTensor alloc_momentum_deep_conv(const Shape& shape) |
分配深层卷积一阶动量 |
参数 | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | shape | const Shape& | 无 | 目标张量形状 [in] |
返回值 返回分配的 DTensor
异常 无
二阶动量(速度)分配接口
| 方法 | 签名 | 说明 |
|---|---|---|
alloc_velocity_bn_bias() |
DTensor alloc_velocity_bn_bias(const Shape& shape) |
分配 BN 偏置二阶动量(V 系列 Region) |
alloc_velocity_bn_weight() |
DTensor alloc_velocity_bn_weight(const Shape& shape) |
分配 BN 权重二阶动量 |
alloc_velocity_fc_bias() |
DTensor alloc_velocity_fc_bias(const Shape& shape) |
分配 FC 偏置二阶动量 |
alloc_velocity_fc_weight() |
DTensor alloc_velocity_fc_weight(const Shape& shape) |
分配 FC 权重二阶动量 |
alloc_velocity_first_conv() |
DTensor alloc_velocity_first_conv(const Shape& shape) |
分配首层卷积二阶动量 |
alloc_velocity_deep_conv() |
DTensor alloc_velocity_deep_conv(const Shape& shape) |
分配深层卷积二阶动量 |
参数 | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | shape | const Shape& | 无 | 目标张量形状 [in] |
返回值 返回分配的 DTensor
异常 无
LARS 范数分配接口
| 方法 | 签名 | 说明 |
|---|---|---|
alloc_norm_fc_weight() |
DTensor alloc_norm_fc_weight(const Shape& shape) |
分配 FC 权重 LARS 范数(N 系列 Region) |
alloc_norm_first_conv() |
DTensor alloc_norm_first_conv(const Shape& shape) |
分配首层卷积 LARS 范数 |
alloc_norm_deep_conv() |
DTensor alloc_norm_deep_conv(const Shape& shape) |
分配深层卷积 LARS 范数 |
参数 | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | shape | const Shape& | 无 | 目标张量形状 [in] |
返回值 返回分配的 DTensor
异常 无
MemoryPlan::alloc_input_buffers()
签名
InputBuffers alloc_input_buffers();
InputBuffers alloc_input_buffers(const Shape& label_shape,
const Shape& data_shape,
DType dtype);
功能简介 分配输入缓冲区(I 输入 Region)。
参数 | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | label_shape | const Shape& | 无 | 标签形状 [in] | | data_shape | const Shape& | 无 | 数据形状 [in] | | dtype | DType | 无 | 数据类型 [in] |
返回值 返回包含 4 个 DTensor 的 InputBuffers 结构
异常 无
通用分配接口
MemoryPlan::alloc(const Shape& shape, DType dtype, Region region)
签名
[[nodiscard]] DTensor alloc(const Shape& shape, DType dtype, Region region);
功能简介 通用分配接口(模型编译场景核心入口,对外开放)。
参数 | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | shape | const Shape& | 无 | 张量形状 [in] | | dtype | DType | 无 | 数据类型 [in] | | region | Region | 无 | 内存分区 [in] |
返回值 返回分配的 DTensor
异常 无
注意事项 这是公开的通用分配接口,用于模型编译和自定义分配场景。
布局锁定
MemoryPlan::finalize()
签名
void finalize();
功能简介 锁定显存布局,计算最终偏移。
参数 无
返回值 无
异常 无
注意事项 锁定后不能再分配新的 DTensor。
MemoryPlan::is_finalized() const noexcept
签名
[[nodiscard]] bool is_finalized() const noexcept;
功能简介 检查是否已锁定布局。
参数 无
返回值 返回 true 表示已锁定,false 表示未锁定
异常 无
MemoryPlan::total_bytes() const
签名
[[nodiscard]] uint64_t total_bytes() const;
功能简介 获取显存布局总字节数。
参数 无
返回值 返回总字节数
异常 无
运行期查询
MemoryPlan::get_dtensor(int32_t id) const
签名
[[nodiscard]] const DTensor& get_dtensor(int32_t id) const;
功能简介 获取指定 ID 的 DTensor。
参数 | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | id | int32_t | 无 | DTensor 全局 ID [in] |
返回值 返回 DTensor 的常量引用
异常 无
MemoryPlan::has_dtensor(int32_t id) const noexcept
签名
[[nodiscard]] bool has_dtensor(int32_t id) const noexcept;
功能简介 检查是否存在指定 ID 的 DTensor。
参数 | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | id | int32_t | 无 | DTensor 全局 ID [in] |
返回值 返回 true 表示存在,false 表示不存在
异常 无
MemoryPlan::dtensors() const
签名
[[nodiscard]] const std::vector<DTensor>& dtensors() const;
功能简介 获取所有 DTensor。
参数 无
返回值 返回 DTensor 向量的常量引用
异常 无
MemoryPlan::get_region_info(Region region) const
签名
[[nodiscard]] RegionInfo get_region_info(Region region) const;
功能简介 获取指定 Region 的信息。
参数 | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | region | Region | 无 | 内存分区 [in] |
返回值 返回包含偏移和大小的 RegionInfo 结构
异常 无
MemoryPlan::get_ids_by_region(Region region) const
签名
[[nodiscard]] const std::vector<int32_t>& get_ids_by_region(Region region) const;
功能简介 获取指定 Region 中的所有 DTensor ID。
参数 | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | region | Region | 无 | 内存分区 [in] |
返回值 返回 DTensor ID 向量的常量引用
异常 无
enum class ComputeOp
概述
ComputeOp 是计算算子类型枚举,定义了所有支持的算子类型。
所属头文件:#include
设计定位:算子类型的类型安全标识。
是否有状态:无状态(stateless)。
继承关系:无继承。
主要算子类别:
基础元素级:IDENTITY_FWD、ADD_FWD、MUL_FWD、AXPY_FWD
激活函数:RELU_FP32_FWD、RELU_AMP_FWD、SILU_FP32_FWD、TANH_FP32_FWD 等
卷积:CONV_FP32_FWD、CONV_AMP_FWD、CONV_FP32_BWD、CONV_AMP_BWD
BatchNorm:BN1D_AMP_FWD、BN2D_AMP_FWD、BN1D_FP32_FWD、BN2D_FP32_FWD
池化:MAXPOOL_FP32_FWD、AVGPOOL_FP32_FWD、GAP_FP32_FWD
全连接:FC_FP32_FWD、FC_AMP_FWD
融合算子:BOTTLENECK_AMP_FWD、GAP_FC_FP32_FWD、CBR_AMP_FWD
损失函数:SOFTMAX_CE_FP32_FWD、SOFTMAX_CE_AMP_FWD
通信:ALLREDUCE_SUM、BROADCAST、BN_STATS_SYNC
优化器:SGD_UPDATE、LARS_UPDATE、ADAMW_UPDATE、EMA_UPDATE
enum class RangeOp
概述
RangeOp 是范围算子类型枚举,定义了所有基于内存范围的算子。
所属头文件:#include
设计定位:Region 级批量操作的类型安全标识。
是否有状态:无状态(stateless)。
继承关系:无继承。
主要算子类别:
数据传输:RANGE_H2D_COPY_A、RANGE_H2D_COPY_B、RANGE_H2D_COPY_DTENSOR
通信:RANGE_BN_STATS_ALLREDUCE、RANGE_SUM_ALLREDUCE、RANGE_MEAN_ALLREDUCE
优化器:RANGE_UPDATE_BIAS_SGD、RANGE_UPDATE_WEIGHT_ADAMW、RANGE_EMA_PARAM_UPDATE
内存操作:RANGE_CLEAR、RANGE_D2D_COPY
类型转换:RANGE_CAST_FP32_TO_FP16、RANGE_CAST_FP16_TO_FP32
梯度处理:RANGE_CHECK_NAN、RANGE_GRAD_SCALING
struct OpParams
概述
OpParams 是算子参数包装器,使用 std::variant 支持多种算子参数类型。
所属头文件:#include
设计定位:类型安全的算子参数容器。
是否有状态:有状态(stateful),存储算子参数。
继承关系:无继承。
支持的参数类型:
ConvParams、PoolParams、FCParams、BNParams、LossParams、UpdateParams、EMAParams、AllReduceParams、AxpyParams、CastParams、FlattenParams、CBRParams、BottleneckParams、GapFCParams、DropoutParams、GradClipParams
成员
| 字段名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| data | std::variant<...> | std::monostate{} | 参数数据 |
访问方法
OpParams::is_empty() const
签名
bool is_empty() const;
功能简介 检查参数是否为空。
参数 无
返回值 返回 true 表示参数为空,false 表示有参数
异常 无
OpParams::conv() const
签名
const ConvParams& conv() const;
功能简介 获取卷积参数。
参数 无
返回值 返回卷积参数的常量引用
异常 无
OpParams::operator==(const ShapeId& o) const noexcept
以下访问器按参数类型提供对应的 getter 方法,语义与 conv() 一致:返回对应参数类型的常量引用。
| 方法 | 返回类型 | 说明 |
|---|---|---|
pool() |
const PoolParams& |
获取池化参数 |
fc() |
const FCParams& |
获取全连接参数 |
bn() |
const BNParams& |
获取 BN 参数 |
loss() |
const LossParams& |
获取损失函数参数 |
update() |
const UpdateParams& |
获取优化器更新参数 |
ema() |
const EMAParams& |
获取 EMA 参数 |
allreduce() |
const AllReduceParams& |
获取 AllReduce 参数 |
axpy() |
const AxpyParams& |
获取 AXPY 参数 |
cast() |
const CastParams& |
获取类型转换参数 |
flatten() |
const FlattenParams& |
获取 Flatten 参数 |
cbr() |
const CBRParams& |
获取 CBR 参数 |
bottleneck() |
const BottleneckParams& |
获取 Bottleneck 参数 |
gap_fc() |
const GapFCParams& |
获取 GAP-FC 参数 |
dropout() |
const DropoutParams& |
获取 Dropout 参数 |
grad_clip() |
const GradClipParams& |
获取梯度裁剪参数 |
has_grad_clip() |
bool |
检查是否包含梯度裁剪参数 |
异常 所有 getter 方法在 variant 类型不匹配时抛出 std::bad_variant_access。
struct ShapeId
概述
ShapeId 是形状去重键,显式四元组 (N, H, W, C),用于 CUDA Graph 的跨变体去重。
所属头文件:#include
设计定位:确定性去重键,用于捕获图的去重和索引。
是否有状态:无状态(stateless)。
继承关系:无继承。
成员
| 字段名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| n | int32_t | 0 | batch 维度 |
| h | int32_t | 0 | 高度 |
| w | int32_t | 0 | 宽度 |
| c | int32_t | 0 | 通道数 |
运算符重载
ShapeId::operator==(const ShapeId& o) const noexcept
签名
bool operator==(const ShapeId& o) const noexcept;
功能简介 相等比较。
参数 | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | o | const ShapeId& | 无 | 比较对象 [in] |
返回值 返回 true 表示相等,false 表示不等
异常 无
ShapeId::to_string() const
签名
std::string to_string() const;
功能简介 转换为字符串。
参数 无
返回值 返回格式为 "{n,h,w,c}" 的字符串
异常 无
struct MemRange
概述
MemRange 是内存范围描述符,描述 RangeOp 的操作范围。
所属头文件:#include
设计定位:范围描述符,用于 Region 级批量操作。
是否有状态:无状态(stateless)。
继承关系:无继承。
成员
| 字段名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| offset | uint64_t | 0 | 起始字节偏移 |
| size | uint64_t | 0 | 字节大小 |
| start_region_id | int32_t | -1 | 起始区域ID |
| end_region_id | int32_t | -1 | 结束区域ID |
struct PreCaptureResult
概述
PreCaptureResult 是 Phase B 输出结构,包含去重后的捕获图和图集。
所属头文件:#include
设计定位:Phase B 的输出数据结构。
是否有状态:有状态(stateful)。
继承关系:无继承。
成员
| 字段名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| graphs | std::vector |
无 | 去重后的捕获图 |
| atlas | GraphAtlas | 无 | 已填充 captured_idx 的图集 |
| total_slots | size_t | 0 | 总槽位数 |
| captured | size_t | 0 | 捕获数量 |
| reused | size_t | 0 | 复用数量 |
LayerDescriptor
概述
LayerDescriptor 是单层算子的函数指针表,定义了层知识契约。每个 LayerKind 对应一个不可变的 LayerDescriptor 实例。
所属头文件:#include
设计定位:层知识契约,实现 Compile 阶段与 Backend 的解耦。
是否有状态:无状态(stateless),只包含函数指针。
继承关系:无继承。
典型使用路径:通过 get_layer_descriptor() 获取,Compiler 通过函数指针调用。
成员
| 字段名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| infer_tensors | InferFn | 无 | 返回三模式张量并集 |
| build_forward | BuildFn | 无 | 构建前向子图模式 |
| build_backward | BuildFn | 无 | 构建反向子图模式 |
| build_inference | BuildFn | 无 | 构建推理子图模式 |
struct TensorDesc
概述
TensorDesc 是单个张量的完整描述,包含名称、形状、Region 和数据类型。
所属头文件:#include
设计定位:张量描述符,用于编译期的形状推导和验证。
是否有状态:无状态(stateless)。
继承关系:无继承。
成员
| 字段名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| name | std::string | 无 | 张量语义名称 |
| shape | Shape | 无 | 该变体下的逻辑形状 |
| region | Region | 无 | 所属 65 个 Region 之一 |
| dtype | DType | 无 | 数据类型 |
struct InferContext
概述
InferContext 是 infer_tensors 的调用上下文,传递当前编译模式和参数。
所属头文件:#include
设计定位:推导上下文,让 LayerDescriptor 根据模式决定所需张量。
是否有状态:无状态(stateless)。
继承关系:无继承。
成员
| 字段名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| mode | GraphMode | 无 | TRAIN_FORWARD / TRAIN_BACKWARD / INFERENCE |
| enable_amp | bool | false | 是否启用混合精度 |
| is_first_layer | bool | false | 是否为首层 |
| bn_folded | bool | false | BN 是否折叠入 Conv |
| batch_size | int | 1 | 批次大小 |
struct SubgraphPattern
概述
SubgraphPattern 是算子子图模式,不含形状信息,只描述算子拓扑。
所属头文件:#include
设计定位:子图模式描述符,用于计算图构建。
是否有状态:有状态(stateful),存储节点序列。
继承关系:无继承。
成员
| 字段名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| nodes | std::vector |
无 | 节点序列 |
独立函数
概述
Graph 模块提供了一组工厂函数与工具函数。工厂函数用于创建 Layer 对象(包括基础层、容器、预融合模块和高层块);工具函数提供算子/图 ID 字符串转换、输出形状计算、编译辅助等能力。所有函数都在 tr 命名空间中。
所属头文件:#include
设计定位:工厂函数是构建模型的唯一方式,每个函数对应一种网络层或组合模式。
是否有状态:无状态(stateless)。
继承关系:无继承。
典型使用路径:直接调用工厂函数 → 返回 Layer 对象 → 组合为复杂模型。
典型使用代码:
// 基础层
auto conv_layer = conv(64, 3, 1, 1);
auto bn_layer = bn();
auto relu_layer = relu();
// 容器
auto seq_layer = seq(conv_layer, bn_layer, relu_layer);
auto add_layer = add2(layer1, layer2);
auto repeat_layer = repeat(block_layer, 3);
// 预融合模块
auto cbr_layer = cbr(64, 3, 1, 1);
auto gap_fc_layer = gap_fc(1000, true);
基础层工厂函数
conv(int out_ch, int k, int s = 1, int p = 0)
签名
Layer conv(int out_ch, int k, int s = 1, int p = 0);
功能简介 创建标准 2D 卷积层。
参数 | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | out_ch | int | 无 | 输出通道数 [in] | | k | int | 无 | 卷积核大小(宽高相同) [in] | | s | int | 1 | 步长 [in] | | p | int | 0 | 填充 [in] |
返回值 返回表示卷积层的 Layer 对象
异常 无
conv_dw(int k, int s = 1, int p = 0)
签名
Layer conv_dw(int k, int s = 1, int p = 0);
功能简介 创建深度可分离卷积的深度卷积(Depthwise Conv)层。
参数 | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | k | int | 无 | 卷积核大小 [in] | | s | int | 1 | 步长 [in] | | p | int | 0 | 填充 [in] |
返回值 返回表示深度可分离卷积层的 Layer 对象
异常 无
group_conv(int out_ch, int groups, int k, int s = 1, int p = 0)
签名
Layer group_conv(int out_ch, int groups, int k, int s = 1, int p = 0);
功能简介 创建分组卷积层。
参数 | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | out_ch | int | 无 | 输出通道数 [in] | | groups | int | 无 | 分组数 [in] | | k | int | 无 | 卷积核大小 [in] | | s | int | 1 | 步长 [in] | | p | int | 0 | 填充 [in] |
返回值 返回表示分组卷积层的 Layer 对象
异常 无
bn(double momentum = 0.1, double eps = 1e-5)
签名
Layer bn(double momentum = 0.1, double eps = 1e-5);
功能简介 创建 BatchNorm2D 层。
参数 | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | momentum | double | 0.1 | 动量 [in] | | eps | double | 1e-5 | epsilon [in] |
返回值 返回表示 BatchNorm 层的 Layer 对象
异常 无
relu()
签名
Layer relu();
功能简介 创建 ReLU 激活层。
参数 无
返回值 返回表示 ReLU 层的 Layer 对象
异常 无
tanh_act()
签名
Layer tanh_act();
功能简介 创建 Tanh 激活层。
参数 无
返回值 返回表示 Tanh 层的 Layer 对象
异常 无
silu()
签名
Layer silu();
功能简介 创建 SiLU(Swish)激活层。
参数 无
返回值 返回表示 SiLU 层的 Layer 对象
异常 无
relu6()
签名
Layer relu6();
功能简介 创建 ReLU6 激活层。
参数 无
返回值 返回表示 ReLU6 层的 Layer 对象
异常 无
leaky_relu()
签名
Layer leaky_relu();
功能简介 创建 LeakyReLU 激活层。
参数 无
返回值 返回表示 LeakyReLU 层的 Layer 对象
异常 无
hardswish()
签名
Layer hardswish();
功能简介 创建 Hardswish 激活层。
参数 无
返回值 返回表示 Hardswish 层的 Layer 对象
异常 无
elu()
签名
Layer elu();
功能简介 创建 ELU 激活层。
参数 无
返回值 返回表示 ELU 层的 Layer 对象
异常 无
sigmoid()
签名
Layer sigmoid();
功能简介 创建 Sigmoid 激活层。
参数 无
返回值 返回表示 Sigmoid 层的 Layer 对象
异常 无
dropout(float p)
签名
Layer dropout(float p);
功能简介 创建 Dropout 层。
参数 | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | p | float | 无 | 丢弃率 [0.0, 1.0) [in] |
返回值 返回表示 Dropout 层的 Layer 对象
异常 无
flatten(int start_dim = 1)
签名
Layer flatten(int start_dim = 1);
功能简介 创建 Flatten 层。
参数 | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | start_dim | int | 1 | 开始展平的维度 [in] |
返回值 返回表示 Flatten 层的 Layer 对象
异常 无
maxpool(int k, int s, int p)
签名
Layer maxpool(int k, int s, int p);
功能简介 创建最大池化层。
参数 | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | k | int | 无 | 池化核大小 [in] | | s | int | 无 | 步长 [in] | | p | int | 无 | 填充 [in] |
返回值 返回表示最大池化层的 Layer 对象
异常 无
avgpool(int k, int s, int p)
签名
Layer avgpool(int k, int s, int p);
功能简介 创建平均池化层。
参数 | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | k | int | 无 | 池化核大小 [in] | | s | int | 无 | 步长 [in] | | p | int | 无 | 填充 [in] |
返回值 返回表示平均池化层的 Layer 对象
异常 无
gap()
签名
Layer gap();
功能简介 创建全局平均池化层。
参数 无
返回值 返回表示 GAP 层的 Layer 对象
异常 无
fc(int out_features, bool bias)
签名
Layer fc(int out_features, bool bias);
功能简介 创建全连接层。
参数 | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | out_features | int | 无 | 输出特征数 [in] | | bias | bool | 无 | 是否使用偏置 [in] |
返回值 返回表示全连接层的 Layer 对象
异常 无
identity()
签名
Layer identity();
功能简介 创建恒等映射层(用于占位或残差连接)。
参数 无
返回值 返回表示恒等映射的 Layer 对象
异常 无
channel_padding()
签名
Layer channel_padding();
功能简介 创建通道填充层(用于在通道维度上补齐特征图)。
参数 无
返回值 返回表示通道填充层的 Layer 对象
异常 无
容器工厂函数
seq(Args&&... args)
签名
template <typename... Args>
Layer seq(Args&&... args);
功能简介 创建序列容器,按顺序执行多个层。
参数 | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | args | Args&&... | 无 | 任意数量的 Layer 对象 [in] |
返回值 返回表示序列容器的 Layer 对象
异常 | 异常类型 | 触发条件 | |:---|:---| | std::invalid_argument | 传入空的参数列表 |
seq(std::vector layers)
签名
Layer seq(std::vector<Layer> layers);
功能简介 从 Layer 向量创建序列容器。
参数 | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | layers | std::vectorLayer 向量 [in] |
返回值 返回表示序列容器的 Layer 对象
异常 | 异常类型 | 触发条件 | |:---|:---| | std::invalid_argument | 向量为空 |
add2(Layer lhs, Layer rhs)
签名
Layer add2(Layer lhs, Layer rhs);
功能简介 创建二元加法容器(用于残差连接)。
参数 | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | lhs | Layer | 无 | 左操作数 [in] | | rhs | Layer | 无 | 右操作数 [in] |
返回值 返回表示加法容器的 Layer 对象
异常 无
repeat(Layer body, int times)
签名
Layer repeat(Layer body, int times);
功能简介 创建重复容器,重复执行指定的层。
参数 | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | body | Layer | 无 | 要重复的层 [in] | | times | int | 无 | 重复次数(必须 >= 1) [in] |
返回值 返回表示重复容器的 Layer 对象
异常 | 异常类型 | 触发条件 | |:---|:---| | std::invalid_argument | times < 1 |
预融合模块工厂函数
conv_bn_relu(int out_ch, int k, int s, int p, double momentum = 0.1, double eps = 1e-5)
签名
Layer conv_bn_relu(int out_ch, int k, int s, int p,
double momentum = 0.1, double eps = 1e-5);
功能简介 创建 Conv-BN-ReLU 融合模块。该函数是 cbr() 的别名,行为完全一致。
参数 | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | out_ch | int | 无 | 输出通道数 [in] | | k | int | 无 | 卷积核大小 [in] | | s | int | 无 | 步长 [in] | | p | int | 无 | 填充 [in] | | momentum | double | 0.1 | BN 动量 [in] | | eps | double | 1e-5 | BN epsilon [in] |
返回值 返回表示 Conv-BN-ReLU 融合模块的 Layer 对象
异常 无
cbr(int out_ch, int k, int s, int p, double momentum = 0.1, double eps = 1e-5)
签名
Layer cbr(int out_ch, int k, int s, int p, double momentum = 0.1, double eps = 1e-5);
功能简介 创建 Conv-BN-ReLU 融合模块(性能优化版本)。
参数 | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | out_ch | int | 无 | 输出通道数 [in] | | k | int | 无 | 卷积核大小 [in] | | s | int | 无 | 步长 [in] | | p | int | 无 | 填充 [in] | | momentum | double | 0.1 | BN 动量 [in] | | eps | double | 1e-5 | BN epsilon [in] |
返回值 返回表示 CBR 融合模块的 Layer 对象
异常 无
cbrp(int out_ch, int conv_k, int conv_s, int conv_p, int pool_k, int pool_s, int pool_p)
签名
Layer cbrp(int out_ch, int conv_k, int conv_s, int conv_p,
int pool_k, int pool_s, int pool_p);
功能简介 创建 Conv-BN-ReLU-Pool 融合模块(性能优化版本)。
参数 | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | out_ch | int | 无 | 输出通道数 [in] | | conv_k | int | 无 | 卷积核大小 [in] | | conv_s | int | 无 | 卷积步长 [in] | | conv_p | int | 无 | 卷积填充 [in] | | pool_k | int | 无 | 池化核大小 [in] | | pool_s | int | 无 | 池化步长 [in] | | pool_p | int | 无 | 池化填充 [in] |
返回值 返回表示 CBRP 融合模块的 Layer 对象
异常 无
gap_fc(int out_features, bool bias)
签名
Layer gap_fc(int out_features, bool bias);
功能简介 创建 GAP-FC 融合模块(性能优化版本)。
参数 | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | out_features | int | 无 | 分类数量 [in] | | bias | bool | 无 | 是否使用偏置 [in] |
返回值 返回表示 GAP-FC 融合模块的 Layer 对象
异常 无
高层块工厂函数
block(int mid_ch, int out_ch, BlockStyle style)
签名
Layer block(int mid_ch, int out_ch, BlockStyle style);
功能简介 创建 Bottleneck 块(ResNet 风格 1x1-3x3-1x1 结构)。
参数 | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | mid_ch | int | 无 | bottleneck 通道数 [in] | | out_ch | int | 无 | 输出通道数 [in] | | style | BlockStyle | 无 | 块样式(必须为 RESNET_1_3_1 或 RESNET_1_3_1_DS) [in] |
返回值 返回表示 Bottleneck 块的 Layer 对象
异常 | 异常类型 | 触发条件 | |:---|:---| | std::invalid_argument | style 不是 RESNET_1_3_1 或 RESNET_1_3_1_DS |
注意事项 该函数创建的 Bottleneck 结构应保持为整体融合算子,不应拆分为子图。后端已为此结构实现了专用融合算子。
block(int out_ch, BlockStyle style)
签名
Layer block(int out_ch, BlockStyle style);
功能简介 创建其他类型的高层块(BasicBlock、MobileNetV2 倒残差块等)。
参数 | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | out_ch | int | 无 | 输出通道数 [in] | | style | BlockStyle | 无 | 块样式 [in] |
返回值 返回表示高层块的 Layer 对象
异常 | 异常类型 | 触发条件 | |:---|:---| | std::invalid_argument | 不支持的 style |
mbconv(int expand_ratio, int out_ch, int stride)
签名
Layer mbconv(int expand_ratio, int out_ch, int stride);
功能简介 创建 MobileNetV2 倒残差块。
参数 | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | expand_ratio | int | 无 | 扩展比率(1 或 6) [in] | | out_ch | int | 无 | 输出通道数 [in] | | stride | int | 无 | 步长(1 或 2) [in] |
返回值 返回表示倒残差块的 Layer 对象
异常 | 异常类型 | 触发条件 | |:---|:---| | std::invalid_argument | expand_ratio 不是 1 或 6 | | std::invalid_argument | stride 不是 1 或 2 |
工具函数
kind_name(LayerKind k)
签名
const char* kind_name(LayerKind k);
功能简介 将 LayerKind 枚举转换为可读字符串。
参数 | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | k | LayerKind | 无 | 层类型 [in] |
返回值 返回层类型的字符串表示
异常 无
graph_id_to_string(GraphId gid) noexcept
签名
inline const char* graph_id_to_string(GraphId gid) noexcept;
功能简介 将 GraphId 枚举转换为语义字符串。
参数 | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | gid | GraphId | 无 | 子图标识 [in] |
返回值 返回字符串表示
异常 无
is_shape_invariant_graph(GraphId gid) noexcept
签名
inline bool is_shape_invariant_graph(GraphId gid) noexcept;
功能简介 判断是否是 shape 无关的子图。
参数 | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | gid | GraphId | 无 | 子图标识 [in] |
返回值 返回 true 表示 shape 无关,false 表示 shape 相关
异常 无
is_train_graph(GraphId gid) noexcept
签名
inline bool is_train_graph(GraphId gid) noexcept;
功能简介 判断是否是训练专用子图。
参数 | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | gid | GraphId | 无 | 子图标识 [in] |
返回值 返回 true 表示训练图,false 表示非训练图
异常 无
is_inference_graph(GraphId gid) noexcept
签名
inline bool is_inference_graph(GraphId gid) noexcept;
功能简介 判断是否是推理专用子图。
参数 | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | gid | GraphId | 无 | 子图标识 [in] |
返回值 返回 true 表示推理图,false 表示非推理图
异常 无
get_output_shape(LayerKind kind, const std::vector& descs)
签名
Shape get_output_shape(LayerKind kind, const std::vector<TensorDesc>& descs);
功能简介 从 TensorDesc 列表中提取输出特征图形状。
参数 | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | kind | LayerKind | 无 | 层类型 [in] | | descs | const std::vector
返回值 返回输出特征图的 Shape,descs 为空时返回 Shape{}
异常 无
compile_arch_plan(const ArchPlan& plan, MemoryPlan& memory_plan, Initializer& initializer)
签名
void compile_arch_plan(const ArchPlan& plan, MemoryPlan& memory_plan, Initializer& initializer);
功能简介 从 ArchPlan 编译生成 MemoryPlan(简化版)。
参数 | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | plan | const ArchPlan& | 无 | 输入的架构规划 [in] | | memory_plan | MemoryPlan& | 无 | 输出的内存规划 [out] | | initializer | Initializer& | 无 | 初始化器 [in,out] |
返回值 无
异常 无
注意事项 这是简化版本的编译器,专注于 MemoryPlan 生成。
compute_op_to_string(ComputeOp op)
签名
std::string compute_op_to_string(ComputeOp op);
功能简介 将 ComputeOp 枚举转换为字符串。
参数 | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | op | ComputeOp | 无 | 计算算子 [in] |
返回值 返回算子的字符串表示
异常 无
range_op_to_string(RangeOp op)
签名
std::string range_op_to_string(RangeOp op);
功能简介 将 RangeOp 枚举转换为字符串。
参数 | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | op | RangeOp | 无 | 范围算子 [in] |
返回值 返回算子的字符串表示
异常 无
format_params(ComputeOp op, const OpParams& p)
签名
std::string format_params(ComputeOp op, const OpParams& p);
功能简介 格式化算子参数为字符串。
参数 | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | op | ComputeOp | 无 | 计算算子 [in] | | p | const OpParams& | 无 | 算子参数 [in] |
返回值 返回参数的格式化字符串
异常 无
pre_capture(const GraphAtlas& compile_atlas, const std::vector& contexts)
签名
PreCaptureResult pre_capture(const GraphAtlas& compile_atlas,
const std::vector<DeviceContext*>& contexts);
功能简介 Phase B:去重 + 三段式捕获。
参数 | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | compile_atlas | const GraphAtlas& | 无 | Phase A 编译期构建的 GraphAtlas [in] | | contexts | const std::vector
返回值 返回去重后的 PreCaptureResult
异常 无
get_layer_descriptor(LayerKind kind)
签名
const LayerDescriptor& get_layer_descriptor(LayerKind kind);
功能简介 获取指定 LayerKind 的 LayerDescriptor。
参数 | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | kind | LayerKind | 无 | 层类型枚举 [in] |
返回值 返回对应描述符的常量引用
异常 无
注意事项 集中 switch 注册表,每个 LayerKind 返回一个不可变的 static 描述符。
Algo
板块介绍
Algo 模块提供训练算法的配置接口,包括优化器、学习率调度器和损失函数。
核心能力:
- 优化器配置:SGD/LARS/Adam/AdamW 四种优化器及变体的构建器与值包装类
- 学习率调度:支持 Warmup、按 batch/epoch 步进的多种衰减策略调度器
- 损失函数配置:CrossEntropyLoss 及标签平滑支持
包含的类:
- 优化器构建器:
SGD、LARS、Adam、AdamW - 优化器包装类:
Optimizer - 学习率调度器基类:
LRScheduler - 学习率调度器派生类:
PolynomialLR、CosineAnnealingLR、StepLR、ConstantLR、MultiStepLR、ExponentialLR、WSDLR、CosineAnnealingWithWarmRestartsLR - 损失函数:
CrossEntropyLoss
关键头文件:
#include#include#include
内部实现: src/algo/optimizer.cpp、src/algo/scheduler.cpp
Optimizer
概述
Optimizer 是优化器配置的值语义包装类,内部持有具体优化器配置的深拷贝,支持类型查询和向下转型。
头文件: #include
设计定位: 用户与 Task 交互的接口,接受 SGD/LARS/Adam/AdamW 构建器构造,提供值语义传递和类型安全的访问。
优化器类型由 Core 模块的 OptimizerKind 枚举定义,取值包括 SGD、SGD_MOMENTUM、SGD_NESTEROV、LARS、LARS_NESTEROV、ADAM、ADAMW。
是否有状态: 有状态(持有配置对象的深拷贝)
典型用法:
#include <renaissance.h>
using namespace tr;
// 通过构建器构造
Optimizer opt = LARS().momentum(0.9f).weight_decay(5e-5f);
task.optimizer(opt);
// 类型安全访问
if (opt.kind() == OptimizerKind::LARS) {
const LARSConfig* cfg = opt.as<LARSConfig>();
// 使用 cfg->trust_coefficient 等
}
构造与赋值
Optimizer::Optimizer()
默认构造,创建无效优化器(不持有任何配置)。
异常: 无
Optimizer::Optimizer(const OptimizerConfig& config)
从具体配置构造(深拷贝配置)。
参数: | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | config | const OptimizerConfig& | - | [in] 具体优化器配置(如 SGDConfig/LARSConfig/AdamConfig/AdamWConfig) |
异常: 无
Optimizer::Optimizer(const Optimizer& other)
拷贝构造(深拷贝内部配置)。
参数: | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | other | const Optimizer& | - | [in] 另一个 Optimizer 对象 |
异常: 无
Optimizer::operator=(const Optimizer& other)
拷贝赋值(深拷贝内部配置)。
参数: | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | other | const Optimizer& | - | [in] 另一个 Optimizer 对象 |
返回值: 返回 *this,支持链式调用
异常: 无
Optimizer::Optimizer(Optimizer&& other)
移动构造。
参数: | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | other | Optimizer&& | - | [in] 右值引用 |
异常: 无
Optimizer::operator=(Optimizer&& other)
移动赋值。
参数: | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | other | Optimizer&& | - | [in] 右值引用 |
返回值: 返回 *this,支持链式调用
异常: 无
查询接口
Optimizer::valid()
检查是否持有有效配置。
返回值: true 表示持有有效配置,false 表示默认构造的无效优化器
异常: 无
Optimizer::kind()
获取优化器类型。
返回值: 优化器类型枚举值,如 OptimizerKind::LARS、OptimizerKind::ADAMW 等
异常: RuntimeError 如果未持有有效配置
Optimizer::kind_name()
获取优化器类型名称字符串。
返回值: 类型名称字符串,如 "LARS"、"AdamW" 等
异常: 无
Optimizer::as()
签名
template<typename T>
const T* as() const noexcept;
类型安全的向下转型访问。
模板参数 T: 目标配置类型(SGDConfig/LARSConfig/AdamConfig/AdamWConfig)
返回值: 指向具体配置的指针;类型不匹配时返回 nullptr
异常: 无
示例:
Optimizer opt = AdamW().beta1(0.9f).weight_decay(0.01f);
if (const AdamWConfig* cfg = opt.as<AdamWConfig>()) {
std::cout << "weight decay: " << cfg->weight_decay << "\n";
}
Optimizer::to_string()
获取配置描述字符串(用于日志与调试)。
返回值: 配置的字符串表示,如 "AdamWConfig{beta1=0.9, beta2=0.999, eps=1e-08, weight_decay=0.01}"
异常: 无
SGD
概述
SGD 是 SGD with Momentum 优化器配置构建器,支持无动量 SGD、带动量 SGD、Nesterov 动量 SGD 三种变体。
头文件: #include
设计定位: 链式配置构建器,隐式转换为 Optimizer 值包装类。
是否有状态: 有状态(持有 SGDConfig 配置)
变体推断规则:
momentum == 0→OptimizerKind::SGD(无动量)momentum > 0 && nesterov == false→OptimizerKind::SGD_MOMENTUM(带动量)momentum > 0 && nesterov == true→OptimizerKind::SGD_NESTEROV(Nesterov 动量)
注意事项: 默认 SGD() 的 momentum 为 0.9f,因此默认构造即表现为 SGD_MOMENTUM。若需要无动量 SGD,必须显式调用 .momentum(0.0f)。
典型用法:
#include <renaissance.h>
using namespace tr;
// 无动量 SGD(必须显式将 momentum 设为 0)
task.optimizer(SGD().momentum(0.0f));
// 带动量 SGD(默认 momentum 为 0.9)
task.optimizer(SGD().momentum(0.9f).weight_decay(5e-5f));
// Nesterov 动量
task.optimizer(SGD().momentum(0.9f).nesterov(true));
构造与赋值
SGD::SGD()
默认构造,初始化 momentum = 0.9f、weight_decay = 0.0f、nesterov = false。默认构造的对象在未显式设置参数时即表现为 SGD_MOMENTUM。
异常: 无
链式配置
SGD::momentum(float v)
设置动量系数。
参数: | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | v | float | - | [in] 动量值,必须 >= 0 |
返回值: 返回 *this,支持链式调用
异常: ValueError 如果 v < 0
SGD::weight_decay(float v)
设置权重衰减(L2 正则化系数)。
参数: | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | v | float | - | [in] 衰减系数,必须 >= 0 |
返回值: 返回 *this,支持链式调用
异常: ValueError 如果 v < 0
SGD::nesterov(bool v)
设置是否使用 Nesterov 动量。
参数: | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | v | bool | - | [in] true=启用 Nesterov,false=普通动量 |
返回值: 返回 *this,支持链式调用
异常: 无
查询接口
SGD::kind()
根据当前参数推断具体的 OptimizerKind 变体。
返回值: OptimizerKind::SGD、OptimizerKind::SGD_MOMENTUM 或 OptimizerKind::SGD_NESTEROV
异常: 无
SGD::operator Optimizer()
隐式转换为 Optimizer(值语义)。
返回值: 持有当前配置深拷贝的 Optimizer 对象
异常: 无
LARS
概述
LARS 是 Layer-wise Adaptive Rate Scaling 优化器配置构建器,支持 LARS 及 LARS_NESTEROV 两种变体。
头文件: #include
设计定位: 链式配置构建器,适用于大规模训练(如 MLPerf 基准测试)。
是否有状态: 有状态(持有 LARSConfig 配置)
典型用法:
#include <renaissance.h>
using namespace tr;
// MLPerf Closed Division 配置
task.optimizer(LARS()
.momentum(0.9f)
.weight_decay(5e-5f)
.trust_coefficient(0.001f)
.nesterov(false)
.eps(0.0f));
// MLPerf Open Division 配置
task.optimizer(LARS()
.momentum(0.905f)
.weight_decay(8e-5f)
.trust_coefficient(0.001f)
.nesterov(true)
.eps(1e-8f));
构造与赋值
LARS::LARS()
默认构造,初始化 momentum = 0.9f、weight_decay = 0.0f、trust_coefficient = 0.001f、eps = 1e-8f、nesterov = false。
异常: 无
链式配置
LARS::momentum(float v)
设置动量系数。
参数: | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | v | float | - | [in] 动量值,必须 >= 0 |
返回值: 返回 *this,支持链式调用
异常: ValueError 如果 v < 0
LARS::weight_decay(float v)
设置权重衰减(L2 正则化系数)。
参数: | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | v | float | - | [in] 衰减系数,必须 >= 0 |
返回值: 返回 *this,支持链式调用
异常: ValueError 如果 v < 0
LARS::trust_coefficient(float v)
设置 LARS trust coefficient(η)。
参数: | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | v | float | - | [in] trust coefficient,必须 > 0 |
返回值: 返回 *this,支持链式调用
异常: ValueError 如果 v <= 0
LARS::eps(float v)
设置 LARS epsilon(数值稳定)。
参数: | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | v | float | - | [in] epsilon 值,必须 >= 0 |
返回值: 返回 *this,支持链式调用
异常: ValueError 如果 v < 0
LARS::nesterov(bool v)
设置是否使用 Nesterov 动量。
参数: | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | v | bool | - | [in] true=启用 Nesterov |
返回值: 返回 *this,支持链式调用
异常: 无
查询接口
LARS::kind()
根据当前参数推断具体的 OptimizerKind 变体。
返回值: OptimizerKind::LARS 或 OptimizerKind::LARS_NESTEROV
异常: 无
LARS::operator Optimizer()
隐式转换为 Optimizer(值语义)。
返回值: 持有当前配置深拷贝的 Optimizer 对象
异常: 无
Adam
概述
Adam 是 Adaptive Moment Estimation 优化器配置构建器。
头文件: #include
设计定位: 链式配置构建器,提供自适应学习率优化。
是否有状态: 有状态(持有 AdamConfig 配置)
注意: Adam 的 weight_decay 作用于梯度(非 decoupled),如需 decoupled weight decay 请使用 AdamW。
典型用法:
#include <renaissance.h>
using namespace tr;
task.optimizer(Adam()
.beta1(0.9f)
.beta2(0.999f)
.eps(1e-8f)
.weight_decay(0.0f));
构造与赋值
Adam::Adam()
默认构造,初始化 beta1 = 0.9f、beta2 = 0.999f、eps = 1e-8f、weight_decay = 0.0f。
异常: 无
链式配置
Adam::beta1(float v)
设置 beta1(一阶矩衰减率)。
参数: | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | v | float | - | [in] 值必须在 (0, 1) 区间 |
返回值: 返回 *this,支持链式调用
异常: ValueError 如果 v 不在 (0, 1) 区间
Adam::beta2(float v)
设置 beta2(二阶矩衰减率)。
参数: | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | v | float | - | [in] 值必须在 (0, 1) 区间 |
返回值: 返回 *this,支持链式调用
异常: ValueError 如果 v 不在 (0, 1) 区间
Adam::eps(float v)
设置 epsilon(数值稳定)。
参数: | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | v | float | - | [in] 必须 > 0 |
返回值: 返回 *this,支持链式调用
异常: ValueError 如果 v <= 0
Adam::weight_decay(float v)
设置权重衰减(L2 正则化)。
参数: | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | v | float | - | [in] 衰减系数,必须 >= 0 |
返回值: 返回 *this,支持链式调用
异常: ValueError 如果 v < 0
查询接口
Adam::kind()
获取优化器类型。
返回值: 始终为 OptimizerKind::ADAM
异常: 无
Adam::operator Optimizer()
隐式转换为 Optimizer(值语义)。
返回值: 持有当前配置深拷贝的 Optimizer 对象
异常: 无
AdamW
概述
AdamW 是 Adam with decoupled weight decay 优化器配置构建器。
头文件: #include
设计定位: 链式配置构建器,weight decay 直接作用于参数而非梯度。
是否有状态: 有状态(持有 AdamWConfig 配置)
与 Adam 的区别: AdamW 的 weight decay 是 decoupled(解耦)的,直接作用于参数更新,而非像 Adam 那样作用于梯度。这是当前主流的 Adam 使用方式。
典型用法:
#include <renaissance.h>
using namespace tr;
task.optimizer(AdamW()
.beta1(0.9f)
.beta2(0.999f)
.eps(1e-8f)
.weight_decay(0.01f));
构造与赋值
AdamW::AdamW()
默认构造,初始化 beta1 = 0.9f、beta2 = 0.999f、eps = 1e-8f、weight_decay = 0.0f。
异常: 无
链式配置
AdamW::beta1(float v)
设置 beta1(一阶矩衰减率)。
参数: | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | v | float | - | [in] 值必须在 (0, 1) 区间 |
返回值: 返回 *this,支持链式调用
异常: ValueError 如果 v 不在 (0, 1) 区间
AdamW::beta2(float v)
设置 beta2(二阶矩衰减率)。
参数: | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | v | float | - | [in] 值必须在 (0, 1) 区间 |
返回值: 返回 *this,支持链式调用
异常: ValueError 如果 v 不在 (0, 1) 区间
AdamW::eps(float v)
设置 epsilon(数值稳定)。
参数: | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---| | v | float | - | [in] 必须 > 0 |
返回值: 返回 *this,支持链式调用
异常: ValueError 如果 v <= 0
AdamW::weight_decay(float v)
设置 decoupled 权重衰减系数。
参数: | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | v | float | - | [in] 衰减系数,必须 >= 0 |
返回值: 返回 *this,支持链式调用
异常: ValueError 如果 v < 0
查询接口
AdamW::kind()
获取优化器类型。
返回值: 始终为 OptimizerKind::ADAMW
异常: 无
AdamW::operator Optimizer()
隐式转换为 Optimizer(值语义)。
返回值: 持有当前配置深拷贝的 Optimizer 对象
异常: 无
LRScheduler
概述
LRScheduler 是学习率调度器抽象基类,采用无状态纯函数设计。
头文件: #include
设计定位: 学习率调度策略的抽象基类,所有调度器继承自此基类。
是否有状态: 无状态(给定 (epoch, batch) 直接计算学习率,不维护 current_step/current_lr 等可变状态)
设计说明:
- 本调度器采用无状态纯函数设计,给定 (epoch, batch) 直接计算学习率
- 不提供 step()、reset() 等状态推进接口,保证多 RANK 并行训练的一致性
- 所有 RANK 在相同 (epoch, batch) 下得到完全相同的 LR,无需同步、无竞态、无锁
- 内部派生实现通过覆写保护接口提供具体衰减公式,普通用户无需关心
- 调用
step_by_batch()或step_by_epoch()后步进模式即被锁定,后续冲突调用会抛出ValueError
典型用法:
#include <renaissance.h>
using namespace tr;
// 通过派生类使用
task.scheduler(CosineAnnealingLR()
.base_lr(0.1f)
.warmup(5)
.step_by_batch(true));
构造与赋值
LRScheduler::~LRScheduler()
签名
virtual ~LRScheduler() = default;
虚析构函数,确保派生类多态删除安全。
异常: 无
链式配置
LRScheduler::base_lr(float lr)
设置基础学习率。
参数: | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | lr | float | - | [in] 基础学习率,必须 > 0 |
返回值: 返回 *this,支持链式调用
异常: ValueError 如果 lr <= 0
LRScheduler::warmup(int epochs)
设置 warmup 周期数(epoch 数)。
参数: | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | epochs | int | - | [in] warmup epoch 数,必须 >= 0 |
返回值: 返回 *this,支持链式调用
异常: ValueError 如果 epochs < 0
LRScheduler::warmup_start_lr(float start_lr)
设置 warmup 起始学习率(绝对值)。
参数: | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | start_lr | float | - | [in] warmup 起始学习率,必须 >= 0 |
返回值: 返回 *this,支持链式调用
异常: ValueError 如果 start_lr < 0
注意事项: 设置后,warmup 起始学习率为绝对值,覆盖 warmup_start_factor() 的设置。
LRScheduler::warmup_start_factor(float factor)
设置 warmup 起始学习率(相对 base_lr 的比例)。
参数: | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | factor | float | - | [in] 比例因子,必须在 [0, 1] 区间 |
返回值: 返回 *this,支持链式调用
异常: ValueError 如果 factor 不在 [0, 1] 区间
注意事项: 与 warmup_start_lr() 互斥,后设置的覆盖先设置的。
LRScheduler::step_by_batch(bool v = true)
设置为按 batch 步进模式。
参数: | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | v | bool | true | [in] true=按 batch 步进,false=按 epoch 步进 |
返回值: 返回 *this,支持链式调用
异常: ValueError 如果步进模式已锁定且与当前设置冲突
LRScheduler::step_by_epoch()
设置为按 epoch 步进模式。
返回值: 返回 *this,支持链式调用
异常: ValueError 如果步进模式已锁定且与当前设置冲突
注意事项: 此方法等效于 step_by_batch(false),语义更清晰。
生命周期
LRScheduler::prepare(int total_epochs, int steps_per_epoch)
准备调度器,计算总步数和 warmup 步数。
参数: | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | total_epochs | int | - | [in] 总训练 epoch 数,必须 > 0 | | steps_per_epoch | int | - | [in] 每个 epoch 的 batch 数,必须 > 0 |
返回值: 无
异常: ValueError 如果 total_epochs <= 0 或 steps_per_epoch <= 0
注意事项: 在使用 get_lr_by_batch() 或 get_lr_by_epoch() 之前必须调用此方法。
LRScheduler::is_prepared()
检查是否已调用 prepare()。
返回值: true 表示已准备就绪,false 表示未调用 prepare()
异常: 无
查询接口
LRScheduler::get_lr_by_batch(int batch_id)
按 batch ID 获取学习率(const 纯函数)。
参数: | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | batch_id | int | - | [in] 全局 batch ID,从 0 开始 |
返回值: 该 batch 对应的学习率
异常: RuntimeError 如果未调用 prepare();ValueError 如果 batch_id < 0 或当前未启用 step_by_batch
注意事项: 使用前必须先调用 prepare()。batch_id 为全局累计 batch 数,跨 epoch 连续递增。
LRScheduler::get_lr_by_epoch(int epoch_id)
按 epoch ID 获取学习率(const 纯函数)。
参数: | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | epoch_id | int | - | [in] epoch ID,从 0 开始 |
返回值: 该 epoch 对应的学习率
异常: RuntimeError 如果未调用 prepare();ValueError 如果 epoch_id < 0
注意事项: 使用前必须先调用 prepare()。
LRScheduler::is_step_by_batch()
检查当前是否为按 batch 步进模式。
返回值: true 表示按 batch 步进,false 表示按 epoch 步进
异常: 无
LRScheduler::total_steps()
获取总训练步数(batch 数)。
返回值: total_epochs × steps_per_epoch
异常: 无
注意事项: 使用前必须先调用 prepare()。
LRScheduler::total_epochs()
获取总训练 epoch 数。
返回值: 传入 prepare() 的 total_epochs
异常: 无
LRScheduler::steps_per_epoch()
获取每个 epoch 的 batch 数。
返回值: 传入 prepare() 的 steps_per_epoch
异常: 无
LRScheduler::warmup_steps()
获取 warmup 步数(batch 数)。
返回值: warmup_epochs × steps_per_epoch
异常: 无
PolynomialLR
概述
PolynomialLR 继承自 LRScheduler,实现多项式衰减学习率调度策略。
头文件: #include
是否有状态: 无状态(纯函数设计)
衰减公式:
lr = end_lr + (base_lr - end_lr) * (1 - decay_step / (total_decay + 1))^power
注意事项: 分母使用 total_decay + 1,对齐 TensorFlow 的 polynomial_decay 行为。
典型用法:
#include <renaissance.h>
using namespace tr;
task.scheduler(PolynomialLR()
.base_lr(0.1f)
.power(2.0f)
.end_lr(0.0001f)
.warmup(5));
该类继承 LRScheduler 的全部公共接口,详见 LRScheduler。
链式配置
PolynomialLR::base_lr(float lr)
设置基础学习率。
参数: | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | lr | float | - | [in] 基础学习率,必须 > 0 |
返回值: 返回 *this,支持链式调用
异常: ValueError 如果 lr <= 0
PolynomialLR::warmup(int epochs)
设置 warmup 周期数。
参数: | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | epochs | int | - | [in] warmup epoch 数,必须 >= 0 |
返回值: 返回 *this,支持链式调用
异常: ValueError 如果 epochs < 0
PolynomialLR::warmup_start_lr(float start_lr)
设置 warmup 起始学习率(绝对值)。
参数: | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | start_lr | float | - | [in] warmup 起始学习率,必须 >= 0 |
返回值: 返回 *this,支持链式调用
异常: ValueError 如果 start_lr < 0
PolynomialLR::warmup_start_factor(float factor)
设置 warmup 起始学习率(相对比例)。
参数: | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | factor | float | - | [in] 比例因子,必须在 [0, 1] 区间 |
返回值: 返回 *this,支持链式调用
异常: ValueError 如果 factor 不在 [0, 1] 区间
PolynomialLR::step_by_batch(bool v = true)
设置为按 batch 步进模式。
参数: | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | v | bool | true | [in] true=按 batch 步进 |
返回值: 返回 *this,支持链式调用
异常: ValueError 如果步进模式已锁定且与当前设置冲突
PolynomialLR::step_by_epoch()
设置为按 epoch 步进模式。
返回值: 返回 *this,支持链式调用
异常: ValueError 如果步进模式已锁定且与当前设置冲突
PolynomialLR::power(float p)
设置多项式指数。
参数: | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | p | float | - | [in] 多项式指数,默认 2.0(二次衰减),必须 > 0 |
返回值: 返回 *this,支持链式调用
异常: ValueError 如果 p <= 0
PolynomialLR::end_lr(float end_lr)
设置结束学习率。
参数: | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | end_lr | float | - | [in] 衰减结束时的学习率,必须 >= 0 |
返回值: 返回 *this,支持链式调用
异常: ValueError 如果 end_lr < 0
继承自基类的公共接口
CosineAnnealingLR
概述
CosineAnnealingLR 继承自 LRScheduler,实现余弦退火学习率调度策略。
头文件: #include
是否有状态: 无状态(纯函数设计)
衰减公式:
lr = eta_min + (base_lr - eta_min) * 0.5 * (1 + cos(pi * decay_step / total_decay))
典型用法:
#include <renaissance.h>
using namespace tr;
task.scheduler(CosineAnnealingLR()
.base_lr(0.1f)
.eta_min(1e-6f)
.warmup(5));
该类继承 LRScheduler 的全部公共接口,详见 LRScheduler。
链式配置
CosineAnnealingLR::base_lr(float lr)
设置基础学习率。
参数: | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | lr | float | - | [in] 基础学习率,必须 > 0 |
返回值: 返回 *this,支持链式调用
异常: ValueError 如果 lr <= 0
CosineAnnealingLR::warmup(int epochs)
设置 warmup 周期数。
参数: | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | epochs | int | - | [in] warmup epoch 数,必须 >= 0 |
返回值: 返回 *this,支持链式调用
异常: ValueError 如果 epochs < 0
CosineAnnealingLR::warmup_start_factor(float factor)
设置 warmup 起始学习率(相对比例)。
参数: | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | factor | float | - | [in] 比例因子,必须在 [0, 1] 区间 |
返回值: 返回 *this,支持链式调用
异常: ValueError 如果 factor 不在 [0, 1] 区间
CosineAnnealingLR::warmup_start_lr(float start_lr)
设置 warmup 起始学习率(绝对值)。
参数: | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | start_lr | float | - | [in] warmup 起始学习率,必须 >= 0 |
返回值: 返回 *this,支持链式调用
异常: ValueError 如果 start_lr < 0
CosineAnnealingLR::step_by_batch(bool v = true)
设置为按 batch 步进模式。
参数: | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | v | bool | true | [in] true=按 batch 步进 |
返回值: 返回 *this,支持链式调用
异常: ValueError 如果步进模式已锁定且与当前设置冲突
CosineAnnealingLR::step_by_epoch()
设置为按 epoch 步进模式。
返回值: 返回 *this,支持链式调用
异常: ValueError 如果步进模式已锁定且与当前设置冲突
CosineAnnealingLR::eta_min(float emin)
设置最小学习率。
参数: | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | emin | float | - | [in] 最小学习率,必须 >= 0 |
返回值: 返回 *this,支持链式调用
异常: ValueError 如果 emin < 0
继承自基类的公共接口
StepLR
概述
StepLR 继承自 LRScheduler,实现阶梯衰减学习率调度策略。
头文件: #include
是否有状态: 无状态(纯函数设计)
衰减公式:
lr = base_lr * gamma^(decay_step // (step_size * steps_per_epoch))
典型用法:
#include <renaissance.h>
using namespace tr;
task.scheduler(StepLR()
.base_lr(0.1f)
.step_size(10)
.gamma(0.1f)
.warmup(5));
该类继承 LRScheduler 的全部公共接口,详见 LRScheduler。
链式配置
StepLR::base_lr(float lr)
设置基础学习率。
参数: | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | lr | float | - | [in] 基础学习率,必须 > 0 |
返回值: 返回 *this,支持链式调用
异常: ValueError 如果 lr <= 0
StepLR::warmup(int epochs)
设置 warmup 周期数。
参数: | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | epochs | int | - | [in] warmup epoch 数,必须 >= 0 |
返回值: 返回 *this,支持链式调用
异常: ValueError 如果 epochs < 0
StepLR::warmup_start_factor(float factor)
设置 warmup 起始学习率(相对比例)。
参数: | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | factor | float | - | [in] 比例因子,必须在 [0, 1] 区间 |
返回值: 返回 *this,支持链式调用
异常: ValueError 如果 factor 不在 [0, 1] 区间
StepLR::warmup_start_lr(float start_lr)
设置 warmup 起始学习率(绝对值)。
参数: | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | start_lr | float | - | [in] warmup 起始学习率,必须 >= 0 |
返回值: 返回 *this,支持链式调用
异常: ValueError 如果 start_lr < 0
StepLR::step_by_batch(bool v = true)
设置为按 batch 步进模式。
参数: | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | v | bool | true | [in] true=按 batch 步进 |
返回值: 返回 *this,支持链式调用
异常: ValueError 如果步进模式已锁定且与当前设置冲突
StepLR::step_by_epoch()
设置为按 epoch 步进模式。
返回值: 返回 *this,支持链式调用
异常: ValueError 如果步进模式已锁定且与当前设置冲突
StepLR::step_size(int epochs)
设置衰减步长(epoch 数)。
参数: | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | epochs | int | - | [in] 每 epoch 数后衰减一次,必须 > 0 |
返回值: 返回 *this,支持链式调用
异常: ValueError 如果 epochs <= 0
StepLR::gamma(float g)
设置衰减系数。
参数: | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | g | float | - | [in] 衰减系数,必须 > 0 |
返回值: 返回 *this,支持链式调用
异常: ValueError 如果 g <= 0
继承自基类的公共接口
ConstantLR
概述
ConstantLR 继承自 LRScheduler,实现恒定学习率调度策略(无衰减)。
头文件: #include
是否有状态: 无状态(纯函数设计)
衰减公式:
lr = base_lr // 恒定不变
典型用法:
#include <renaissance.h>
using namespace tr;
task.scheduler(ConstantLR()
.base_lr(0.001f)
.warmup(3));
该类继承 LRScheduler 的全部公共接口,详见 LRScheduler。
链式配置
ConstantLR::base_lr(float lr)
设置基础学习率。
参数: | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | lr | float | - | [in] 基础学习率,必须 > 0 |
返回值: 返回 *this,支持链式调用
异常: ValueError 如果 lr <= 0
ConstantLR::warmup(int epochs)
设置 warmup 周期数。
参数: | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | epochs | int | - | [in] warmup epoch 数,必须 >= 0 |
返回值: 返回 *this,支持链式调用
异常: ValueError 如果 epochs < 0
ConstantLR::warmup_start_factor(float factor)
设置 warmup 起始学习率(相对比例)。
参数: | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | factor | float | - | [in] 比例因子,必须在 [0, 1] 区间 |
返回值: 返回 *this,支持链式调用
异常: ValueError 如果 factor 不在 [0, 1] 区间
ConstantLR::warmup_start_lr(float start_lr)
设置 warmup 起始学习率(绝对值)。
参数: | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | start_lr | float | - | [in] warmup 起始学习率,必须 >= 0 |
返回值: 返回 *this,支持链式调用
异常: ValueError 如果 start_lr < 0
ConstantLR::step_by_batch(bool v = true)
设置为按 batch 步进模式。
参数: | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | v | bool | true | [in] true=按 batch 步进 |
返回值: 返回 *this,支持链式调用
异常: ValueError 如果步进模式已锁定且与当前设置冲突
ConstantLR::step_by_epoch()
设置为按 epoch 步进模式。
返回值: 返回 *this,支持链式调用
异常: ValueError 如果步进模式已锁定且与当前设置冲突
继承自基类的公共接口
MultiStepLR
概述
MultiStepLR 继承自 LRScheduler,实现多阶梯衰减学习率调度策略。
头文件: #include
是否有状态: 无状态(纯函数设计)
衰减公式:
lr = base_lr * gamma^count
其中 count 为 decay_step 超过的 milestones 数量
典型用法:
#include <renaissance.h>
using namespace tr;
task.scheduler(MultiStepLR()
.base_lr(0.1f)
.milestones({30, 60, 80})
.gamma(0.1f)
.warmup(5));
该类继承 LRScheduler 的全部公共接口,详见 LRScheduler。
链式配置
MultiStepLR::base_lr(float lr)
设置基础学习率。
参数: | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | lr | float | - | [in] 基础学习率,必须 > 0 |
返回值: 返回 *this,支持链式调用
异常: ValueError 如果 lr <= 0
MultiStepLR::warmup(int epochs)
设置 warmup 周期数。
参数: | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | epochs | int | - | [in] warmup epoch 数,必须 >= 0 |
返回值: 返回 *this,支持链式调用
异常: ValueError 如果 epochs < 0
MultiStepLR::warmup_start_factor(float factor)
设置 warmup 起始学习率(相对比例)。
参数: | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | factor | float | - | [in] 比例因子,必须在 [0, 1] 区间 |
返回值: 返回 *this,支持链式调用
异常: ValueError 如果 factor 不在 [0, 1] 区间
MultiStepLR::warmup_start_lr(float start_lr)
设置 warmup 起始学习率(绝对值)。
参数: | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | start_lr | float | - | [in] warmup 起始学习率,必须 >= 0 |
返回值: 返回 *this,支持链式调用
异常: ValueError 如果 start_lr < 0
MultiStepLR::step_by_batch(bool v = true)
设置为按 batch 步进模式。
参数: | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | v | bool | true | [in] true=按 batch 步进 |
返回值: 返回 *this,支持链式调用
异常: ValueError 如果步进模式已锁定且与当前设置冲突
MultiStepLR::step_by_epoch()
设置为按 epoch 步进模式。
返回值: 返回 *this,支持链式调用
异常: ValueError 如果步进模式已锁定且与当前设置冲突
MultiStepLR::milestones(const std::vector& m)
设置衰减里程碑(epoch 列表)。
参数: | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | m | const std::vector
返回值: 返回 *this,支持链式调用
异常: ValueError 如果里程碑元素 < 0 或未严格递增
MultiStepLR::gamma(float g)
设置衰减系数。
参数: | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | g | float | - | [in] 衰减系数,必须 > 0 |
返回值: 返回 *this,支持链式调用
异常: ValueError 如果 g <= 0
继承自基类的公共接口
ExponentialLR
概述
ExponentialLR 继承自 LRScheduler,实现指数衰减学习率调度策略。
头文件: #include
是否有状态: 无状态(纯函数设计)
衰减公式:
lr = base_lr * gamma^epoch
其中 epoch = decay_step // steps_per_epoch(整数除法)
注意事项: 衰减按 epoch 计数,decay_step 为扣除 warmup 后的步数。
典型用法:
#include <renaissance.h>
using namespace tr;
task.scheduler(ExponentialLR()
.base_lr(0.1f)
.gamma(0.95f)
.warmup(5));
该类继承 LRScheduler 的全部公共接口,详见 LRScheduler。
链式配置
ExponentialLR::base_lr(float lr)
设置基础学习率。
参数: | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | lr | float | - | [in] 基础学习率,必须 > 0 |
返回值: 返回 *this,支持链式调用
异常: ValueError 如果 lr <= 0
ExponentialLR::warmup(int epochs)
设置 warmup 周期数。
参数: | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | epochs | int | - | [in] warmup epoch 数,必须 >= 0 |
返回值: 返回 *this,支持链式调用
异常: ValueError 如果 epochs < 0
ExponentialLR::warmup_start_factor(float factor)
设置 warmup 起始学习率(相对比例)。
参数: | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | factor | float | - | [in] 比例因子,必须在 [0, 1] 区间 |
返回值: 返回 *this,支持链式调用
异常: ValueError 如果 factor 不在 [0, 1] 区间
ExponentialLR::warmup_start_lr(float start_lr)
设置 warmup 起始学习率(绝对值)。
参数: | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | start_lr | float | - | [in] warmup 起始学习率,必须 >= 0 |
返回值: 返回 *this,支持链式调用
异常: ValueError 如果 start_lr < 0
ExponentialLR::step_by_batch(bool v = true)
设置为按 batch 步进模式。
参数: | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | v | bool | true | [in] true=按 batch 步进 |
返回值: 返回 *this,支持链式调用
异常: ValueError 如果步进模式已锁定且与当前设置冲突
ExponentialLR::step_by_epoch()
设置为按 epoch 步进模式。
返回值: 返回 *this,支持链式调用
异常: ValueError 如果步进模式已锁定且与当前设置冲突
ExponentialLR::gamma(float g)
设置衰减系数。
参数: | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | g | float | - | [in] 衰减系数,必须 > 0 |
返回值: 返回 *this,支持链式调用
异常: ValueError 如果 g <= 0
继承自基类的公共接口
WSDLR
概述
WSDLR 继承自 LRScheduler,实现"稳定期+线性衰减"学习率调度策略。
头文件: #include
是否有状态: 无状态(纯函数设计)
衰减公式:
前 80% (decay_start 比例): lr = base_lr
后 20%: lr = base_lr - (base_lr - end_lr) * ((decay_step - decay_start) / (total_decay - decay_start))
典型用法:
#include <renaissance.h>
using namespace tr;
task.scheduler(WSDLR()
.base_lr(0.1f)
.decay_start(0.8f)
.end_lr(0.0f)
.warmup(5));
该类继承 LRScheduler 的全部公共接口,详见 LRScheduler。
链式配置
WSDLR::base_lr(float lr)
设置基础学习率。
参数: | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | lr | float | - | [in] 基础学习率,必须 > 0 |
返回值: 返回 *this,支持链式调用
异常: ValueError 如果 lr <= 0
WSDLR::warmup(int epochs)
设置 warmup 周期数。
参数: | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | epochs | int | - | [in] warmup epoch 数,必须 >= 0 |
返回值: 返回 *this,支持链式调用
异常: ValueError 如果 epochs < 0
WSDLR::warmup_start_factor(float factor)
设置 warmup 起始学习率(相对比例)。
参数: | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | factor | float | - | [in] 比例因子,必须在 [0, 1] 区间 |
返回值: 返回 *this,支持链式调用
异常: ValueError 如果 factor 不在 [0, 1] 区间
WSDLR::warmup_start_lr(float start_lr)
设置 warmup 起始学习率(绝对值)。
参数: | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | start_lr | float | - | [in] warmup 起始学习率,必须 >= 0 |
返回值: 返回 *this,支持链式调用
异常: ValueError 如果 start_lr < 0
WSDLR::step_by_batch(bool v = true)
设置为按 batch 步进模式。
参数: | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | v | bool | true | [in] true=按 batch 步进 |
返回值: 返回 *this,支持链式调用
异常: ValueError 如果步进模式已锁定且与当前设置冲突
WSDLR::step_by_epoch()
设置为按 epoch 步进模式。
返回值: 返回 *this,支持链式调用
异常: ValueError 如果步进模式已锁定且与当前设置冲突
WSDLR::decay_start(float fraction)
设置衰减起始位置(占 total_decay 的比例)。
参数: | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | fraction | float | - | [in] 衰减起始比例,0.8 表示前 80% 为 stable,后 20% 线性衰减,必须在 [0, 1] 区间 |
返回值: 返回 *this,支持链式调用
异常: ValueError 如果 fraction 不在 [0, 1] 区间
WSDLR::end_lr(float lr)
设置结束学习率。
参数: | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | lr | float | - | [in] 衰减结束时的学习率,必须 >= 0 |
返回值: 返回 *this,支持链式调用
异常: ValueError 如果 lr < 0
继承自基类的公共接口
CosineAnnealingWithWarmRestartsLR
概述
CosineAnnealingWithWarmRestartsLR 继承自 LRScheduler,实现带热重启的余弦退火学习率调度策略。
头文件: #include
是否有状态: 无状态(纯函数设计)
衰减公式:
每个周期 T_i 内:
lr = eta_min + (base_lr - eta_min) * 0.5 * (1 + cos(pi * t / T_i))
其中 t 为当前周期内的步数,T_i = T_0 * T_mult^i
典型用法:
#include <renaissance.h>
using namespace tr;
task.scheduler(CosineAnnealingWithWarmRestartsLR()
.base_lr(0.1f)
.T_0(10)
.T_mult(2)
.eta_min(0.0f)
.warmup(5));
该类继承 LRScheduler 的全部公共接口,详见 LRScheduler。
链式配置
CosineAnnealingWithWarmRestartsLR::base_lr(float lr)
设置基础学习率。
参数: | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | lr | float | - | [in] 基础学习率,必须 > 0 |
返回值: 返回 *this,支持链式调用
异常: ValueError 如果 lr <= 0
CosineAnnealingWithWarmRestartsLR::warmup(int epochs)
设置 warmup 周期数。
参数: | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | epochs | int | - | [in] warmup epoch 数,必须 >= 0 |
返回值: 返回 *this,支持链式调用
异常: ValueError 如果 epochs < 0
CosineAnnealingWithWarmRestartsLR::warmup_start_factor(float factor)
设置 warmup 起始学习率(相对比例)。
参数: | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | factor | float | - | [in] 比例因子,必须在 [0, 1] 区间 |
返回值: 返回 *this,支持链式调用
异常: ValueError 如果 factor 不在 [0, 1] 区间
CosineAnnealingWithWarmRestartsLR::warmup_start_lr(float start_lr)
设置 warmup 起始学习率(绝对值)。
参数: | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | start_lr | float | - | [in] warmup 起始学习率,必须 >= 0 |
返回值: 返回 *this,支持链式调用
异常: ValueError 如果 start_lr < 0
CosineAnnealingWithWarmRestartsLR::step_by_batch(bool v = true)
设置为按 batch 步进模式。
参数: | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | v | bool | true | [in] true=按 batch 步进 |
返回值: 返回 *this,支持链式调用
异常: ValueError 如果步进模式已锁定且与当前设置冲突
CosineAnnealingWithWarmRestartsLR::step_by_epoch()
设置为按 epoch 步进模式。
返回值: 返回 *this,支持链式调用
异常: ValueError 如果步进模式已锁定且与当前设置冲突
CosineAnnealingWithWarmRestartsLR::T_0(int t0)
设置初始周期长度。
参数: | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | t0 | int | - | [in] 初始周期长度(epoch 数或 batch 数),必须 > 0 |
返回值: 返回 *this,支持链式调用
异常: ValueError 如果 t0 <= 0
CosineAnnealingWithWarmRestartsLR::T_mult(int tm)
设置周期倍增系数。
参数: | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | tm | int | - | [in] 每次重启后周期长度乘以该系数,必须 >= 1 |
返回值: 返回 *this,支持链式调用
异常: ValueError 如果 tm < 1
CosineAnnealingWithWarmRestartsLR::eta_min(float emin)
设置最小学习率。
参数: | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | emin | float | - | [in] 最小学习率,必须 >= 0 |
返回值: 返回 *this,支持链式调用
异常: ValueError 如果 emin < 0
继承自基类的公共接口
CrossEntropyLoss
概述
CrossEntropyLoss 是交叉熵损失函数配置类(一期唯一支持的损失函数)。
头文件: #include
设计定位: 纯配置类,无运行时状态,用于 Task 链式配置中设定损失函数参数。实际计算由后端融合算子完成。
是否有状态: 无状态(仅持有配置参数)
设计约束:
- 一期只支持此一种损失函数
- 支持标签平滑(label smoothing),范围 [0, 0.2]
- MLPerf 规则约束:Closed Division 的 label_smoothing 只能是 0 或 0.1
典型用法:
#include <renaissance.h>
using namespace tr;
task.loss(CrossEntropyLoss().label_smoothing(0.1f));
构造与赋值
CrossEntropyLoss::CrossEntropyLoss()
默认构造,初始化 label_smoothing = 0.0f(不使用标签平滑)。
异常: 无
链式配置
CrossEntropyLoss::label_smoothing(float value)
设置标签平滑系数。
参数: | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | value | float | - | [in] 标签平滑系数,范围 [0, 0.2] |
返回值: 返回 *this,支持链式调用
异常: ValueError 如果 value 不在 [0, 0.2] 范围内
标签平滑的含义:
- 0.0f:不使用标签平滑,标准的 one-hot 编码
- 0.1f:MLPerf 标准配置,目标分布 = 0.9 one_hot + 0.1 uniform
查询接口
CrossEntropyLoss::label_smoothing()
获取当前标签平滑系数。
返回值: 当前标签平滑系数
异常: 无
独立函数
概述
Algo 模块提供若干与优化器/学习率调度器配合的独立工具函数,如将 OptimizerKind 转换为字符串、从优化器类型推导 PlanConfig 等。
所属头文件:#include 等。
设计定位:无状态自由函数,直接调用。
优化器工具函数
optimizer_kind_name(OptimizerKind)
签名:
const char* optimizer_kind_name(OptimizerKind kind) noexcept;
功能简介: 将 OptimizerKind 枚举值转换为可读的类型名称字符串,常用于日志输出。
参数: | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | kind | OptimizerKind | - | [in] 优化器类型枚举 |
返回值: 优化器类型名称字符串,如 "SGD"、"LARS"、"AdamW" 等;未知类型返回 "Unknown"
异常: 无
plan_config_from_optimizer(OptimizerKind, bool)
签名:
PlanConfig plan_config_from_optimizer(OptimizerKind kind, bool has_ema = false);
功能简介: 根据优化器类型推导 PlanConfig 中的优化器相关标志(如是否使用 momentum、Adam、LARS 等),供后端执行计划使用。
参数: | 参数名 | 类型 | 默认值 | 说明 | |:---|:---|:---|:---| | kind | OptimizerKind | - | [in] 优化器类型 | | has_ema | bool | false | [in] 是否使用 EMA |
返回值: 推导得到的 PlanConfig 结构
异常: 无
注意事项: bn_folded / need_mask 由调用方根据网络结构设置,不在此函数内处理。
Task
板块介绍
Task 模块是 Tech-Renaissance 的任务执行层,提供统一的三阶段状态机(PLANNING → MEMORY_LOCKED → COMPILED)和硬件句柄管理。该模块包含两个面向不同场景的任务门面类:SimpleTask 用于手动构图场景,DeepLearningTask 用于深度学习训练场景。
核心能力:
- 三阶段状态机强制执行,确保编译期与运行期分离
- 统一的硬件资源管理和 CUDA Graph 生命周期
- 分布式多 GPU 训练支持(通过 Rank 逻辑 ID 映射到物理 GPU ID)
- 完整的深度学习训练循环(训练、验证、SEMA、早停、指标收集)
包含的类/枚举/函数:
TaskBase:任务基类,定义状态机和核心接口SimpleTask:手动构图门面,暴露构图接口DeepLearningTask:深度学习训练门面,封装完整训练循环CompileInfo:编译诊断信息级别控制(定义于deep_learning_task.h)H2DTestResult/H2DRunResult:H2D 测试辅助结构体
关键头文件:
#include#include#include
内部实现位置:src/task/
enum class CompileInfo
概述
编译诊断信息级别,位掩码枚举。用于控制 compile() 时打印的诊断信息范围,默认只打印模型架构(ArchPlan)。
| 枚举值 | 说明 |
|---|---|
NONE |
不打印诊断信息 |
ARCH_PLAN |
打印模型架构(默认) |
MEMORY_PLAN |
打印内存布局 |
TRAIN_GRAPH |
打印训练计算图详情 |
INFER_GRAPH |
打印推理计算图详情 |
ALL |
打印所有诊断信息 |
位运算组合示例:
task.compile(CompileInfo::ARCH_PLAN | CompileInfo::MEMORY_PLAN); // 打印架构和内存布局
task.compile(CompileInfo::ALL); // 打印所有信息
TaskBase
概述
任务抽象基类,定义三阶段状态机和核心硬件句柄接口。TaskBase 是整个 Task 模块的基础,强制执行 PLANNING → MEMORY_LOCKED → COMPILED 状态转换,管理 CUDA Graph 生命周期和多 GPU 硬件资源。
头文件:#include
设计定位:TaskBase 是硬件句柄的唯一持有者,通过 protected 接口暴露构图能力给派生类,通过 public 接口暴露运行期能力给用户。
状态管理:有状态,强制三阶段状态机
继承关系:无继承,作为基类被 SimpleTask 和 DeepLearningTask 继承
典型使用路径:用户通过 SimpleTask 或 DeepLearningTask 使用,不直接构造 TaskBase
关联类型:本模块使用 Core 模块定义的 Phase 三阶段状态机,以及 Metric、TTA、TrainingResult 等类型。
核心概念:Rank 与 GPU ID 的区别
- Rank(逻辑 ID):0~num_gpus-1 的连续整数,用户在 Task 层面直接指定
- GPU ID(物理 ID):实际硬件设备的 CUDA 编号,由
GlobalRegistry::use_gpu()指定 - 映射关系:rank 0 → GPU IDs[0],rank 1 → GPU IDs[1],依此类推
示例:
GlobalRegistry::instance().use_gpu("2,3,5,7"); // 指定物理 GPU
task.transfer_to_rank(host_tensor, dtensor, 0); // rank 0 → GPU 2
task.fill(dtensor, 1.0f); // 所有 rank → GPU (2,3,5,7)
构造、析构与赋值
TaskBase::TaskBase()
签名
TaskBase();
功能简介
protected 默认构造函数,创建处于 Phase::PLANNING 阶段的任务。用户不直接构造 TaskBase,而是通过 SimpleTask 或 DeepLearningTask 派生类使用。
异常
无
TaskBase::TaskBase(const TaskBase&)
签名
TaskBase(const TaskBase&) = delete;
功能简介
禁用拷贝构造。
TaskBase::TaskBase(TaskBase&&)
签名
TaskBase(TaskBase&&) = delete;
功能简介
禁用移动构造。
TaskBase::operator=(const TaskBase&)
签名
TaskBase& operator=(const TaskBase&) = delete;
TaskBase& operator=(TaskBase&&) = delete;
功能简介
禁用拷贝赋值与移动赋值。
TaskBase::~TaskBase()
签名
virtual ~TaskBase();
功能简介
虚析构函数,释放硬件资源和 CUDA Graph。由派生类自动调用。
异常
无
状态查询
TaskBase::phase()
签名
[[nodiscard]] Phase phase() const noexcept;
功能简介
获取当前任务所处阶段。
返回值
当前阶段(Phase::PLANNING、Phase::MEMORY_LOCKED 或 Phase::COMPILED)
异常
无
TaskBase::memory_plan()
签名
[[nodiscard]] const MemoryPlan& memory_plan() const noexcept;
功能简介
获取当前内存布局计划(只读)。
返回值
MemoryPlan 常量引用,包含所有 DTensor 的布局信息
异常
无
TaskBase::config()
签名
[[nodiscard]] PlanConfig& config() noexcept;
功能简介
获取内存布局配置(可修改)。
返回值
PlanConfig 引用,可配置 BN 折叠、优化器类型等
异常
无
TaskBase::debug_mode()
签名
[[nodiscard]] bool debug_mode() const noexcept;
功能简介
检查是否处于调试模式(干运行)。
返回值
true 表示调试模式,false 表示正常运行
异常
无
TaskBase::is_simple_task()
签名
[[nodiscard]] virtual bool is_simple_task() const;
功能简介
判断当前任务是否为 SimpleTask 类型。
返回值
SimpleTask 实例返回 true,TaskBase 自身及 DeepLearningTask 返回 false
异常
无
TaskBase::graphs()
签名
[[nodiscard]] const std::unordered_map<std::string, GraphEntry>& graphs() const noexcept;
[[nodiscard]] std::unordered_map<std::string, GraphEntry>& graphs() noexcept;
功能简介
获取所有已注册命名计算图的访问接口。const 重载为只读,非 const 重载允许修改。
返回值
命名图到 GraphEntry 的映射引用。GraphEntry 包含 ComputationGraph 与 StreamKind
异常
无
注意事项
主要用于测试和调试,普通用户通常通过 run() 间接使用图。
编译接口
TaskBase::compile()
签名
void compile();
功能简介
正常编译模式:分配硬件资源、捕获 CUDA Graph、进入 COMPILED 阶段。
异常
RuntimeError:硬件分配失败或图捕获失败ValueError:配置不完整或状态机错误
注意事项
必须在 PLANNING 或 MEMORY_LOCKED 阶段调用,调用后进入 COMPILED 阶段。
TaskBase::compile_for_dry_run()
签名
void compile_for_dry_run();
功能简介
干运行编译:仅完成 IR 规划与打印,不分配硬件、不捕获图。用于调试模型架构和内存布局。
异常
ValueError:配置不完整或状态机错误
注意事项
编译后处于 COMPILED 阶段,但无法执行实际训练。
TaskBase::compile_capture_simple()
签名
void compile_capture_simple();
功能简介
SimpleTask 专用:逐个图独立捕获,不进入 GraphAtlas 预捕获流水线。
异常
RuntimeError:图捕获失败ValueError:状态机错误
注意事项
仅 SimpleTask 可调用此方法。
数据传输
TaskBase::transfer(const Tensor&, const DTensor&)
签名
void transfer(const Tensor& host, const DTensor& dtensor);
功能简介
主机到设备传输:将主机张量数据广播到所有 GPU。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
host |
const Tensor& |
- | [in] 主机张量 |
dtensor |
const DTensor& |
- | [in] 目标分布式张量 |
返回值
无
异常
ValueError:张量形状不匹配、DType 不一致或不在 COMPILED 阶段IndexError:内部 rank 越界(通常不会出现)RuntimeError:CUDA 传输失败
注意事项
必须在 COMPILED 阶段调用。等价于先 transfer_to_rank(host, dtensor, 0) 再 broadcast_from_rank0(dtensor)。
TaskBase::transfer(const std::vector&, const DTensor&)
签名
void transfer(const std::vector<Tensor>& hosts, const DTensor& dtensor);
功能简介
多主机张量传输:每个 GPU 对应一个主机张量,按 Rank 顺序传输。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
hosts |
const std::vector |
- | [in] 主机张量列表 |
dtensor |
const DTensor& |
- | [in] 目标分布式张量 |
返回值
无
异常
ValueError:张量数量与 GPU 数量不匹配、DType 不一致或不在 COMPILED 阶段IndexError:内部 rank 越界(通常不会出现)RuntimeError:CUDA 传输失败
注意事项
必须在 COMPILED 阶段调用。hosts[i] 传输到 rank i。
TaskBase::transfer_to_rank()
签名
void transfer_to_rank(const Tensor& host, const DTensor& dtensor, int rank);
功能简介
仅传输到指定逻辑 Rank(不广播)。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
host |
const Tensor& |
- | [in] 主机张量 |
dtensor |
const DTensor& |
- | [in] 目标分布式张量 |
rank |
int |
- | [in] 目标逻辑 Rank(0 ~ num_gpus-1) |
返回值
无
异常
ValueError:DType 不一致、形状不匹配或不在 COMPILED 阶段IndexError:Rank 超出范围[0, num_gpus)RuntimeError:CUDA 传输失败
注意事项
- Rank 会自动映射到物理 GPU ID:rank i → GPU IDs[i]
- 必须在 COMPILED 阶段调用
- 例如:
gpu_ids=[2,3,5,7],rank=0→ GPU ID 2
示例
task.transfer_to_rank(h_a, d_a, 0); // 传输到 rank 0(GPU 2)
TaskBase::broadcast_from_rank0()
签名
void broadcast_from_rank0(const DTensor& dtensor);
功能简介
从逻辑 Rank 0 广播到所有 GPU。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
dtensor |
const DTensor& |
- | [in,out] 要广播的分布式张量 |
返回值
无
异常
RuntimeError:CUDA 广播失败或不在 COMPILED 阶段
注意事项
- Rank 0 的数据会复制到所有其他 Rank
- 必须在 COMPILED 阶段调用
- Rank 0 映射到物理 GPU ID
gpu_ids[0]
示例
task.broadcast_from_rank0(d_a); // 广播到所有卡
TaskBase::fetch_from_rank()
签名
[[nodiscard]] Tensor fetch_from_rank(const DTensor& dtensor, int rank);
功能简介
从指定逻辑 Rank 取回数据到 CPU。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
dtensor |
const DTensor& |
- | [in] 源分布式张量 |
rank |
int |
- | [in] 源逻辑 Rank(0 ~ num_gpus-1) |
返回值
主机张量,包含从指定 Rank 取回的数据
异常
ValueError:DTensor 无效或不在 COMPILED 阶段IndexError:Rank 超出范围[0, num_gpus)RuntimeError:CUDA 传输失败
注意事项
- 使用同步
cudaMemcpy进行 D2H 传输,支持可分页内存 - Rank 会自动映射到物理 GPU ID
TaskBase::fetch()
签名
[[nodiscard]] Tensor fetch(const DTensor& dtensor);
功能简介
从逻辑 Rank 0 取回数据到 CPU(便捷方法)。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
dtensor |
const DTensor& |
- | [in] 源分布式张量 |
返回值
主机张量,包含从 Rank 0 取回的数据
异常
RuntimeError:CUDA 传输失败或不在 COMPILED 阶段
注意事项
等价于 fetch_from_rank(dtensor, 0)。
数据初始化
TaskBase::fill()
签名
void fill(const DTensor& dtensor, float value);
功能简介
用常量值填充分布式张量(所有 Rank)。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
dtensor |
const DTensor& |
- | [in,out] 目标分布式张量 |
value |
float |
- | [in] 填充值 |
返回值
无
异常
RuntimeError:CUDA 操作失败或不在 COMPILED 阶段
注意事项
- 必须在 COMPILED 阶段调用
- 当前实现仅支持
DType::FP32的 DTensor
TaskBase::zero()
签名
void zero(const DTensor& dtensor);
功能简介
将分布式张量清零(所有 Rank)。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
dtensor |
const DTensor& |
- | [in,out] 目标分布式张量 |
返回值
无
异常
RuntimeError:CUDA 操作失败或不在 COMPILED 阶段
注意事项
等价于 fill(dtensor, 0.0f)。必须在 COMPILED 阶段调用。
TaskBase::randn()
签名
void randn(const DTensor& dtensor, uint64_t seed);
功能简介
用正态分布随机数填充分布式张量(所有 Rank)。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
dtensor |
const DTensor& |
- | [in,out] 目标分布式张量 |
seed |
uint64_t |
- | [in] 随机种子 |
返回值
无
异常
RuntimeError:CUDA 操作失败或不在 COMPILED 阶段
注意事项
- 每个 Rank 使用相同的种子,保证分布式一致性
- 必须在 COMPILED 阶段调用
- 当前实现仅支持
DType::FP32的 DTensor
TaskBase::init()
签名
void init(const DTensor& dtensor, InitConfig cfg = InitConfig{});
功能简介
按 InitConfig 配置初始化单个 DTensor。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
dtensor |
const DTensor& |
- | [in,out] 目标分布式张量 |
cfg |
InitConfig |
InitConfig{} |
[in] 初始化配置 |
返回值
无
异常
RuntimeError:初始化失败或不在 COMPILED 阶段
注意事项
- 根据
InitConfig的kind选择初始化方式(CONSTANTS、ZEROS、TRUNC_NORMAL 等) - 如果
cfg为空,使用 DTensor 自带的init_config - 必须在 COMPILED 阶段调用
示例
task.init(d_w); // 按 Initializer 策略初始化权重
TaskBase::init_all()
签名
void init_all();
功能简介
初始化 MemoryPlan 中所有参数 DTensor。
返回值
无
异常
RuntimeError:初始化失败或不在 COMPILED 阶段
注意事项
按每个 DTensor 的 init_config 配置执行初始化,跳过 InitKind::NONE 的张量。必须在 COMPILED 阶段调用。
示例
task.init_all(); // 初始化所有权重
TaskBase::set_dropout_seed_id()
签名
void set_dropout_seed_id(int32_t id);
功能简介
设置 Dropout per-RANK seed 的 DTensor ID。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
id |
int32_t |
- | [in] 已分配的 seed DTensor ID |
返回值
无
异常
无
注意事项
用于 SimpleTask 测试场景,补充 baseline 注入。DTensor 应在 S_SCALAR_INT32 区域,shape 为 {1,1,1,2}。
策略配置
TaskBase::initializer()
签名
TaskBase& initializer(const Initializer& init);
功能简介
配置初始化策略(必须在 PLANNING 阶段调用,alloc 前)。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
init |
const Initializer& |
- | [in] 初始化策略 |
返回值
返回 *this,支持链式调用
异常
无
注意事项
必须在 PLANNING 阶段调用,否则配置不生效。
示例
task.initializer(Initializer().conv(TRUNC_NORMAL).bn().fc(FIXED_NORMAL));
TaskBase::initializer() const
签名
[[nodiscard]] const Initializer& initializer() const noexcept;
功能简介
获取当前初始化策略(只读)。
返回值
Initializer 常量引用
异常
无
TaskBase::scheduler(SchedulerType&& sched)
签名
template<typename SchedulerType>
TaskBase& scheduler(SchedulerType&& sched);
功能简介
配置学习率调度器(模板方法,支持任意派生类)。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
sched |
SchedulerType&& |
- | [in] 任意调度器派生类实例 |
返回值
返回 *this,支持链式调用
异常
无
注意事项
支持 PolynomialLR、CosineAnnealingLR、StepLR、ConstantLR 等所有调度器类型。
示例
task.scheduler(PolynomialLR()
.base_lr(12.4f)
.warmup(2)
.power(2.0f)
.step_by_batch());
TaskBase::scheduler() const
签名
[[nodiscard]] const LRScheduler* scheduler() const noexcept;
功能简介
获取当前学习率调度器(只读)。
返回值
LRScheduler 指针,未设置时为 nullptr
异常
无
TaskBase::scheduler()
签名
[[nodiscard]] LRScheduler* scheduler() noexcept;
功能简介
获取当前学习率调度器(可修改)。
返回值
LRScheduler 指针,未设置时为 nullptr
异常
无
SimpleTask
概述
手动构图门面类,暴露 TaskBase 的手动构图接口,提供极简用户体验。SimpleTask 适用于用户需要显式控制计算图构建的场景,如自定义算子测试、性能基准测试、算法验证等。
头文件:#include
设计定位:面向手动构图场景的任务句柄,通过 using 声明将 TaskBase 的 protected 接口提升为 public。
状态管理:有状态,继承 TaskBase 的三阶段状态机
继承关系:继承自 TaskBase,重写 on_prepare() 和 compile_freeze_global() 钩子
典型使用路径:用户直接构造 SimpleTask,手动调用 alloc()、finalize_memory()、add_graph()、compile()、run() 等方法
与 DeepLearningTask 的区别:
SimpleTask暴露手动构图接口(alloc、add_graph),适合手动构图DeepLearningTask不暴露构图接口,通过BluePrint自动生成 IR,适合深度学习训练
典型工作流程:
- PLANNING 阶段:调用
alloc()分配 DTensor - 调用
finalize_memory()锁定内存布局 - MEMORY_LOCKED 阶段:调用
add_graph()注册计算图 - 调用
compile()编译并捕获 CUDA Graph - COMPILED 阶段:通过
transfer()、fill()初始化数据 - 调用
run()执行图,通过fetch()取回结果
构造、析构与赋值
SimpleTask::SimpleTask()
签名
SimpleTask() = default;
功能简介
默认构造函数,创建处于 PLANNING 阶段的手动构图任务。
异常
无
SimpleTask::SimpleTask(const SimpleTask&)
签名
SimpleTask(const SimpleTask&) = delete;
功能简介
禁用拷贝构造。
SimpleTask::SimpleTask(SimpleTask&&)
签名
SimpleTask(SimpleTask&&) = delete;
功能简介
禁用移动构造。
SimpleTask::operator=(const TaskBase&)
签名
SimpleTask& operator=(const SimpleTask&) = delete;
SimpleTask& operator=(SimpleTask&&) = delete;
功能简介
禁用拷贝赋值与移动赋值。
SimpleTask::~SimpleTask()
签名
~SimpleTask() override = default;
功能简介
析构函数,资源由 TaskBase 和 Backend RAII 管理。
异常
无
SimpleTask::is_simple_task()
签名
[[nodiscard]] bool is_simple_task() const override;
功能简介
重写基类方法,返回 true 标识当前为 SimpleTask。
返回值
true
异常
无
手动构图接口
SimpleTask::alloc()
签名
using TaskBase::alloc;
功能简介
在 PLANNING 阶段分配分布式张量(继承自 TaskBase)。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
shape |
const Shape& |
- | [in] NHWC 逻辑形状 |
dtype |
DType |
DType::FP32 |
[in] 数据类型 |
region |
Region |
- | [in] 显存区域 |
返回值
DTensor 分布式张量描述符
异常
ValueError:不在 PLANNING 阶段或 Region 冲突
注意事项
必须在 PLANNING 阶段调用。Region 不能省略,避免 AMP/FP32 静默错配。
示例
DTensor d_a = task.alloc(shape, DType::FP32, Region::F_FEATURE_FP32);
SimpleTask::alloc_scalar()
签名
using TaskBase::alloc_scalar;
功能简介
在 PLANNING 阶段分配标量张量(继承自 TaskBase)。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
dtype |
DType |
DType::FP32 |
[in] 数据类型 |
返回值
DTensor 标量分布式张量描述符
异常
ValueError:不在 PLANNING 阶段
注意事项
自动放入 S_SCALAR 区域(FP32 或 FP16)。必须在 PLANNING 阶段调用。
示例
DTensor d_alpha = task.alloc_scalar(DType::FP32);
SimpleTask::finalize_memory()
签名
using TaskBase::finalize_memory;
功能简介
锁定内存布局,从 PLANNING 进入 MEMORY_LOCKED 阶段(继承自 TaskBase)。
返回值
无
异常
ValueError:不在 PLANNING 阶段
注意事项
调用后不可再 alloc(),必须先 add_graph() 再 compile()。
SimpleTask::add_graph()
签名
using TaskBase::add_graph;
功能简介
在 MEMORY_LOCKED 阶段注册命名计算图(继承自 TaskBase)。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
name |
const std::string& |
- | [in] 图名称 |
graph |
ComputationGraph |
- | [in] 平台无关计算图 |
stream |
StreamKind |
StreamKind::COMP_1 |
[in] 流类型 |
返回值
无
异常
ValueError:不在 MEMORY_LOCKED 阶段或图名重复
注意事项
必须在 MEMORY_LOCKED 阶段调用,编译阶段不可添加新图。
示例
task.add_graph("xfer", std::move(g_xfer), StreamKind::TRANS);
图执行接口
SimpleTask::run(const std::string&)
签名
void run(const std::string& name);
功能简介
执行单个已注册的图。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
name |
const std::string& |
- | [in] 图名称 |
返回值
无
异常
ValueError:图不存在或不在 COMPILED 阶段RuntimeError:图执行失败
注意事项
必须在 COMPILED 阶段调用。
示例
task.run("axpy");
SimpleTask::run(const std::string&, const std::string&)
签名
void run(const std::string& a, const std::string& b);
功能简介
双图并行执行。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
a |
const std::string& |
- | [in] 第一个图的名称 |
b |
const std::string& |
- | [in] 第二个图的名称 |
返回值
无
异常
ValueError:图不存在或不在 COMPILED 阶段RuntimeError:图执行失败
注意事项
两个图在不同 Stream 上并行执行。必须在 COMPILED 阶段调用。
示例
task.run("xfer", "compute");
SimpleTask::run_iter(const std::string& name, int iterations)
签名
void run_iter(const std::string& name, int iterations);
功能简介
高性能迭代执行单个图(SimpleTask 专用)。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
name |
const std::string& |
- | [in] 图名称 |
iterations |
int |
- | [in] 迭代次数 |
返回值
无
异常
ValueError:图不存在、iterations 非正或不在 COMPILED 阶段RuntimeError:图执行失败
注意事项
- 循环外一次性查找 + 多线程展开,循环内只做 launch + sync
- 自动按 CPU/GPU 分支:GPU 用
cudaGraphLaunch,CPU 直接 launch - 必须在 COMPILED 阶段调用
SimpleTask::run_iter(const std::string& a, const std::string& b, int iterations)
签名
void run_iter(const std::string& a, const std::string& b, int iterations);
功能简介
高性能迭代执行双图并行(SimpleTask 专用)。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
a |
const std::string& |
- | [in] 第一个图的名称 |
b |
const std::string& |
- | [in] 第二个图的名称 |
iterations |
int |
- | [in] 迭代次数 |
返回值
无
异常
ValueError:图不存在、iterations 非正或不在 COMPILED 阶段RuntimeError:图执行失败
注意事项
双图在不同 Stream 上并行执行,GPU 场景下多线程展开。
调试接口
SimpleTask::print_memory_plan()
签名
void print_memory_plan(std::ostream& os = std::cout) const;
功能简介
打印 MemoryPlan 布局信息到指定输出流。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
os |
std::ostream& |
std::cout |
[in,out] 输出流 |
返回值
无
异常
ValueError:不在 COMPILED 阶段
注意事项
必须在 compile() 之后调用。输出包含每个 Region 的偏移、大小,以及其中所有 Tensor 的 ID/偏移/字节数/类型/形状。
SimpleTask::print_computation_graphs()
签名
void print_computation_graphs(std::ostream& os = std::cout) const;
功能简介
打印所有已注册 ComputationGraph 的拓扑信息到指定输出流。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
os |
std::ostream& |
std::cout |
[in,out] 输出流 |
返回值
无
异常
ValueError:不在 COMPILED 阶段
注意事项
必须在 compile() 之后调用。输出包含每张图的名字、Stream、节点总数,以及每个节点的算子/输入/输出。
继承自基类的公共接口
SimpleTask 通过 using 声明继承了 TaskBase 的以下 public 接口,详见 TaskBase 文档:
| 方法 | 继承自 | 说明 |
|---|---|---|
phase() |
TaskBase |
获取当前阶段 |
memory_plan() |
TaskBase |
获取内存布局计划 |
config() |
TaskBase |
获取内存布局配置 |
debug_mode() |
TaskBase |
检查调试模式 |
is_simple_task() |
TaskBase |
判断是否为 SimpleTask |
graphs() |
TaskBase |
获取已注册计算图 |
compile() |
TaskBase |
编译任务 |
compile_for_dry_run() |
TaskBase |
干运行编译 |
compile_capture_simple() |
TaskBase |
SimpleTask 专用编译 |
transfer() |
TaskBase |
主机到设备广播传输 |
transfer_to_rank() |
TaskBase |
传输到指定 Rank |
broadcast_from_rank0() |
TaskBase |
从 Rank 0 广播 |
fill() |
TaskBase |
常量填充 |
zero() |
TaskBase |
清零 |
randn() |
TaskBase |
正态分布随机初始化 |
init() |
TaskBase |
初始化单个 DTensor |
init_all() |
TaskBase |
初始化所有 DTensor |
set_dropout_seed_id() |
TaskBase |
设置 Dropout seed |
initializer() |
TaskBase |
配置初始化策略 |
scheduler() |
TaskBase |
配置学习率调度器 |
scheduler() const |
TaskBase |
获取学习率调度器(只读) |
scheduler() |
TaskBase |
获取学习率调度器(可修改) |
fetch_from_rank() |
TaskBase |
从 Rank 取回数据 |
fetch() |
TaskBase |
从 Rank 0 取回数据 |
DeepLearningTask
概述
深度学习训练任务门面类,封装完整训练循环、验证、SEMA、早停与指标收集。DeepLearningTask 适用于标准深度学习训练场景,用户只需配置模型、优化器、调度器等超参数,无需手动构图。
头文件:#include
设计定位:深度学习训练门面,隐藏构图细节,通过 BluePrint 自动生成 IR。
状态管理:有状态,继承 TaskBase 的三阶段状态机
继承关系:继承自 TaskBase,重写 on_prepare() 驱动 Compiler 生成完整 IR
典型使用路径:用户构造 DeepLearningTask,通过链式 API 配置训练参数,调用 compile() 和 run() 执行训练
与 SimpleTask 的区别:
DeepLearningTask不暴露alloc()、add_graph()等手动构图接口- 通过
BluePrint自动生成 IR,防止自动生成与手动作图的双重权威冲突 - 提供完整训练循环(epoch 循环、验证、SEMA、早停、指标收集、模型保存)
内部执行路径:DeepLearningTask 在 compile() 期间通过 build_graph_atlas()、build_exec_table()、fetch_lr_for_batch()、init_variant_scalars() 等内部方法完成图索引、执行表预解析和运行时标量初始化。这些方法为 public,但由编译/训练流程自动调用,普通用户无需直接操作。
构造、析构与赋值
DeepLearningTask::DeepLearningTask()
签名
DeepLearningTask();
功能简介
构造函数,创建处于 PLANNING 阶段的深度学习训练任务。
异常
无
DeepLearningTask::DeepLearningTask(const DeepLearningTask&)
签名
DeepLearningTask(const DeepLearningTask&) = delete;
功能简介
禁用拷贝构造。
DeepLearningTask::DeepLearningTask(DeepLearningTask&&)
签名
DeepLearningTask(DeepLearningTask&&) = delete;
功能简介
禁用移动构造。
DeepLearningTask::operator=(const DeepLearningTask&)
签名
DeepLearningTask& operator=(const DeepLearningTask&) = delete;
DeepLearningTask& operator=(DeepLearningTask&&) = delete;
功能简介
禁用拷贝赋值与移动赋值。
DeepLearningTask::~DeepLearningTask()
签名
~DeepLearningTask() override;
功能简介
析构函数,释放训练资源和 CUDA Graph。
异常
无
DeepLearningTask::is_simple_task()
签名
[[nodiscard]] bool is_simple_task() const override;
功能简介
重写基类方法,返回 false 标识当前不是 SimpleTask。
返回值
false
异常
无
链式配置接口
DeepLearningTask::model()
签名
DeepLearningTask& model(const BluePrint& bp);
功能简介
设置模型蓝图。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
bp |
const BluePrint& |
- | [in] 模型蓝图 |
返回值
返回 *this,支持链式调用
异常
无
注意事项
必须在 compile() 前调用。
DeepLearningTask::loss()
签名
DeepLearningTask& loss(const CrossEntropyLoss& loss_cfg);
功能简介
设置损失函数。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
loss_cfg |
const CrossEntropyLoss& |
- | [in] 损失函数配置 |
返回值
返回 *this,支持链式调用
异常
无
注意事项
必须在 compile() 前调用。
DeepLearningTask::initializer()
签名
DeepLearningTask& initializer(const Initializer& init);
功能简介
设置权重初始化策略。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
init |
const Initializer& |
- | [in] 初始化策略 |
返回值
返回 *this,支持链式调用
异常
无
注意事项
必须在 compile() 前调用。如未设置,on_prepare() 会自动应用默认策略。
DeepLearningTask::optimizer(const LARS&)
签名
DeepLearningTask& optimizer(const LARS& opt);
功能简介
设置 LARS 优化器。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
opt |
const LARS& |
- | [in] LARS 优化器配置 |
返回值
返回 *this,支持链式调用
异常
无
注意事项
必须在 compile() 前调用。LARS 适用于大 batch 训练。
DeepLearningTask::optimizer(const SGD&)
签名
DeepLearningTask& optimizer(const SGD& opt);
功能简介
设置 SGD 优化器。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
opt |
const SGD& |
- | [in] SGD 优化器配置 |
返回值
返回 *this,支持链式调用
异常
无
注意事项
必须在 compile() 前调用。
DeepLearningTask::optimizer(const Adam&)
签名
DeepLearningTask& optimizer(const Adam& opt);
功能简介
设置 Adam 优化器。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
opt |
const Adam& |
- | [in] Adam 优化器配置 |
返回值
返回 *this,支持链式调用
异常
无
注意事项
必须在 compile() 前调用。Adam 自适应学习率,适合大多数场景。
DeepLearningTask::optimizer(const AdamW&)
签名
DeepLearningTask& optimizer(const AdamW& opt);
功能简介
设置 AdamW 优化器。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
opt |
const AdamW& |
- | [in] AdamW 优化器配置 |
返回值
返回 *this,支持链式调用
异常
无
注意事项
必须在 compile() 前调用。AdamW 解耦权重衰减,适合Transformer等架构。
DeepLearningTask::scheduler(const PolynomialLR&)
签名
DeepLearningTask& scheduler(const PolynomialLR& sched);
功能简介
设置 PolynomialLR 学习率调度器。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
sched |
const PolynomialLR& |
- | [in] PolynomialLR 调度器配置 |
返回值
返回 *this,支持链式调用
异常
无
注意事项
必须在 compile() 前调用。多项式衰减,MLPerf 推荐策略。
DeepLearningTask::scheduler(const CosineAnnealingLR&)
签名
DeepLearningTask& scheduler(const CosineAnnealingLR& sched);
功能简介
设置 CosineAnnealingLR 学习率调度器。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
sched |
const CosineAnnealingLR& |
- | [in] CosineAnnealingLR 调度器配置 |
返回值
返回 *this,支持链式调用
异常
无
注意事项
必须在 compile() 前调用。余弦退火,平滑衰减策略。
DeepLearningTask::scheduler(const StepLR&)
签名
DeepLearningTask& scheduler(const StepLR& sched);
功能简介
设置 StepLR 学习率调度器。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
sched |
const StepLR& |
- | [in] StepLR 调度器配置 |
返回值
返回 *this,支持链式调用
异常
无
注意事项
必须在 compile() 前调用。阶梯式衰减,按步长降低学习率。
DeepLearningTask::scheduler(const ConstantLR&)
签名
DeepLearningTask& scheduler(const ConstantLR& sched);
功能简介
设置 ConstantLR 学习率调度器。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
sched |
const ConstantLR& |
- | [in] ConstantLR 调度器配置 |
返回值
返回 *this,支持链式调用
异常
无
注意事项
必须在 compile() 前调用。恒定学习率,不衰减。
DeepLearningTask::scheduler(const MultiStepLR&)
签名
DeepLearningTask& scheduler(const MultiStepLR& sched);
功能简介
设置 MultiStepLR 学习率调度器。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
sched |
const MultiStepLR& |
- | [in] MultiStepLR 调度器配置 |
返回值
返回 *this,支持链式调用
异常
无
注意事项
必须在 compile() 前调用。多阶梯衰减,在指定 epoch 降低学习率。
DeepLearningTask::scheduler(const ExponentialLR&)
签名
DeepLearningTask& scheduler(const ExponentialLR& sched);
功能简介
设置 ExponentialLR 学习率调度器。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
sched |
const ExponentialLR& |
- | [in] ExponentialLR 调度器配置 |
返回值
返回 *this,支持链式调用
异常
无
注意事项
必须在 compile() 前调用。指数衰减,每 epoch 按比例降低学习率。
DeepLearningTask::scheduler(const WSDLR&)
签名
DeepLearningTask& scheduler(const WSDLR& sched);
功能简介
设置 WSDLR 学习率调度器。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
sched |
const WSDLR& |
- | [in] WSDLR 调度器配置 |
返回值
返回 *this,支持链式调用
异常
无
注意事项
必须在 compile() 前调用。Warmup + Step Decay,先预热再阶梯衰减。
DeepLearningTask::scheduler(const CosineAnnealingWithWarmRestartsLR&)
签名
DeepLearningTask& scheduler(const CosineAnnealingWithWarmRestartsLR& sched);
功能简介
设置 CosineAnnealingWithWarmRestartsLR 学习率调度器。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
sched |
const CosineAnnealingWithWarmRestartsLR& |
- | [in] CosineAnnealingWithWarmRestartsLR 调度器配置 |
返回值
返回 *this,支持链式调用
异常
无
注意事项
必须在 compile() 前调用。余弦退火 + 热重启,周期性重置学习率。
DeepLearningTask::total_epochs()
签名
DeepLearningTask& total_epochs(int n);
功能简介
设置总训练 epoch 数。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
n |
int |
- | [in] 总 epoch 数 |
返回值
返回 *this,支持链式调用
异常
无
注意事项
默认值 35。必须在 compile() 前调用。
DeepLearningTask::num_classes()
签名
DeepLearningTask& num_classes(int n);
功能简介
设置输出类别数(ArchPlan::build 使用)。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
n |
int |
- | [in] 类别数 |
返回值
返回 *this,支持链式调用
异常
无
注意事项
默认值 1000(ImageNet)。必须在 compile() 前调用。
DeepLearningTask::validate_every()
签名
DeepLearningTask& validate_every(int interval, int offset = 0);
功能简介
设置验证频率。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
interval |
int |
- | [in] 每多少个 epoch 验证一次(必须 > 0) |
offset |
int |
0 |
[in] 首次验证的 epoch 编号(1-based) |
返回值
返回 *this,支持链式调用
异常
无
注意事项
- 遵循 MLPerf 1-based epoch 编号语义
- 验证点序列:offset, offset+interval, offset+2*interval, ...
- 示例:
validate_every(4, 2)→ 在 epoch 2, 6, 10, 14, ... 验证
示例
task.validate_every(4, 2); // 在 epoch 2, 6, 10, 14, ... 验证
DeepLearningTask::early_stop_by_top1()
签名
DeepLearningTask& early_stop_by_top1(float threshold);
功能简介
设置早停 Top-1 准确率阈值。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
threshold |
float |
- | [in] 准确率阈值(0.0 ~ 1.0) |
返回值
返回 *this,支持链式调用
异常
无
注意事项
当验证 Top-1 准确率达到阈值时,训练提前终止。
DeepLearningTask::use_sema()
签名
DeepLearningTask& use_sema(bool enable);
功能简介
是否启用 SEMA(Switch EMA)。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
enable |
bool |
- | [in] 是否启用 |
返回值
返回 *this,支持链式调用
异常
无
注意事项
SEMA 在每个 epoch 开关将 EMA 权重应用回主模型,提升推理性能。
DeepLearningTask::sema_decay()
签名
DeepLearningTask& sema_decay(float decay);
功能简介
设置 SEMA 衰减系数。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
decay |
float |
- | [in] 衰减系数(0.0 ~ 1.0) |
返回值
返回 *this,支持链式调用
异常
无
注意事项
默认值 0.9。控制 EMA 权重的更新速率。
DeepLearningTask::grad_clip()
签名
DeepLearningTask& grad_clip(float max_abs);
功能简介
设置梯度裁剪最大绝对值。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
max_abs |
float |
- | [in] 裁剪阈值;<= 0 表示不裁剪 |
返回值
返回 *this,支持链式调用
异常
无
注意事项
- 仅可在
Phase::PLANNING调用 - 裁剪方式:
clamp(g, -max_abs, +max_abs) - 阈值在 compile 时嵌入图,运行期零 H2D
DeepLearningTask::tta()
签名
DeepLearningTask& tta(TTA mode);
功能简介
设置测试时增强(TTA)模式。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
mode |
TTA |
- | [in] TTA 模式 |
返回值
返回 *this,支持链式调用
异常
无
注意事项
DISABLED:禁用 TTA(默认)LR:左右翻转SHIFT_1PX:一像素平移(适用于 MNIST 等小图像)- 当前版本仅提供 API 支持,具体实现留为 TODO
DeepLearningTask::freeze_first_layer_after()
签名
DeepLearningTask& freeze_first_layer_after(int epoch);
功能简介
设置首层冻结起始 epoch。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
epoch |
int |
- | [in] 起始 epoch(-1 表示不冻结) |
返回值
返回 *this,支持链式调用
异常
无
注意事项
冻结后首层权重不再更新,用于迁移学习微调。
DeepLearningTask::progressive_crop()
签名
DeepLearningTask& progressive_crop(int begin_size, int end_size);
功能简介
设置渐进式裁剪训练。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
begin_size |
int |
- | [in] 起始裁剪尺寸(像素) |
end_size |
int |
- | [in] 结束裁剪尺寸(像素) |
返回值
返回 *this,支持链式调用
异常
无
注意事项
TODO: 实现渐进式裁剪训练策略。从 begin_size 逐步增长到 end_size,提升模型对尺度的鲁棒性。
DeepLearningTask::progressive_resize()
签名
DeepLearningTask& progressive_resize(int begin_size, int end_size);
功能简介
设置渐进式缩放训练。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
begin_size |
int |
- | [in] 起始缩放尺寸(像素) |
end_size |
int |
- | [in] 结束缩放尺寸(像素) |
返回值
返回 *this,支持链式调用
异常
无
注意事项
TODO: 实现渐进式缩放训练策略。从 begin_size 逐步增长到 end_size,提升模型对分辨率的鲁棒性。
DeepLearningTask::metrics()
签名
DeepLearningTask& metrics(Metric m);
功能简介
设置需要收集的指标。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
m |
Metric |
- | [in] 指标位掩码 |
返回值
返回 *this,支持链式调用
异常
无
注意事项
默认值:Metric::TRAIN_LOSS | Metric::VAL_LOSS | Metric::VAL_TOP1。支持位运算组合。
示例
task.metrics(Metric::VAL_TOP1 | Metric::VAL_TOP5 | Metric::EMA_TOP1);
DeepLearningTask::save_model_at_epoch()
签名
DeepLearningTask& save_model_at_epoch(int epoch, const std::string& path);
功能简介
在指定 epoch 保存模型。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
epoch |
int |
- | [in] epoch 编号 |
path |
const std::string& |
- | [in] 保存路径 |
返回值
返回 *this,支持链式调用
异常
无
注意事项
到达指定 epoch 时自动保存模型检查点。
DeepLearningTask::save_best_model()
签名
DeepLearningTask& save_best_model(const std::string& path);
功能简介
保存最佳模型(自动命名)。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
path |
const std::string& |
- | [in] 保存路径(目录) |
返回值
返回 *this,支持链式调用
异常
无
注意事项
验证 Top-1 准确率提升时自动保存最佳模型。
编译与执行接口
DeepLearningTask::compile()
签名
void compile();
功能简介
编译:默认只打印 ArchPlan。
返回值
无
异常
ValueError:配置不完整或状态机错误RuntimeError:编译失败或硬件分配失败
注意事项
无参版本总是把诊断级别恢复为 CompileInfo::ARCH_PLAN,普通用户调用时输出保持简洁。
DeepLearningTask::compile(CompileInfo)
签名
void compile(CompileInfo info);
功能简介
编译:显式指定诊断信息打印级别。
参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
info |
CompileInfo |
- | [in] 位掩码组合 |
返回值
无
异常
ValueError:配置不完整或状态机错误RuntimeError:编译失败或硬件分配失败
注意事项
支持位运算组合,例如 CompileInfo::ARCH_PLAN | CompileInfo::MEMORY_PLAN。
示例
task.compile(CompileInfo::ALL); // 打印所有诊断信息
DeepLearningTask::run()
签名
[[nodiscard]] TrainingResult run();
功能简介
执行完整训练循环。
返回值
TrainingResult 训练结果汇总(best_top1、best_top5、best_epoch 等)
异常
RuntimeError:训练失败或硬件错误ValueError:不在 COMPILED 阶段
注意事项
- 内部流程:train phase → (可选)val phase → 指标收集 → SEMA → 早停判断 → 保存模型
- 每个 epoch 重复上述流程,直到达到 total_epochs 或早停阈值
示例
auto result = task.run();
std::cout << "Best Top-1: " << result.best_top1 * 100.0f << "%" << std::endl;
DeepLearningTask::dry_run()
签名
[[nodiscard]] TrainingResult dry_run();
功能简介
仅打印配置信息,不执行实际训练(debug 模式)。
返回值
TrainingResult 训练结果汇总(debug 模式下为空值)
异常
ValueError:不在 COMPILED 阶段
注意事项
用于验证配置是否正确,不执行实际训练,耗时极短。
测试接口
DeepLearningTask::test_h2d_copy_correctness()
签名
H2DTestResult test_h2d_copy_correctness();
功能简介
验证 H2D copy 数据正确性(第一个 epoch 的前 2 个 batch)。
返回值
H2DTestResult 测试结果(包含批次数量、数据正确性、标签正确性等)
异常
RuntimeError:测试失败ValueError:不在 COMPILED 阶段
注意事项
用于验证数据加载管线的正确性,检查 H2D 传输是否损坏数据。
DeepLearningTask::test_h2d_copy_bandwidth()
签名
H2DTestResult test_h2d_copy_bandwidth();
功能简介
测量 H2D copy 等效带宽(第一个 epoch 全部 batch)。
返回值
H2DTestResult 测试结果(包含带宽、延迟等性能指标)
异常
RuntimeError:测试失败ValueError:不在 COMPILED 阶段
注意事项
用于评估数据加载性能,测量 H2D 传输带宽和平均延迟。
DeepLearningTask::compile_h2d_only()
签名
void compile_h2d_only();
功能简介
只编译 H2D 传输图(TRANSFER_A + TRANSFER_B),不编译训练图。
返回值
无
异常
ValueError:配置不完整RuntimeError:编译失败
注意事项
用于独立测试数据加载管线,不包含前向/反向传播。
DeepLearningTask::run_h2d_only()
签名
H2DRunResult run_h2d_only();
功能简介
只运行 H2D 传输图(联动 Preprocessor/TransferStation,支持多 epoch + val)。
返回值
H2DRunResult 多 epoch H2D 运行结果
异常
RuntimeError:运行失败ValueError:不在 COMPILED 阶段
注意事项
用于端到端测试数据加载管线,包含训练和验证阶段。
继承自基类的公共接口
DeepLearningTask 继承了 TaskBase 的以下 public 接口,详见 TaskBase 文档:
| 方法 | 继承自 | 说明 |
|---|---|---|
phase() |
TaskBase |
获取当前阶段 |
memory_plan() |
TaskBase |
获取内存布局计划 |
config() |
TaskBase |
获取内存布局配置 |
debug_mode() |
TaskBase |
检查调试模式 |
is_simple_task() |
TaskBase |
判断是否为 SimpleTask |
graphs() |
TaskBase |
获取已注册计算图 |
compile() |
TaskBase |
编译任务 |
compile_for_dry_run() |
TaskBase |
干运行编译 |
compile_capture_simple() |
TaskBase |
SimpleTask 专用编译 |
transfer() |
TaskBase |
主机到设备广播传输 |
transfer_to_rank() |
TaskBase |
传输到指定 Rank |
broadcast_from_rank0() |
TaskBase |
从 Rank 0 广播 |
fill() |
TaskBase |
常量填充 |
zero() |
TaskBase |
清零 |
randn() |
TaskBase |
正态分布随机初始化 |
init() |
TaskBase |
初始化单个 DTensor |
init_all() |
TaskBase |
初始化所有 DTensor |
set_dropout_seed_id() |
TaskBase |
设置 Dropout seed |
initializer() |
TaskBase |
配置初始化策略 |
initializer() const |
TaskBase |
获取初始化策略(只读) |
scheduler() |
TaskBase |
配置学习率调度器 |
scheduler() const |
TaskBase |
获取学习率调度器(只读) |
scheduler() |
TaskBase |
获取学习率调度器(可修改) |
fetch_from_rank() |
TaskBase |
从 Rank 取回数据 |
fetch() |
TaskBase |
从 Rank 0 取回数据 |
H2DTestResult
概述
H2D copy 测试结果结构体,用于验证数据加载管线 H2D 传输的正确性,以及测量等效带宽和延迟。
头文件:#include
设计定位:DeepLearningTask 的 test_h2d_copy_correctness() 与 test_h2d_copy_bandwidth() 返回该结构体,属于测试诊断数据。
状态管理:无状态,纯数据容器
成员
| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
batches |
int |
0 |
批次数量 |
elapsed_us |
double |
0.0 |
总耗时(微秒) |
total_bytes |
size_t |
0 |
总传输字节数 |
bandwidth_gbps |
double |
0.0 |
等效带宽(GB/s) |
labels_ok |
bool |
true |
标签数据是否正确 |
data_ok |
bool |
true |
图像数据是否正确 |
avg_lat_us |
double |
0.0 |
平均延迟(微秒) |
min_lat_us |
double |
0.0 |
最小延迟(微秒) |
max_lat_us |
double |
0.0 |
最大延迟(微秒) |
H2DRunResult
概述
多 epoch H2D 运行结果容器,由 DeepLearningTask::run_h2d_only() 返回,包含每个 epoch 的训练和验证 H2D 传输结果。
头文件:#include
设计定位:DeepLearningTask 的 H2D-only 测试模式结果汇总,支持按训练和验证分别聚合。
状态管理:无状态,纯数据容器
成员
| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
epochs_run |
int |
0 |
训练 epoch 数 |
vals_run |
int |
0 |
验证次数 |
train_per_epoch |
std::vector |
{} |
每个 epoch 的训练结果 |
val_per_epoch |
std::vector |
{} |
每次验证的结果 |
total_elapsed_us |
double |
0.0 |
总耗时(微秒) |
方法
H2DRunResult::aggregate_train()
签名
H2DTestResult aggregate_train() const;
功能简介
聚合所有训练 epoch 的 H2D 结果,返回总批次、总字节数、总耗时、平均带宽和延迟统计。
返回值
聚合后的 H2DTestResult
异常
无
H2DRunResult::aggregate_val()
签名
H2DTestResult aggregate_val() const;
功能简介
聚合所有验证阶段的 H2D 结果,返回总批次、总字节数、总耗时、平均带宽和延迟统计。
返回值
聚合后的 H2DTestResult
异常
无
参见
Phase:任务生命周期阶段CompileInfo:编译诊断信息级别Tensor:主机张量DTensor:分布式张量BluePrint:模型蓝图MemoryPlan:内存布局计划ComputationGraph:计算图Initializer:初始化策略LRScheduler:学习率调度器基类Optimizer:优化器包装类
Backend
板块介绍
Backend 模块是 Tech-Renaissance 的执行引擎,负责管理硬件设备、内存/显存池、算子执行和多流调度。该模块提供以下核心能力:
- 设备管理:通过
DeviceContext管理单卡执行上下文,包括流、cuDNN/cuBLAS句柄、工作空间和DTensor指针解析 - 内存管理:通过
MemoryArena和ArenaKeeper提供统一的CPU/GPU内存池管理,支持多卡并行分配和按需扩容 - 图执行:通过
GraphExecutor实现A/B双缓冲、双图并行和训练/验证工作流调度 - 算子注册:通过全局算子表(
g_compute_op_table/g_range_op_table)和各register_op_*()函数提供ComputeOp和RangeOp到启动函数的映射表 - 流策略:通过
get_op_default_stream()定义算子默认流分配策略
关键头文件:
device_context.h- 单卡执行上下文memory_arena.h- 统一内存/显存池graph_executor.h- 图执行调度器op_registry.h- 算子注册表op_stream_policy.h- 算子流策略cudnn_utils.h- cuDNN辅助工具cudnn_fe_cache.h- cuDNN Frontend缓存lars_common.h- LARS常量定义
本板块条目:
- 类:
GraphExecutor、DeviceContext、MemoryArena、CpuArena、CudaArena、ArenaKeeper - 结构体:
OptimizerScalarIds、MemRangeInfo、CpuOpContext、ComputeOpEntry、RangeOpEntry、CudnnFeGraphCache - 宏:
TR_CUDNN_FE_CHECK、TR_CUDNN_CHECK - 预定义常量:
kComputeOpCount、kRangeOpCount、g_compute_op_table、g_range_op_table、lars::kLarsMaxPartial - 独立函数:
gid_to_stream_kind、get_op_default_stream、register_default_ops、各register_op_*、require_warmup、warmup_single_cudnn_op、shape_from_fe_dim、to_fe_dtype、to_fe_dim、to_fe_stride_nhwc、create_cudnn_graph、finalize_cudnn_graph、to_cudnn_dtype
内部实现:src/backend/
GraphExecutor
概述
GraphExecutor 是 per-rank 运行调度器,实现A/B双缓冲、双图并行和训练/验证工作流。该类由 TaskBase 内部使用,普通用户通常不需要直接操作。
头文件:#include
状态:有状态(需要构造和配置)
使用路径:由 TaskBase 在图捕获后创建并管理,用户通过 TaskBase::train_step() 和 TaskBase::val_step() 间接调用
典型用法:
// 由 TaskBase 内部创建和管理,用户无需直接构造
// 以下代码仅展示内部使用模式
GraphExecutor exec(rank, device_context, pre_capture_result);
exec.set_optimizer_scalar_ids(scalar_ids);
exec.set_current_lr(0.01f);
exec.run_train_step(); // 执行训练步
构造与配置
GraphExecutor::GraphExecutor(int, const DeviceContext&, const PreCaptureResult&)
GraphExecutor(int rank,
const DeviceContext& ctx,
const PreCaptureResult& pre_capture_result);
功能简介:构造函数,初始化图执行器,绑定设备上下文和预捕获结果
参数:
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| rank | int | - | 当前进程的rank标识 |
| ctx | const DeviceContext& | - | 设备上下文引用 |
| pre_capture_result | const PreCaptureResult& | - | 预捕获结果引用 |
异常:无
GraphExecutor::GraphExecutor(const GraphExecutor&) = delete
GraphExecutor(const GraphExecutor&) = delete;
功能简介:禁止拷贝构造
GraphExecutor::operator=(const GraphExecutor&) = delete
GraphExecutor& operator=(const GraphExecutor&) = delete;
功能简介:禁止拷贝赋值
GraphExecutor::set_training(bool)
void set_training(bool v) noexcept;
功能简介:设置执行模式,true为训练模式,false为验证模式
参数:
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| v | bool | - | 执行模式标志 |
异常:无
GraphExecutor::set_last_batch(bool)
void set_last_batch(bool v) noexcept;
功能简介:标记当前是否为最后一个batch,影响训练步的调度路径
参数:
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| v | bool | - | 是否为最后一个batch |
异常:无
GraphExecutor::set_low_resolution(bool)
void set_low_resolution(bool v) noexcept;
功能简介:设置是否使用低分辨率路径
参数:
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| v | bool | - | 是否使用低分辨率 |
异常:无
GraphExecutor::set_skip_first_bwd(bool)
void set_skip_first_bwd(bool v) noexcept;
功能简介:设置是否跳过首层反向传播
参数:
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| v | bool | - | 是否跳过首层反向 |
异常:无
GraphExecutor::set_optimizer_scalar_ids(const OptimizerScalarIds&)
void set_optimizer_scalar_ids(const OptimizerScalarIds& ids) noexcept;
功能简介:设置优化器标量ID映射,用于学习率、动量等参数的GPU更新
参数:
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| ids | const OptimizerScalarIds& | - | 优化器标量ID结构体 |
异常:无
GraphExecutor::set_current_lr(float)
void set_current_lr(float lr) noexcept;
功能简介:设置当前学习率,用于GPU标量更新
参数:
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| lr | float | - | 当前学习率值 |
异常:无
GraphExecutor::toggle_ab()
void toggle_ab() noexcept;
功能简介:切换A/B双缓冲状态
异常:无
GraphExecutor::reset_ab(bool)
void reset_ab(bool to_a = true) noexcept;
功能简介:重置A/B双缓冲状态
参数:
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| to_a | bool | true | true时切换到A缓冲,false时切换到B缓冲 |
异常:无
查询接口
GraphExecutor::rank() const
[[nodiscard]] int rank() const noexcept;
功能简介:返回当前rank标识
返回值:当前进程的rank
异常:无
GraphExecutor::device_id() const
[[nodiscard]] int device_id() const noexcept;
功能简介:返回关联的设备ID
返回值:设备ID
异常:无
GraphExecutor::is_gpu() const
[[nodiscard]] bool is_gpu() const noexcept;
功能简介:判断是否为GPU模式
返回值:true表示GPU模式,false表示CPU模式
异常:无
执行控制
GraphExecutor::run_train_step()
void run_train_step();
功能简介:执行完整的训练步,包括前向、后向、优化器和通信
异常:
RuntimeError- 图索引解析失败或CUDA执行失败DeviceError- GPU设备操作失败
GraphExecutor::run_val_step()
void run_val_step();
功能简介:执行验证步,仅执行前向计算
异常:
RuntimeError- 图索引解析失败或CUDA执行失败DeviceError- GPU设备操作失败
GraphExecutor::launch(GraphId) const
void launch(GraphId gid) const;
功能简介:启动指定的计算图
参数:
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| gid | GraphId | - | 要启动的图ID |
异常:
RuntimeError- 图索引解析失败DeviceError- CUDA图启动失败
GraphExecutor::launch_dual(GraphId, GraphId) const
void launch_dual(GraphId gid1, GraphId gid2) const;
功能简介:同时启动两个计算图,用于双图并行(如传输与计算重叠)
参数:
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| gid1 | GraphId | - | 第一个要启动的图ID |
| gid2 | GraphId | - | 第二个要启动的图ID |
异常:
RuntimeError- 图索引解析失败DeviceError- CUDA图启动失败
GraphExecutor::sync_all() const
void sync_all() const;
功能简介:同步所有设备流,等待所有操作完成
异常:
DeviceError- 设备同步失败
工作流内部接口
GraphExecutor::update_lr_scalar()
void update_lr_scalar();
功能简介:将 set_current_lr() 设置的学习率写入GPU标量DTensor
异常:
DeviceError- GPU内存复制失败
GraphExecutor::check_nan_flag() const
[[nodiscard]] bool check_nan_flag() const;
功能简介:读取GPU上的NaN检测标志
返回值:true表示检测到NaN
异常:
DeviceError- GPU内存复制失败
GraphExecutor::on_nan_detected()
void on_nan_detected();
功能简介:检测到NaN时的回调,记录警告并跳过本次优化器更新
异常:无
DeviceContext
概述
DeviceContext 是单卡执行上下文,管理流、Workspace、per-stream cuDNN/cuBLAS句柄和DTensor指针解析。该类由 TaskBase 内部使用,普通用户通常不需要直接操作。
头文件:#include
状态:有状态(管理硬件资源)
使用路径:由 TaskBase 在初始化时创建,用户通过 TaskBase::context(int rank) 访问
典型用法:
// 用户通过 TaskBase 访问 DeviceContext
DeviceContext& ctx = task.context(rank);
void* stream = ctx.stream(StreamKind::COMP_1);
void* cublas_handle = ctx.cublas_handle(StreamKind::COMP_1);
构造与析构
DeviceContext::DeviceContext(int)
explicit DeviceContext(int device_id);
功能简介:构造函数,创建设备上下文并初始化流、cuDNN/cuBLAS句柄
参数:
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| device_id | int | - | GPU设备ID(>=0),CPU模式传入-1 |
异常:
DeviceError- GPU设备初始化失败(cudaSetDevice、cudaStreamCreate、cudnnCreate、cublasCreate失败)RuntimeError- 其他初始化错误
注意事项:
- GPU模式下创建5个非阻塞CUDA流,每个流独立绑定cuDNN和cuBLAS句柄
- CPU模式下设置Eigen线程数为4
DeviceContext::~DeviceContext()
~DeviceContext();
功能简介:析构函数,释放流、句柄、workspace等资源
异常:无
DeviceContext::DeviceContext(const DeviceContext&) = delete
DeviceContext(const DeviceContext&) = delete;
功能简介:禁止拷贝构造
DeviceContext::operator=(const DeviceContext&) = delete
DeviceContext& operator=(const DeviceContext&) = delete;
功能简介:禁止拷贝赋值
DeviceContext::DeviceContext(DeviceContext&&) = delete
DeviceContext(DeviceContext&&) = delete;
功能简介:禁止移动构造
DeviceContext::operator=(DeviceContext&&) = delete
DeviceContext& operator=(DeviceContext&&) = delete;
功能简介:禁止移动赋值
查询接口
DeviceContext::device_id() const
[[nodiscard]] int device_id() const noexcept;
功能简介:返回设备ID,GPU模式返回设备编号,CPU模式返回-1
返回值:设备ID
异常:无
DeviceContext::is_gpu() const
[[nodiscard]] bool is_gpu() const noexcept;
功能简介:判断是否为GPU模式
返回值:true表示GPU模式,false表示CPU模式
异常:无
DeviceContext::rank_for_context() const
[[nodiscard]] int rank_for_context() const noexcept;
功能简介:返回当前上下文对应的rank
返回值:rank标识
异常:无
DeviceContext::set_rank(int)
void set_rank(int rank) noexcept;
功能简介:设置当前上下文对应的rank,用于ArenaKeeper指针解析
参数:
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| rank | int | - | rank标识 |
异常:无
DeviceContext::memory_plan() const
[[nodiscard]] const MemoryPlan* memory_plan() const noexcept;
功能简介:返回当前设置的MemoryPlan指针
返回值:MemoryPlan指针,未设置时返回nullptr
异常:无
内存访问
DeviceContext::ptr_at(int) const
[[nodiscard]] void* ptr_at(int dtensor_id) const noexcept;
功能简介:根据DTensor ID获取实际设备指针,支持运行时MemoryPlan切换
参数:
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| dtensor_id | int | - | DTensor ID |
返回值:实际设备指针
异常:无(Release模式);Debug模式下可能抛出:
IndexError- dtensor_id无效RuntimeError- 未设置MemoryPlan
注意事项:
- 这是训练期热路径,Release模式下零开销
- 需要先通过
set_memory_plan()设置MemoryPlan
DeviceContext::set_memory_plan(const MemoryPlan*)
void set_memory_plan(const MemoryPlan* mp) noexcept;
功能简介:设置当前MemoryPlan,支持图集切换
参数:
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| mp | const MemoryPlan* | - | MemoryPlan指针 |
异常:无
流管理
DeviceContext::stream(StreamKind) const
[[nodiscard]] void* stream(StreamKind kind) const;
功能简介:获取指定类型的CUDA流句柄
参数:
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| kind | StreamKind | - | 流类型枚举 |
返回值:CUDA流句柄(void*类型),CPU模式下返回nullptr
异常:无
DeviceContext::synchronize_all() const
void synchronize_all() const;
功能简介:同步设备上的所有流
异常:
DeviceError- 设备同步失败
DeviceContext::synchronize_stream(StreamKind) const
void synchronize_stream(StreamKind kind) const;
功能简介:同步指定类型的流
参数:
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| kind | StreamKind | - | 流类型枚举 |
异常:
DeviceError- 流同步失败
DeviceContext::device_sync() const
void device_sync() const;
功能简介:同步整个设备,等价于 synchronize_all()
异常:
DeviceError- 设备同步失败
算子库句柄
DeviceContext::cudnn_handle(StreamKind) const
[[nodiscard]] void* cudnn_handle(StreamKind kind) const noexcept;
功能简介:获取指定流绑定的cuDNN句柄
参数:
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| kind | StreamKind | - | 流类型枚举 |
返回值:cuDNN句柄(void*类型),CPU模式下返回nullptr
异常:无
注意事项:
- per-stream handles是多流捕获的安全基础
- cuDNN不保证多流共享同一handle的安全性
- 仅在定义了
TR_USE_CUDA时有效
DeviceContext::cublas_handle(StreamKind) const
[[nodiscard]] void* cublas_handle(StreamKind kind) const noexcept;
功能简介:获取指定流绑定的cuBLAS句柄
参数:
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| kind | StreamKind | - | 流类型枚举 |
返回值:cuBLAS句柄(void*类型),CPU模式下返回nullptr
异常:无
注意事项:
- per-stream handles与cuDNN保持一致,确保多流并发安全
- 仅在定义了
TR_USE_CUDA时有效
Workspace管理
DeviceContext::workspace(StreamKind) const
[[nodiscard]] void* workspace(StreamKind kind) const;
功能简介:获取指定流的Workspace指针
参数:
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| kind | StreamKind | - | 流类型枚举 |
返回值:Workspace基地址(void*类型),GPU未分配或CPU模式下返回nullptr
异常:无
DeviceContext::workspace_size(StreamKind) const
[[nodiscard]] size_t workspace_size(StreamKind kind) const;
功能简介:获取指定流的Workspace大小
参数:
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| kind | StreamKind | - | 流类型枚举 |
返回值:Workspace字节数
异常:无
DeviceContext::pre_allocate_workspace(StreamKind, size_t)
void pre_allocate_workspace(StreamKind kind, size_t size);
功能简介:预分配指定流的GPU Workspace(仅首次分配有效,不支持扩容)
参数:
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| kind | StreamKind | - | 流类型枚举 |
| size | size_t | - | 预分配的Workspace字节数 |
异常:
NotImplementedError- CPU模式调用GPUOutOfMemoryError- GPU显存分配失败
注意事项:
- 已分配时跳过,不会扩容
- 主要用于编译阶段的确定性预分配
DeviceContext::ensure_workspace(StreamKind, size_t)
void ensure_workspace(StreamKind kind, size_t req_size);
功能简介:确保指定流的Workspace满足大小要求,首次分配或报错
参数:
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| kind | StreamKind | - | 流类型枚举 |
| req_size | size_t | - | 需求的Workspace大小 |
异常:
NotImplementedError- CPU模式调用RuntimeError- 已分配但空间不足GPUOutOfMemoryError- GPU显存分配失败
注意事项:
- 如果已分配但空间不足,会抛出异常
- 调用者应在图编译阶段预估足够的空间
DeviceContext::ensure_workspace_grow(StreamKind, size_t) const
void ensure_workspace_grow(StreamKind kind, size_t req_size) const;
功能简介:精确按需扩容指定流的GPU Workspace(释放旧空间并重新分配)
参数:
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| kind | StreamKind | - | 流类型枚举 |
| req_size | size_t | - | 需求的Workspace大小 |
异常:
GPUOutOfMemoryError- GPU显存分配失败
注意事项:
- CPU模式下直接返回
- 主要用于warmup阶段根据实际workspace需求动态扩容
DeviceContext::cpu_workspace() const
[[nodiscard]] void* cpu_workspace() const noexcept;
功能简介:返回CPU全局Workspace基地址
返回值:CPU Workspace指针
异常:无
DeviceContext::cpu_workspace_size() const
[[nodiscard]] size_t cpu_workspace_size() const noexcept;
功能简介:返回CPU全局Workspace大小
返回值:CPU Workspace字节数
异常:无
DeviceContext::ensure_cpu_workspace_grow(size_t) const
void ensure_cpu_workspace_grow(size_t req_size) const;
功能简介:确保CPU Workspace满足大小要求,支持动态扩容
参数:
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| req_size | size_t | - | 需求的CPU Workspace大小 |
异常:
GPUOutOfMemoryError- CPU内存分配失败
注意事项:
- CPU Workspace是单流全局共享,避免算子内反复malloc/free
NCCL通信
DeviceContext::nccl_comm() const
[[nodiscard]] void* nccl_comm() const noexcept;
功能简介:返回关联的NCCL通信句柄
返回值:NCCL通信句柄(void*类型),未设置时返回nullptr
异常:无
DeviceContext::set_nccl_comm(void*)
void set_nccl_comm(void* comm) noexcept;
功能简介:设置NCCL通信句柄
参数:
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| comm | void* | - | NCCL通信句柄 |
异常:无
MemoryArena
概述
MemoryArena 是统一内存/显存池抽象基类,提供对齐分配接口。该类由 ArenaKeeper 管理,用户通常通过 ArenaKeeper::instance() 访问。
头文件:#include
状态:有状态(一次性分配,自动回收)
使用路径:通过 ArenaKeeper::instance() 初始化和查询
核心契约:
allocate()只能成功调用一次,再次调用将抛出异常- 不提供public释放接口,资源随对象析构自动回收
- usable_size必须能被alignment整除
构造与析构
MemoryArena::MemoryArena(size_t)
explicit MemoryArena(size_t alignment);
功能简介:构造函数,设置对齐字节数
参数:
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| alignment | size_t | - | 对齐字节数,必须是2的幂 |
异常:
ValueError- alignment不是2的幂或等于0
MemoryArena::~MemoryArena()
virtual ~MemoryArena();
功能简介:虚析构函数,资源由派生类析构时回收
异常:无
MemoryArena::MemoryArena(const MemoryArena&) = delete
MemoryArena(const MemoryArena&) = delete;
功能简介:禁止拷贝构造
MemoryArena::operator=(const MemoryArena&) = delete
MemoryArena& operator=(const MemoryArena&) = delete;
功能简介:禁止拷贝赋值
MemoryArena::MemoryArena(MemoryArena&&) = delete
MemoryArena(MemoryArena&&) = delete;
功能简介:禁止移动构造
MemoryArena::operator=(MemoryArena&&) = delete
MemoryArena& operator=(MemoryArena&&) = delete;
功能简介:禁止移动赋值
分配
MemoryArena::allocate(size_t)
void* allocate(size_t usable_size);
功能简介:分配内存/显存,返回满足对齐要求的可用区域基地址
参数:
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| usable_size | size_t | - | 用户请求的可用字节数 |
返回值:满足对齐要求的可用区域基地址
异常:
RuntimeError- 多次调用ValueError- usable_size小于等于0或不能被alignment整除MemoryError- 可用大小溢出或派生类原始分配失败
注意事项:
- 实际分配usable_size + alignment字节
- 使用CAS保证严格只调用一次,多线程误用也安全
查询接口
MemoryArena::base_ptr() const
[[nodiscard]] void* base_ptr() const noexcept;
功能简介:返回对齐后的可用基地址
返回值:对齐后的基地址
异常:无
MemoryArena::usable_size() const
[[nodiscard]] size_t usable_size() const noexcept;
功能简介:返回用户请求的可用大小
返回值:可用字节数
异常:无
MemoryArena::is_allocated() const
[[nodiscard]] bool is_allocated() const noexcept;
功能简介:判断是否已分配
返回值:true表示已分配,false表示未分配
异常:无
MemoryArena::alignment() const
[[nodiscard]] size_t alignment() const noexcept;
功能简介:返回对齐字节数
返回值:对齐字节数
异常:无
CpuArena
概述
CpuArena 是CPU内存池实现,使用mimalloc作为后端分配器。构造函数为私有,只能通过 ArenaKeeper 创建。
头文件:#include
状态:有状态(一次性分配,自动回收)
继承:继承自 MemoryArena
使用路径:通过 ArenaKeeper::instance().initialize() 创建
注意事项:
- 构造函数为私有,只能通过
ArenaKeeper创建 - 这确保了所有内存池都通过统一管理器创建
构造与析构
CpuArena::~CpuArena()
~CpuArena() override;
功能简介:析构函数,释放CPU内存池
异常:无
CudaArena
概述
CudaArena 是GPU显存池实现,使用CUDA Runtime作为后端。构造函数为私有,只能通过 ArenaKeeper 创建。
头文件:#include
状态:有状态(一次性分配,自动回收)
继承:继承自 MemoryArena
使用路径:通过 ArenaKeeper::instance().initialize() 创建
注意事项:
- 构造函数为私有,只能通过
ArenaKeeper创建 - 仅在定义了
TR_USE_CUDA时可用 - 这确保了所有显存池都通过统一管理器创建
构造与析构
CudaArena::~CudaArena()
~CudaArena() override;
功能简介:析构函数,释放GPU显存池
异常:无
查询接口
CudaArena::device_id() const
[[nodiscard]] int device_id() const noexcept;
功能简介:返回GPU设备ID
返回值:GPU设备ID
异常:无
静态方法
CudaArena::warm_context(int)
static void warm_context(int device_id);
功能简介:预热指定设备的CUDA上下文,消除多线程分配时的锁竞争
参数:
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| device_id | int | - | GPU设备ID |
异常:无
注意事项:
- cudaSetDevice首次调用会触发上下文懒加载,驱动层持有全局锁
- 主线程预先为每个设备完成上下文初始化,可消除多线程分配时的锁竞争
ArenaKeeper
概述
ArenaKeeper 是内存池/显存池的全局管理器,实现多卡并行分配和统一查询。采用Mayer单例模式,全局唯一实例。
头文件:#include
状态:有状态(单例,一次性初始化)
使用路径:通过 ArenaKeeper::instance() 访问
典型用法:
// 初始化(在TaskBase::prepare_hardware()中调用)
auto& keeper = ArenaKeeper::instance();
keeper.initialize(using_gpu, device_ids, usable_size_per_device);
// 查询(训练期热路径,完全无锁)
void* base = keeper.base_ptr(rank);
void* ptr = keeper.ptr_at(rank, offset);
核心特性:
- Mayer单例模式,全局唯一
- 支持CPU和GPU两种模式
- 多GPU并行分配,显著提升初始化速度
- 初始化后查询接口完全无锁,零开销
- 异常安全,分配失败自动回滚
静态方法
ArenaKeeper::instance()
static ArenaKeeper& instance();
功能简介:获取全局唯一的 ArenaKeeper 实例
返回值: ArenaKeeper 单例引用
异常:无
ArenaKeeper::init()
static void init();
功能简介:触发单例初始化(可选调用)
异常:无
构造与赋值
ArenaKeeper::ArenaKeeper(const ArenaKeeper&) = delete
ArenaKeeper(const ArenaKeeper&) = delete;
功能简介:禁止拷贝构造
ArenaKeeper::operator=(const ArenaKeeper&) = delete
ArenaKeeper& operator=(const ArenaKeeper&) = delete;
功能简介:禁止拷贝赋值
ArenaKeeper::ArenaKeeper(ArenaKeeper&&) = delete
ArenaKeeper(ArenaKeeper&&) = delete;
功能简介:禁止移动构造
ArenaKeeper::operator=(ArenaKeeper&&) = delete
ArenaKeeper& operator=(ArenaKeeper&&) = delete;
功能简介:禁止移动赋值
初始化
ArenaKeeper::initialize(bool, const std::vector&, size_t, size_t)
void initialize(bool using_gpu,
const std::vector<int>& device_ids,
size_t usable_size_per_device,
size_t alignment = 256);
功能简介:初始化内存池/显存池,支持多GPU并行分配
参数:
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| using_gpu | bool | - | 是否使用GPU |
| device_ids | const std::vector |
- | 设备ID列表 |
| usable_size_per_device | size_t | - | 每设备的可用字节数 |
| alignment | size_t | 256 | 对齐字节数 |
异常:
RuntimeError- 多次调用、GPU模式但未定义TR_USE_CUDA、CPU模式device_ids数量不等于1ValueError- device_ids为空或usable_size_per_device等于0GPUOutOfMemoryError- GPU显存分配失败MemoryError- CPU内存分配失败DeviceError- GPU设备操作失败
注意事项:
- 初始化全程互斥,确保仅执行一次
- 训练阶段此锁永不触碰
- GPU模式下会先预热所有设备的CUDA上下文,再并行分配
查询接口
ArenaKeeper::base_ptr(int) const
[[nodiscard]] void* base_ptr(int rank) const;
功能简介:返回指定rank的Arena基地址
参数:
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| rank | int | - | 设备rank(0 ~ world_size-1) |
返回值:指定rank的Arena基地址
异常:无(Release模式);Debug模式下可能抛出:
RuntimeError- ArenaKeeper未初始化IndexError- rank越界
ArenaKeeper::base_ptr_by_device(int) const
[[nodiscard]] void* base_ptr_by_device(int device_id) const;
功能简介:根据设备ID返回Arena基地址
参数:
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| device_id | int | - | 设备ID |
返回值:指定设备的Arena基地址
异常:无
ArenaKeeper::usable_size(int) const
[[nodiscard]] size_t usable_size(int rank) const;
功能简介:返回指定rank的可用大小
参数:
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| rank | int | - | 设备rank |
返回值:可用字节数
异常:无(Release模式);Debug模式下可能抛出:
RuntimeError- ArenaKeeper未初始化IndexError- rank越界
ArenaKeeper::arena(int) const
[[nodiscard]] MemoryArena* arena(int rank) const;
功能简介:返回指定rank的 MemoryArena 指针
参数:
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| rank | int | - | 设备rank |
返回值: MemoryArena 指针
异常:无(Release模式);Debug模式下可能抛出:
RuntimeError- ArenaKeeper未初始化IndexError- rank越界
ArenaKeeper::device_id(int) const
[[nodiscard]] int device_id(int rank) const;
功能简介:返回指定rank对应的设备ID
参数:
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| rank | int | - | 设备rank |
返回值:设备ID
异常:无(Debug模式下可能有边界检查)
ArenaKeeper::rank_of_device(int) const
[[nodiscard]] int rank_of_device(int device_id) const;
功能简介:返回指定设备ID对应的rank
参数:
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| device_id | int | - | 设备ID |
返回值:rank值
异常:
RuntimeError- ArenaKeeper未初始化IndexError- 设备ID不存在
ArenaKeeper::ptr_at(int, size_t) const
[[nodiscard]] void* ptr_at(int rank, size_t offset) const noexcept;
功能简介:根据rank和偏移量获取实际指针(训练期热路径)
参数:
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| rank | int | - | 设备rank(0 ~ world_size-1) |
| offset | size_t | - | 相对Arena基地址的字节偏移 |
返回值:实际设备/内存指针
异常:无(Release模式);Debug模式下可能抛出:
RuntimeError- ArenaKeeper未初始化IndexError- rank越界
注意事项:
- 训练期热路径,Release模式下零分支、零虚函数调用
- Debug模式下保留完整的边界检查和异常诊断
ArenaKeeper::world_size() const
[[nodiscard]] size_t world_size() const noexcept;
功能简介:返回设备总数(world size)
返回值:设备总数
异常:无
ArenaKeeper::is_gpu_mode() const
[[nodiscard]] bool is_gpu_mode() const noexcept;
功能简介:判断是否为GPU模式
返回值:true表示GPU模式,false表示CPU模式
异常:无
ArenaKeeper::is_initialized() const
[[nodiscard]] bool is_initialized() const noexcept;
功能简介:判断是否已初始化
返回值:true表示已初始化,false表示未初始化
异常:无
OptimizerScalarIds
概述
优化器标量ID映射结构,用于 GraphExecutor 设置GPU标量更新参数。
头文件:#include
成员
| 字段名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| lr | int32_t | -1 | 学习率scalar ID |
| beta | int32_t | -1 | Adam动量beta参数ID |
| beta2 | int32_t | -1 | Adam动量beta2参数ID |
| tc | int32_t | -1 | Trust region参数ID |
| wd | int32_t | -1 | 权重衰减参数ID |
| eps | int32_t | -1 | Adam epsilon参数ID |
| has_nan | int32_t | -1 | NaN检测标志ID |
| scaling | int32_t | -1 | Loss Scaling参数ID |
| local_batch_size | int32_t | -1 | 本地批次大小ID |
| last_train_batch_size | int32_t | -1 | 上次训练批次大小ID |
| last_val_batch_size | int32_t | -1 | 上次验证批次大小ID |
| step | int32_t | -1 | 训练步数ID(INT32,GPU算子自增) |
| bias_corr1 | int32_t | -1 | 偏差校正1 ID(FP32,1/(1-beta1^step)) |
| bias_corr2 | int32_t | -1 | 偏差校正2 ID(FP32,1/(1-beta2^step)) |
MemRangeInfo
概述
内存范围信息结构,用于 RangeOp 描述输入/输出张量的内存范围。
头文件:#include
成员
| 字段名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| offset | uint64_t | 0 | 范围起始偏移量(字节) |
| size | uint64_t | 0 | 范围大小(字节) |
| start_region_id | int32_t | -1 | 起始区域ID |
| end_region_id | int32_t | -1 | 结束区域ID |
CpuOpContext
概述
CPU算子执行上下文结构,包含算子执行所需的全部参数和元信息。
头文件:#include
成员
| 字段名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| ctx | const DeviceContext* | nullptr | 设备上下文指针 |
| input_ids | int32_t[12] | {} | 输入DTensor ID数组 |
| output_ids | int32_t[12] | {} | 输出DTensor ID数组 |
| num_inputs | int | 0 | 输入数量 |
| num_outputs | int | 0 | 输出数量 |
| total_elements | int64_t | 0 | 总元素数量 |
| input_shape | ShapeId | - | 输入形状ID |
| output_shape | ShapeId | - | 输出形状ID |
| params | OpParams | - | 算子参数 |
| range_op | RangeOp | RangeOp::UNKNOWN | RANGE算子类型 |
| n_stride | int64_t | 0 | N维度stride(DTensor用) |
| h_stride | int64_t | 0 | H维度stride(DTensor用) |
| w_stride | int64_t | 0 | W维度stride(DTensor用) |
| c_stride | int64_t | 0 | C维度stride(DTensor用) |
| input_ranges | MemRangeInfo[12] | {} | 输入内存范围信息(RangeOp用) |
| output_ranges | MemRangeInfo[12] | {} | 输出内存范围信息(RangeOp用) |
| num_input_ranges | int | 0 | 输入范围数量 |
| num_output_ranges | int | 0 | 输出范围数量 |
ComputeOpEntry
概述
计算算子注册表条目,包含算子类型和CPU/GPU启动函数指针。
头文件:#include
成员
| 字段名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| op | ComputeOp | ComputeOp::UNKNOWN | 算子类型 |
| launch_cpu | void()(CpuOpContext) | nullptr | CPU启动函数指针 |
| launch_cuda | void(*)(const GraphNode&, const MemoryPlan&, const DeviceContext&, MultiStreamCaptureState&) | nullptr | GPU启动函数指针 |
注意事项:
launch_cuda仅在定义了TR_USE_CUDA时存在
RangeOpEntry
概述
范围算子注册表条目,包含算子类型和CPU/GPU启动函数指针。
头文件:#include
成员
| 字段名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| op | RangeOp | RangeOp::UNKNOWN | 算子类型 |
| launch_cpu | void()(CpuOpContext) | nullptr | CPU启动函数指针 |
| launch_cuda | void(*)(const GraphNode&, const MemoryPlan&, const DeviceContext&, MultiStreamCaptureState&) | nullptr | GPU启动函数指针 |
注意事项:
launch_cuda仅在定义了TR_USE_CUDA时存在
CudnnFeGraphCache
概述
cuDNN Frontend图缓存模板,消除Host端开销。
头文件:#include
注意事项:
- 仅在定义了
TR_USE_CUDA时可用 MAX_SLOTS为编译期模板参数,需根据实际算子slot数量选择
成员
template<size_t MAX_SLOTS>
struct CudnnFeGraphCache {
std::shared_ptr<cudnn_frontend::graph::Graph> graph;
size_t workspace_size = 0;
std::unordered_map<std::shared_ptr<cudnn_frontend::graph::Tensor_attributes>, void*> variant_pack;
void** slot_vp_addrs[MAX_SLOTS];
int64_t dtensor_ids[MAX_SLOTS];
void* fixed_ptrs[MAX_SLOTS];
size_t ptr_offsets[MAX_SLOTS];
size_t num_slots = 0;
void register_slot(std::shared_ptr<cudnn_frontend::graph::Tensor_attributes> ta,
int64_t init_dt_id,
void* fixed_ptr = nullptr,
size_t ptr_offset = 0);
};
| 字段名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| graph | std::shared_ptr |
- | cuDNN Frontend图对象 |
| workspace_size | size_t | 0 | 该图所需的workspace字节数 |
| variant_pack | std::unordered_map<...> | - | execute阶段使用的variant_pack,预存避免运行时堆分配 |
| slot_vp_addrs | void**[MAX_SLOTS] | - | 预存的variant_pack value地址,execute阶段直接解引用 |
| dtensor_ids | int64_t[MAX_SLOTS] | - | 运行时更新的DTensor ID,支持A/B双缓冲切换 |
| fixed_ptrs | void*[MAX_SLOTS] | - | 固定设备指针(如clamp),nullptr表示动态解析 |
| ptr_offsets | size_t[MAX_SLOTS] | 0 | 字节偏移(如bn_stats_offset) |
| num_slots | size_t | 0 | 实际使用的slot数量 |
核心特性:
- 零字符串比较(数组索引替代)
- 零堆分配(Cache内预存variant_pack)
- 零shared_ptr原子操作(预存slot_vp_addrs裸指针)
- 零hash查找(execute阶段直接解引用)
方法
CudnnFeGraphCache::register_slot(...)
void register_slot(std::shared_ptr<cudnn_frontend::graph::Tensor_attributes> ta,
int64_t init_dt_id,
void* fixed_ptr = nullptr,
size_t ptr_offset = 0);
功能简介:注册一个tensor slot到缓存
参数:
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| ta | std::shared_ptr |
- | Tensor属性 |
| init_dt_id | int64_t | - | 初始DTensor ID |
| fixed_ptr | void* | nullptr | 固定设备指针(如clamp) |
| ptr_offset | size_t | 0 | 字节偏移(如bn_stats_offset) |
异常:无
TR_CUDNN_FE_CHECK
概述
cuDNN Frontend错误检查宏,检查操作是否成功。
#define TR_CUDNN_FE_CHECK(call, msg)
功能简介
参数:
| 参数名 | 说明 |
|---|---|
| call | cuDNN Frontend函数调用 |
| msg | 错误消息描述 |
异常:在错误时调用 TR_DEVICE_ERROR,抛出 DeviceError
注意事项:
- 仅在定义了
TR_USE_CUDA时可用
TR_CUDNN_CHECK
概述
cuDNN Legacy错误检查宏,检查操作是否成功。
#define TR_CUDNN_CHECK(call)
功能简介
参数:
| 参数名 | 说明 |
|---|---|
| call | cuDNN Legacy函数调用 |
异常:在错误时调用 TR_DEVICE_ERROR,抛出 DeviceError
注意事项:
- 仅在定义了
TR_USE_CUDA时可用
预定义常量
概述
Backend 模块提供的预定义常量,包括全局算子表容量、LARS 常量等。
constexpr size_t kComputeOpCount = static_cast<size_t>(ComputeOp::COUNT);
constexpr size_t kRangeOpCount = static_cast<size_t>(RangeOp::COUNT);
说明:全局算子表的最大容量,分别为计算算子和范围算子的总数
extern ComputeOpEntry g_compute_op_table[kComputeOpCount];
extern RangeOpEntry g_range_op_table[kRangeOpCount];
说明:全局算子注册表数组,由 register_default_ops() 和各 register_op_*() 函数填充。算子启动时通过 op 值作为索引查找对应条目。
namespace lars {
constexpr int kLarsMaxPartial = 65535;
}
说明:LARS两阶段reduce的最大block数
独立函数
概述
Backend 模块提供算子注册、流策略、cuDNN 辅助等独立函数。
所属头文件:根据具体函数分别位于 graph_executor.h、op_registry.h、op_stream_policy.h、cudnn_utils.h 等。
设计定位:无状态自由函数,直接调用。
流策略函数
gid_to_stream_kind(GraphId gid)
StreamKind gid_to_stream_kind(GraphId gid) noexcept;
功能简介:将 GraphId 映射到默认的 StreamKind,用于图执行时选择流
参数:
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| gid | GraphId | - | 图ID |
返回值:对应的流类型枚举
异常:无
注意事项:
- 传输类图(TRANSFER_A/B)映射到TRANS流
- 优化器和通信类图映射到UPDATE流
- 计算类图默认映射到COMP_1流
get_op_default_stream(ComputeOp op)
StreamKind get_op_default_stream(ComputeOp op) noexcept;
功能简介:获取计算算子的默认流类型
参数:
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| op | ComputeOp | - | 计算算子类型 |
返回值:默认流类型
异常:无
注意事项:
- 该函数提供算子到流的静态映射策略
- 实际执行时可通过参数覆盖默认流
算子注册函数
register_default_ops()
void register_default_ops();
功能简介:注册所有默认算子到全局算子表
异常:无
注意事项:
- 该函数在系统初始化时调用
- 注册包括ReLU、Conv、FC、Pool等基础算子
下面函数将对应算子族的 launch 函数指针写入 g_compute_op_table 或 g_range_op_table。
| 注册函数 | 算子族 | 注册的主要 ComputeOp / RangeOp |
|---|---|---|
register_op_relu() |
激活函数 | RELU_* |
register_op_identity() |
恒等映射 | IDENTITY_FP32/AMP_FWD/BWD |
register_op_tanh() |
激活函数 | TANH_* |
register_op_silu() |
激活函数 | SILU_* |
register_op_relu6() |
激活函数 | RELU6_* |
register_op_leaky_relu() |
激活函数 | LEAKY_RELU_* |
register_op_hardswish() |
激活函数 | HARDSWISH_* |
register_op_elu() |
激活函数 | ELU_* |
register_op_sigmoid() |
激活函数 | SIGMOID_* |
register_op_conv() |
卷积 | CONV_* |
register_op_maxpool() |
池化 | MAXPOOL_* |
register_op_avgpool() |
池化 | AVGPOOL_* |
register_op_gap() |
全局池化 | GAP_* |
register_op_fc() |
全连接 | FC_* |
register_op_bn() |
批量归一化 | BN1D_、BN2D_、BN_UPDATE_EQ_PARAMS |
register_op_cbr() |
融合算子 | CBR_AMP_* |
register_op_softmax_ce() |
损失函数 | SOFTMAX_CE_* |
register_op_dropout() |
正则化 | DROPOUT_* |
register_op_flatten() |
形状变换 | FLATTEN_* |
register_op_channel_padding() |
形状变换 | CHANNEL_PADDING_* |
register_op_axpy() |
元素级运算 | AXPY_FWD |
register_op_lars() |
LARS 优化器 | LARS_* 及流感知变体 |
register_op_adam_bc() |
Adam 偏差修正 | SCALAR_INCREMENT、ADAM_BIAS_CORRECTION |
register_op_dtensor_copy() |
DTensor 拷贝 | DTENSOR_COPY |
register_op_range_h2d() |
H2D 传输 | RANGE_H2D_COPY_* |
register_op_range_d2d_copy() |
D2D 拷贝 | RANGE_D2D_COPY |
register_op_range_clear() |
内存清零 | RANGE_CLEAR |
register_op_range_cast() |
类型转换 | RANGE_CAST_FP32_TO_FP16、RANGE_CAST_FP16_TO_FP32 |
register_op_range_allreduce() |
分布式通信 | RANGE_SUM_ALLREDUCE、RANGE_MEAN_ALLREDUCE、RANGE_BN_STATS_ALLREDUCE |
register_op_range_optimizer() |
优化器更新 | RANGE_UPDATE_WEIGHT_、RANGE_UPDATE_BIAS_ |
register_op_range_check_nan() |
数值检查 | RANGE_CHECK_NAN |
register_op_range_grad_scaling() |
梯度缩放 | RANGE_GRAD_SCALING |
register_op_range_accum_metrics() |
指标累积 | RANGE_ACCUM_METRICS |
功能简介:注册单个算子族到全局算子表
异常:无
注意事项:
- 这些函数在
register_default_ops()中统一调用 - 各算子族的具体说明与实现文件见 DTensor 算子 和 Range 算子
- 用户可扩展自定义算子注册函数
require_warmup(ComputeOp op)
bool require_warmup(ComputeOp op) noexcept;
功能简介:判断指定计算算子是否需要在捕获前进行cuDNN预热
参数:
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| op | ComputeOp | - | 计算算子类型 |
返回值:true表示需要预热
异常:无
注意事项:
- 仅在定义了
TR_USE_CUDA时可用 - 返回true的算子包括Conv、BN、Pool、SoftmaxCE、激活函数等
warmup_single_cudnn_op(const GraphNode& node, const MemoryPlan& mp, DeviceContext& ctx)
void warmup_single_cudnn_op(const GraphNode& node,
const MemoryPlan& mp,
DeviceContext& ctx);
功能简介:对单个cuDNN算子执行预热,消除首次执行的额外开销
参数:
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| node | const GraphNode& | - | 计算图节点 |
| mp | const MemoryPlan& | - | 内存计划 |
| ctx | DeviceContext& | - | 设备上下文 |
异常:
DeviceError- CUDA执行或同步失败
注意事项:
- 仅在定义了
TR_USE_CUDA时可用 - 通常在图捕获前的warmup阶段调用
shape_from_fe_dim(const std::vector& fe_dim)
inline Shape shape_from_fe_dim(const std::vector<int64_t>& fe_dim);
功能简介:将cuDNN Frontend维度数组转换回 Shape
参数:
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| fe_dim | const std::vector |
- | cuDNN Frontend维度数组(N, C, H, W顺序) |
返回值:Renaissance Shape 对象
异常:无
注意事项:
- 该函数在
cudnn_utils.h中定义,依赖cuDNN Frontend头文件 - 输入维度顺序应与
to_fe_dim()输出一致
to_fe_dtype(DType dtype)
inline fe::DataType_t to_fe_dtype(DType dtype);
功能简介:将 DType 转换为cuDNN Frontend的 DataType_t
参数:
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| dtype | DType | - | Renaissance数据类型 |
返回值:cuDNN Frontend数据类型
异常: ValueError - 不支持的数据类型
注意事项:
- 仅在定义了
TR_USE_CUDA时可用
to_fe_dim(const Shape& s)
inline std::vector<int64_t> to_fe_dim(const Shape& s);
功能简介:将 Shape 转换为cuDNN Frontend的维度数组
参数:
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| s | const Shape& | - | Renaissance形状 |
返回值:cuDNN Frontend维度数组(N, C, H, W顺序)
异常:无
注意事项:
- 仅在定义了
TR_USE_CUDA时可用
to_fe_stride_nhwc(const Shape& s, DType dt)
inline std::vector<int64_t> to_fe_stride_nhwc(const Shape& s, DType dt);
功能简介:计算NHWC布局的cuDNN Frontend stride数组
参数:
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| s | const Shape& | - | Renaissance形状 |
| dt | DType | - | 数据类型 |
返回值:NHWC布局的stride数组
异常: ValueError - 不支持的数据类型
注意事项:
- 仅在定义了
TR_USE_CUDA时可用
create_cudnn_graph(DType dtype)
inline std::shared_ptr<fe::graph::Graph> create_cudnn_graph(DType dtype);
功能简介:创建并配置cuDNN Frontend图对象
参数:
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| dtype | DType | - | 数据类型 |
返回值:配置好的cuDNN Frontend图智能指针
异常:无
注意事项:
- 仅在定义了
TR_USE_CUDA时可用 - AMP场景下中间数据类型设为HALF,其他场景设为FLOAT
finalize_cudnn_graph(fe::graph::Graph* graph, cudnnHandle_t handle)
inline void finalize_cudnn_graph(fe::graph::Graph* graph, cudnnHandle_t handle);
功能简介:完成cuDNN Frontend图的构建和编译
参数:
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| graph | fe::graph::Graph* | - | cuDNN Frontend图指针 |
| handle | cudnnHandle_t | - | cuDNN句柄 |
异常:
DeviceError- 图验证、构建或编译失败
注意事项:
- 仅在定义了
TR_USE_CUDA时可用
to_cudnn_dtype(DType dtype)
inline cudnnDataType_t to_cudnn_dtype(DType dtype);
功能简介:将 DType 转换为cuDNN Legacy的 cudnnDataType_t
参数:
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| dtype | DType | - | Renaissance数据类型 |
返回值:cuDNN Legacy数据类型
异常: ValueError - 不支持的数据类型
注意事项:
- 仅在定义了
TR_USE_CUDA时可用
DTensor 算子
概述
DTensor 算子对应 enum class ComputeOp(定义于 include/renaissance/graph/op_kind.h),是 Backend 中基于完整 DTensor 执行的前向/反向/推理计算算子。GraphExecutor 通过 g_compute_op_table 查表获得每个算子的 launch_cpu / launch_cuda 函数指针,并在捕获的 CUDA Graph 或 CPU 回退路径上执行。
实现目录:src/backend/ops/dtensor/
注册入口:src/backend/op_registry.cpp 中的 register_default_ops(),按族调用 register_op_*()。
公共调用约定:
- 算子通过
GraphNode描述,input_ids/output_ids是MemoryPlan中的 DTensor ID。 params.data为std::variant<...>,当算子需要参数(Conv、Pool、FC、BN、Axpy、Dropout、Flatten 等)时由 graph 编译阶段填充。FWD= 前向,BWD= 反向,INF= 推理优化路径。FP32指 I/O 为DType::FP32;AMP指 I/O 为DType::FP16(部分反向会额外使用INT8mask)。- 后端支持:FP32 路径通常同时提供 CUDA 与 CPU fallback(部分 CPU fallback 依赖
TR_USE_EIGEN、xnnpack 或 naive 实现);AMP 路径与 CBR 融合算子仅 CUDA。
未在 ops/dtensor/ 中实现的后端 launch:下列 ComputeOp 枚举值已定义,但当前目录下没有对应的注册/launch 实现,主要由 graph 层占位、分解或未启用: IDENTITY_FWD、ADD_FWD、ADD_BWD、MUL_FWD、ALLREDUCE_SUM、BROADCAST、BN_STATS_SYNC、CAST_H2F、CAST_F2H、SGD_UPDATE、ADAM_UPDATE、ADAMW_UPDATE、EMA_UPDATE、BOTTLENECK_AMP_、BASICBLOCK_AMP_、INVRESIDUAL_AMP_、GAP_FC_。
Identity / AXPY / DTensorCopy
IDENTITY_FP32_FWD
输入:1 个 | 输出:1 个
| 方向 | 编号 | 名称 | 数据类型 | 形状 |
|---|---|---|---|---|
| 输入 | 0 | x | FP32 | [N, C, H, W] |
| 输出 | 0 | y | FP32 | 与 x 相同 |
功能:恒等映射 y = x,逐元素拷贝。CPU 路径依赖 TR_USE_EIGEN。
IDENTITY_FP32_BWD
输入:1 个 | 输出:1 个
| 方向 | 编号 | 名称 | 数据类型 | 形状 |
|---|---|---|---|---|
| 输入 | 0 | dY | FP32 | [N, C, H, W](复用 y 的内存) |
| 输出 | 0 | dX | FP32 | 与 dY 相同 |
功能:恒等反向 dX = dY(memcpy)。
IDENTITY_AMP_FWD / IDENTITY_AMP_BWD
同 FP32 变体,数据类型为 FP16,仅支持 CUDA。
AXPY_FWD
输入:2 个 | 输出:1 个 | 参数:AXPYParams(alpha: float)
| 方向 | 编号 | 名称 | 数据类型 | 形状 |
|---|---|---|---|---|
| 输入 | 0 | a | FP32 | [N, C, H, W] |
| 输入 | 1 | b | FP32 | [N, C, H, W] |
| 输出 | 0 | c | FP32 | 与 a 相同 |
功能:二元向量运算 c = α·a + b,非 in-place。支持 CPU/CUDA 双后端。
DTENSOR_COPY
输入:1 个 | 输出:1 个
| 方向 | 编号 | 名称 | 数据类型 | 形状 |
|---|---|---|---|---|
| 输入 | 0 | src | 任意 | 任意 |
| 输出 | 0 | dst | 同 src | 与 src 相同 |
功能:DTensor 级别的 D2D 拷贝,用于标签双缓冲等场景。
ReLU
源文件:relu_op.cpp / relu_op.cu | 注册函数:register_op_relu()
ReLU 是唯一需要输出 INT8 mask 的激活函数,mask 用于反向传播时路由梯度。
RELU_FP32_FWD / RELU_AMP_FWD
输入:1 个 | 输出:2 个
| 方向 | 编号 | 名称 | 数据类型 | 形状 |
|---|---|---|---|---|
| 输入 | 0 | x | FP32 / FP16 | [N, C, H, W] |
| 输出 | 0 | y | FP32 / FP16 | 与 x 相同 |
| 输出 | 1 | mask | INT8 | [N, C, H, W](x > 0 时为 1) |
功能:ReLU 前向 y = max(0, x),同时输出 mask 用于反向传播。
RELU_FP32_BWD / RELU_AMP_BWD
输入:2 个 | 输出:1 个
| 方向 | 编号 | 名称 | 数据类型 | 形状 |
|---|---|---|---|---|
| 输入 | 0 | dY | FP32 / FP16 | [N, C, H, W] |
| 输入 | 1 | mask | INT8 | [N, C, H, W] |
| 输出 | 0 | dX | FP32 / FP16 | 与 dY 相同(in-place 复用 x 的内存) |
功能:ReLU 反向 dX = dY * mask。mask 来自 FWD 阶段。
RELU_FP32_INF / RELU_AMP_INF
输入:1 个 | 输出:2 个(mask 占位但不使用)
| 方向 | 编号 | 名称 | 数据类型 | 形状 |
|---|---|---|---|---|
| 输入 | 0 | x | FP32 / FP16 | [N, C, H, W] |
| 输出 | 0 | y | FP32 / FP16 | 与 x 相同 |
| 输出 | 1 | mask | INT8 | 占位,内容未定义 |
功能:推理模式 ReLU,仅计算 y = max(0, x),mask 输出仅用于保持张量布局一致。
Tanh
源文件:tanh_op.cpp / tanh_op.cu | 注册函数:register_op_tanh()
所有 Tanh 变体均为 in-place 操作(输出复用输入内存)。BWD 从 dY 重新推导 tanh 值。
TANH_FP32_FWD / TANH_AMP_FWD
输入:1 个 | 输出:1 个(in-place)
| 方向 | 编号 | 名称 | 数据类型 | 形状 |
|---|---|---|---|---|
| 输入 | 0 | x | FP32 / FP16 | [N, C, H, W] |
| 输出 | 0 | y | FP32 / FP16 | 与 x 相同(in-place 复用 x) |
功能:y = tanh(x)。
TANH_FP32_BWD / TANH_AMP_BWD
输入:1 个 | 输出:1 个(in-place)
| 方向 | 编号 | 名称 | 数据类型 | 形状 |
|---|---|---|---|---|
| 输入 | 0 | dY | FP32 / FP16 | [N, C, H, W](复用 y 的内存) |
| 输出 | 0 | dX | FP32 / FP16 | 与 dY 相同(in-place 复用 x) |
功能:dX = dY * (1 - tanh²(x)),从 dY 重算 tanh 值。
SiLU
源文件:silu_op.cpp / silu_op.cu | 注册函数:register_op_silu()
SILU_FP32_FWD / SILU_AMP_FWD
输入:1 个 | 输出:1 个(in-place)
| 方向 | 编号 | 名称 | 数据类型 | 形状 |
|---|---|---|---|---|
| 输入 | 0 | x | FP32 / FP16 | [N, C, H, W] |
| 输出 | 0 | y | FP32 / FP16 | 与 x 相同(in-place) |
功能:y = x * sigmoid(x)(Swish 激活)。
SILU_FP32_BWD / SILU_AMP_BWD
输入:1 个 | 输出:1 个(in-place)
| 方向 | 编号 | 名称 | 数据类型 | 形状 |
|---|---|---|---|---|
| 输入 | 0 | dY | FP32 / FP16 | [N, C, H, W](复用 y 的内存) |
| 输出 | 0 | dX | FP32 / FP16 | 与 dY 相同(in-place 复用 x) |
功能:SiLU 反向,重算 sigmoid 后求导。
ReLU6
源文件:relu6_op.cpp / relu6_op.cu | 注册函数:register_op_relu6()
RELU6_FP32_FWD / RELU6_AMP_FWD
输入:1 个 | 输出:1 个(in-place)
| 方向 | 编号 | 名称 | 数据类型 | 形状 |
|---|---|---|---|---|
| 输入 | 0 | x | FP32 / FP16 | [N, C, H, W] |
| 输出 | 0 | y | FP32 / FP16 | 与 x 相同(in-place) |
功能:y = min(max(x, 0), 6)。
RELU6_FP32_BWD / RELU6_AMP_BWD
输入:1 个 | 输出:1 个(in-place)
| 方向 | 编号 | 名称 | 数据类型 | 形状 |
|---|---|---|---|---|
| 输入 | 0 | dY | FP32 / FP16 | [N, C, H, W](复用 y 的内存) |
| 输出 | 0 | dX | FP32 / FP16 | 与 dY 相同(in-place 复用 x) |
功能:ReLU6 反向,梯度仅在 0 < x < 6 时通过。
LeakyReLU
源文件:leaky_relu_op.cpp / leaky_relu_op.cu | 注册函数:register_op_leaky_relu()
当前实现使用固定负斜率 0.01(LeakyReluParams::alpha,默认 0.01)。
LEAKY_RELU_FP32_FWD / LEAKY_RELU_AMP_FWD
输入:1 个 | 输出:1 个(in-place)
| 方向 | 编号 | 名称 | 数据类型 | 形状 |
|---|---|---|---|---|
| 输入 | 0 | x | FP32 / FP16 | [N, C, H, W] |
| 输出 | 0 | y | FP32 / FP16 | 与 x 相同(in-place) |
功能:y = max(0, x) + alpha * min(0, x)。
LEAKY_RELU_FP32_BWD / LEAKY_RELU_AMP_BWD
输入:1 个 | 输出:1 个(in-place)
| 方向 | 编号 | 名称 | 数据类型 | 形状 |
|---|---|---|---|---|
| 输入 | 0 | dY | FP32 / FP16 | [N, C, H, W](复用 y 的内存) |
| 输出 | 0 | dX | FP32 / FP16 | 与 dY 相同(in-place 复用 x) |
功能:LeakyReLU 反向,对应斜率 1(x ≥ 0)或 alpha(x < 0)。
Hardswish
源文件:hardswish_op.cpp / hardswish_op.cu | 注册函数:register_op_hardswish()
HARDSWISH_FP32_FWD / HARDSWISH_AMP_FWD
输入:1 个 | 输出:1 个(in-place)
| 方向 | 编号 | 名称 | 数据类型 | 形状 |
|---|---|---|---|---|
| 输入 | 0 | x | FP32 / FP16 | [N, C, H, W] |
| 输出 | 0 | y | FP32 / FP16 | 与 x 相同(in-place) |
功能:y = x * ReLU6(x+3) / 6。
HARDSWISH_FP32_BWD / HARDSWISH_AMP_BWD
输入:1 个 | 输出:1 个(in-place)
| 方向 | 编号 | 名称 | 数据类型 | 形状 |
|---|---|---|---|---|
| 输入 | 0 | dY | FP32 / FP16 | [N, C, H, W](复用 y 的内存) |
| 输出 | 0 | dX | FP32 / FP16 | 与 dY 相同(in-place 复用 x) |
功能:Hardswish 反向。
ELU
源文件:elu_op.cpp / elu_op.cu | 注册函数:register_op_elu()
当前实现使用默认 α = 1.0(EluParams::alpha)。
ELU_FP32_FWD / ELU_AMP_FWD
输入:1 个 | 输出:1 个(in-place)
| 方向 | 编号 | 名称 | 数据类型 | 形状 |
|---|---|---|---|---|
| 输入 | 0 | x | FP32 / FP16 | [N, C, H, W] |
| 输出 | 0 | y | FP32 / FP16 | 与 x 相同(in-place) |
功能:y = x (x ≥ 0), α(e^x - 1) (x < 0)。
ELU_FP32_BWD / ELU_AMP_BWD
输入:1 个 | 输出:1 个(in-place)
| 方向 | 编号 | 名称 | 数据类型 | 形状 |
|---|---|---|---|---|
| 输入 | 0 | dY | FP32 / FP16 | [N, C, H, W](复用 y 的内存) |
| 输出 | 0 | dX | FP32 / FP16 | 与 dY 相同(in-place 复用 x) |
功能:ELU 反向。
Sigmoid
源文件:sigmoid_op.cpp / sigmoid_op.cu | 注册函数:register_op_sigmoid()
SIGMOID_FP32_FWD / SIGMOID_AMP_FWD
输入:1 个 | 输出:1 个(in-place)
| 方向 | 编号 | 名称 | 数据类型 | 形状 |
|---|---|---|---|---|
| 输入 | 0 | x | FP32 / FP16 | [N, C, H, W] |
| 输出 | 0 | y | FP32 / FP16 | 与 x 相同(in-place) |
功能:y = 1 / (1 + exp(-x))。
SIGMOID_FP32_BWD / SIGMOID_AMP_BWD
输入:1 个 | 输出:1 个(in-place)
| 方向 | 编号 | 名称 | 数据类型 | 形状 |
|---|---|---|---|---|
| 输入 | 0 | dY | FP32 / FP16 | [N, C, H, W](复用 y 的内存) |
| 输出 | 0 | dX | FP32 / FP16 | 与 dY 相同(in-place 复用 x) |
功能:dX = dY y (1 - y)(重算)。
Dropout
源文件:dropout_op.cpp / dropout_op.cu | 注册函数:register_op_dropout()
参数:DropoutParams(drop_prob: float 丢弃概率,默认 0.5;seed: uint64_t 随机种子)。Inverted Dropout:训练时按 1/(1-p) 缩放保留元素。
DROPOUT_FP32_FWD / DROPOUT_AMP_FWD
输入:1 个 | 输出:2 个
| 方向 | 编号 | 名称 | 数据类型 | 形状 |
|---|---|---|---|---|
| 输入 | 0 | x | FP32 / FP16 | [N, C, H, W] |
| 输出 | 0 | y | FP32 / FP16 | 与 x 相同(in-place 复用 x) |
| 输出 | 1 | mask | INT8 | [N, C, H, W](保留/丢弃标记) |
功能:Inverted Dropout 前向,以概率 drop_prob 将元素置零,其余元素乘以 1/(1-drop_prob) 保持期望不变。
DROPOUT_FP32_BWD / DROPOUT_AMP_BWD
输入:2 个 | 输出:1 个
| 方向 | 编号 | 名称 | 数据类型 | 形状 |
|---|---|---|---|---|
| 输入 | 0 | dY | FP32 / FP16 | [N, C, H, W] |
| 输入 | 1 | mask | INT8 | [N, C, H, W] |
| 输出 | 0 | dX | FP32 / FP16 | 与 dY 相同(in-place 复用 x) |
功能:按 mask 回传梯度,被丢弃位置的梯度为零。
DROPOUT_FP32_INF / DROPOUT_AMP_INF
输入:1 个 | 输出:1 个
| 方向 | 编号 | 名称 | 数据类型 | 形状 |
|---|---|---|---|---|
| 输入 | 0 | x | FP32 / FP16 | [N, C, H, W] |
| 输出 | 0 | y | FP32 / FP16 | 与 x 相同(in-place 复用 x) |
功能:推理模式,等价于恒等映射(不丢弃任何元素)。
Conv
源文件:conv_op.cpp + conv_op_impl.cpp | 注册函数:register_op_conv()
参数:ConvParams(out_channels: int, kernel_h: int, kernel_w: int, pad_h: int, pad_w: int, stride_h: int, stride_w: int, groups: int, dilation_h: int, dilation_w: int)。
基于 cuDNN Frontend Graph 实现。FP32 提供 CPU fallback(xnnpack / Eigen / naive),AMP 仅 CUDA。AMP FWD 额外包含 GenStats(sum、sq_sum)用于后续 BN 融合。
CONV_FP32_FWD
输入:2 个 | 输出:3 个(含 sum/sq_sum 占位)
| 方向 | 编号 | 名称 | 数据类型 | 形状 |
|---|---|---|---|---|
| 输入 | 0 | X | FP32 | [N, C, H, W](NHWC) |
| 输入 | 1 | W | FP32 | [K, C/g, R, S](KRSC) |
| 输出 | 0 | Y | FP32 | [N, K, OH, OW](NHWC) |
| 输出 | 1 | sum | FP32 | 占位(FP32 路径不使用) |
| 输出 | 2 | sq_sum | FP32 | 占位(FP32 路径不使用) |
CONV_AMP_FWD
输入:2 个 | 输出:3 个(含 GenStats)
| 方向 | 编号 | 名称 | 数据类型 | 形状 |
|---|---|---|---|---|
| 输入 | 0 | X | FP16 | [N, C, H, W](NHWC) |
| 输入 | 1 | W | FP16 | [K, C/g, R, S](KRSC) |
| 输出 | 0 | Y | FP16 | [N, K, OH, OW](NHWC) |
| 输出 | 1 | sum | FP32 | [K](per-channel 和) |
| 输出 | 2 | sq_sum | FP32 | [K](per-channel 平方和) |
CONV_FP32_BWD
输入:3 个 | 输出:2 个(dX 为 in-place)
| 方向 | 编号 | 名称 | 数据类型 | 形状 |
|---|---|---|---|---|
| 输入 | 0 | dY | FP32 | [N, K, OH, OW] |
| 输入 | 1 | W | FP32 | [K, C/g, R, S] |
| 输入 | 2 | X | FP32 | [N, C, H, W](in-place 目标) |
| 输出 | 0 | dX | FP32 | [N, C, H, W](in-place 复用 X) |
| 输出 | 1 | dW | FP32 | [K, C/g, R, S] |
CONV_AMP_BWD
同 FP32 BWD,数据类型为 FP16(dW 为 FP16)。
CONV_FP32_INF / CONV_AMP_INF
输入:2 个 | 输出:1 个
| 方向 | 编号 | 名称 | 数据类型 | 形状 |
|---|---|---|---|---|
| 输入 | 0 | X | FP32 / FP16 | [N, C, H, W] |
| 输入 | 1 | W | FP32 / FP16 | [K, C/g, R, S] |
| 输出 | 0 | Y | FP32 / FP16 | [N, K, OH, OW] |
功能:推理模式卷积,不含 GenStats。
CONV_FP32_BWD_FIRST_LAYER / CONV_AMP_BWD_FIRST_LAYER
输入:3 个 | 输出:2 个(dX 不写入)
| 方向 | 编号 | 名称 | 数据类型 | 形状 |
|---|---|---|---|---|
| 输入 | 0 | dY | FP32 / FP16 | [N, K, OH, OW] |
| 输入 | 1 | W | FP32 / FP16 | [K, C/g, R, S] |
| 输入 | 2 | X | FP32 / FP16 | [N, C, H, W] |
| 输出 | 0 | dX | FP32 / FP16 | 占位,不写入 |
| 输出 | 1 | dW | FP32 / FP16 | [K, C/g, R, S] |
功能:首层卷积反向,仅计算 dW(Weight Gradient),跳过 dX 计算(首层输入为数据,无需回传梯度)。
MaxPool
源文件:maxpool_op.cpp / maxpool_op.cu | 注册函数:register_op_maxpool()
参数:PoolParams(kernel_h: int, kernel_w: int, pad_h: int, pad_w: int, stride_h: int, stride_w: int)。
MAXPOOL_FP32_FWD / MAXPOOL_AMP_FWD
输入:1 个 | 输出:2 个
| 方向 | 编号 | 名称 | 数据类型 | 形状 |
|---|---|---|---|---|
| 输入 | 0 | X | FP32 / FP16 | [N, C, H, W] |
| 输出 | 0 | Y | FP32 / FP16 | [N, C, OH, OW] |
| 输出 | 1 | mask | INT8 | 保存最大值位置,用于 BWD 路由梯度 |
MAXPOOL_FP32_BWD / MAXPOOL_AMP_BWD
输入:4 个 | 输出:1 个(in-place)
| 方向 | 编号 | 名称 | 数据类型 | 形状 |
|---|---|---|---|---|
| 输入 | 0 | dY | FP32 / FP16 | [N, C, OH, OW] |
| 输入 | 1 | Y | FP32 / FP16 | [N, C, OH, OW](前向输出) |
| 输入 | 2 | mask | INT8 | 前向保存的 mask |
| 输入 | 3 | X | FP32 / FP16 | [N, C, H, W](in-place 目标) |
| 输出 | 0 | dX | FP32 / FP16 | [N, C, H, W](in-place 复用 X) |
功能:根据 mask 将梯度路由到前向最大值位置。
MAXPOOL_FP32_INF / MAXPOOL_AMP_INF
输入:1 个 | 输出:1 个
| 方向 | 编号 | 名称 | 数据类型 | 形状 |
|---|---|---|---|---|
| 输入 | 0 | X | FP32 / FP16 | [N, C, H, W] |
| 输出 | 0 | Y | FP32 / FP16 | [N, C, OH, OW] |
功能:推理模式最大池化,不保存 mask。
AvgPool
源文件:avgpool_op.cpp / avgpool_op.cu | 注册函数:register_op_avgpool()
参数:PoolParams(同 MaxPool)。
AVGPOOL_FP32_FWD / AVGPOOL_AMP_FWD
输入:1 个 | 输出:1 个
| 方向 | 编号 | 名称 | 数据类型 | 形状 |
|---|---|---|---|---|
| 输入 | 0 | X | FP32 / FP16 | [N, C, H, W] |
| 输出 | 0 | Y | FP32 / FP16 | [N, C, OH, OW] |
AVGPOOL_FP32_BWD / AVGPOOL_AMP_BWD
输入:1 个 | 输出:1 个(in-place)
| 方向 | 编号 | 名称 | 数据类型 | 形状 |
|---|---|---|---|---|
| 输入 | 0 | dY | FP32 / FP16 | [N, C, OH, OW] |
| 输出 | 0 | dX | FP32 / FP16 | [N, C, H, W](in-place 复用 X) |
功能:平均池化反向,梯度均匀分配到池化窗口内各位置。
AVGPOOL_FP32_INF / AVGPOOL_AMP_INF
同 FWD,用于推理。
GAP(Global Average Pooling)
源文件:gap_op.cpp / gap_op.cu | 注册函数:register_op_gap()
GAP_FP32_FWD / GAP_AMP_FWD
输入:1 个 | 输出:1 个
| 方向 | 编号 | 名称 | 数据类型 | 形状 |
|---|---|---|---|---|
| 输入 | 0 | X | FP32 / FP16 | [N, C, H, W] |
| 输出 | 0 | Y | FP32 / FP16 | [N, C, 1, 1] |
功能:全局平均池化,将空间维度降为 1×1。
GAP_FP32_BWD / GAP_AMP_BWD
输入:1 个 | 输出:1 个(in-place)
| 方向 | 编号 | 名称 | 数据类型 | 形状 |
|---|---|---|---|---|
| 输入 | 0 | dY | FP32 / FP16 | [N, C, 1, 1] |
| 输出 | 0 | dX | FP32 / FP16 | [N, C, H, W](in-place 复用 X) |
功能:全局平均池化反向,梯度均匀广播到所有空间位置。
FC(全连接)
源文件:fc_op.cpp / fc_op.cu | 注册函数:register_op_fc()
参数:FCParams(out_features: int, bias: bool)。
FC 将输入展平为 [batch, in_features](其中 in_features = H W C),然后执行 Y = X @ W^T + B。FP32 路径基于 cuBLAS GEMM + 自定义 bias add kernel,提供 CPU fallback(Eigen / naive 三重循环);AMP 路径使用 cuDNN Frontend 1×1 Conv 图实现(含 clamp 到 FP16 范围),仅 CUDA。AMP BWD 直接输出 FP32 的 dW/dB(cuBLAS 混合精度 GEMM),无需后续 CAST。
FC_FP32_FWD
输入:3 个(bias 固定传入,不使用则为占位) | 输出:1 个
| 方向 | 编号 | 名称 | 数据类型 | 形状 |
|---|---|---|---|---|
| 输入 | 0 | X | FP32 | [N, C, H, W](内部展平为 [N, CHW]) |
| 输入 | 1 | W | FP32 | [K, CHW, 1, 1](KRSC 布局) |
| 输入 | 2 | B | FP32 | [K, 1, 1, 1](若 bias=false 则为占位,不使用) |
| 输出 | 0 | Y | FP32 | [N, K, 1, 1] |
功能:Y = X_flatten @ W^T + B。GPU 路径使用 cuBLAS cublasGemmEx(FP32),CPU 路径优先使用 Eigen,回退到 naive 三重循环。
FC_FP32_BWD
输入:4 个 | 输出:3 个(dX 为 in-place)
| 方向 | 编号 | 名称 | 数据类型 | 形状 |
|---|---|---|---|---|
| 输入 | 0 | dY | FP32 | [N, K, 1, 1] |
| 输入 | 1 | W | FP32 | [K, CHW, 1, 1] |
| 输入 | 2 | Y_output | FP32 | 占位,不使用 |
| 输入 | 3 | X | FP32 | [N, C, H, W](in-place 目标) |
| 输出 | 0 | dX | FP32 | [N, C, H, W](in-place 复用 X) |
| 输出 | 1 | dW | FP32 | [K, CHW, 1, 1] |
| 输出 | 2 | dB | FP32 | [K, 1, 1, 1](若 bias=false 仍输出占位) |
功能:计算 dB = sum(dY, axis=0)、dW = dY^T @ X、dX = dY @ W。GPU 路径使用三流并行(dB @ COMP_2, dW @ COMP_1, dX @ COMP_3),dX 等待 dW 完成。
FC_AMP_FWD
输入:3 个 | 输出:1 个
| 方向 | 编号 | 名称 | 数据类型 | 形状 |
|---|---|---|---|---|
| 输入 | 0 | X | FP16 | [N, C, H, W](内部展平为 [N, CHW, 1, 1]) |
| 输入 | 1 | W | FP16 | [K, CHW, 1, 1] |
| 输入 | 2 | B | FP32 | [K, 1, 1, 1](若 bias=false 则为占位) |
| 输出 | 0 | Y | FP16 | [N, K, 1, 1] |
功能:使用 cuDNN Frontend 1×1 Conv 图实现,含 FP32 累加、bias add(FP32)、clamp 到 FP16 范围。仅 CUDA,CPU 不支持。
FC_AMP_BWD
输入:4 个 | 输出:3 个(dX 为 in-place,dW/dB 为 FP32)
| 方向 | 编号 | 名称 | 数据类型 | 形状 |
|---|---|---|---|---|
| 输入 | 0 | dY | FP16 | [N, K, 1, 1] |
| 输入 | 1 | W | FP16 | [K, CHW, 1, 1] |
| 输入 | 2 | Y_output | FP16 | 占位,不使用 |
| 输入 | 3 | X | FP16 | [N, C, H, W](in-place 目标) |
| 输出 | 0 | dX | FP16 | [N, C, H, W](in-place 复用 X) |
| 输出 | 1 | dW | FP32 | [K, CHW, 1, 1] |
| 输出 | 2 | dB | FP32 | [K, 1, 1, 1](若 bias=false 仍输出占位) |
功能:AMP 反向,使用 cuBLAS 混合精度 GEMM(FP16 输入 × FP16,FP32 累加/输出)。与 Conv 不同,dW/dB 直接输出 FP32 无需后续 CAST。三流并行同 FP32 BWD。
BatchNorm
源文件:bn_op.cpp / bn_op.cu | 注册函数:register_op_bn()
参数:BNParams(eps: float 默认 1e-5, momentum: float 默认 0.1)。
BN1D 和 BN2D 的 IO 结构完全相同,区别仅在于张量布局:BN1D 操作 [N, C] 形状,BN2D 操作 [N, C, H, W](NHWC)形状。训练模式下 running_mean/var 通过 B_NEXT 原地更新;推理模式使用预计算的 eq_scale/eq_bias。
BN1D_FP32_FWD / BN2D_FP32_FWD
输入:7 个 | 输出:3 个(running_mean/var 原地更新)
| 方向 | 编号 | 名称 | 数据类型 | 形状 |
|---|---|---|---|---|
| 输入 | 0 | X | FP32 | [N, C] 或 [N, C, H, W] |
| 输入 | 1 | γ | FP32 | [C] |
| 输入 | 2 | β | FP32 | [C] |
| 输入 | 3 | running_mean | FP32 | [C](原地更新为 next_mean) |
| 输入 | 4 | running_var | FP32 | [C](原地更新为 next_var) |
| 输入 | 5 | eps | FP32 | 标量(1 元素) |
| 输入 | 6 | momentum | FP32 | 标量(1 元素) |
| 输出 | 0 | Y | FP32 | 与 X 相同 |
| 输出 | 1 | saved_mean | FP32 | [C] |
| 输出 | 2 | saved_inv_var | FP32 | [C] |
功能:训练前向 BN。计算 Y = γ (X - μ) / √(σ² + ε) + β,同时更新 running_mean/var(EMA:new = (1-m)old + m*batch,cuDNN 使用无偏方差)。GPU 基于 cuDNN Frontend Graph,CPU 提供 naive 循环 fallback。
BN1D_FP32_BWD / BN2D_FP32_BWD
输入:5 个 | 输出:3 个(dX 为 in-place)
| 方向 | 编号 | 名称 | 数据类型 | 形状 |
|---|---|---|---|---|
| 输入 | 0 | dY | FP32 | 与 X 相同 |
| 输入 | 1 | γ | FP32 | [C] |
| 输入 | 2 | saved_mean | FP32 | [C](来自 FWD) |
| 输入 | 3 | saved_inv_var | FP32 | [C](来自 FWD) |
| 输入 | 4 | X | FP32 | 与 Y 相同(in-place 目标) |
| 输出 | 0 | dX | FP32 | 与 X 相同(in-place 复用 X) |
| 输出 | 1 | dγ | FP32 | [C] |
| 输出 | 2 | dβ | FP32 | [C] |
功能:BN 反向,计算 dX、dγ、dβ。GPU 基于 cuDNN Frontend Graph,CPU 提供 naive 循环 fallback。
BN1D_FP32_INF / BN2D_FP32_INF
输入:3 个 | 输出:1 个
| 方向 | 编号 | 名称 | 数据类型 | 形状 |
|---|---|---|---|---|
| 输入 | 0 | X | FP32 | [N, C] 或 [N, C, H, W] |
| 输入 | 1 | eq_scale | FP32 | [C] |
| 输入 | 2 | eq_bias | FP32 | [C] |
| 输出 | 0 | Y | FP32 | 与 X 相同 |
功能:推理模式 Y = X * eq_scale + eq_bias(融合的 affine 变换)。GPU 使用自定义 kernel,CPU 提供 naive 循环。
BN1D_AMP_FWD / BN2D_AMP_FWD
IO 结构同 FP32 FWD,数据类型为 FP16(γ/β/rm/rv/eps/momentum 仍为 FP32)。仅 CUDA,基于 cuDNN Frontend Graph。
BN1D_AMP_BWD / BN2D_AMP_BWD
IO 结构同 FP32 BWD,数据类型为 FP16(γ/saved_mean/saved_inv_var/dγ/dβ 为 FP32)。仅 CUDA。
BN1D_AMP_INF / BN2D_AMP_INF
IO 结构同 FP32 INF,X/Y 为 FP16,eq_scale/eq_bias 为 FP32。仅 CUDA。
BN_UPDATE_EQ_PARAMS
输入:5 个 | 输出:2 个
| 方向 | 编号 | 名称 | 数据类型 | 形状 |
|---|---|---|---|---|
| 输入 | 0 | γ | FP32 | [C] |
| 输入 | 1 | β | FP32 | [C] |
| 输入 | 2 | running_mean | FP32 | [C] |
| 输入 | 3 | running_var | FP32 | [C] |
| 输入 | 4 | eps | FP32 | 标量(1 元素,可选) |
| 输出 | 0 | eq_scale | FP32 | [C] |
| 输出 | 1 | eq_bias | FP32 | [C] |
功能:由训练后的 running stats 计算推理用等效参数。eq_scale = γ / √(rv + ε),eq_bias = β - rm * eq_scale。训练结束后调用一次,之后 INF 路径直接使用。
Flatten
源文件:flatten_op.cpp / flatten_op.cu | 注册函数:register_op_flatten()
参数:FlattenParams(start_dim: int 默认 1)。
将 [N, C, H, W] 张量展平为 [N, 1, 1, CHW]。GPU 路径使用逐元素 kernel 正确处理 padding(padded_c ≠ C),CPU 路径 compact 布局下等价于 memcpy。BWD_FIRST_LAYER 变体与 BWD 实现相同,仅在图编译阶段区分调度路径。
FLATTEN_FP32_FWD
输入:1 个 | 输出:1 个
| 方向 | 编号 | 名称 | 数据类型 | 形状 |
|---|---|---|---|---|
| 输入 | 0 | X | FP32 | [N, C, H, W] |
| 输出 | 0 | Y | FP32 | [N, 1, 1, CHW] |
功能:将 NHWC 张量展平为 [N, 1, 1, CHW]。GPU 使用逐元素 kernel 处理 stride,CPU compact 布局下为 memcpy。
FLATTEN_FP32_BWD
输入:1 个 | 输出:1 个(in-place)
| 方向 | 编号 | 名称 | 数据类型 | 形状 |
|---|---|---|---|---|
| 输入 | 0 | dY | FP32 | [N, 1, 1, CHW] |
| 输出 | 0 | dX | FP32 | [N, C, H, W](in-place 复用 X) |
功能:将展平梯度还原为原始 NHWC 形状。
FLATTEN_FP32_BWD_FIRST_LAYER
IO 结构同 BWD。实现与 BWD 相同,仅在图编译阶段通过不同枚举值区分调度路径。
FLATTEN_AMP_FWD
IO 结构同 FP32 FWD,数据类型为 FP16。仅 CUDA,CPU 不支持。
FLATTEN_AMP_BWD
IO 结构同 FP32 BWD,数据类型为 FP16。仅 CUDA。
FLATTEN_AMP_BWD_FIRST_LAYER
IO 结构同 AMP BWD。仅 CUDA。
ChannelPadding
源文件:channel_padding_op.cpp / channel_padding_op.cu | 注册函数:register_op_channel_padding()
将通道维度从 C_in 填充到 C_out(C_out 为 8 的倍数),新增通道置零。反向传播时取 dY 的前 C_in 个通道作为 dX。BWD_FIRST_LAYER 变体与 BWD 实现相同。
CHANNEL_PADDING_FP32_FWD
输入:1 个 | 输出:1 个
| 方向 | 编号 | 名称 | 数据类型 | 形状 |
|---|---|---|---|---|
| 输入 | 0 | X | FP32 | [N, C_in, H, W] |
| 输出 | 0 | Y | FP32 | [N, C_out, H, W](C_out ≥ C_in,新增通道置零) |
功能:将通道数从 C_in 填充到 C_out(向上取整到 8 的倍数),新增通道填充 0。GPU 使用逐元素 kernel,CPU 提供 naive 循环。
CHANNEL_PADDING_FP32_BWD
输入:1 个 | 输出:1 个(in-place)
| 方向 | 编号 | 名称 | 数据类型 | 形状 |
|---|---|---|---|---|
| 输入 | 0 | dY | FP32 | [N, C_out, H, W] |
| 输出 | 0 | dX | FP32 | [N, C_in, H, W](in-place 复用 X) |
功能:取 dY 的前 C_in 个通道作为 dX,丢弃填充通道的梯度。
CHANNEL_PADDING_FP32_BWD_FIRST_LAYER
IO 结构同 BWD。实现与 BWD 相同。
CHANNEL_PADDING_AMP_FWD / CHANNEL_PADDING_AMP_BWD / CHANNEL_PADDING_AMP_BWD_FIRST_LAYER
IO 结构同对应 FP32 变体,数据类型为 FP16。仅 CUDA,CPU 不支持。
SoftmaxCrossEntropy
源文件:softmax_ce_op.cpp / softmax_ce_op.cu | 注册函数:register_op_softmax_ce()
参数:LossParams(label_smoothing: float, num_classes: int)。
标量输入(scaling、batch_size、label_smoothing)由 Compiler Phase 4 注入并绑定到 DTensor ID。FWD 输出 loss、inv_scaling 和 probs;INF 额外输出 top1、top5、pred 用于评估。
SOFTMAX_CE_FP32_FWD
输入:5 个(含标量) | 输出:3 个
| 方向 | 编号 | 名称 | 数据类型 | 形状 |
|---|---|---|---|---|
| 输入 | 0 | logits | FP32 | [N, num_classes] |
| 输入 | 1 | labels | INT32 | [N] |
| 输入 | 2 | scaling | FP32 | 标量(1 元素) |
| 输入 | 3 | batch_size | INT32 | 标量(1 元素) |
| 输入 | 4 | label_smoothing | FP32 | 标量(1 元素) |
| 输出 | 0 | loss | FP32 | 标量(1 元素) |
| 输出 | 1 | inv_scaling | FP32 | 标量(1 元素) |
| 输出 | 2 | probs | FP32 | [N, num_classes] |
功能:训练版 Softmax + CrossEntropy,支持 label smoothing。GPU 使用自定义 kernel(含 partial reduction 用于多卡),CPU 提供 naive fallback。
SOFTMAX_CE_FP32_BWD
输入:5 个(含标量) | 输出:1 个
| 方向 | 编号 | 名称 | 数据类型 | 形状 |
|---|---|---|---|---|
| 输入 | 0 | probs | FP32 | [N, num_classes](来自 FWD) |
| 输入 | 1 | labels | INT32 | [N] |
| 输入 | 2 | scaling | FP32 | 标量(1 元素) |
| 输入 | 3 | inv_scaling | FP32 | 标量(1 元素) |
| 输入 | 4 | label_smoothing | FP32 | 标量(1 元素) |
| 输出 | 0 | dlogits | FP32 | [N, num_classes] |
功能:SoftmaxCE 反向,计算 dlogits = (probs - one_hot_with_smoothing) / (N * scaling)。
SOFTMAX_CE_FP32_INF
输入:5 个(含标量) | 输出:6 个
| 方向 | 编号 | 名称 | 数据类型 | 形状 |
|---|---|---|---|---|
| 输入 | 0 | logits | FP32 | [N, num_classes] |
| 输入 | 1 | labels | INT32 | [N] |
| 输入 | 2 | scaling | FP32 | 标量(1 元素) |
| 输入 | 3 | batch_size | INT32 | 标量(1 元素) |
| 输入 | 4 | label_smoothing | FP32 | 标量(1 元素) |
| 输出 | 0 | loss | FP32 | 标量(1 元素) |
| 输出 | 1 | inv_scaling | FP32 | 标量(1 元素) |
| 输出 | 2 | probs | FP32 | [N, num_classes] |
| 输出 | 3 | top1 | FP32 | 标量(1 元素) |
| 输出 | 4 | top5 | FP32 | 标量(1 元素) |
| 输出 | 5 | pred | INT32 | [N] |
功能:推理版,输出完整评估指标(loss、top1、top5、pred)。
SOFTMAX_CE_AMP_FWD / SOFTMAX_CE_AMP_BWD / SOFTMAX_CE_AMP_INF
IO 结构同对应 FP32 变体,logits/probs 为 FP16,scaling/inv_scaling/label_smoothing/loss 为 FP32,labels 为 INT32。仅 CUDA。
CBR(Conv + BN + ReLU 融合)
源文件:cbr_op.cpp / cbr_op.cu | 注册函数:register_op_cbr()
参数:CBRParams(内含 ConvParams + BNParams)。仅 AMP 路径,CPU 不支持。
CBR 将 Conv、BN、ReLU 三个算子融合为单个 cuDNN Frontend Graph,避免中间结果写回显存,显著提升 AMP 训练性能。FWD 额外输出 GenStats(sum、sq_sum)用于后续 BN 融合。
CBR_AMP_FWD
输入:8 个 | 输出:8 个
| 方向 | 编号 | 名称 | 数据类型 | 形状 |
|---|---|---|---|---|
| 输入 | 0 | X | FP16 | [N, C, H, W](NHWC) |
| 输入 | 1 | W | FP16 | [K, C/g, R, S](KRSC) |
| 输入 | 2 | γ | FP32 | [K] |
| 输入 | 3 | β | FP32 | [K] |
| 输入 | 4 | running_mean | FP32 | [K](原地更新为 next_mean) |
| 输入 | 5 | running_var | FP32 | [K](原地更新为 next_var) |
| 输入 | 6 | eps | FP32 | 标量(1 元素) |
| 输入 | 7 | momentum | FP32 | 标量(1 元素) |
| 输出 | 0 | conv_output | FP16 | [N, K, OH, OW] |
| 输出 | 1 | sum | FP32 | [K](GenStats per-channel 和) |
| 输出 | 2 | sq_sum | FP32 | [K](GenStats per-channel 平方和) |
| 输出 | 3 | bn_output | FP16 | [N, K, OH, OW] |
| 输出 | 4 | saved_mean | FP32 | [K] |
| 输出 | 5 | saved_inv_var | FP32 | [K] |
| 输出 | 6 | relu_output | FP16 | [N, K, OH, OW] |
| 输出 | 7 | mask | INT8 | [N, K, OH, OW](ReLU mask,x > 0 时为 1) |
功能:训练前向融合 Conv→BN→ReLU。通过 cuDNN Frontend Graph 单次 launch 完成,避免中间张量写回。
CBR_AMP_BWD
输入:7 个 | 输出:6 个
| 方向 | 编号 | 名称 | 数据类型 | 形状 |
|---|---|---|---|---|
| 输入 | 0 | dY_relu | FP16 | [N, K, OH, OW] |
| 输入 | 1 | W | FP16 | [K, C/g, R, S] |
| 输入 | 2 | γ | FP32 | [K] |
| 输入 | 3 | saved_mean | FP32 | [K](来自 FWD) |
| 输入 | 4 | saved_inv_var | FP32 | [K](来自 FWD) |
| 输入 | 5 | mask | INT8 | [N, K, OH, OW](来自 FWD) |
| 输入 | 6 | X | FP16 | [N, C, H, W](in-place 目标) |
| 输出 | 0 | dX | FP16 | [N, C, H, W](in-place 复用 X) |
| 输出 | 1 | dW | FP16 | [K, C/g, R, S] |
| 输出 | 2 | dγ | FP32 | [K] |
| 输出 | 3 | dβ | FP32 | [K] |
| 输出 | 4 | conv_output | FP16 | [N, K, OH, OW] |
| 输出 | 5 | bn_bwd_out | FP16 | [N, K, OH, OW] |
功能:完整反向融合 ReLU_BWD→BN_BWD→Conv_BWD(dW + dX)。
CBR_AMP_BWD_FIRST_LAYER
输入:7 个 | 输出:6 个(dX 为占位,不写入)
| 方向 | 编号 | 名称 | 数据类型 | 形状 |
|---|---|---|---|---|
| 输入 | 0 | dY_relu | FP16 | [N, K, OH, OW] |
| 输入 | 1 | W | FP16 | [K, C/g, R, S] |
| 输入 | 2 | γ | FP32 | [K] |
| 输入 | 3 | saved_mean | FP32 | [K] |
| 输入 | 4 | saved_inv_var | FP32 | [K] |
| 输入 | 5 | mask | INT8 | [N, K, OH, OW] |
| 输入 | 6 | X | FP16 | [N, C, H, W] |
| 输出 | 0 | dX | FP16 | 占位,不写入 |
| 输出 | 1 | dW | FP16 | [K, C/g, R, S] |
| 输出 | 2 | dγ | FP32 | [K] |
| 输出 | 3 | dβ | FP32 | [K] |
| 输出 | 4 | conv_output | FP16 | [N, K, OH, OW] |
| 输出 | 5 | bn_bwd_out | FP16 | [N, K, OH, OW] |
功能:首层融合反向,仅计算 dW(Weight Gradient),跳过 dX(首层输入为数据)。
CBR_AMP_INF
输入:4 个 | 输出:3 个
| 方向 | 编号 | 名称 | 数据类型 | 形状 |
|---|---|---|---|---|
| 输入 | 0 | X | FP16 | [N, C, H, W] |
| 输入 | 1 | W | FP16 | [K, C/g, R, S] |
| 输入 | 2 | eq_scale | FP32 | [K] |
| 输入 | 3 | eq_bias | FP32 | [K] |
| 输出 | 0 | conv_output | FP16 | [N, K, OH, OW] |
| 输出 | 1 | bn_output | FP16 | [N, K, OH, OW] |
| 输出 | 2 | relu_output | FP16 | [N, K, OH, OW] |
功能:推理融合路径 Conv→BN(INF)→ReLU,使用预计算的 eq_scale/eq_bias。
LARS 优化器更新
源文件:lars_op.cpp / lars_op.cu | 注册函数:register_op_lars()
LARS(Layer-wise Adaptive Rate Scaling)是 DTensor 算子(非 Range 算子),操作单个权重张量及其梯度。输入中包含若干 1 元素标量 DTensor。不同流变体(_FC、_FIRST、_DEEP)的 IO 结构完全相同,仅在图编译阶段映射到不同流(COMP_1/COMP_2/COMP_3)以实现流水线并行。
LARS_COMPUTE_TRUST_RATIO
输入:7 或 8 个 | 输出:1 个
| 方向 | 编号 | 名称 | 数据类型 | 形状 |
|---|---|---|---|---|
| 输入 | 0 | W | FP32 | [K, C, H, W](权重) |
| 输入 | 1 | G | FP32 | 与 W 相同(梯度) |
| 输入 | 2 | trust_coefficient | FP32 | 标量(1 元素) |
| 输入 | 3 | weight_decay | FP32 | 标量(1 元素) |
| 输入 | 4 | eps | FP32 | 标量(1 元素) |
| 输入 | 5 | loss_scaling | FP32 | 标量(1 元素) |
| 输入 | 6 | has_nan | INT32 | 标量(1 元素) |
| 输入 | 7 | temp | FP32 | 临时缓冲区(两阶段 reduction 用,可选) |
| 输出 | 0 | η | FP32 | 标量(1 元素) |
功能:计算 LARS trust ratio η = tc ‖W‖ / (‖G‖/s + wd ‖W‖ + ε),限制在 (0, 100]。GPU 使用两阶段 reduction(Phase1 计算 partial w2/g2,Phase2 归约求 η),CPU 提供 naive 循环 fallback。
LARS_UPDATE
输入:9 个 | 输出:1 个(W 原地更新)
| 方向 | 编号 | 名称 | 数据类型 | 形状 |
|---|---|---|---|---|
| 输入 | 0 | W | FP32 | [K, C, H, W](原地更新) |
| 输入 | 1 | G | FP32 | 与 W 相同 |
| 输入 | 2 | M | FP32 | 与 W 相同(momentum buffer,原地更新) |
| 输入 | 3 | η | FP32 | 标量(1 元素) |
| 输入 | 4 | lr | FP32 | 标量(1 元素) |
| 输入 | 5 | beta | FP32 | 标量(1 元素) |
| 输入 | 6 | wd | FP32 | 标量(1 元素) |
| 输入 | 7 | loss_scaling | FP32 | 标量(1 元素) |
| 输入 | 8 | has_nan | INT32 | 标量(1 元素) |
| 输出 | 0 | W | FP32 | 与输入 W 相同(原地更新) |
功能:LARS 动量更新。M_new = β M + lr η (G/s + wd W),W = W - M_new。若 has_nan 为真则跳过更新。
LARS_NESTEROV_UPDATE
IO 结构同 LARS_UPDATE。Nesterov 变体:M_new = β M + lr η (G/s + wd W),W = W - (lr η (G/s + wd W) + β M_new)。
流感知变体
| 变体后缀 | 映射流 | 适用场景 |
|---|---|---|
_FC |
COMP_1 | FC 层 |
_FIRST |
COMP_2 | 首层卷积 |
_DEEP |
COMP_3 | 深层卷积 |
所有流感知变体的 IO 结构同基础变体,仅在图编译阶段通过不同 ComputeOp 枚举值区分调度流。
Adam 偏差修正与标量
源文件:adam_bc_op.cpp / adam_bc_op.cu | 注册函数:register_op_adam_bc()
SCALAR_INCREMENT
输入:1 个 | 输出:1 个(原地)
| 方向 | 编号 | 名称 | 数据类型 | 形状 |
|---|---|---|---|---|
| 输入 | 0 | step | INT32 | 标量(1 元素,原地更新) |
| 输出 | 0 | step | INT32 | 标量(1 元素) |
功能:step += 1,训练步数自增。GPU 使用原子加,CPU 直接递增。
ADAM_BIAS_CORRECTION
输入:3 个 | 输出:2 个
| 方向 | 编号 | 名称 | 数据类型 | 形状 |
|---|---|---|---|---|
| 输入 | 0 | step | INT32 | 标量(1 元素) |
| 输入 | 1 | β1 | FP32 | 标量(1 元素) |
| 输入 | 2 | β2 | FP32 | 标量(1 元素) |
| 输出 | 0 | bc1 | FP32 | 标量(1 元素) |
| 输出 | 1 | bc2 | FP32 | 标量(1 元素) |
功能:计算 Adam 偏差修正因子。bc1 = 1 / (1 - β1^step),bc2 = 1 / (1 - β2^step)。GPU 使用自定义 kernel,CPU 使用 std::pow。
Range 算子
概述
Range 算子对应 enum class RangeOp(定义于 include/renaissance/graph/op_kind.h),操作对象是 MemoryPlan 中的内存范围(Region),而不是完整 DTensor。它们负责数据传输、内存清零、类型转换、分布式通信、优化器更新、数值检查与指标累积等辅助任务,由 GraphExecutor 通过 g_range_op_table 调度。
实现目录:src/backend/ops/range/
注册入口:src/backend/op_registry.cpp 中的 register_default_ops()。
公共调用约定:
- 算子通过
GraphNode描述,主要字段为input_ranges/output_ranges(成对的Region范围)。 - 部分算子同时使用
input_ids/output_ids来引用标量 DTensor(如has_nan、scaling、lr等)。 - 所有 Range 算子默认在
UPDATE流执行,H2D/A2D 类传输算子在TRANSFER流执行。
重要说明:
- LARS 优化器更新不是 Range 算子,而是 DTensor 算子(见上一节)。
RANGE_EMA_PARAM_UPDATE与RANGE_SEMA_SWITCH已在枚举和 graph 编译阶段使用,但当前src/backend/ops/range/下尚未提供后端 launch 实现。
H2D Copy
| 算子变体 | 输入 | 输出 | 数据类型 | 形状 | 功能 |
|---|---|---|---|---|---|
RANGE_H2D_COPY_A |
Host 侧 StagingBufferPool A 区(由 start_region_id 决定 label/data) |
output_ranges[]: 设备端 Region(I_A_LABEL、I_A_DATA 等) |
FP32 / INT32 | 按 range 大小 | 异步 Host→Device 双缓冲 A |
RANGE_H2D_COPY_B |
Host 侧 StagingBufferPool B 区 |
output_ranges[]: 设备端 Region(I_B_LABEL、I_B_DATA 等) |
FP32 / INT32 | 按 range 大小 | 异步 Host→Device 双缓冲 B |
RANGE_H2D_COPY_DTENSOR |
Host 侧 StagingParamPool slot 0(当前 hardcoded) |
output_ranges[0]: 目标设备内存 |
FP32 | sizeof(float)(目前仅传 LR) |
从参数 staging 区拷贝标量到设备 |
D2D Copy
| 算子变体 | 输入 | 输出 | 数据类型 | 形状 | 功能 |
|---|---|---|---|---|---|
RANGE_D2D_COPY |
input_ranges[]: 源设备内存范围 |
output_ranges[]: 目标设备内存范围 |
FP32/FP16 等 | range 大小一一对应 | 通用 Device-to-Device 拷贝 |
Clear
| 算子变体 | 输入 | 输出 | 数据类型 | 形状 | 功能 |
|---|---|---|---|---|---|
RANGE_CLEAR |
无 | output_ranges[]: 待清零范围 |
任意 | range 大小 | 将指定内存范围置 0,常用于梯度清零 |
Cast
| 算子变体 | 输入 | 输出 | 数据类型 | 形状 | 功能 |
|---|---|---|---|---|---|
RANGE_CAST_FP32_TO_FP16 |
input_ranges[]: FP32 范围 |
output_ranges[]: FP16 范围 |
FP32→FP16 | range 大小 / 2 | 范围级 FP32 转 FP16 |
RANGE_CAST_FP16_TO_FP32 |
input_ranges[]: FP16 范围 |
output_ranges[]: FP32 范围 |
FP16→FP32 | range 大小 × 2 | 范围级 FP16 转 FP32 |
AllReduce
| 算子变体 | 输入 | 输出 | 数据类型 | 形状 | 功能 |
|---|---|---|---|---|---|
RANGE_SUM_ALLREDUCE |
input_ranges[]: 各 rank 数据 |
output_ranges[]: 归约后数据 |
FP32 | range 大小 | NCCL ncclSum AllReduce |
RANGE_MEAN_ALLREDUCE |
同上 | 同上 | FP32 | 同上 | AllReduce 后按 world_size 平均 |
RANGE_BN_STATS_ALLREDUCE |
同上 | 同上 | FP32 | 同上 | BN stats 专用 AllReduce + 平均 |
说明:无 NCCL 时 CPU 路径退化为本地拷贝,Mean/BN_STATS 仍做平均。
优化器更新
所有更新均为原地修改权重/偏置范围;标量(lr、wd、beta 等)通过 input_ids 传入 1 元素 DTensor。
| 算子变体 | 输入(range + scalar) | 输出 | 数据类型 | 形状 | 功能 |
|---|---|---|---|---|---|
RANGE_UPDATE_WEIGHT_SGD |
ranges: W, G scalars: lr, wd, scaling, has_nan |
output_ranges[0]: W(原地) |
FP32 | W 的大小 | W -= lr(G/s + wdW) |
RANGE_UPDATE_WEIGHT_MOMENTUM |
ranges: W, G, M scalars: lr, wd, beta, scaling, has_nan |
W(原地) M(原地) |
FP32 | W 的大小 | SGD + Momentum |
RANGE_UPDATE_WEIGHT_NESTEROV |
ranges: W, G, M scalars: lr, wd, beta, scaling, has_nan |
W(原地) M(原地) |
FP32 | W 的大小 | SGD + Nesterov |
RANGE_UPDATE_WEIGHT_ADAM |
ranges: W, G, M, V scalars: lr, wd, β1, β2, eps, scaling, bc1, bc2, has_nan |
W(原地) M/V(原地) |
FP32 | W 的大小 | Adam 更新 |
RANGE_UPDATE_WEIGHT_ADAMW |
ranges: W, G, M, V scalars: lr, wd, β1, β2, eps, scaling, bc1, bc2, has_nan |
W(原地) M/V(原地) |
FP32 | W 的大小 | AdamW 更新 |
RANGE_UPDATE_BIAS_SGD |
ranges: B, G scalars: lr, scaling, has_nan |
B(原地) | FP32 | B 的大小 | 偏置 SGD(无 wd) |
RANGE_UPDATE_BIAS_MOMENTUM |
ranges: B, G, M scalars: lr, beta, scaling, has_nan |
B/M(原地) | FP32 | B 的大小 | 偏置 Momentum |
RANGE_UPDATE_BIAS_NESTEROV |
ranges: B, G, M scalars: lr, beta, scaling, has_nan |
B/M(原地) | FP32 | B 的大小 | 偏置 Nesterov |
RANGE_UPDATE_BIAS_ADAM |
ranges: B, G, M, V scalars: lr, β1, β2, eps, scaling, bc1, bc2, has_nan |
B/M/V(原地) | FP32 | B 的大小 | 偏置 Adam/AdamW(wd 传 nullptr) |
CheckNaN
| 算子变体 | 输入 | 输出 | 数据类型 | 形状 | 功能 |
|---|---|---|---|---|---|
RANGE_CHECK_NAN |
input_ranges[0]: 待检查梯度范围OpParams: 可选 GradClipParams.max_abs |
output_ids[0]: has_nan(INT32) |
FP32 / INT32 | has_nan 为 1 元素 | 检测 NaN/Inf;若 max_abs>0 则同时裁剪 |
GradScaling
| 算子变体 | 输入 | 输出 | 数据类型 | 形状 | 功能 |
|---|---|---|---|---|---|
RANGE_GRAD_SCALING |
input_ids[0]: has_nan(INT32)input_ids[1]: scaling(FP32,原地) |
output_ids[0]: scaling |
FP32 / INT32 | 1 元素 | 若 has_nan 为真,则 scaling *= 0.5(下限 1.0) |
AccumMetrics
| 算子变体 | 输入 | 输出 | 数据类型 | 形状 | 功能 |
|---|---|---|---|---|---|
RANGE_ACCUM_METRICS |
input_ids[0]: batch_size(INT32)input_ids[1]: lossinput_ids[2]: top1input_ids[3]: top5 |
output_ids[0]: accum_lossoutput_ids[1]: accum_top1output_ids[2]: accum_top5 |
FP32 / INT32 | 输出为 1 元素 | 按 batch size 加权累积 loss/top1/top5 |
已声明、待后端实现
| 算子变体 | 当前状态 | 说明 |
|---|---|---|
RANGE_EMA_PARAM_UPDATE |
后端未实现 | graph 编译阶段生成,用于 EMA 参数更新 |
RANGE_SEMA_SWITCH |
后端未实现 | graph 编译阶段生成,用于 EMA 权重与原权重切换 |
参见
DeviceContext- 单卡执行上下文MemoryArena- 内存池抽象基类ArenaKeeper- 全局内存池管理器GraphExecutor- 图执行调度器ComputeOp- 计算算子类型枚举RangeOp- 范围算子类型枚举StreamKind- 流类型枚举GraphId- 图 ID 枚举