全同态加密与混淆电路在隐私保护AI推理中的性能对比与实践指南
1. 项目概述:当隐私成为AI推理的硬通货
在医疗诊断、金融风控这些领域,数据就是命脉。想象一下,一家医院想用某科技公司先进的AI模型来分析患者的敏感医疗影像,但双方都有顾虑:医院绝不能泄露患者数据,科技公司也绝不想暴露自己辛苦训练的模型参数。这就是隐私保护机器学习(PPML)要解决的核心矛盾——如何在“数据不出域,模型不公开”的前提下,完成可靠的机器学习推理。
其背后的技术基石,主要来自密码学中的安全多方计算(MPC)。简单来说,MPC就像让两个互不信任的盲人,共同摸清一头大象的形状,但各自只知道自己摸到的那部分,最终却能拼凑出完整的真相,而无需向对方透露自己摸到的具体细节。在PPML的工程落地中,全同态加密(FHE)和混淆电路(GC)是两种最具代表性的实现路径,它们用截然不同的方式诠释了“盲人摸象”的艺术。
FHE的思路很“暴力美学”:客户端把数据用一把复杂的数学锁(公钥)加密后,直接扔给服务器。服务器拿着这个密文“盲盒”,在完全看不懂里面是什么的情况下,按照预设的规则(模型计算)一顿操作,生成另一个密文“盲盒”返回。客户端再用自己的私钥打开,得到结果。整个过程,服务器从头到尾没见过明文数据,也碰不到模型参数(如果模型也被加密了),实现了真正的非交互、端到端加密计算。
GC则更像一场精心设计的“密室逃脱”游戏。服务器(混淆方)把整个计算过程(比如一个神经网络的前向传播)编译成一个巨大的、由逻辑门(与门、或门、非门等)组成的布尔电路。然后,它为电路里每一根电线都准备两把不同的“钥匙”(标签),分别对应信号0和1,但只有服务器知道哪把钥匙对应哪个值。接着,服务器把整个电路的门用真值表加密(混淆)后发给客户端(评估方)。客户端通过一种叫“不经意传输”的协议,安全地拿到自己输入数据对应的那些“钥匙”,却不知道另一把钥匙是什么。拿着这些钥匙,客户端可以在加密的电路里一路通关,得到输出结果的“钥匙”,最后再找服务器兑换成明文结果。服务器自始至终不知道客户端的输入,客户端也看不到电路的内部逻辑(即模型结构),但电路的拓扑(有几层、每层大概多大)可能会被窥见。
这两种方案听起来都很美好,但在真实的服务器上跑起来,性能天差地别。FHE的数学运算极其沉重,动辄需要GB级别的内存和数十秒的计算时间;GC虽然计算快、内存省,但需要来回通信好几轮,传输的数据量也可能很大。到底选哪个?不能光看论文,得拉出来溜溜。这就是我们这次系统级对比实验的初衷:用同一个简单的两层神经网络,分别在FHE(基于微软SEAL库的CKKS方案)和GC(基于Intel Labs的TinyGarble2.0框架)上实现,在相同的半诚实敌手模型下,硬碰硬地比一比往返时间、内存峰值、通信开销和输出精度。我们的目标很直接:给正在为实际项目做技术选型的工程师和架构师,提供一份来自一线的、带有具体数据和避坑指南的参考手册。
2. 实验设计与核心思路拆解
2.1 威胁模型与对比基准的设立
任何安全方案讨论的前提都是明确敌手模型。我们采用密码学中经典的“半诚实”模型,也叫“诚实但好奇”模型。这意味着参与双方(服务器和客户端)都会老老实实地执行协议规定的每一步计算,不会恶意发送错误信息或中途退出。但是,他们会保留所有通信记录和中间计算结果,并试图从中分析出对方的隐私信息。这个模型非常贴合很多商业合作场景——大家有合作的基础,但出于商业竞争或合规要求,又希望最大限度地保护自己的核心资产。在这个模型下,FHE能提供输入和模型的完全保密,而GC能保护输入和模型参数,但可能会泄露模型的“骨架”(即电路结构)。
为了公平对比,我们固定了一个最简单的两层全连接神经网络作为评测对象:y = Sigmoid( W2 * ReLU( W1*x + b1 ) + b2 )。输入x是一个3维向量,第一层有4个神经元,第二层输出1个标量。选择这个简单模型是为了剥离模型复杂度的影响,聚焦于两种密码学原语本身的开销特性。同时,我们设置了一个明文推理的基线(PLAIN),即在没有任何隐私保护措施下,用浮点数直接计算该网络。所有性能数据(速度、内存)都将以这个基线为参照,计算“慢了多少倍”或“多了多少开销”,这样比绝对数值更有参考价值。
2.2 非线性的妥协:多项式逼近的必然选择
无论是FHE还是GC,面对神经网络中的非线性激活函数(如ReLU, Sigmoid)都是一个巨大挑战。FHE目前主流方案(如CKKS)直接支持的是加法和乘法,无法高效处理比较、分段等非线性操作。GC虽然理论上可以精确实现任何布尔电路,但用基本逻辑门去搭建一个浮点数Sigmoid函数,电路规模会爆炸式增长,完全不现实。
因此,工程上通用的做法是“近似”。我们不得不对激活函数进行低阶多项式逼近,用乘法和加法来模拟非线性。这是一个关键的权衡点:逼近精度越高,所需多项式次数越高,在FHE中意味着更深的乘法深度和更大的噪声,在GC中意味着更复杂的电路和更多的通信。
- ReLU的替代:我们选择了平方函数
f(x) = x²。虽然它失去了ReLU的“单边抑制”特性,但它简单、连续,且能保持非负性,在多项式空间中是对“非线性”一种可接受的模拟。 - Sigmoid的逼近:我们采用了一个二次多项式:
σ(x) ≈ 0.5 + 0.197*x - 0.004*x²。这个逼近在零点附近能较好地拟合Sigmoid的S形曲线,计算开销小。
实操心得:逼近函数的选择是精度与效率的博弈。在项目初期,我们尝试过更高阶的逼近(如3次、4次多项式)。在FHE中,这直接导致所需的模数链长度(乘法深度)增加,需要更大的多项式模数,内存消耗和计算时间呈指数增长。在GC中,电路规模也线性增长。最终我们回归到这个二次逼近,因为它能在可接受的误差范围内(后续会看到),将计算复杂度控制在实验硬件可承受的范围内。一个重要的教训是:在隐私计算中,模型设计的第一步可能就需要重新审视和修改激活函数,传统的ReLU、GELU可能要让位于更“密码学友好”的替代品。
2.3 技术栈选型:为什么是SEAL和TinyGarble2.0?
市面上FHE和GC的库不少,我们的选择基于成熟度、社区活跃度和与实验目标的匹配度。
- FHE方案:Microsoft SEAL (CKKS)。SEAL是微软研究院维护的FHE库,工业级应用广泛,文档相对完善。选择CKKS方案而非BFV或BGV,是因为CKKS直接支持近似算术,可以对实数进行加密计算,这天然适合机器学习中大量的浮点运算。虽然会引入微小的计算误差,但比起用BFV模拟浮点数所带来的巨大开销,这是更务实的选择。
- GC方案:TinyGarble2.0。由Intel Labs开源,它最大的特点是支持顺序电路的混淆与评估。传统的Yao‘s GC协议针对的是组合电路(无状态),而神经网络推理本质上是顺序执行的(一层接一层)。TinyGarble2.0允许我们将每一层电路单独混淆和评估,中间结果以加密状态传递,这大大降低了单次需要处理���内存峰值,也更贴合实际编程模型。相比之下,一些框架如ABY虽然功能强大,但更偏向于混合协议,不够“纯粹”地体现GC本身的特性。
注意事项:环境搭建的坑。SEAL和TinyGarble2.0的依赖管理略有棘手。SEAL需要较新版本的CMake和特定的多精度数学库(如NTL或FLINT)支持。TinyGarble2.0依赖EMP-Toolkit,而后者又依赖Boost和OpenSSL。我们的经验是,严格按照官方GitHub仓库的README,在干净的Ubuntu系统上从源码编译,并注意版本匹配。特别是OpenSSL,系统自带的版本可能不兼容,建议使用相同的版本(如我们用的3.0.13)从头编译安装。一个小技巧:将所有依赖的安装路径统一指向一个自定义目录(如/opt/ppml_deps),然后在编译主项目时用-DCMAKE_PREFIX_PATH指定,可以极大减少环境冲突。
3. 核心细节解析与实操要点
3.1 FHE实现:参数配置是门艺术
用CKKS方案实现神经网络,90%的难点和决定性能的关键都在于参数配置。这不像调深度学习超参那样有自动优化器,每一步都需要手动计算和权衡。
核心参数三件套:
多项式模数次数 (poly_modulus_degree):通常取2的幂,如8192, 16384, 32768。它决定了:
- 安全等级:次数越高,基于RLWE问题的加密方案越安全。
- 槽位数:CKKS可以将多个数据“打包”进一个密文进行SIMD操作,槽位数 =
poly_modulus_degree / 2。我们实验用了16384,即8192个槽位。 - 计算容量:支持的最大乘法深度。深度越深,能做的连续乘法操作越多。 选择16384是一个折中,它在128位安全强度下,能提供约438比特的总模数预算(见表II),足够我们这个小网络,又不至于让密文尺寸过大。
系数模数链 (coeff_modulus):这是一系列质数的集合,如
[60, 40, 40, 40, 30, 30](单位:比特)。每个质数对应一个“模数层”。每次密文乘法后,噪声会增长,尺度(scale)会变大。重缩放 (Rescale)操作会除掉一个质数(即去掉一层模数),并相应减小尺度,以控制噪声。模数链的长度直接决定了你最多能进行多少次连续的乘法(即乘法深度)。我们的链有6个质数,理论深度是5(因为最后一次乘法后不需要再重缩放了)。初始尺度 (scale):CKKS编码浮点数时,会先乘以一个很大的数(尺度)转为整数,加密计算后再解密除以这个尺度。初始尺度(如2^30)影响计算精度。尺度太大会过早占满模数空间,导致溢出;太小会损失精度。需要在噪声增长和精度间平衡。
实操中的关键步骤:
- 客户端(Bob):
- 生成密钥:私钥、公钥、重线性化密钥(用于乘法后密文尺寸膨胀的压缩)、伽罗瓦密钥(用于密文槽的旋转,这是实现矩阵乘法的关键)。
- 编码与加密:将3维输入向量
x编码到密文的头3个槽中,其余槽位填0,然后加密。 - 发送:将密文、公钥、重线性化密钥、伽罗瓦密钥发送给服务器。私钥绝不能发送!
- 服务器(Alice):
- 将模型参数(权重W1, W2,偏置b1, b2)编码为明文多项式。注意,在CKKS中,你可以直接对密文和明文进行运算,这比密文-密文运算快得多。
- 实现矩阵向量乘:这是最精巧的部分。由于密文槽的旋转特性,我们可以通过“旋转-求和”的技巧来实现矩阵乘。对于权重矩阵的每一行,将其编码为明文,与输入密文做逐槽乘法,然后通过一系列旋转操作,将分散在各个槽中的乘积结果累加到第一个槽中,形成内积结果。这个过程完全在密态下进行。
- 逐层计算:完成第一层线性计算后,对结果密文做平方(近似ReLU)。然后进行第二层计算,最后应用Sigmoid的二次多项式逼近。
- 返回加密结果给客户端。
重要提示:CKKS的“近似”特性。所有操作都有噪声,每次乘法都会放大噪声并消耗模数链。设计计算图时,必须精确计算所需的乘法深度,确保模数链足够长。我们的网络经过精心安排,深度刚好为5,用尽了模数链。如果网络再深一层,就必须使用“自举”操作来刷新噪声和模数链,而自举在SEAL中是非常耗时的,目前实用性较低。
3.2 GC实现:从算术电路到布尔电路
GC的实现流程更像传统的编译和分布式计算。
第一步:电路编译(服务器端)
- 定点数转换:GC处理的是布尔值(0/1)。因此,所有浮点数权重和输入,都需要先转换为定点数。我们选择了10比特精度(即乘以1024后取整)。这一步会引入量化误差,是最终输出误差的来源之一。
- 生成网表:将整个神经网络的计算过程,包括定点数乘法、加法、比较(用于ReLU)和多项式计算,编译成一个由逻辑门(AND, XOR等)连接而成的网表文件。TinyGarble2.0支持用类似硬件描述语言的方式定义电路,然后编译。
- 混淆:服务器为网表中的每一根电线生成两个随机标签(例如,两个128位的字符串),分别代表逻辑0和1。然后,对于每一个逻辑门(如AND门),根据其真值表,用输入线的标签作为密钥,去加密输出线的标签,生成一个混淆表。例如,一个AND门的混淆表包含4个条目,每个条目是
Encrypt(Label_A, Label_B; Label_Output)。混淆完成后,电路的具体逻辑就被隐藏在了这些加密的表中。
第二步:不经意传输与评估(交互过程)
- 标签传输:客户端拥有自己的输入(例如,3个定点数,每个数由多个比特表示)。它需要获得每个输入比特所对应的那个标签(而不知道另一个标签)。这通过不经意传输协议完成:客户端向服务器请求“我输入比特是b,请给我对应的标签”,服务器发送两个标签,但通过OT协议,客户端只能解密出对应b的那个,服务器则不知道客户端要了哪个。
- 发送混淆电路:服务器将混淆表、电路元数据(网表结构)发送给客户端。
- 电路评估:客户端拿到所有输入比特的标签后,开始“解密”电路。对于第一个逻辑门,它用手中的两个输入标签去尝试解密混淆表中的四个条目。由于加密的设计,有且仅有一个条目能被正确解密,解出的就是该门输出线的标签。如此逐门评估,如同拿着钥匙开一连串的锁,最终得到输出线的标签。
- 输出揭示:客户端将输出标签发回给服务器。服务器根据自己生成的标签映射关系,将其翻译成明文输出(0或1的比特序列),再组合成定点数返回给客户端。
实操心得:通信是GC的主要瓶颈之一。在我们的实现中,虽然计算很快,但服务器需要向客户端发送整个混淆电路(包括所有混淆表),对于这个小网络就达到了3.5 MiB。而OT过程虽然通信量小(268 KiB),但需要多轮交互(我们用了6轮OT,每轮2次交互)。在真实的网络环境中,尤其是跨地域或高延迟网络(如移动网络),这多轮的往返时间可能成为主要延迟来源,而不是计算本身。因此,评估GC方案时,必须将网络延迟纳入性能模型。
4. 性能对比实验与结果分析
所有实验在统一的Proxmox虚拟机(Ubuntu 24.04, 8 vCPU, 32GB RAM)上运行,客户端和服务器进程位于同一台机器以消除网络延迟影响,专注于计算和通信开销本身。
4.1 往返时间:速度的��沟
往返时间(RTT)是从客户端发起请求到拿到最终结果所经历的全部时间,包括密钥/标签生成、加密/OT、计算、解密/解码。
| 模式 | 平均RTT (秒) | 相对于明文基线慢的倍数 | 主要耗时环节 |
|---|---|---|---|
| 明文 (PLAIN) | 0.00024 | 1x | 纯浮点计算 |
| 混淆电路 (GC) | 0.039 | 161x | 对称加密操作(AES)、电路评估 |
| 全同态加密 (FHE) | 5.077 | 20,912x | 大数多项式运算(NTT)、重缩放 |
结果非常直观。GC的延迟增加了两个数量级,但仍在几十毫秒级别,对于很多非实时交互场景是可接受的。而FHE的延迟增加了四个数量级,达到秒级。这个差距主要源于计算密度的不同:GC的核心是AES等对称加密操作,现代CPU有专用指令(AES-NI)加速,极快;而FHE的密文是一个高次多项式,每一次乘法都是大规模的多项式卷积和模约减,计算复杂度是O(N log N)级别(N为多项式次数),极其沉重。
对工程选择的启示:如果你的应用对推理延迟要求是亚秒级或秒级(例如,离线批量处理、非实时的医疗影像分析),FHE的5秒延迟或许可以忍受。但如果要求毫秒级响应(例如,实时反欺诈、交互式应用),那么GC是唯一可行的选择,或者需要考虑将模型拆分,部分计算用GC,部分用明文或其他MPC协议。
4.2 内存消耗:资源需求的差异
我们测量了进程运行期间的最大常驻集大小(MaxRSS),即峰值内存使用量。
| 模式 | 峰值内存 (MB) | 相对于明文基线倍数 | 内存消耗主要来源 |
|---|---|---|---|
| 明文 (PLAIN) | 11.15 | 1x | 模型参数、输入输出缓冲区 |
| 混淆电路 (GC) | 11.15 | 1x | 电路网表、混淆表、标签缓存 |
| 全同态加密 (FHE) | 1053.75 (服务器) | 182x | 大尺寸密文、临时密文、密钥材料 |
GC的内存效率令人印象深刻,几乎和明文推理持平。这是因为TinyGarble2.0的顺序执行模式可以做到“评估完一个门就清理一个门”的状态,不需要同时将整个电路载入内存。
FHE则是一个“内存怪兽”。一个poly_modulus_degree=16384的CKKS密文,其大小约为2 * 16384 * sizeof(uint64_t) * num_moduli。我们的模数链有6个质数,导致单个密文就非常庞大。再加上计算过程中产生的多个临时密文,以及公钥、重线性化密钥、伽罗瓦密钥等,轻松突破GB级别。
避坑指南:部署FHE服务的内存规划。如果你计划部署基于FHE的服务,千万不要按模型参数大小来估算内存。一个几MB的模型,在FHE下可能需要上GB的内存来运行。在容器化部署时(如Kubernetes),必须为Pod申请足够的内存限制(requests/limits),否则极易引发OOM(内存溢出)崩溃。建议在压测阶段就详细分析内存增长曲线。
4.3 通信开销与交互轮次:交互模式的根本区别
| 指标 | 混淆电路 (GC) | 全同态加密 (FHE) | 说明 |
|---|---|---|---|
| 总通信量 | ~3.76 MiB | ~151.5 MiB | GC的电路传输是主要开销;FHE的密钥和密文巨大 |
| 通信轮次 | 7 轮 | 1 轮 | GC需要多轮OT和输出揭示;FHE仅需一传一回 |
| 客户端发送 | ~268 KiB | ~150 MiB (首次) | FHE客户端首次需发送公钥等;GC客户端发送量很小 |
| 服务器发送 | ~3.5 MiB | ~1 MiB (每次) | GC服务器发送整个混淆电路;FHE服务器只返回结果密文 |
这个对比揭示了两种范式的本质差异:
- GC:高带宽,多轮交互。它需要一次性传输整个“计算程序”(混淆电路),数据量随模型复杂度线性增长。但之后每轮推理,如果模型不变,这部分通信可以预计算并缓存吗?不行!由于安全考虑,每次推理必须使用全新的随机标签和重新混淆的电路,否则会泄露信息。因此,通信开销是每次推理都必需的。
- FHE:首次巨大,后续轻盈。首次连接时,客户端需要上传公钥等密钥材料(约150 MiB),这是一笔巨大的“初始化”开销。但是,这些密钥可以长期复用。在后续的每次推理中,客户端只需上传加密的输入(约1 MiB),服务器返回加密的输出(约1 MiB)。通信轮次固定为1轮。
场景化选型建议:
- 选择GC,如果:你的场景是单次或低频次的推理请求,且网络带宽充足、延迟较低(如局域网)。它的单次响应时间快。
- 选择FHE,如果:你的场景是高频次、持续不断的推理服务(如云API)。巨大的初始化通信成本可以被海量的后续请求摊薄,其非交互、单轮的特性在高并发下极具优势,客户端也无需保持在线。
4.4 输出精度:逼近带来的误差
由于使用了多项式逼近和定点数编码,安全推理的输出与明文结果存在偏差。我们测试了多组输入向量:
| 输入向量 | GC输出偏差 | FHE输出偏差 | 主要误差来源 |
|---|---|---|---|
| [1.0, 2.0, 3.0] | +2.1% | -15.7% | GC:定点量化;FHE:多项式逼近+重缩放噪声 |
| [0.6, 1.9, -2.5] | -5.8% | +58.3% | 输入值范围较大时,FHE误差显著放大 |
| [0.0, 0.0, 0.0] | 0% | +121.7% | 极端案例:FHE在零值附近因噪声占主导,相对误差极大 |
GC的误差主要来自定点数量化(我们用了10比特),相对可控,最大偏差在23%左右。FHE的误差则波动很大,来自多个方面:多项式逼近本身的误差、每层计算后重缩放引入的精度损失、以及密文噪声的累积。在输入值较小或计算路径较长时,噪声可能“淹没”真实信号,导致巨大相对误差(如零输入案例)。
工程上的应对策略:
- 模型重训练/微调:在隐私计算部署前,使用逼近后的激活函数(如平方函数、低阶多项式Sigmoid)对模型进行重新训练或微调,让模型权重适应这种计算误差,可以显著提升最终精度。
- 输入标准化:确保输入数据落在模型训练时预期的数值范围内。对于FHE,避免输入值过小,可以通过平移缩放来调整。
- 精度参数调优:在FHE中,可以适当增大初始
scale或使用更长的模数链(以牺牲性能为代价)来保留更多有效位数。 - 后处理校准:在客户端解密后,可以加入一个简单的线性校准层,根据一批测试数据拟合出误差曲线进行修正。
5. 扩展讨论与未来方向
5.1 向更复杂模型扩展的挑战
我们的实验基于一个微型网络,但现实中的模型动辄数十上百层。扩展性如何?
- FHE的深度瓶颈:FHE的乘法深度受限于模数链长度。更深层的网络需要更长的链,这意味着更大的多项式模数(更慢、更耗内存)或使用自举操作。自举目前仍是FHE的性能瓶颈,一次操作可能就需要数秒。对于深度卷积网络(如ResNet),纯FHE方案目前仍不实用,通常需要与GC或MPC结合,将非线性部分剥离出去用其他方案计算。
- GC的通信瓶颈:GC的电路大小和通信量随模型参数量和深度线性增长。一个5-10层的全连接网络,通信量可能达到10-20 MiB。对于Transformer这类巨无霸模型,纯GC方案的通信开销将是天文数字。因此,当前的研究热点是混合协议,例如,线性层用通信高效但计算较慢的FHE或秘密分享,非线性激活层用计算快但通信大的GC,以达到整体最优。
5.2 安全性的细微差别
在“半诚实”模型下,两者都提供了严格的安全性证明,但保护的内容有细微差别:
- FHE:提供了最强的保护。客户端仅获得输出,服务器对输入和模型都一无所知(如果模型也被加密)。
- GC���保护了数据和参数,但可能泄露模型结构。因为客户端在评估电路时,知道电路有多少个门、如何连接(即网表),这揭示了网络的层数、每层大小等拓扑信息。在某些场景下,这可能是不可接受的。一种增强方案是使用通用电路,将具体模型作为输入嵌入到一个通用的、固定结构的电路中,从而隐藏结构,但这会带来额外的性能开销。
5.3 实际部署的考量
从实验室到生产环境,还有很长的路要走:
- 客户端开销:FHE将大部分计算转移给了服务器,客户端主要做加密和解密,相对轻松。GC则需要客户端参与大量的电路评估计算,对客户端的计算能力有一定要求。
- 预处理与复用:FHE的密钥生成和GC的电路混淆都是耗时操作。在生产系统中,这部分工作可以作为预处理阶段离线完成。FHE的公钥和GC的混淆电路模板可以提前生成并缓存,在线推理时只需处理具体的输入数据。
- 框架与工具链成熟度:尽管SEAL和TinyGarble2.0是不错的库,但离成熟的、开箱即用的PPML推理框架还有距离。工程师需要深入密码学细节去设计计算图、管理噪声预算、处理通信协议。像CrypTen、MPCFormer这样的更高层框架正在试图抽象这些细节,但它们通常绑定特定的协议或混合方案,灵活性可能受限。
5.4 混合协议:未来的主流方向?
纯粹的FHE或GC各有明显短板。工业界和学术界越来越倾向于“混合协议”的思路,博采众长:
- 线性计算用FHE/秘密分享,非线性用GC:利用FHE或秘密分享在线性运算(矩阵乘、卷积)上通信低的优势,以及GC在非线性函数(比较、分段)上计算快的优势。
- 三服务器模型:引入一个或多个非共谋的第三方服务器,采用秘密分享技术,可以在不显著增加单点计算负担的情况下,获得更高的效率和更强的安全模型(如恶意安全)。
这次对比实验像一次精准的“解剖”,让我们看清了FHE和GC这两种强大技术的“肌肉”和“骨骼”。FHE像一位内力深厚但行动迟缓的宗师,一招一式(单轮交互)蕴含巨大力量,但消耗也大;GC则像一位敏捷的刺客,动作迅捷(计算快),但需要与同伴紧密配合(多轮交互)。没有绝对的好坏,只有是否契合场景。在数据隐私法规日益收紧的今天,理解这些工具的真实性能边界,是构建下一代可信AI应用不可或缺的一课。我的体会是,隐私保护机器学习正在从密码学家的理论论文,迅速走向工程师的实践清单。而真正落地的那一刻,往往就始于一次像这样,把两个方案放在同一台机器上,按下“运行”键的简单比较。
