#arithmetic #parallel #homomorphic #fhe #neural-network

parmesan

PARMESAN:在加密数据上的并行算术

9 个版本

0.1.0 2023 年 4 月 20 日
0.1.0-alpha2023 年 4 月 19 日
0.0.20-alpha-42022 年 9 月 2 日
0.0.20-alpha-32022 年 8 月 26 日
0.0.2 2021 年 7 月 31 日

#324 in 加密

每月 28 次下载

AGPL-3.0

600KB
3.5K SLoC

Rust 3K SLoC // 0.3% comments Ruby 355 SLoC // 0.2% comments

帕尔马桑

在加密数据上的并行算术

帕尔马桑实现了对 TFHE 密文的多位数算术的选定并行算法。具体包括

  • 加法/减法,
  • 标量乘法(即乘以一个已知整数),
  • 乘法,
  • 平方,
  • 符号函数,
  • 两个数的最大值,
  • 舍入,以及
  • 简单神经网络的评估。

免责声明:帕尔马桑目前是一个实验性库,用作加密数据上可并行化算术的证明概念。因此,既不能保证其正确功能,也不能保证任何级别的代码质量。

简短的故事

在标准的整数表示中,由于进位可能从最低有效位(LSB)传播到最高有效位(MSB),因此并行加法是不可能的。然而,使用,例如,基-2 整数表示的字母表 {-1,0,1},存在一个并行加法算法。其他操作(如标量乘法和平方)也受益于快速的加法。

长篇大论

请参阅我们的 完整论文 和我们之前的 研究(也请参阅 eprint)。

使用 parmesan

将依赖项添加到你的 Rust 项目的 Cargo.toml 文件中。

[dependencies]
parmesan = { version = "^0.0.20-alpha", features = ["measure"] }
colored = "^2.0.0"

为了获得最佳性能,请使用以下命令编译

$ RUSTFLAGS="-C target-cpu=native" cargo build --release

示例

use std::error::Error;

use colored::Colorize;

use parmesan::params;
use parmesan::userovo::*;
use parmesan::ParmesanUserovo;
use parmesan::ParmesanCloudovo;
use parmesan::arithmetics::ParmArithmetics;

pub fn main() -> Result<(), Box<dyn Error>> {

    // =================================
    //  Initialization
    // ---------------------------------
    //  Global Scope
    let par = &params::PAR_TFHE_V0_2__M4_C0;

    // ---------------------------------
    //  Userovo Scope
    let pu = ParmesanUserovo::new(par)?;
    let pub_k = pu.export_pub_keys();
    // ---------------------------------
    //  Cloudovo Scope
    let pc = ParmesanCloudovo::new(par, &pub_k);

    // =================================
    //  U: Encryption
    let a: Vec<i32> = vec![1,0,1,-1,-1,0,-1,1,1,-1,1,1,1,-1,-1,0,0,1,1,0,0,0,0,-1,0,0,0,0,0,-1,0,0,];
    let b: Vec<i32> = vec![-1,0,0,-1,1,1,-1,1,-1,0,0,1,0,1,1,0,0,0,-1,0,0,1,0,0,-1,0,-1,-1,-1,1,1,0,];
    let ca = pu.encrypt_vec(&a)?;
    let cb = pu.encrypt_vec(&b)?;
    // convert to actual numbers
    let a_val = encryption::convert_from_vec(&a)?;
    let b_val = encryption::convert_from_vec(&b)?;
    // print plain inputs
    println!("\nInputs:\n");
    println!("a   = {:12}", a_val);
    println!("b   = {:12}", b_val);

    // =================================
    //  C: Evaluation
    let c_add_a_b = ParmArithmetics::add(&pc, &ca, &cb);

    // =================================
    //  U: Decryption
    let add_a_b = pu.decrypt(&c_add_a_b)?;

    let mut summary_text = format!("\nResults:\n");
    summary_text = format!("{}\nAddition:", summary_text);
    summary_text = format!("{}\na + b         = {:12} :: {} (exp. {})", summary_text,
                            add_a_b,
                            if add_a_b == a_val + b_val {String::from("PASS").bold().green()} else {String::from("FAIL").bold().red()},
                            a_val + b_val
    );

    println!("{}", summary_text);

    println!("\nDemo END\n");

    Ok(())
}

基准测试

对于基准测试,我们实现了一个实验性工具 bench-parmesan,它还比较了 Parmesan 和 Concrete v0.2。结果可以在 白皮书 中找到。

处理器负载

特别是,我们测量了处理器负载;在下图中,你可以找到我们在具有 AMD EPYC 7543 的机器上测量的 32 位最大值的结果。

proc load max

可以在这里找到展示32位乘法期间处理器负载的额外图表。

版本日志

  • v0.1.0-alpha:使用tfhe v0.2重写,而不是使用concrete_core
  • v0.0.20-alpha-4:白皮书中的算法。

许可

Parmesan遵循AGPLv3许可。

致谢

本工作得到了MESRI-BMBF法国-德国联合项目UPCARE(ANR-20-CYAL-0003-01)的支持,该项目授予EURECOM

EURECOM logo

计算资源由项目e-Infrastruktura CZ(e-INFRA CZ LM2018140)提供,该项目由捷克共和国教育部、青年和体育部支持。

e-infra logo

依赖

~15–26MB
~374K SLoC