TFHE-rs v0.8版本发布,引入了加密数组类型,并增强了多GPU计算能力,开发者可以更轻松地处理向量和张量,同时大幅缩短GPU上算术运算的计算时间,此外,新版本还引入了诸多新特性,包括后同态计算密文压缩、更多基于GPU的同态运算、以及CPU运算的改进等。
TFHE-rs v0.8 引入了数组类型并增强了多 GPU 计算。通过此版本,开发人员现在可以更轻松地使用向量和张量。此外,增强的多 GPU 大大减少了 GPU 上算术运算的计算时间。例如,在 8xH100 上,将两个加密的 64 位整数相乘现在大约需要 100 毫秒,而在高端 CPU 上则需要 366 毫秒,从而实现了 3.5 倍的加速。这篇博文将通过一个使用同态数组的示例,并提供额外的计时结果。与往常一样,此版本还引入了许多新功能,如最后一节所述。
TFHE-rs v0.8 引入了用于加密数据的 n 维数组(或张量)。这使得定义向量或矩阵同态运算变得容易。支持的运算包括:
以下示例演示了新数组类型的一些功能:它展示了如何从两个 4x4 矩阵中提取大小为 2x2 的子矩阵,执行加法,然后将一个明文矩阵添加到先前的结果中。你可以在文档中找到有关如何使用同态数组的更多详细信息。
use tfhe::{ConfigBuilder, generate_keys, set_server_key, CpuFheUint32Array, ClearArray};
use tfhe::prelude::*;
fn main() {
let config = ConfigBuilder::default().build();
let (cks, sks) = generate_keys(config);
set_server_key(sks);
let num_elems = 4 * 4;
let clear_xs = (0..num_elems as u32).collect::<Vec<_>>();
let clear_ys = vec![1u32; num_elems];
// Encrypted 2D array with values
// [[ 0, 1, 2, 3]\
// [ 4, 5, 6, 7]\
// [ 8, 9, 10, 11]\
// [ 12, 13, 14, 15]]
// and shape 4x4
let xs = CpuFheUint32Array::try_encrypt((clear_xs.as_slice(), vec![4, 4]), &cks).unwrap();
// Encrypted 2D array with values
// [[ 1, 1, 1, 1]\
// [ 1, 1, 1, 1]\
// [ 1, 1, 1, 1]\
// [ 1, 1, 1, 1]]
// and shape 4x4
let ys = CpuFheUint32Array::try_encrypt((clear_ys.as_slice(), vec![4, 4]), &cks).unwrap();
assert_eq!(xs.num_dim(), 2);
assert_eq!(xs.shape(), &[4, 4]);
assert_eq!(ys.num_dim(), 2);
assert_eq!(ys.shape(), &[4, 4]);
// Take a sub slice
// [[ 10, 11]\
// [ 14, 15]]
let xss = xs.slice(&[2..4, 2..4]);
// Take a sub slice
// [[ 1, 1]\
// [ 1, 1]]
let yss = ys.slice(&[2..4, 2..4]);
assert_eq!(xss.num_dim(), 2);
assert_eq!(xss.shape(), &[2, 2]);
assert_eq!(yss.num_dim(), 2);
assert_eq!(yss.shape(), &[2, 2]);
let r = &xss + &yss;
// Result is
// [[ 11, 12]\
// [ 15, 16]]
let result: Vec<u32> = r.decrypt(&cks);
assert_eq!(result, vec![11, 12, 15, 16]);
// Clear 2D array with values
// [[ 10, 20]\
// [ 30, 40]]
let clear_array = ClearArray::new(vec![10u32, 20u32, 30u32, 40u32], vec![2, 2]);
let r = &xss + &clear_array;
// Result is
// [[ 20, 31]\
// [ 44, 55]]
let r: Vec<u32> = r.decrypt(&cks);
assert_eq!(r, vec![20, 31, 44, 55]);
}
在 TFHE-rs v0.7 中,引入了多 GPU 支持,利用 NVLink 来处理 GPU 之间的数据共享。但是,此功能仅限于具有 NVLink 的平台,从而限制了其可扩展性。TFHE-rs v0.8 消除了这些限制,并提供了以下改进:
由于可编程引导和快速傅里叶变换 CUDA 实现中的优化,单 GPU 性能也提高了约 20%。
图 1:64 位乘法(左)和加法(右)的计时,其中两个输入已加密,在 CPU(来自 AWS 的 hpc7a.96xlarge)与一个、两个和八个 H100 GPU 上运行。这些参数对应于两条消息位和两条进位位,对 GPU 使用分组因子等于 3 的多位 PBS,对 CPU 使用经典 PBS。
每个操作的最佳 GPU 数量因操作本身和用户指定的整数精度而异。有关所有指定精度的单 GPU 和多 GPU 的综合基准测试结果数组可在文档中找到。
请注意,可以通过以下环境变量选择要用于多 GPU 平台上计算的 GPU:
export CUDA_SET_DEVICES=0,1,2
这将限制计算仅限于指定的 GPU,即使系统有更多的 GPU 可用。例如,这里 GPU 0、1 和 2 被标记为在平台上可见,这意味着即使平台有 8 个 GPU,也只有 CUDA_SET_DEVICES 中选择的那些 GPU 将用于计算。这对于在同一台机器上的不同 GPU 上执行计算非常有用。
最后,请注意,不再需要手动指定 GPU 特定的参数,即可在 GPU 上获得最佳性能,它们会在调用时自动配置:
let config = ConfigBuilder::default().build();
TFHE-rs v0.8 引入了其他几个功能:
随着 TFHE-rs v0.8 的发布,该团队致力于提高整体代码稳定性,并添加了许多新功能。请参阅发行说明以查看完整列表。TFHE-rs 的下一个版本将侧重于引入新的数据类型并继续提高整体性能。敬请关注即将到来的更新!
- 原文链接: zama.ai/post/tfhe-rs-v0-...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!