Improve performance of recursive#163
Conversation
This comment was marked as off-topic.
This comment was marked as off-topic.
|
@microsoft-github-policy-service agree company="OROCHI NETWORK PTE. LTD." |
|
@chiro-hiro Is this still a draft? Could you please rebase with the main branch and let me know when this is ready? |
Thank you, I will rebase my code and try to complete this in the weekend. |
4438e1d to
ced1675
Compare
ced1675 to
179f716
Compare
|
Here is the original code, there are multiple instance of // produce a recursive SNARK
let mut recursive_snark: Option<
RecursiveSNARK<
G1,
G2,
TrivialTestCircuit<<G1 as Group>::Scalar>,
CubicCircuit<<G2 as Group>::Scalar>,
>,
> = None;
for _i in 0..num_steps {
let res = RecursiveSNARK::prove_step(
&pp,
recursive_snark,
circuit_primary.clone(),
circuit_secondary.clone(),
vec![<G1 as Group>::Scalar::ONE],
vec![<G2 as Group>::Scalar::ZERO],
);
assert!(res.is_ok());
recursive_snark = Some(res.unwrap());
}
assert!(recursive_snark.is_some());
let recursive_snark = recursive_snark.unwrap();
// verify the recursive SNARK
let res = recursive_snark.verify(
&pp,
num_steps,
vec![<G1 as Group>::Scalar::ONE],
vec![<G2 as Group>::Scalar::ZERO],
);
assert!(res.is_ok());Instead of create new instance of // produce a recursive SNARK
let mut recursive_snark = RecursiveSNARK::<
G1,
G2,
TrivialTestCircuit<<G1 as Group>::Scalar>,
CubicCircuit<<G2 as Group>::Scalar>,
>::new(
&pp,
&circuit_primary,
&circuit_secondary,
vec![<G1 as Group>::Scalar::one()],
vec![<G2 as Group>::Scalar::zero()],
);
for _i in 0..num_steps {
let res = recursive_snark.prove_step(
&pp,
&circuit_primary,
&circuit_secondary,
vec![<G1 as Group>::Scalar::one()],
vec![<G2 as Group>::Scalar::zero()],
);
assert!(res.is_ok());
}
// verify the recursive SNARK
let res = recursive_snark.verify(
&pp,
num_steps,
vec![<G1 as Group>::Scalar::ONE],
vec![<G2 as Group>::Scalar::ZERO],
);
assert!(res.is_ok());In my observations, the circuit and z0 were passed as immutable parameters. I'm also change the code to borrow these values instead of |
|
Fantastic! Thanks @chiro-hiro! I had a quick comment about avoiding a small piece of code in prove_step. Please check. |
|
My pleasure, Indeed, that part of code looks ugly but I can't find the better way to keep the backwards compatibility. |
|
Hi @srinathsetty, there are pretty much changes were made in |
Hi @chiro-hiro! I'll see if I can find a fix for the issue noted above. We'll prioritize this PR. |
|
Thank you, I will focus on fixing the conflict with the main branch. |
91c143d to
8253bb7
Compare
|
@chiro-hiro this is neat! I've opened orochi-network#1 to refine it further - you might find this or a similar way of getting the same results interesting. |
|
@huitseeker Thank you, everything looks great. I do check and rerun the test/benchmark as well. All set, just wait for @srinathsetty to review this PR. |
|
@chiro-hiro clippy warnings should disappear as soon as you rebase on the latest master. |
|
Hi, @chiro-hiro Could we please update this branch soon (with a rebase + a change to address the discussion thread above) so we can merge this ahead of other pending PRs? (cc: @huitseeker) |
|
Hi @srinathsetty, sorry for the delay. I have rebasing my fork with the upstream's main branch. |
- Update function arguments to use borrowing instead of passing ownership
Updates to version 0.21 See - microsoft/Nova#163
Updates to version 0.22 See - microsoft/Nova#163
Updates to version 0.22 See - microsoft/Nova#163
Updates to version 0.22 See - microsoft/Nova#163
Updates to version 0.22 See - microsoft/Nova#163
* Include number of instances in transcript * Clarify Sumcheck and verifier * Fix clippy
* skeleton of what is to be done * wip inner and outer sumchecks done * fix borrow checker issues * batched spartan prove done * Small improvements - Irregular shape yields error - Remove (W,E) clones - Use Math module for log2 - Generate tau using only 1 challenge - Remove some `clone()` - Comments * Fix evaluation points * Implement verifier * `CompressedSNARK` implementation * Tests fixed, failing * fix sumcheck, test passes * bound -> bind * remove todo * add test * Document BatchedRelaxedR1CSSNARKTrait and SuperNova CompressedSNARK. * working * - Remove debug code - Add Sumcheck::verify_batch - Uniformize batching of evals - Comments * Adress review comments - add itertools for multiunzip - avoid clones - avoid recomputing sizes for asserts * Fix asserts * batched ppsnark * Fix scaling * - Fix padding of poly_W - Optimized evaluation - use batch_diff_size - use multiunzip * rebase fixes * Only create taus once. * Avoid clone by not allocating PowPolynomial. * Riff on review. * refactor: Implement `.zip_eq()` for equal length iterator safety - Replaced `.zip()` with `.zip_eq()` across various files including `sumcheck.rs`, `mod.rs`, `batched_ppsnark.rs`, `batched.rs` and `snark.rs`, ensuring equal length enforcement in iterations and reducing out-of-bound errors. - Updated a multiunzip resulting in a double iteration in batched_ppsnark::prove. * add benchmark * fix witnes * fix: clean up iterators * feat: Introduce new utility macros in spartan module - Introduced a macro `zip_with` in `src/spartan/mod.rs` to simplify the process of zipping multiple iterators and applying a single parallel function. - Developed additional macros `nested_tuple` and `nested_idents` for detailed nested tuple patterns and identifiers respectively. - Implemented `zip_all` macro that acts as a fold-right zipping operator for all given expressions. * refactor: Refactor batched.rs to enhance code readability - Refactored `src/spartan/batched.rs` to use `zip_with()` macro improving the readability, simplification, and consistent usage in the code. - Inserted comments highlighting sections marked for review or possible future code simplification. * refactor: use zip_with! in batch_ppsnark - Updated `batched_ppsnark.rs` in the `src/spartan` directory with uses of zip_with macro * ignore local macro doctest * Use zip_with. * Implement and use zip_with_for_each. * Dubious double zip_with. * More zip_with. * Small fixes - `zip_with` for `batched_ppsnark` - Complete comment of `BatchedRelaxedR1CSSNARK` - Restore Abomonation bounds - Fix nits in `multilinear.rs` * refactor: more zip_with instances (microsoft#153) * refactor: more instances of zip_with * Supernova: Some rewrites (microsoft#154) * refactor: more zip_with * feat: Implement `FromIterator` for polynomial types - Enhanced `EqPolynomial`, `MultilinearPolynomial`, and `SparsePolynomial` with `FromIterator` implementation. * refactor: use instaces of Polynomial Fromiterator where possible * refactor: remove unused impls of FromIterator * refactor: address review comments * refactor: enhance scope visibility scope in Spartan and Supernova modules (microsoft#156) Absolute visibility modifiers tend to not inadvertently make things public when you move code, contrarily to (super). - Changed the visibility scope of several fields and methods within multiple substrates in the `ppsnark.rs` file to be within the `crate::spartan`. - Altered the module import path in the `circuit.rs` file from `super` to `crate::supernova`. - Modified the visibility of the `WitnessBoundSumcheck` in `batched_ppsnark.rs`, the visibility scope is now set to `crate::spartan`. - Scoped `batch_eval_prove` and `batch_eval_verify` functions within `crate::spartan` in `snark.rs`. * Avoid EqPolynomial when only for evals. * refactor: a few more instances of EqPolynomial::evals_from_points - in `multilinear.rs` and `ipa_pc.rs`, replaces the previous method `EqPolynomial::new(r.to_vec()).evals()` with a more efficient `EqPolynomial::evals_from_points(r)`. * doc: fix a few nits (microsoft#160) * refactor: rename powers -> squares - Renamed the `powers` method to `squares` in `PowPolynomial` struct within `src/spartan/polys/power.rs` and changed its visibility level. * fix: comment * fix: comment of batch * derive fixes * fix: compressed snark benchmark - Introduced `compressed-snark-supernova` within the `Cargo.toml` file. - fixed Rust * ci: Add trigger for PRs to batched_spartan (microsoft#165) * More zip with (microsoft#158) * Expand zip_with macros to accommodate more use. * Clippy. * Move Spartan macros to own module. * Only use zip_with_fn to implement convenience macros. * Use convenience zip_with macros more. * Remove for_each variants of zip_with macros. * Remove flat_map variants of zip_with. --------- Co-authored-by: porcuquine <porcuquine@users.noreply.github.com> * Introduce proper `MaskedEq` poly (microsoft#162) * Introduce proper `MaskedEq` poly * refactor: Refactor MaskedEq poly for improved testing and performance - Introduce lifetime parameters to `MaskedEqPolynomial` struct to improve memory management. - Modify the `MaskedEqPolynomial` creation process so it now requires a reference to an existing `EqPolynomial`. - Adapt corresponding tests to reflect the above changes. * Fix fmt & derive debug --------- Co-authored-by: François Garillot <francois@garillot.net> * Restore zip_with_for_each. (microsoft#166) Co-authored-by: porcuquine <porcuquine@users.noreply.github.com> * fix benchmark (microsoft#168) * Sumcheck update (microsoft#163) * Include number of instances in transcript * Clarify Sumcheck and verifier * Fix clippy * Streamline macro syntax (microsoft#169) * refactor: Refactor Spartan code for streamlined use of `zip_with_fn` Details: - Simplified the implementation of `BatchedRelaxedR1CSSNARKTrait` by replacing usage of `zip_with_iter` and related macros with `zip_with_fn`. - Eliminated `zip_with_iter`, `zip_with_par_iter`, `zip_with_into_iter`, and `zip_with_into_par_iter` macros from the codebase, reducing repetition and enhancing code organization. * refactor: Refactor zip functions - Replaced the `zip_with_fn!` function with the `zip_with!` function in various files, - Refactored `zip_with` and `zip_with_for_each` macros in `src/spartan/macros.rs` for improved handling of iterator projection specification. - Consolidated `zip_all_with_fn` macro's functionality into `zip_all` and eliminated unused macros. * fix: remove brackets * Small fixes (microsoft#170) * refactor: removed needless copies of `R1CSShape` - Modified the `primary_r1cs_shapes` function in `supernova/mod.rs` to return a vector of references, improving memory efficiency. - Use those `primary_r1cs_shapes` in the `setup` and `prove` methods of `CompressedSNARK`. - Altered the `BatchedRelaxedR1CSSNARKTrait` trait functions in `traits/snark.rs` to accept vector of references instead of reference, * refactor: Refactor polynomial size assertion checks in sumcheck.rs - Refactors the length assertion checks in the `prove_quad_batch` and `prove_cubic_with_additive_term_batch` methods in `src/spartan/sumcheck.rs`. - Simplified the code by replacing multiple `assert_eq` calls with a loop. * refactor: Remove "nested_tuple" macro from spartan macros - Removed the "nested_tuple" macro from the "src/spartan/macros.rs" file. * refactor: pedantic calls in tests --------- Co-authored-by: Matej Penciak <matej.penciak@gmail.com> Co-authored-by: Adrian Hamelink <adrian@hamelink.com> Co-authored-by: porcuquine <porcuquine@users.noreply.github.com> Co-authored-by: Hanting Zhang <hantingz@usc.edu> Co-authored-by: Samuel Burnham <45365069+samuelburnham@users.noreply.github.com> Co-authored-by: porcuquine <1746729+porcuquine@users.noreply.github.com> Co-authored-by: Adrian Hamelink <adrian.hamelink@gmail.com> Co-authored-by: Matej Penciak <96667244+mpenciak@users.noreply.github.com>
Im try to minimize the cost to
.copy(),.clone()multiple structures around. You might expect ~10% in total performance and ~5% in memory saving.2 tests are broken, so I'm try to fix it. If this worth, please let me know.