KCAL中间件 Python 接口封装
本文介绍 KCAL 中间件用 Python 进行封装(目前仅提供PSI接口)的项目如何 virtCCA 内部部署和验证, 对外提供以 Python 方式集成的思路
注: 为防止算子并发执行带来的 Python GIL 锁的抢占,引入了蚂蚁的通信库 yacl
前置条件
- 安装
Python和pdm包, 以及依赖pybind11-3.0.1版本 - 其它参考 scql README.md 的前置条件说明
目录结构介绍
当前项目目录主要信息如下, 需要安装 kcal 包进行构建,参考 scql README.md 的 2.1 节
.
|-- README.md # 说明文档
|-- bazel # bazel 构建相关脚本及 patch
|-- kcal # 实际打包进 whl 里面的目录
| |-- __init__.py
| |-- utils
| |-- __init__.py
| |-- preload.py # 加载 kcal lib
| |-- kcal.pyi # Python 接口存根文件
| |-- context_ext.cc
| |-- context_ext.h # kcal 上下文拓展
| |-- yacl_linker.cc
| |-- yacl_linker.h # 蚂蚁 yacl 网络包装
| |-- enums.py # kcal 类型枚举
| |-- kcal_wrapper.cc # Python 对外接口
|-- pyproject.toml # Python 打包管理说明
|-- build_native.py # 构建 Python 封装包的脚本
|-- test # 测试目录
|-- yacl
|-- data # 测试数据
|-- arith_combination_demo.py # mpc 算数类算子组合调用示例
|-- arith_demo.py # mpc 算数类算子示例
|-- make_share_demo.py # mpc 算数类算子分片示例
|-- reveal_share_demo.py # mpc 算数类算子分片还原示例
|-- pir_demo.py # pir 示例
|-- psi_demo.py # 平衡 psi 示例
|-- psi_ub_demo.py # 非平衡 psi 示例
|-- run.py # 测试入口
构建
进入到kcal_python目录, 然后执行以下操作(前提是已经安装好 Python 和 pdm 包, 这里推荐使用 uv 作为 Python 的版本管理工具)
安装依赖
-
安装 uv 工具
curl -LsSf https://astral.sh/uv/install.sh | sh -
创建虚拟环境
# 避免用系统自带的 python,可能不包含完整的开发组件 uv python install 3.11 uv venv --python 3.11 source .venv/bin/activate -
安装 pdm 工具
uv pip install pdm pybind11
打包构建
该打包过程基于kcal_python根目录下面的kcal目录进行打包, kcal加速库会一并打包进.whl包内, 并在导入时自动加载
# 或者也可以采用下面命令一键打包构建
uv build --wheel
# 单独编译 kcal python so 参考
bazelisk build //... -c opt --@rules_python//python/config_settings:python_version=3.11 && /bin/cp bazel-bin/kcal/libkcal.so kcal/
-
asan (地址检查,可选)
# 构建时开启 asan bazelisk build --config=asan //... -c dbg --@rules_python//python/config_settings:python_version=3.11 && /bin/cp bazel-bin/kcal/libkcal.so kcal/ # 运行时增加该环境变量再执行脚本 export LSAN_OPTIONS=suppressions=/opt/virtCCA_sdk/MPC/kcal_python/lsan.supp
执行完后会在dist目录下面生成打包好的.whl包, 然后执行 uv pip install dist/*.whl 即可覆盖安装
部署
只需将生成的 .whl 包导入到 cvm 内, 然后在 cvm 内进行安装, 前提是 cvm 内安装有 Python 版本和构建一致,并且安装了 kcal 包, 步骤如下
注: 机密虚机启动及连接参考: https://www.hikunpeng.com/document/detail/zh/kunpengcctrustzone/tee/cVMcont/kunpengtee_16_0027.html
# 这里以 cvm 内的 /home/admin/dev 作为工作目录
scp dist/*.whl root@<cvm_ip>:/home/admin/dev/
# 安装, 进入到 cvm 内
pip install *.whl --force-reinstall
测试
为方便演示, 这里仅在一台机器上多个 cvm 内进行测试, 实际情况在两台或者三台分离部署的 cvm 内进行测试
将test目录直接拷贝进cvm内的/home/admin/dev下, 连接cvm, 并打开两个终端, 分别运行以下指令, 即可进行下面的测试
参与方通信地址按需修改xxx_demo.py文件
推荐在 cvm 内直接使用 uv 工具管理 python 版本,或直接使用系统自带的 python (需确定好构建出来的 kcal 包和实际安装的 python 版本一致)
运行前先将测试数据 /opt/virtCCA_sdk/MPC/kcal_python/test/yacl/data/*.csv 放在 work_dir 下, 下面默认在 /opt/data 目录
不同脚本使用的数据文件名如下归类:
| 数据项 | 说明 |
|---|---|
| 算术类算子测试数据 | arith_0.csv/arith_1.csv/arith_2.csv(三方时需要) |
| PSI/PSI_UB测试数据 | 0.csv/1.csv/2.csv(三方时需要) |
| PIR | pir_kv.csv(服务端键值对)/pir_query.csv(客户端查询) |
| 分片/还原 | share0.csv/share1.csv 使用文件模式还原时需先调用文件模式分片,使用文件模式分片产生的结果文件(share_output_0.csv/share_output_1.csv)进行还原测试 |
| 算术类算子组合调用测试 | 一次计算数据:arith_0_1st.csv/arith_1_1st.csv/arith_2_1st.csv(三方时需要) |
| 二次计算数据:arith_0_2nd.csv/arith_1_2nd.csv/arith_2_2nd.csv(三方时需要) |
# 两方 make_share 测试
python test/yacl/make_share_demo.py --rank 0 --work_dir /opt/data --mode memory
python test/yacl/make_share_demo.py --rank 1 --work_dir /opt/data --mode memory
# 两方 make_share 测试(文件模式)
python test/yacl/make_share_demo.py --rank 0 --work_dir /opt/data --mode file
python test/yacl/make_share_demo.py --rank 1 --work_dir /opt/data --mode file
# 两方 reveal_share 测试
python test/yacl/reveal_share_demo.py --rank 0 --work_dir /opt/data --mode memory
python test/yacl/reveal_share_demo.py --rank 1 --work_dir /opt/data --mode memory
# 两方 reveal_share 测试(文件模式)
python test/yacl/reveal_share_demo.py --rank 0 --work_dir /opt/data --mode file
python test/yacl/reveal_share_demo.py --rank 1 --work_dir /opt/data --mode file
# 两方 MPC 算术类算子测试
python test/yacl/arith_demo.py --rank 0 --work_dir /opt/data --operate_type MUL --mode memory
python test/yacl/arith_demo.py --rank 1 --work_dir /opt/data --operate_type MUL --mode memory
# 两方 MPC 算术类算子测试(文件模式)
python test/yacl/arith_demo.py --rank 0 --work_dir /opt/data --operate_type MUL --mode file
python test/yacl/arith_demo.py --rank 1 --work_dir /opt/data --operate_type MUL --mode file
# 两方 PSI 测试
python test/yacl/psi_demo.py --rank 0 --work_dir /opt/data --mode memory
python test/yacl/psi_demo.py --rank 1 --work_dir /opt/data --mode memory
# 两方 UB PSI 测试
python test/yacl/psi_ub_demo.py --rank 0 --work_dir /opt/data --mode file
python test/yacl/psi_ub_demo.py --rank 1 --work_dir /opt/data --mode file
# PIR 测试
python test/yacl/pir_demo.py --rank 0 --work_dir /opt/data --mode memory
python test/yacl/pir_demo.py --rank 1 --work_dir /opt/data --mode memory
# PIR 测试(文件模式)
python test/yacl/pir_demo.py --rank 0 --work_dir /opt/data --mode file
python test/yacl/pir_demo.py --rank 1 --work_dir /opt/data --mode file
# 算术类算子组合调用测试(先加法,再最大值)
python test/yacl/arith_combination_demo.py --rank 0 --work_dir /opt/data --mode memory --operate_type_1st ADD --operate_type_2nd MAX
python test/yacl/arith_combination_demo.py --rank 1 --work_dir /opt/data --mode memory --operate_type_1st ADD --operate_type_2nd MAX
# 算术类算子组合调用测试(先加法,再最大值)(文件模式)
python test/yacl/arith_combination_demo.py --rank 0 --work_dir /opt/data --mode file --operate_type_1st ADD --operate_type_2nd MAX
python test/yacl/arith_combination_demo.py --rank 1 --work_dir /opt/data --mode file --operate_type_1st ADD --operate_type_2nd MAX
# 算术类算子组合调用测试(先乘法,再求和)
python test/yacl/arith_combination_demo.py --rank 0 --work_dir /opt/data --mode memory --operate_type_1st MUL --operate_type_2nd SUM
python test/yacl/arith_combination_demo.py --rank 1 --work_dir /opt/data --mode memory --operate_type_1st MUL --operate_type_2nd SUM
# 算术类算子组合调用测试(先乘法,再求和)(文件模式)
python test/yacl/arith_combination_demo.py --rank 0 --work_dir /opt/data --mode file --operate_type_1st MUL --operate_type_2nd SUM
python test/yacl/arith_combination_demo.py --rank 1 --work_dir /opt/data --mode file --operate_type_1st MUL --operate_type_2nd SUM
# 算术类算子组合调用测试(先乘法,再小于)
python test/yacl/arith_combination_demo.py --rank 0 --work_dir /opt/data --mode memory --operate_type_1st MUL --operate_type_2nd LESS
python test/yacl/arith_combination_demo.py --rank 1 --work_dir /opt/data --mode memory --operate_type_1st MUL --operate_type_2nd LESS
# 算术类算子组合调用测试(先乘法,再小于)(文件模式)
python test/yacl/arith_combination_demo.py --rank 0 --work_dir /opt/data --mode file --operate_type_1st MUL --operate_type_2nd LESS
python test/yacl/arith_combination_demo.py --rank 1 --work_dir /opt/data --mode file --operate_type_1st MUL --operate_type_2nd LESS
# 算术类算子组合调用测试(先乘法,再小于等于)
python test/yacl/arith_combination_demo.py --rank 0 --work_dir /opt/data --mode memory --operate_type_1st MUL --operate_type_2nd LESS_EQUAL
python test/yacl/arith_combination_demo.py --rank 1 --work_dir /opt/data --mode memory --operate_type_1st MUL --operate_type_2nd LESS_EQUAL
# 算术类算子组合调用测试(先乘法,再小于等于)(文件模式)
python test/yacl/arith_combination_demo.py --rank 0 --work_dir /opt/data --mode file --operate_type_1st MUL --operate_type_2nd LESS_EQUAL
python test/yacl/arith_combination_demo.py --rank 1 --work_dir /opt/data --mode file --operate_type_1st MUL --operate_type_2nd LESS_EQUAL
# 算术类算子组合调用测试(先乘法,再大于)
python test/yacl/arith_combination_demo.py --rank 0 --work_dir /opt/data --mode memory --operate_type_1st MUL --operate_type_2nd GREATER
python test/yacl/arith_combination_demo.py --rank 1 --work_dir /opt/data --mode memory --operate_type_1st MUL --operate_type_2nd GREATER
# 算术类算子组合调用测试(先乘法,再大于)(文件模式)
python test/yacl/arith_combination_demo.py --rank 0 --work_dir /opt/data --mode file --operate_type_1st MUL --operate_type_2nd GREATER
python test/yacl/arith_combination_demo.py --rank 1 --work_dir /opt/data --mode file --operate_type_1st MUL --operate_type_2nd GREATER
# 算术类算子组合调用测试(先乘法,再大于等于)
python test/yacl/arith_combination_demo.py --rank 0 --work_dir /opt/data --mode memory --operate_type_1st MUL --operate_type_2nd GREATER_EQUAL
python test/yacl/arith_combination_demo.py --rank 1 --work_dir /opt/data --mode memory --operate_type_1st MUL --operate_type_2nd GREATER_EQUAL
# 算术类算子组合调用测试(先乘法,再大于等于)(文件模式)
python test/yacl/arith_combination_demo.py --rank 0 --work_dir /opt/data --mode file --operate_type_1st MUL --operate_type_2nd GREATER_EQUAL
python test/yacl/arith_combination_demo.py --rank 1 --work_dir /opt/data --mode file --operate_type_1st MUL --operate_type_2nd GREATER_EQUAL
# 算术类算子组合调用测试(先乘法,再等于)
python test/yacl/arith_combination_demo.py --rank 0 --work_dir /opt/data --mode memory --operate_type_1st MUL --operate_type_2nd EQUAL
python test/yacl/arith_combination_demo.py --rank 1 --work_dir /opt/data --mode memory --operate_type_1st MUL --operate_type_2nd EQUAL
# 算术类算子组合调用测试(先乘法,再等于)(文件模式)
python test/yacl/arith_combination_demo.py --rank 0 --work_dir /opt/data --mode file --operate_type_1st MUL --operate_type_2nd EQUAL
python test/yacl/arith_combination_demo.py --rank 1 --work_dir /opt/data --mode file --operate_type_1st MUL --operate_type_2nd EQUAL
# 算术类算子组合调用测试(先乘法,再不等于)
python test/yacl/arith_combination_demo.py --rank 0 --work_dir /opt/data --mode memory --operate_type_1st MUL --operate_type_2nd NO_EQUAL
python test/yacl/arith_combination_demo.py --rank 1 --work_dir /opt/data --mode memory --operate_type_1st MUL --operate_type_2nd NO_EQUAL
# 算术类算子组合调用测试(先乘法,再等于)(文件模式)
python test/yacl/arith_combination_demo.py --rank 0 --work_dir /opt/data --mode file --operate_type_1st MUL --operate_type_2nd NO_EQUAL
python test/yacl/arith_combination_demo.py --rank 1 --work_dir /opt/data --mode file --operate_type_1st MUL --operate_type_2nd NO_EQUAL
三方测试需要新增
--n_part参数,然后分别在三个cvm内运行上面命令,PIR 和 UB PSI 暂不不支持三方 国密算法测试需要新增--use_sm_alg参数,然后分别在各个cvm内运行上面命令