TFHE-rs v0.7 版本发布,引入了密文压缩和多 GPU 支持等重要特性。密文压缩可将密文大小最多减少 1900 倍,而多 GPU 支持能够显著提升同态计算的性能,文章还介绍了新版本中参数集合的更新、新的向量和数组运算、优化的零知识证明以及优化的 GPU 密钥切换等额外功能。
TFHE-rs v0.7 现在支持压缩对同态计算结果进行加密的密文。这项新功能在提供的参数下,可将密文大小最多减少 1,900 倍! 此外,TFHE-rs v0.7 允许用户利用广泛部署在服务器上的多 GPU 架构,从而大幅提高计算性能。 与往常一样,此版本引入了大量新功能和改进,如下详述!
FHE 实现的挑战之一是密文的大小。 默认情况下,明文的 1 位与其加密等效值之间的比率约为 8,200,这意味着密文中需要 8,200 位数据才能表示明文中的 1 位数据。 自 v0.2 以来,TFHE-rs 一直支持输入压缩; 但是,直到现在才有可能减小密文的后计算大小。 从 v0.7 此版本开始,现在可以在程序的任何时候压缩密文。
目前,后计算压缩仅适用于少数参数集,如下面的代码片段所示。 具有这些参数的压缩密文列表最多可以有 256 个槽,每个槽能够包含 2 位的加密数据。 例如,8 个 FheUint64 值可以最佳地存储在一个列表中。 表 1 提供了密文大小和压缩比的摘要。
表 1:压缩密文的大小与明文位数的函数关系。
以下示例演示了如何使用 TFHE-rs 和新引入的 CompressedCiphertextList 压缩密文。 它是异构的,因此允许将任何类型的密文存储在一起,例如 FheUint32、FheUint16、FheBool 等。如果输入位数超过最大阈值,则列表会自动拆分为多个列表。
use tfhe::prelude::*;
use tfhe::shortint::parameters::{COMP_PARAM_MESSAGE_2_CARRY_2, PARAM_MESSAGE_2_CARRY_2};
use tfhe::{
set_server_key, CompressedCiphertextListBuilder, FheBool, FheInt64, FheUint2, FheUint32,
};
fn main() {
let config = tfhe::ConfigBuilder::with_custom_parameters(PARAM_MESSAGE_2_CARRY_2, None)
.enable_compression(COMP_PARAM_MESSAGE_2_CARRY_2)
.build();
let ck = tfhe::ClientKey::generate(config);
let sk = tfhe::ServerKey::new(&ck);
set_server_key(sk);
let ct1 = FheUint32::encrypt(17_u32, &ck);
let ct2 = FheInt64::encrypt(-1i64, &ck);
let ct3 = FheBool::encrypt(false, &ck);
let ct4 = FheUint2::encrypt(3u8, &ck);
let serialized_ct1 = bincode::serialize(&ct1).unwrap();
let serialized_ct2 = bincode::serialize(&ct2).unwrap();
let serialized_ct3 = bincode::serialize(&ct3).unwrap();
let serialized_ct4 = bincode::serialize(&ct4).unwrap();
let uncompressed_serialized_size =
serialized_ct1.len() + serialized_ct2.len() + serialized_ct3.len() + serialized_ct4.len();
println!(
"Uncompressed serialized size: {} bytes",
uncompressed_serialized_size
);
let compressed_list = CompressedCiphertextListBuilder::new()
.push(ct1)
.push(ct2)
.push(ct3)
.push(ct4)
.build()
.unwrap();
let serialized = bincode::serialize(&compressed_list).unwrap();
let compressed_serialized_size = serialized.len();
println!(
"Compressed serialized size: {} bytes",
compressed_serialized_size
);
println!(
"Compression ratio for 105 bits {}",
uncompressed_serialized_size as f64 / compressed_serialized_size as f64
);
}
TFHE-rs v0.7 首次实现了使用多个 GPU 进行同态计算,标志着性能的显著提升。无需更改代码即可在多个 GPU 上执行。为了尽可能保持 API 的用户友好性,配置是自动设置的; 用户无法对 GPU 的选择进行细粒度控制。
但是,存在某些限制:只有通过 NVLink 对 GPU 0 具有对等访问权限的 GPU 才用于计算。 根据平台的不同,这可能会限制 TFHE-rs 可以有效利用的 GPU 数量。
多 GPU 支持以及此版本中引入的一些优化,为整数运算带来了前所未有的性能。
图 1:64 位加法、乘法和除法的耗时,其中两个输入已加密,在 CPU(来自 AWS 的 hpc7a.96xlarge)与一个和两个 H100 GPU 上运行。 这些参数对应于两位消息和两位进位,使用分组因子等于 3 的多位 PBS。
每个操作的最佳 GPU 数量因操作本身和用户指定的整数精度而异。 在文档中提供了所有指定精度下单 GPU 和多 GPU 的综合基准测试结果数组。
TFHE-rs v0.7 还包括一些其他新功能和性能改进:
TFHE-rs 的下一个版本将侧重于增强多 GPU 性能,同时扩展可用操作集。
- 原文链接: zama.ai/post/tfhe-rs-v0-...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!