From b40897adbe904a38f69b3093f04b9c83a35eb54b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Test=C3=A9?= Date: Tue, 12 Mar 2024 16:15:56 +0100 Subject: [PATCH] chore(bench): benchmark server keys with wasm Benchmarks are run for 1_1 and 2_2 parameters set on compressed server key. --- .../utilities/wasm_benchmarks_parser.rs | 15 +++-- tfhe/web_wasm_parallel_tests/index.html | 3 + tfhe/web_wasm_parallel_tests/index.js | 4 +- tfhe/web_wasm_parallel_tests/test/common.mjs | 1 + .../test/server-key.test.js | 12 ++++ tfhe/web_wasm_parallel_tests/worker.js | 58 +++++++++++++++++++ 6 files changed, 88 insertions(+), 5 deletions(-) diff --git a/tfhe/examples/utilities/wasm_benchmarks_parser.rs b/tfhe/examples/utilities/wasm_benchmarks_parser.rs index 433ae7315a..da5129e77c 100644 --- a/tfhe/examples/utilities/wasm_benchmarks_parser.rs +++ b/tfhe/examples/utilities/wasm_benchmarks_parser.rs @@ -11,13 +11,17 @@ use std::io::Write; use std::path::Path; use tfhe::keycache::NamedParam; use tfhe::shortint::keycache::{ - PARAM_MESSAGE_2_CARRY_2_COMPACT_PK_KS_PBS_NAME, PARAM_MESSAGE_2_CARRY_2_COMPACT_PK_PBS_KS_NAME, + PARAM_MESSAGE_1_CARRY_1_KS_PBS_NAME, PARAM_MESSAGE_2_CARRY_2_COMPACT_PK_KS_PBS_NAME, + PARAM_MESSAGE_2_CARRY_2_COMPACT_PK_PBS_KS_NAME, PARAM_MESSAGE_2_CARRY_2_KS_PBS_NAME, }; use tfhe::shortint::parameters::{ - PARAM_MESSAGE_2_CARRY_2_COMPACT_PK_KS_PBS, PARAM_MESSAGE_2_CARRY_2_COMPACT_PK_PBS_KS, + PARAM_MESSAGE_1_CARRY_1_KS_PBS, PARAM_MESSAGE_2_CARRY_2_COMPACT_PK_KS_PBS, + PARAM_MESSAGE_2_CARRY_2_COMPACT_PK_PBS_KS, PARAM_MESSAGE_2_CARRY_2_KS_PBS, }; use tfhe::shortint::{ClassicPBSParameters, PBSParameters}; +const BENCHMARK_NAME_PREFIX: &str = "wasm::"; + #[derive(Parser, Debug)] #[command(author, version, about, long_about = None)] struct Args { @@ -28,6 +32,8 @@ fn params_from_name(name: &str) -> ClassicPBSParameters { match name.to_uppercase().as_str() { PARAM_MESSAGE_2_CARRY_2_COMPACT_PK_KS_PBS_NAME => PARAM_MESSAGE_2_CARRY_2_COMPACT_PK_KS_PBS, PARAM_MESSAGE_2_CARRY_2_COMPACT_PK_PBS_KS_NAME => PARAM_MESSAGE_2_CARRY_2_COMPACT_PK_PBS_KS, + PARAM_MESSAGE_1_CARRY_1_KS_PBS_NAME => PARAM_MESSAGE_1_CARRY_1_KS_PBS, + PARAM_MESSAGE_2_CARRY_2_KS_PBS_NAME => PARAM_MESSAGE_2_CARRY_2_KS_PBS, _ => panic!("failed to get parameters for name '{name}'"), } } @@ -56,14 +62,15 @@ pub fn parse_wasm_benchmarks(results_file: &Path, raw_results_dir: &Path) { let results_as_json: HashMap = serde_json::from_str(&raw_results).unwrap(); for (full_name, val) in results_as_json.iter() { + let prefixed_full_name = format!("{BENCHMARK_NAME_PREFIX}{full_name}"); let name_parts = full_name.split("_mean_").collect::>(); let bench_name = name_parts[0]; let params: PBSParameters = params_from_name(name_parts[1]).into(); let value_in_ns = (val * 1_000_000_f32) as usize; - write_result(&mut file, full_name, value_in_ns); + write_result(&mut file, &prefixed_full_name, value_in_ns); write_to_json::( - full_name, + &prefixed_full_name, params, params.name(), bench_name, diff --git a/tfhe/web_wasm_parallel_tests/index.html b/tfhe/web_wasm_parallel_tests/index.html index a6d512253b..87c92260f8 100644 --- a/tfhe/web_wasm_parallel_tests/index.html +++ b/tfhe/web_wasm_parallel_tests/index.html @@ -39,6 +39,9 @@ + + +
diff --git a/tfhe/web_wasm_parallel_tests/index.js b/tfhe/web_wasm_parallel_tests/index.js index 9bd28f14aa..35c1ae7e9d 100644 --- a/tfhe/web_wasm_parallel_tests/index.js +++ b/tfhe/web_wasm_parallel_tests/index.js @@ -36,7 +36,9 @@ async function setup() { 'compactPublicKeyBench32BitBig', 'compactPublicKeyBench32BitSmall', 'compactPublicKeyBench256BitBig', - 'compactPublicKeyBench256BitSmall' + 'compactPublicKeyBench256BitSmall', + 'compressedServerKeyBenchMessage1Carry1', + 'compressedServerKeyBenchMessage2Carry2', ] function setupBtn(id) { diff --git a/tfhe/web_wasm_parallel_tests/test/common.mjs b/tfhe/web_wasm_parallel_tests/test/common.mjs index a2bb4d5f0a..c81edda80f 100644 --- a/tfhe/web_wasm_parallel_tests/test/common.mjs +++ b/tfhe/web_wasm_parallel_tests/test/common.mjs @@ -59,6 +59,7 @@ async function runTestAttachedToButton(buttonId) { let page = await browser.newPage(); + await page.setDefaultTimeout(300000) // Five minutes timeout await page.goto('http://localhost:3000'); page.on('console', msg => console.log('PAGE LOG:', msg.text())); diff --git a/tfhe/web_wasm_parallel_tests/test/server-key.test.js b/tfhe/web_wasm_parallel_tests/test/server-key.test.js index e69de29bb2..1754e37eee 100644 --- a/tfhe/web_wasm_parallel_tests/test/server-key.test.js +++ b/tfhe/web_wasm_parallel_tests/test/server-key.test.js @@ -0,0 +1,12 @@ +import { runTestAttachedToButton } from "./common.mjs"; + + +it('Server Key Bench 1_1', async () => { + await runTestAttachedToButton('compressedServerKeyBenchMessage1Carry1') +}, + 300000); // Five minutes timeout + +it('Server Key Bench 2_2', async () => { + await runTestAttachedToButton('compressedServerKeyBenchMessage2Carry2') + }, + 300000); // Five minutes timeout diff --git a/tfhe/web_wasm_parallel_tests/worker.js b/tfhe/web_wasm_parallel_tests/worker.js index 6b79534833..95f2e9118c 100644 --- a/tfhe/web_wasm_parallel_tests/worker.js +++ b/tfhe/web_wasm_parallel_tests/worker.js @@ -441,6 +441,62 @@ async function compactPublicKeyBench256BitSmall() { ); } +async function compressedServerKeyBenchConfig(config) { + const bench_loops = 35; + let bench_results = {}; + + console.log('Begin benchmarks') // DEBUG + let clientKey = TfheClientKey.generate(config); + + // Bench the sk generation for bench_loops iterations + let start = performance.now(); + for (let i = 0; i < bench_loops; i++) { + let _ = TfheCompressedServerKey.new(clientKey); + } + let end = performance.now(); + const timing_1 = (end - start) / bench_loops + console.log('CompressedServerKey Gen bench: ', timing_1, ' ms'); + bench_results["compressed_server_key_gen_mean"] = timing_1; + + let serverKey = TfheCompressedServerKey.new(clientKey); + let serialized_key = serverKey.serialize(); + console.log("Serialized ServerKey size: ", serialized_key.length); + + // Bench the serialization for bench_loops iterations + start = performance.now(); + for (let i = 0; i < bench_loops; i++) { + let _ = serverKey.serialize(); + } + end = performance.now(); + const timing_2 = (end - start) / bench_loops + console.log('CompressedServerKey serialization bench: ', timing_2, ' ms'); + bench_results["compressed_server_key_serialization_mean"] = timing_2; + + return bench_results; +} + +async function compressedServerKeyBenchMessage1Carry1() { + const block_params = new ShortintParameters(ShortintParametersName.PARAM_MESSAGE_1_CARRY_1_KS_PBS); + let config = TfheConfigBuilder.default() + .use_custom_parameters(block_params) + .build(); + return append_param_name( + await compressedServerKeyBenchConfig(config), + "PARAM_MESSAGE_1_CARRY_1_KS_PBS" + ); +} + +async function compressedServerKeyBenchMessage2Carry2() { + const block_params = new ShortintParameters(ShortintParametersName.PARAM_MESSAGE_2_CARRY_2_KS_PBS); + let config = TfheConfigBuilder.default() + .use_custom_parameters(block_params) + .build(); + return append_param_name( + await compressedServerKeyBenchConfig(config), + "PARAM_MESSAGE_2_CARRY_2_KS_PBS" + ); +} + async function main() { await init() await initThreadPool(navigator.hardwareConcurrency); @@ -459,6 +515,8 @@ async function main() { compactPublicKeyBench32BitSmall, compactPublicKeyBench256BitBig, compactPublicKeyBench256BitSmall, + compressedServerKeyBenchMessage1Carry1, + compressedServerKeyBenchMessage2Carry2, }) }