From e4d856afdf0f8a6953cb46b7e83a7fa6a1f6f8a2 Mon Sep 17 00:00:00 2001 From: Agnes Leroy Date: Thu, 12 Jun 2025 18:02:04 +0200 Subject: [PATCH] chore(gpu): update noise squashing parameters --- .../benches/core_crypto/pbs128_bench.rs | 8 ++++---- .../lwe_programmable_bootstrapping_128.rs | 19 +++++++++--------- .../high_level_api/tests/noise_squashing.rs | 4 +++- tfhe/src/shortint/parameters/aliases.rs | 5 +++++ tfhe/src/shortint/parameters/v1_3/mod.rs | 14 +++++++++---- .../noise_squashing/p_fail_2_minus_128/mod.rs | 20 +++++++++++++++++++ 6 files changed, 51 insertions(+), 19 deletions(-) diff --git a/tfhe-benchmark/benches/core_crypto/pbs128_bench.rs b/tfhe-benchmark/benches/core_crypto/pbs128_bench.rs index 8cb90e6c3..1b09ee34c 100644 --- a/tfhe-benchmark/benches/core_crypto/pbs128_bench.rs +++ b/tfhe-benchmark/benches/core_crypto/pbs128_bench.rs @@ -178,8 +178,8 @@ mod cuda { use tfhe::core_crypto::prelude::*; use tfhe::shortint::engine::ShortintEngine; use tfhe::shortint::parameters::{ - ModulusSwitchType, NOISE_SQUASHING_PARAM_MESSAGE_2_CARRY_2_KS_PBS_TUNIFORM_2M128, - PARAM_MESSAGE_2_CARRY_2_KS_PBS_TUNIFORM_2M128, + ModulusSwitchType, NOISE_SQUASHING_PARAM_GPU_MESSAGE_2_CARRY_2_KS_PBS_TUNIFORM_2M128, + PARAM_GPU_MULTI_BIT_GROUP_4_MESSAGE_2_CARRY_2_KS_PBS_TUNIFORM_2M128, }; use tfhe::shortint::server_key::ModulusSwitchNoiseReductionKey; @@ -191,8 +191,8 @@ mod cuda { .measurement_time(std::time::Duration::from_secs(30)); type Scalar = u128; - let input_params = PARAM_MESSAGE_2_CARRY_2_KS_PBS_TUNIFORM_2M128; - let squash_params = NOISE_SQUASHING_PARAM_MESSAGE_2_CARRY_2_KS_PBS_TUNIFORM_2M128; + let input_params = PARAM_GPU_MULTI_BIT_GROUP_4_MESSAGE_2_CARRY_2_KS_PBS_TUNIFORM_2M128; + let squash_params = NOISE_SQUASHING_PARAM_GPU_MESSAGE_2_CARRY_2_KS_PBS_TUNIFORM_2M128; let lwe_noise_distribution_u64 = DynamicDistribution::new_t_uniform(46); let ct_modulus_u64: CiphertextModulus = CiphertextModulus::new_native(); diff --git a/tfhe/src/core_crypto/gpu/algorithms/test/lwe_programmable_bootstrapping_128.rs b/tfhe/src/core_crypto/gpu/algorithms/test/lwe_programmable_bootstrapping_128.rs index 0f7a7ecbd..bbaa3ded2 100644 --- a/tfhe/src/core_crypto/gpu/algorithms/test/lwe_programmable_bootstrapping_128.rs +++ b/tfhe/src/core_crypto/gpu/algorithms/test/lwe_programmable_bootstrapping_128.rs @@ -1,5 +1,8 @@ pub(crate) use crate::core_crypto::algorithms::test::gen_keys_or_get_from_cache_if_enabled; -use crate::shortint::parameters::DynamicDistribution; +use crate::shortint::parameters::{ + DynamicDistribution, NOISE_SQUASHING_PARAM_GPU_MESSAGE_2_CARRY_2_KS_PBS_TUNIFORM_2M128, + PARAM_GPU_MULTI_BIT_GROUP_4_MESSAGE_2_CARRY_2_KS_PBS_TUNIFORM_2M128, +}; use crate::shortint::prelude::{DecompositionBaseLog, LweDimension}; use crate::core_crypto::algorithms::par_allocate_and_generate_new_lwe_bootstrap_key; @@ -18,13 +21,9 @@ use crate::core_crypto::prelude::{ Plaintext, SignedDecomposer, UnsignedTorus, }; use crate::shortint::engine::ShortintEngine; -use crate::shortint::parameters::{ - ModulusSwitchType, NoiseSquashingParameters, - NOISE_SQUASHING_PARAM_MESSAGE_2_CARRY_2_KS_PBS_TUNIFORM_2M128, - PARAM_MESSAGE_2_CARRY_2_KS_PBS_TUNIFORM_2M128, -}; +use crate::shortint::parameters::{ModulusSwitchType, NoiseSquashingParameters}; use crate::shortint::server_key::ModulusSwitchNoiseReductionKey; -use crate::shortint::ClassicPBSParameters; +use crate::shortint::MultiBitPBSParameters; use serde::de::DeserializeOwned; use serde::Serialize; @@ -74,7 +73,7 @@ pub fn generate_keys< pub fn execute_bootstrap_u128( squash_params: NoiseSquashingParameters, - input_params: ClassicPBSParameters, + input_params: MultiBitPBSParameters, ) { let glwe_dimension = squash_params.glwe_dimension; let polynomial_size = squash_params.polynomial_size; @@ -207,7 +206,7 @@ pub fn execute_bootstrap_u128( #[test] fn test_bootstrap_u128_with_squashing() { execute_bootstrap_u128( - NOISE_SQUASHING_PARAM_MESSAGE_2_CARRY_2_KS_PBS_TUNIFORM_2M128, - PARAM_MESSAGE_2_CARRY_2_KS_PBS_TUNIFORM_2M128, + NOISE_SQUASHING_PARAM_GPU_MESSAGE_2_CARRY_2_KS_PBS_TUNIFORM_2M128, + PARAM_GPU_MULTI_BIT_GROUP_4_MESSAGE_2_CARRY_2_KS_PBS_TUNIFORM_2M128, ); } diff --git a/tfhe/src/high_level_api/tests/noise_squashing.rs b/tfhe/src/high_level_api/tests/noise_squashing.rs index 423b69d87..cbd4217e2 100644 --- a/tfhe/src/high_level_api/tests/noise_squashing.rs +++ b/tfhe/src/high_level_api/tests/noise_squashing.rs @@ -4,6 +4,8 @@ use crate::high_level_api::{ }; use crate::integer::U256; use crate::set_server_key; +#[cfg(feature = "gpu")] +use crate::shortint::parameters::NOISE_SQUASHING_PARAM_GPU_MESSAGE_2_CARRY_2_KS_PBS_TUNIFORM_2M128; use crate::shortint::parameters::{ NOISE_SQUASHING_PARAM_MESSAGE_2_CARRY_2_KS_PBS_TUNIFORM_2M128, PARAM_MESSAGE_2_CARRY_2_KS_PBS_TUNIFORM_2M128, @@ -82,7 +84,7 @@ fn test_gpu_noise_squashing() { let config = ConfigBuilder::with_custom_parameters( crate::shortint::parameters::PARAM_GPU_MULTI_BIT_GROUP_4_MESSAGE_2_CARRY_2_KS_PBS_TUNIFORM_2M128, ) - .enable_noise_squashing(NOISE_SQUASHING_PARAM_MESSAGE_2_CARRY_2_KS_PBS_TUNIFORM_2M128) + .enable_noise_squashing(NOISE_SQUASHING_PARAM_GPU_MESSAGE_2_CARRY_2_KS_PBS_TUNIFORM_2M128) .build(); let cks = crate::ClientKey::generate(config); let sks = cks.generate_compressed_server_key(); diff --git a/tfhe/src/shortint/parameters/aliases.rs b/tfhe/src/shortint/parameters/aliases.rs index c3ab14ae0..42740f460 100644 --- a/tfhe/src/shortint/parameters/aliases.rs +++ b/tfhe/src/shortint/parameters/aliases.rs @@ -5,6 +5,7 @@ use crate::shortint::parameters::{ }; use crate::shortint::parameters::current_params::key_switching::p_fail_2_minus_128::ks_pbs_gpu::V1_3_PARAM_MULTI_BIT_GROUP_4_KEYSWITCH_PKE_TO_SMALL_MESSAGE_2_CARRY_2_KS_PBS_TUNIFORM_2M128; +use crate::shortint::parameters::v1_3::V1_3_NOISE_SQUASHING_PARAM_GPU_MESSAGE_2_CARRY_2_KS_PBS_TUNIFORM_2M128; use current_params::classic::gaussian::p_fail_2_minus_128::ks_pbs::{ V1_3_PARAM_MESSAGE_2_CARRY_2_KS_PBS_GAUSSIAN_2M128, V1_3_PARAM_MESSAGE_3_CARRY_3_KS_PBS_GAUSSIAN_2M128, @@ -120,6 +121,10 @@ pub const NOISE_SQUASHING_COMP_PARAM_MESSAGE_2_CARRY_2_KS_PBS_TUNIFORM_2M128: NoiseSquashingCompressionParameters = V1_3_NOISE_SQUASHING_COMP_PARAM_MESSAGE_2_CARRY_2_KS_PBS_TUNIFORM_2M128; +pub const NOISE_SQUASHING_PARAM_GPU_MESSAGE_2_CARRY_2_KS_PBS_TUNIFORM_2M128: + NoiseSquashingParameters = + V1_3_NOISE_SQUASHING_PARAM_GPU_MESSAGE_2_CARRY_2_KS_PBS_TUNIFORM_2M128; + // GPU 2^-64 // GPU TUniform pub const PARAM_GPU_MULTI_BIT_GROUP_4_MESSAGE_1_CARRY_1_KS_PBS_TUNIFORM_2M64: diff --git a/tfhe/src/shortint/parameters/v1_3/mod.rs b/tfhe/src/shortint/parameters/v1_3/mod.rs index d827952a8..4c4810a73 100644 --- a/tfhe/src/shortint/parameters/v1_3/mod.rs +++ b/tfhe/src/shortint/parameters/v1_3/mod.rs @@ -1689,10 +1689,16 @@ pub const VEC_ALL_COMPACT_PUBLIC_KEY_ENCRYPTION_PARAMETERS: [( ]; /// All [`NoiseSquashingParameters`] in this module. -pub const VEC_ALL_NOISE_SQUASHING_PARAMETERS: [(&NoiseSquashingParameters, &str); 1] = [( - &V1_3_NOISE_SQUASHING_PARAM_MESSAGE_2_CARRY_2_KS_PBS_TUNIFORM_2M128, - "V1_3_NOISE_SQUASHING_PARAM_MESSAGE_2_CARRY_2_KS_PBS_TUNIFORM_2M128", -)]; +pub const VEC_ALL_NOISE_SQUASHING_PARAMETERS: [(&NoiseSquashingParameters, &str); 2] = [ + ( + &V1_3_NOISE_SQUASHING_PARAM_MESSAGE_2_CARRY_2_KS_PBS_TUNIFORM_2M128, + "V1_3_NOISE_SQUASHING_PARAM_MESSAGE_2_CARRY_2_KS_PBS_TUNIFORM_2M128", + ), + ( + &V1_3_NOISE_SQUASHING_PARAM_GPU_MESSAGE_2_CARRY_2_KS_PBS_TUNIFORM_2M128, + "V1_3_NOISE_SQUASHING_PARAM_GPU_MESSAGE_2_CARRY_2_KS_PBS_TUNIFORM_2M128", + ), +]; /// All [`NoiseSquashingCompressionParameters`] in this module. pub const VEC_ALL_NOISE_SQUASHING_COMPRESSION_PARAMETERS: [( diff --git a/tfhe/src/shortint/parameters/v1_3/noise_squashing/p_fail_2_minus_128/mod.rs b/tfhe/src/shortint/parameters/v1_3/noise_squashing/p_fail_2_minus_128/mod.rs index 9c65c79c0..12a5ca832 100644 --- a/tfhe/src/shortint/parameters/v1_3/noise_squashing/p_fail_2_minus_128/mod.rs +++ b/tfhe/src/shortint/parameters/v1_3/noise_squashing/p_fail_2_minus_128/mod.rs @@ -38,3 +38,23 @@ pub const V1_3_NOISE_SQUASHING_COMP_PARAM_MESSAGE_2_CARRY_2_KS_PBS_TUNIFORM_2M12 message_modulus: MessageModulus(4), carry_modulus: CarryModulus(4), }; + +pub const V1_3_NOISE_SQUASHING_PARAM_GPU_MESSAGE_2_CARRY_2_KS_PBS_TUNIFORM_2M128: + NoiseSquashingParameters = NoiseSquashingParameters { + glwe_dimension: GlweDimension(1), + polynomial_size: PolynomialSize(4096), + glwe_noise_distribution: DynamicDistribution::new_t_uniform(30), + decomp_base_log: DecompositionBaseLog(24), + decomp_level_count: DecompositionLevelCount(3), + modulus_switch_noise_reduction_params: ModulusSwitchType::DriftTechniqueNoiseReduction( + ModulusSwitchNoiseReductionParams { + modulus_switch_zeros_count: LweCiphertextCount(2827), + ms_bound: NoiseEstimationMeasureBound(288230376151711744f64), + ms_r_sigma_factor: RSigmaFactor(20.83904137608219f64), + ms_input_variance: Variance(2.7596542105799535e-07f64), + }, + ), + message_modulus: MessageModulus(4), + carry_modulus: CarryModulus(4), + ciphertext_modulus: CoreCiphertextModulus::::new_native(), +};