目录
1. PPML(Privacy-Preserving Machine Learning)in SPU
1. PPML(Privacy-Preserving Machine Learning)in SPU
- SPU的概念请参考 [隐私计算学习笔记]8。
- ML和MPC技术栈对比:
2. 浮点数和定点数
2.1 浮点数表示
以FP32为例:
- S:符号位,0表示正数,1表示负数
- E:biased指数,8位,以2为底
- f:尾数,23位,决定精度
以IEEE 754标准定义的:
- 规格数:
,
- 非规格数:
,
(注:对每个给定的E,都有个数,对不同的E,两个数间距不同)
- 特殊值:
2.2 定点数表示
以 8bit 环,定点bit数 fxp=4 为例:
两个数之间的间距恒定为。
2.3 浮点数和定点数比较
浮点数 | 定点数 |
0点处密集分布 | 均匀分布 |
![]() | ![]() |
取值范围较大( | 取值范围较小 |
计算相对复杂(高次多项式、Lookup Table) | 计算简单(整数运算、低次多项式) |
计算精度高,所有算子有严格的误差证明(<3bit) | 计算精度低,乘法依赖truncation,数学函数通常使用近似解(不同算子误差范围不同) |
3.明文算法迁移流程
- Step1: 将算法用jax的api重新实现,如Jax.numpy替换numpy、Jax.scipy替换scipy;
- Step2:测试密态下的数据精度(模拟在定点数上运行的所有操作、可以提供真实的数值计算精度环境,运行速度更快)
- Step3:测试密态下的实际性能(在真实的MPC协议上通过多进程/Docker进行仿真、提供算法有效的性能结果)
4.常见问题
Q1:如何知道SPU支持的算子类型?
A1:
- 通过Simulation/emulation查询
- 参考文档查询:
https://www.secretflow.org.cn/docs/spu/latest/en-US/reference/np_op_status
https://secretflow.org.cn/zh-CN/docs/spu/main/reference/xla_status
Q2:如何知道非线性算子大致的误差范围?
A2:误差来源于:1.系统设定误差(如环大小、fxp大小、truncation协议等)2.非线性算子拟合误差。故较难给出浮点数的误差估计,参考相关数学算子的大致误差:
https://www.secretflow.org.cn/zh-CN/docs/spu/main/development/fxp
Q3:为什么明文下正常运行,密态下出现运行错误?
A3:
- 若运行报错: 1. 实现的算法是否jitable(即使用@jax.jit是否能运行) 2. 是否使用了SPU不支持的算子
- 若能运行,但误差极大,可以自查是否有以下情况: 1. 是否可能发生溢出:输入数据或参数是否太大或太小 ;2. SPU内部是否使用了浮点随机数生成器 ;3. 是否调用了线形代数算子(如矩阵分解,奇异值分解等)
- 若误差适中:可以考虑增大环的大小,提高fxp精度
Q4:为什么Emulation的速度比simulation快很多?
A4:数据没有seal(即load到PYU),SPU将其视为Public数据,所有计算在明文下进行。