TFHE-rs v1.3 版本在 CPU、GPU 和 HPU 后端带来了多项重大改进和新功能,主要包括:GPU 性能提升(整数对数运算速度提升 4 倍,其他操作速度提升高达 20%)、GPU 内存跟踪、CPU 除法加速(速度提升 36%)、零知识证明 v2、密钥升级器等,这些改进提高了全同态加密 (FHE) 工作负载的性能、可用性和安全性。
—
Jean-Baptiste Orfila, Arthur Meyre, Agnes Leroy
TFHE-rs v1.3 带来了 CPU、GPU 和 HPU 后端的几项重大改进和新功能,从而增强了全同态加密 (FHE) 工作负载的性能、可用性和安全性。
内存跟踪
GPU 内存用于存储输入和输出密文、服务器密钥以及 FHE 操作期间所需的临时缓冲区。这些缓冲区的大小取决于操作,例如,64 位加法需要的内存相对较少,而 128 位乘法则消耗的内存多得多。
在 v1.3 之前,当使用 TFHE-rs 的高级 API 时,开发人员无法在执行操作之前知道该操作需要多少 GPU 内存。这使得在不冒内存不足的风险的情况下调度大型计算或并行工作负载非常具有挑战性。
TFHE-rs v1.3 引入了实用函数,这些函数返回每个操作所需的 GPU 内存量,并允许用户检查 GPU 是否有足够的可用内存来执行它。
这是一个最小的示例,展示了如何跟踪 GPU 内存使用情况:
use rand::Rng;
use tfhe::prelude::*;
use tfhe::{
set_server_key, ClientKey, CompressedServerKey, ConfigBuilder,
FheInt32, GpuIndex,
};
fn main() {
let config = ConfigBuilder::default();
let client_key = ClientKey::generate(config);
let csks = CompressedServerKey::new(&client_key);
let server_key = csks.decompress_to_gpu();
set_server_key(server_key);
let mut rng = rand::thread_rng();
let clear_a = rng.gen_range(1..=i32::MAX);
let clear_b = rng.gen_range(1..=i32::MAX);
let mut a = FheInt32::try_encrypt(clear_a, &client_key).unwrap();
let mut b = FheInt32::try_encrypt(clear_b, &client_key).unwrap();
// 确定 a 和 b 将使用多少内存
let ciphertexts_size = a.get_size_on_gpu() + b.get_size_on_gpu();
// 检查 GPU 内存中是否有足够的空间来存储 a 和 b
check_valid_cuda_malloc_assert_oom(ciphertexts_size, GpuIndex::new(0));
// 将 a 和 b 移动到 GPU 内存
a.move_to_current_device();
b.move_to_current_device();
// 确定将使用多少 GPU 内存来添加 a 和 b
let add_size = a.get_add_size_on_gpu(&b);
// 检查 GPU 是否有足够的内存来执行加法
check_valid_cuda_malloc_assert_oom(add_size, GpuIndex::new(0));
// 执行加法
a += &b;
}
在此示例中,你首先计算存储密文所需的 GPU 内存:
// 确定 a 和 b 将使用多少内存
let ciphertexts_size = a.get_size_on_gpu() + b.get_size_on_gpu();
然后,你计算加法本身所需的内存:
// 确定将使用多少 GPU 内存来添加 a 和 b
let add_size = a.get_add_size_on_gpu(&b);
最后,你检查 GPU 是否有足够的可用内存来安全地执行加法:
// 检查 GPU 是否有足够的内存来进行加法
check_valid_cuda_malloc_assert_oom(add_size, GpuIndex::new(0));
这些新的实用函数有助于避免执行期间出现内存不足错误。
性能提升
TFHE-rs v1.3 带来了显着的 GPU 性能改进,特别是:
由于 TFHE-rs 是 Zama Confidential Blockchain Protocol 的底层库,为了说明实际性能,请考虑需要执行以下操作序列的 ERC20 转账:
fn erc20_transfer(
from_amount: &FheUint64,
to_amount: &FheUint64,
amount: &FheUint64,
) -> (FheUint64, FheUint64)
let (new_from, did_not_have_enough) = (from_amount).overflowing_sub(amount);
let did_not_have_enough = &did_not_have_enough;
let had_enough_funds = !did_not_have_enough;
let (new_from_amount, new_to_amount) = rayon::join(
|| did_not_have_enough.if_then_else(from_amount, &new_from),
|| to_amount + (amount * FheType::cast_from(had_enough_funds)),
);
(new_from_amount, new_to_amount)
}
在 8xH100 GPU 上,此 ERC20 转账的延迟和吞吐量如下所示:
TFHE-rs 保证 FHE 操作的失败概率低于 2 -128,从而确保生产场景中的计算正确性和安全性。
新功能
从 TFHE-rs v1.3 开始,用户可以在 ProvenCompactCiphertextList 及其非证明对应物上调用函数 expand_and_verify。在此工作流程中,零知识证明验证在 CPU 上执行,而扩展(此类型密文上 FHE 计算所必需的预处理步骤)在 GPU 上运行。
此外,阈值解密协议中使用的噪声抑制现在可以在 GPU 上执行,以获得更好的性能。
TFHE-rs v1.3 带来了 CPU 端性能和加密功能的几项改进。
除法算法得到了改进,当使用 FheUint64 输入时,运行时从 8.6 秒减少到 5.5 秒。零知识证明也看到了重要的增强。ZK v2 中的一种新的哈希方案以少量增加证明生成时间为代价,使验证过程加快了 34-38%,从而显着提高了证明效率。
在 MPC 设置中,TFHE-rs 1.1.0 中首次引入的噪声抑制原语可以实现噪声泛洪,以防止泄漏。但是,这些操作可能会产生大型密文。为了解决这个问题,v1.3 添加了压缩原语,可以减少噪声抑制密文的大小,从而提高存储和传输效率。有关更多详细信息,请参阅文档。
为了简化使用不断发展的加密参数,此版本引入了一种密钥升级器机制。它允许使用旧密钥或参数集加密的密文更新为较新的配置。此过程要求正确标记密钥和密文,以便可以使用提供的升级密钥识别和应用升级路径。
此外,TFHE-rs v1.3 为二进制密钥分配引入了一种新的模数切换技术变体。与以前的方法不同,此变体允许在不使用额外密钥材料的情况下实现相同的 2-128 失败概率。
最后,TFHE-rs v1.3 现在支持具有较小密钥切换模数的参数集,当密钥切换正确性不需要大模数(如 264)时,这可以提高性能。
TFHE-rs v1.3 扩展了 HPU 后端:
HPU 的默认加密参数现在与 CPU 和 GPU 对齐,以最小的性能影响实现 <2 -128 的误差概率。
- 原文链接: zama.ai/post/tfhe-rs-v1-...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!