Skip to content

BJTUpupil/AscendFHE

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

23 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

AscendFHE:面向 Atlas A2 / Ascend 910B 的 FHE 底层算子库与硬件加速方案

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.*

Quick Start

这条任务流用于最快完成“拿到源码 -> 确认内容 -> 准备环境 -> 打开交互入口”。真实算子执行 依赖目标 NPU 环境中已经安装并注册 AscendFHE 算子包。

  1. 获取源码并查看算子:
git clone https://github.com/BJTUpupil/AscendFHE.git
cd AscendFHE
  1. 确认当前仓库内容:
ls
rg --files kernels
rg --files doc notebooks

应能看到 kernels/doc/notebooks/。其中 kernels/ 存放算子源码,doc/ 存放公开文档, notebooks/ 存放交互检查入口。

  1. 准备 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 环境安装方法

  1. 验证 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

  1. 打开交互 Notebook:
jupyter notebook notebooks/ascend_npu_fhe_quickstart.ipynb

Notebook 提交版本默认不执行安装、环境检查或算子调用。进入目标 NPU 环境后,可先启用环境检查:

RUN_INSTALL = False
RUN_ENV_CHECK = True
RUN_OP_TESTS = False
  1. 仅在完成算子包安装和注册后启用算子测试:
RUN_OP_TESTS = True

RUN_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 源码。

torch_npu API

安装并注册 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

在 torch_npu 中接入

统一接入链路如下:

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 的统一职责:

  1. 校验输入 Tensor 位于 NPU,且 dtype、shape 和属性满足算子要求。
  2. 按算子 shape 推导规则创建输出 Tensor。
  3. 调用现有 op_host/ 中的 tiling 逻辑,或实现等价 tiling 生成函数。
  4. 调用对应 Ascend C kernel 入口。
  5. 返回输出 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:使用 WWprimeq 校验 Shoup 模乘结果。
  • MontgomeryMul:使用 q_muq 校验 Montgomery 模乘结果。
  • BConv:使用小规模源基和目标基校验基转换结果。
  • IP:使用小规模 num_rnsdpoly_degree 校验内积累加结果。
  • AutoOp:校验重排、符号处理和模归一化结果。
  • NTT:使用固定旋转因子表和模数校验五阶段 NTT 输出。

验证记录必须包含:

算子名称
torch_npu API
输入形状
输入数据类型
属性值
参考实现输出
NPU 输出
校验和
运行命令
运行日志

添加新算子

添加新算子时按以下步骤修改仓库:

  1. 新建 kernels/<name>/op_host/,添加 shape 推导、数据类型推导和 tiling 参数生成。
  2. 新建 kernels/<name>/op_kernel/,添加 Ascend C 设备侧 kernel。
  3. 新建 kernels/<name>/operator.cmake,声明构建所需源码和头文件。
  4. 新建 kernels/<name>/README.md,说明独立功能和 torch_npu 接入方式。
  5. 在后续 torch_npu 适配层中新增 torch_npu_ext/ops/<name>.cpp
  6. 更新根 README 的独立功能卡片和 torch_npu API。

本地检查命令:

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 条目。 实验记录中必须包含仓库提交哈希。

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors