AscendFHE 是面向同态加密计算的 Ascend NPU 硬件加速底层算子库,当前公开支持
Atlas A2 / Ascend 910B,SOC 配置为 ascend910b。仓库提供 FHE 常用模运算、RNS
基转换、内积累加、自同构重排和 NTT 等算子的 Ascend C kernel、host tiling 逻辑、
算子构建片段和 torch_npu 调用说明。
安装并注册 AscendFHE 算子包后,这些算子通过 torch.ops.ascend_npu_fhe.* 暴露给
PyTorch / torch_npu;未安装或未注册算子包的环境只能进行源码审查、环境检查和 Notebook
入口验证。
| 能力 | 状态 | 说明 |
|---|---|---|
| Ascend C kernel | 已提供 | 位于各 kernels/<operator>/op_kernel/。 |
| host shape/tiling | 已提供 | 位于各 kernels/<operator>/op_host/。 |
| 算子级 README | 已提供 | 每个算子目录都有独立接口、入口和验证说明。 |
| Notebook 入口 | 已提供 | notebooks/ascend_npu_fhe_quickstart.ipynb 用于目标 NPU 环境中的交互检查。 |
| 支持设备 | 已标定 | Atlas A2 / Ascend 910B,SOC 为 ascend910b。 |
torch.ops.ascend_npu_fhe.* API |
安装注册后支持 | 安装并注册 AscendFHE 算子包后可通过 torch_npu 调用。 |
顶层 CMakeLists.txt |
未提供 | 当前不能从仓库根目录直接构建完整扩展。 |
现在可以审查源码、准备 CANN 环境、使用 Notebook 做环境或注册检查;不能直接从根目录构建完整
扩展,也不能在未安装注册 AscendFHE 算子包的环境中直接调用 torch.ops.ascend_npu_fhe.*。
这条任务流用于最快完成“拿到源码 -> 确认内容 -> 准备环境 -> 打开交互入口”。真实算子执行 依赖目标 NPU 环境中已经安装并注册 AscendFHE 算子包。
- 获取源码并查看算子:
git clone https://github.com/BJTUpupil/AscendFHE.git
cd AscendFHE- 确认当前仓库内容:
ls
rg --files kernels
rg --files doc notebooks应能看到 kernels/、doc/ 和 notebooks/。其中 kernels/ 存放算子源码,doc/ 存放公开文档,
notebooks/ 存放交互检查入口。
- 准备 CANN 8.5.0 / Atlas A2 / Ascend 910B 环境:
conda create -n ascend-fhe python=3.10 -y
conda activate ascend-fhe
conda install ascend::cann-toolkit==8.5.0 -y
conda install ascend::cann-910b-ops==8.5.0 -y
source "${CONDA_PREFIX}/Ascend/ascend-toolkit/set_env.sh"
export ASCEND_HOME_PATH="${CONDA_PREFIX}/Ascend/ascend-toolkit"驱动、固件、PyTorch 和 torch_npu 需要按目标 Atlas A2 / Ascend 910B 机器的实际版本安装。
完整安装路径见 CANN 8.5.0 环境安装方法。
- 验证 NPU 运行环境:
echo "${ASCEND_HOME_PATH}"
npu-smi info
python -c "import torch, torch_npu; print(torch.npu.is_available())"期望结果是 ASCEND_HOME_PATH 指向实际 CANN Toolkit 目录,npu-smi info 能识别设备,
Python 命令输出 True。
- 打开交互 Notebook:
jupyter notebook notebooks/ascend_npu_fhe_quickstart.ipynbNotebook 提交版本默认不执行安装、环境检查或算子调用。进入目标 NPU 环境后,可先启用环境检查:
RUN_INSTALL = False
RUN_ENV_CHECK = True
RUN_OP_TESTS = False- 仅在完成算子包安装和注册后启用算子测试:
RUN_OP_TESTS = TrueRUN_OP_TESTS=True 只适用于已经完成 AscendFHE 算子包安装和 torch.ops.ascend_npu_fhe.*
注册的环境。当前仓库最快可完成的是环境检查和接口入口验证;真正的 NPU 算子执行依赖目标环境中的
算子包安装与注册。
公开文档位于 doc/:
docs/ 是本地忽略目录,不作为公开文档入口。
每个算子当前提供 Ascend C kernel、host tiling 逻辑和算子级 README。安装并注册 AscendFHE
算子包后,表中的调用形式即为公开 torch_npu API。
| 独立功能 | 目录 | 功能定位 | torch_npu 调用形式 | 输入输出 | 独立性证明 | 详情文档 |
|---|---|---|---|---|---|---|
AddMod |
kernels/add_mod |
逐元素模加 | torch.ops.ascend_npu_fhe.add_mod(a, b, q) |
输入 a,b,q:int32;输出 y:int32 |
执行 (a + b) mod q,与减法、乘法和变换类算子分离 |
add_mod |
SubMod |
kernels/sub_mod |
逐元素模减 | torch.ops.ascend_npu_fhe.sub_mod(a, b, q) |
输入 a,b,q:int32;输出 y:int32 |
执行 (a - b) mod q,与模加和模乘路径分离 |
sub_mod |
MulModShoup |
kernels/mul_mod_shoup |
Shoup 预计算模乘 | torch.ops.ascend_npu_fhe.mul_mod_shoup(a, W, Wprime, q) |
输入 a:int32 和 3 个整数属性;输出 y:int32 |
使用 Shoup 常量完成单输入逐元素乘法,与双输入 Montgomery 乘法分离 | mul_mod_shoup |
MontgomeryMul |
kernels/montgomery_mul |
Montgomery 约减模乘 | torch.ops.ascend_npu_fhe.montgomery_mul(x, y, q_mu, q) |
输入 x,y,q_mu,q:int32;输出 z:int32 |
基于 q_mu 完成双输入 Montgomery 乘法,与 Shoup 常量乘法分离 |
montgomery_mul |
BConv |
kernels/bconv |
RNS 基转换 | torch.ops.ascend_npu_fhe.bconv(x, lhs_dense, attrs...) |
输入 x:int32,lhs_dense:int8;输出 y:int32 |
处理 RNS 源基到目标基转换,包含矩阵阶段和误差补偿 | bconv |
IP |
kernels/ip |
RNS 内积累加 | torch.ops.ascend_npu_fhe.ip(x, key, key_shoup, num_rns, d, poly_degree, q_array) |
输入 x,key,key_shoup:int32;输出 y:int32 |
在 RNS 和分解维度上累加,与逐元素算子和基转换算子分离 | ip |
AutoOp |
kernels/auto_op |
自同构重排与符号归一化 | torch.ops.ascend_npu_fhe.auto_op(x, byte_offsets_32, sign_mask, num_rns, poly_degree, k, q_array) |
输入 x,byte_offsets_32:int32,sign_mask:int8;输出 dst:int32 |
负责系数重排和模意义取反,与算术和 NTT 路径分离 | auto_op |
NTT |
kernels/ntt |
五阶段数论变换 | torch.ops.ascend_npu_fhe.ntt(a_grid, w1_soa, w2_all, qs_tensor, q_mu_tensor, w3_mm2_mat_soa) |
混合 int32/int8 输入;输出 stage5_out:int32 |
融合 NTT 五阶段计算,与基础模运算和 RNS 辅助算子分离 | ntt |
AscendFHE/
|-- README.md
|-- LICENSE
|-- doc/
|-- notebooks/
`-- kernels/
|-- add_mod/
|-- sub_mod/
|-- mul_mod_shoup/
|-- montgomery_mul/
|-- bconv/
|-- ip/
|-- auto_op/
`-- ntt/
每个算子目录采用固定结构:
kernels/<operator>/
|-- README.md
|-- operator.cmake
|-- op_host/
`-- op_kernel/
目录含义:
| 路径 | 内容 |
|---|---|
README.md |
独立功能说明和 torch_npu 接入说明。 |
operator.cmake |
声明主机侧源码、设备侧源码和头文件目录。 |
op_host/ |
shape 推导、数据类型推导和 tiling 参数生成。 |
op_kernel/ |
Ascend C 设备侧 kernel 源码。 |
安装并注册 AscendFHE 算子包后,公开 API 如下:
torch.ops.ascend_npu_fhe.add_mod(a, b, q) -> y
torch.ops.ascend_npu_fhe.sub_mod(a, b, q) -> y
torch.ops.ascend_npu_fhe.mul_mod_shoup(a, W, Wprime, q) -> y
torch.ops.ascend_npu_fhe.montgomery_mul(x, y, q_mu, q) -> z
torch.ops.ascend_npu_fhe.bconv(
x, lhs_dense, num_src_bases, num_dst_bases, poly_degree, fixed_shift,
src_bases, dst_bases, q_hat_inv_mod_q, q_hat_inv_mod_q_shoup,
src_bases_inv_fixed, error_comp_coefs, error_comp_coefs_shoup,
merge_base_shoup
) -> y
torch.ops.ascend_npu_fhe.ip(x, key, key_shoup, num_rns, d, poly_degree, q_array) -> y
torch.ops.ascend_npu_fhe.auto_op(x, byte_offsets_32, sign_mask, num_rns, poly_degree, k, q_array) -> dst
torch.ops.ascend_npu_fhe.ntt(a_grid, w1_soa, w2_all, qs_tensor, q_mu_tensor, w3_mm2_mat_soa) -> stage5_out统一接入链路如下:
Python API
-> torch.ops.ascend_npu_fhe.<op_name>
-> C++ extension wrapper
-> 输入 dtype/shape/device 校验
-> 输出 Tensor 创建
-> host tiling 或等价 tiling 生成
-> ACL / torch_npu 自定义算子 launch
-> Ascend C kernel
-> NPU 输出 Tensor
C++ wrapper 的统一职责:
- 校验输入 Tensor 位于 NPU,且 dtype、shape 和属性满足算子要求。
- 按算子 shape 推导规则创建输出 Tensor。
- 调用现有
op_host/中的 tiling 逻辑,或实现等价 tiling 生成函数。 - 调用对应 Ascend C kernel 入口。
- 返回输出 Tensor 给 PyTorch。
建议新增的 torch_npu 适配层目录:
torch_npu_ext/
|-- CMakeLists.txt
|-- register_ops.cpp
|-- ops/
| |-- add_mod.cpp
| |-- sub_mod.cpp
| |-- mul_mod_shoup.cpp
| |-- montgomery_mul.cpp
| |-- bconv.cpp
| |-- ip.cpp
| |-- auto_op.cpp
| `-- ntt.cpp
`-- python/
`-- ascend_npu_fhe/
|-- __init__.py
`-- ops.py
当前仓库不包含上述适配层源码;本 README 和各算子 README 描述的是接入实现时必须 遵守的接口和数据流。
本仓库公开支持的 CANN 版本固定为 CANN Community Edition 8.5.0。源码中的
AICore().AddConfig("ascend910b") 声明了硬件目标,公开支持路径固定为 Atlas A2 /
Ascend 910B,并使用 910b ops 算子包。
| 项目 | 固定版本或目标 |
|---|---|
| CANN | CANN Community Edition 8.5.0 |
| Toolkit | ascend::cann-toolkit 8.5.0 |
| ops | ascend::cann-910b-ops 8.5.0 |
| 硬件 | Atlas A2 / Ascend 910B |
| SOC | ascend910b |
| 主机编译器 | CANN 8.5.0 支持的 C++17 编译器 |
| 构建工具 | CMake 与 Ninja 或 Make |
| Python 调用侧 | PyTorch + torch_npu |
本仓库不声明兼容 CANN Community Edition 8.5.0 以外的版本。安装方法见 CANN 8.5.0 环境安装方法。
实现 torch_npu 适配层后,每个算子按以下方式验证:
AddMod:校验y = (a + b) mod q。SubMod:校验y = (a - b) mod q。MulModShoup:使用W、Wprime、q校验 Shoup 模乘结果。MontgomeryMul:使用q_mu、q校验 Montgomery 模乘结果。BConv:使用小规模源基和目标基校验基转换结果。IP:使用小规模num_rns、d、poly_degree校验内积累加结果。AutoOp:校验重排、符号处理和模归一化结果。NTT:使用固定旋转因子表和模数校验五阶段 NTT 输出。
验证记录必须包含:
算子名称
torch_npu API
输入形状
输入数据类型
属性值
参考实现输出
NPU 输出
校验和
运行命令
运行日志
添加新算子时按以下步骤修改仓库:
- 新建
kernels/<name>/op_host/,添加 shape 推导、数据类型推导和 tiling 参数生成。 - 新建
kernels/<name>/op_kernel/,添加 Ascend C 设备侧 kernel。 - 新建
kernels/<name>/operator.cmake,声明构建所需源码和头文件。 - 新建
kernels/<name>/README.md,说明独立功能和 torch_npu 接入方式。 - 在后续 torch_npu 适配层中新增
torch_npu_ext/ops/<name>.cpp。 - 更新根 README 的独立功能卡片和
torch_npuAPI。
本地检查命令:
rg -n "torch_npu|torch.ops.ascend_npu_fhe" README.md kernels/*/README.md
rg -n "__global__ __aicore__ void" kernels
rg --files kernels仓库根目录的 LICENSE 为 GPL-2.0。修改和分发源码时必须保留源文件中的许可证声明。
公开发布前,在此处补充论文标题、作者、会议或期刊名称、年份和 BibTeX 条目。 实验记录中必须包含仓库提交哈希。