TFHE-rs v0.6 版本引入了零知识证明技术,增强了 GPU 对有符号整数运算的支持,并引入了加密随机数生成等新的加密功能。该版本现在包含 Marc Joye 提出的公钥方案,并生成零知识证明以验证公钥加密过程的正确性。此外,新版本还支持 GPU 上的有符号整数运算,并改进了 GPU 用户的多位 PBS。
TFHE-rs v0.6 引入了一种补充 FHE 的密码学技术,称为零知识证明。此外,此版本还增强了对有符号整数运算的 GPU 支持。此外,它还引入了额外的密码学特性,例如加密随机数的生成。
除了标准的私钥设置外,TFHE-rs 现在还包含 Marc Joye 的工作 中描述的公钥方案。这种方法允许任何人加密密文,因此在某些情况下,证明加密已正确执行至关重要。最新版本的 TFHE-rs 能够生成零知识证明,以验证公钥加密过程是否已正确执行。换句话说,证明的创建不会泄露有关加密消息的任何信息,除了其已知的范围。这项技术源自 Benoit Libert 的工作。
部署此功能非常简单:客户端在加密时生成证明,而服务器在进行同态计算之前对其进行验证。以下是一个示例,演示了客户端如何加密和证明密文,以及服务器如何验证密文并对其进行计算:
use rand::prelude::*;
use tfhe::prelude::FheDecrypt;
use tfhe::set_server_key;
use tfhe::zk::{CompactPkeCrs, ZkComputeLoad};
pub fn main() -> Result<(), Box<dyn std::error::Error>> {
let mut rng = thread_rng();
let max_num_message = 1;
let params = tfhe::shortint::parameters::PARAM_MESSAGE_2_CARRY_2_COMPACT_PK_KS_PBS_TUNIFORM_2M40;
let client_key = tfhe::ClientKey::generate(tfhe::ConfigBuilder::with_custom_parameters(params, None));
// This is done in an offline phase and the CRS is shared to all clients and the server
// 这是在离线阶段完成的,并且 CRS 将共享给所有客户端和服务器
let crs = CompactPkeCrs::from_shortint_params(params, max_num_message).unwrap();
let public_zk_params = crs.public_params();
let server_key = tfhe::ServerKey::new(&client_key);
let public_key = tfhe::CompactPublicKey::try_new(&client_key).unwrap();
let clear_a = rng.gen::();
let clear_b = rng.gen::();
let a = tfhe::ProvenCompactFheUint64::try_encrypt(
clear_a,
public_zk_params,
&public_key,
ZkComputeLoad::Proof,
)?;
let b = tfhe::ProvenCompactFheUint64::try_encrypt(
clear_b,
public_zk_params,
&public_key,
ZkComputeLoad::Proof,
)?;
// Server side
// 服务端
let result = {
set_server_key(server_key);
// Verify the ciphertexts
// 验证密文
let a = a.verify_and_expand(&public_zk_params, &public_key)?;
let b = b.verify_and_expand(&public_zk_params, &public_key)?;
a + b
};
// Back on the client side
// 回到客户端
let a_plus_b: u64 = result.decrypt(&client_key);
assert_eq!(a_plus_b, clear_a.wrapping_add(clear_b));
Ok(())
}
在模拟客户端的 Dell XPS 15 9500 上,加密和证明 FheUint64 需要 6.9 秒。另一方面,在使用更便宜的验证模式下,在 AWS 上提供的 hpc7a.96xlarge 上,验证仅需 123 毫秒即可完成。
还有另一种具有更广泛验证的模式,在这种模式下,在同一台笔记本电脑上生成证明仅需 2.5 秒,在同一 AWS 实例上验证需要 467 毫秒。
此版本引入了对 GPU 上的有符号整数运算的支持,以及:
由于新的 C API 包装了 GPU 上的整数算术运算,因此现在可以实现跨语言支持。
此版本还带来了性能改进:多位 PBS(又名 多线程 PBS)支持已稳定,现在建议 GPU 用户使用,因为它比经典 PBS 快得多。它确实是一种用于 PBS 的算法,可以暴露更多的并行性,因此它在 GPU 上的性能优于 CPU。以下是如何使用它的示例:
use tfhe::{ConfigBuilder, set_server_key, FheUint8, ClientKey, CompressedServerKey};
use tfhe::prelude::*;
use tfhe::shortint::parameters::PARAM_GPU_MULTI_BIT_MESSAGE_2_CARRY_2_GROUP_3_KS_PBS;
fn main() {
let config = ConfigBuilder::with_custom_parameters(PARAM_GPU_MULTI_BIT_MESSAGE_2_CARRY_2_GROUP_3_KS_PBS, None).build();
let client_key= ClientKey::generate(config);
let compressed_server_key = CompressedServerKey::new(&client_key);
let gpu_key = compressed_server_key.decompress_to_gpu();
let clear_a = 27u8;
let clear_b = 128u8;
let a = FheUint8::encrypt(clear_a, &client_key);
let b = FheUint8::encrypt(clear_b, &client_key);
//Server-side
//服务端
set_server_key(gpu_key);
let result = a + b;
//Client-side
//客户端
let decrypted_result: u8 = result.decrypt(&client_key);
let clear_result = clear_a + clear_b;
assert_eq!(decrypted_result, clear_result);
}
此外,随着 LLM 训练和推理的兴起,H100 GPU 变得越来越容易和便宜地访问,并且比以前针对的 V100 GPU 提供更高的计算吞吐量。TFHE-rs v0.6 中增强了 H100 支持,并且这些 GPU 现在已在参考基准测试结果中作为目标,如表 1 所示。
在单个 H100 上,GPU 性能现在非常接近用作参考的高端 CPU 的性能。
最新版本的 TFHE-rs 还包括新操作、新噪声分布和其他一些增强功能:
对于即将发布的版本,重点将转移到减少密文的大小,并引入对多 GPU 计算的支持,以进一步提高性能。
- 原文链接: zama.ai/post/tfhe-rs-v0-...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!