| Files | Last commit | Last update |
|---|---|---|
| 19 days ago | ||
| 19 days ago | ||
| 19 days ago | ||
| 19 days ago | ||
| 19 days ago | ||
| 19 days ago | ||
| 19 days ago | ||
| 19 days ago |
FusedExponential
产品支持情况
| 产品 | 是否支持 |
|---|---|
| Atlas A2 训练系列产品 / Atlas A2 推理系列产品 | 支持 |
| Atlas A3 训练系列产品 / Atlas A3 推理系列产品 | 支持 |
构建配置分别为 ascend910b / ascend910_93。
功能说明
将已经生成的均匀分布样本转换为指数分布样本,融合 neg、add、边界填充、log 和 mul。此算子不生成随机数,不修改随机数生成器状态。
epsilon = finfo(u.dtype).eps / 2
out = -log(min(1 - u, 1 - epsilon)) / lambd
epsilon 在 FLOAT16、BFLOAT16、FLOAT32 下分别为 2^-11、2^-8、2^-24。
参数说明
aclnnStatus aclnnFusedExponentialGetWorkspaceSize(
const aclTensor* u, const aclScalar* lambd, aclTensor* out,
uint64_t* workspaceSize, aclOpExecutor** executor);
aclnnStatus aclnnFusedExponential(
void* workspace, uint64_t workspaceSize,
aclOpExecutor* executor, aclrtStream stream);
| 参数 | 说明 |
|---|---|
| u | Device Tensor;FLOAT16、BFLOAT16 或 FLOAT32,ND,rank 0~8 |
| lambd | Host DOUBLE scalar,正率参数;+inf 对应全零输出 |
| out | 与 u 的 shape、dtype 相同;支持独立输出和原地输出 |
| workspaceSize / executor | 第一段接口返回的工作空间字节数及执行器 |
| stream | 第二段接口执行所在的 ACL stream |
完整接口说明见 aclnnFusedExponential。
约束说明
输入与输出均支持非连续布局。空张量不启动计算;rank 0 表示一个标量元素。读回输出之前应同步对应 stream。相同输入和参数得到逐位一致的结果。
输出支持可由 stride 排序证明元素不重叠的布局(包括连续、转置、带步长切片),拒绝内部重叠或无法证明不重叠的布局。连续输入输出可以完全原地,不支持部分地址重叠。非连续输入先转连续、非连续输出经临时结果写回,保证读写顺序。输入展开视图允许零 stride;输出不允许在非单元素维度使用零 stride。shape 必须为非负具体维度,字节数不得超出 INT64_MAX。
调用方保证 u 的采样域为 [0, 1),ACLNN 层不扫描 Device 数据。按照任务书,lambd <= 0 或 NaN 的值校验属于 torch 适配层;调用 ACLNN 前应检查 lambd > 0。当输入的低精度表示舍入为 1 时,有限正率参数对应 +inf 输出,不对重尾端追加钳制。
空参数、非法 dtype、不匹配的 shape/dtype、超出支持范围的 rank 和非 ND 格式分别由接口参数检查处理。
实现
各 AI Vector Core 处理不重叠的连续区间,采用 UB 分块搬运。计算在 FLOAT32 中完成,最后一次收窄至输出 dtype。对 FLOAT32 输入,通过 log(1-v) 的舍入修正降低小值侧抵消误差,其中 v=max(u, epsilon)。FLOAT16/BFLOAT16 输入经该保护后,1-v 可由 FLOAT32 精确表示,因此省去恒等的补偿运算。Host 将 DOUBLE 率参数分解为尾数与二进制指数,避免直接把极端 DOUBLE 率参数转换为 FLOAT32 后溢出或下溢。
连续路径直接写入输出,不创建 GM 中间结果或 bool mask。非连续输入通过 Contiguous 转换,非连续输出通过 ViewCopy 写回;构建显式依赖仓内 ViewCopy,以保持其接口层与内核实现一致。
算法不使用 workspace。CANN 9.1.0 执行框架对零字节 workspace 描述保留固定的 512 字节保护及对齐空间,连续路径的第一段接口仍可能返回 512 字节;调用方必须按返回值分配,不可强制传入零字节。空张量路径返回 0。非连续布局的转换缓冲另计。
调用说明
| 调用方式 | 示例 | 说明 |
|---|---|---|
| ACLNN | test_aclnn_fused_exponential.cpp | 完整初始化、两段式调用、精度核对和资源释放;通过 DEVICE 选择逻辑设备 |
安装算子包并设置 ASCEND_CUSTOM_OPP_PATH 后,可在仓库根目录执行:
DEVICE=0 bash build.sh --run_example FusedExponential eager cust --vendor_name=fusedexp --experimental
构建与测试
Host/Tiling、shape/dtype 推导及 API 参数校验使用仓库 UT 框架,在仓库根目录执行:
source /usr/local/Ascend/cann-9.1.0/set_env.sh
bash build.sh -u --ophost --opapi --soc=ascend910b --ops=FusedExponential --experimental -j8
UT 不替代设备精度和性能测试。设备构建与补充集成测试命令如下。
在仓库根目录执行:
source /usr/local/Ascend/cann-9.1.0/set_env.sh
bash build.sh --pkg --soc=ascend910b --vendor_name=fusedexp --ops=FusedExponential --experimental -j8
bash build_out/cann-ops-math-fusedexp_linux-aarch64.run --quiet --install-path=/path/to/opp
export ASCEND_CUSTOM_OPP_PATH=/path/to/opp/vendors/fusedexp_math
export ATK_CUSTOM_OPP_PATH=$ASCEND_CUSTOM_OPP_PATH/op_api/lib/libcust_opapi.so
export LD_LIBRARY_PATH=$ASCEND_CUSTOM_OPP_PATH/op_api/lib:$LD_LIBRARY_PATH
DEVICE=0 python experimental/math/FusedExponential/tests/st/test_fused_exponential.py
补充测试覆盖边界率参数、rank、空张量、尾块、非连续输出、原地、确定性、非默认 stream 与异常元数据。任务验收另外使用官方自验包中的完整 1000 条精度、200 条性能和内存探针,补充测试不能替代官方矩阵。
贡献说明
| 贡献者 | 贡献方 | 贡献算子 | 贡献时间 | 贡献内容 |
|---|---|---|---|---|
| katiyaaa | 个人开发者 | FusedExponential | 2026/10 | 新增 Atlas A2/A3 实现、ACLNN 接口及测试 |