Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

chore: fixing the sizes of VMs in CIVC #11793

Merged
merged 20 commits into from
Feb 11, 2025
Merged

Conversation

iakovenkos
Copy link
Contributor

@iakovenkos iakovenkos commented Feb 6, 2025

The sizes of Translator and ECCVM circuits leak the amount of circuits that have been folded, so we need to fix them.

benchmark_client_ivc after fixing the sizes (note that regression is expected, as the IPA prover is opening a dense polynomial of size 2^16 instead of 2^15 + there is not much skipping in Sumcheck except for SetRelation)

ECCVMProver(CircuitBuilder&)(t) 190 0.87%
ECCVMProver::construct_proof(t) 2405 10.95%
TranslatorProver::construct_proof(t) 1316 5.99%
Goblin::merge(t) 132 0.60%

Total time accounted for: 21963ms/23040ms = 95.32%

Benchmark on master:

ECCVMProver(CircuitBuilder&)(t) 182 0.85%
ECCVMProver::construct_proof(t) 1612 7.51%
TranslatorProver::construct_proof(t) 1650 7.69%
Goblin::merge(t) 132 0.62%

Total time accounted for: 21468ms/22538ms = 95.25%

@iakovenkos iakovenkos changed the title chore: fixing the size of VMs chore: fixing the sizes of VMs Feb 6, 2025
@@ -92,6 +92,9 @@ class TranslatorProvingKey {

inline void compute_mini_circuit_dyadic_size(const Circuit& circuit)
{
// Check that the Translator Circuit does not exceed the fixed upper bound, the current value 8192 corresponds
// to 10 rounds of folding (i.e. 20 circuits)
ASSERT(circuit.num_gates < Flavor::MINIMUM_MINI_CIRCUIT_SIZE);
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

maybe this has to be a runtime error?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

can convert in the same way described above

@iakovenkos iakovenkos changed the title chore: fixing the sizes of VMs chore: fixing the sizes of VMs in CIVC Feb 6, 2025
@@ -516,7 +546,12 @@ class ECCVMFlavor {
const size_t num_rows =
std::max({ point_table_rows.size(), msm_rows.size(), transcript_rows.size() }) + MASKING_OFFSET;
const auto log_num_rows = static_cast<size_t>(numeric::get_msb64(num_rows));
const size_t dyadic_num_rows = 1UL << (log_num_rows + (1UL << log_num_rows == num_rows ? 0 : 1));

ASSERT(1UL << CONST_ECCVM_LOG_N > 1UL << (log_num_rows + (1UL << log_num_rows == num_rows ? 0 : 1)));
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

need to change to a runtime check?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Couple of suggestions here: 1) make well named variables for each of the expressions in these conditionals here so they're easier to digest. 2) For runtime checks, I usually just convert something like this to a
if (condition) {info("Relevant warning"); ASSERT(false);}. For now this is better than having nothing at all at runtime - in the future maybe we can improve the pattern further

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

thanks for the suggestion!

simplified the logic here

@@ -17,6 +17,13 @@ template <typename FF_> class ECCVMSetRelationImpl {
3 // left-shiftable polynomial sub-relation
};

template <typename AllEntities> inline static bool skip(const AllEntities& in)
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I looked into the other relations - does not seem there are any simple skipping conditions

@iakovenkos iakovenkos marked this pull request as ready for review February 7, 2025 09:37
@iakovenkos iakovenkos self-assigned this Feb 7, 2025
@iakovenkos iakovenkos linked an issue Feb 7, 2025 that may be closed by this pull request
Copy link
Contributor

@ledwards2225 ledwards2225 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Overall LGTM - my two requests would be tests demonstrating the independence of the CIVC VK on the IVC inputs and some benchmark data showing the delta that results from this change.

@@ -516,7 +546,12 @@ class ECCVMFlavor {
const size_t num_rows =
std::max({ point_table_rows.size(), msm_rows.size(), transcript_rows.size() }) + MASKING_OFFSET;
const auto log_num_rows = static_cast<size_t>(numeric::get_msb64(num_rows));
const size_t dyadic_num_rows = 1UL << (log_num_rows + (1UL << log_num_rows == num_rows ? 0 : 1));

ASSERT(1UL << CONST_ECCVM_LOG_N > 1UL << (log_num_rows + (1UL << log_num_rows == num_rows ? 0 : 1)));
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Couple of suggestions here: 1) make well named variables for each of the expressions in these conditionals here so they're easier to digest. 2) For runtime checks, I usually just convert something like this to a
if (condition) {info("Relevant warning"); ASSERT(false);}. For now this is better than having nothing at all at runtime - in the future maybe we can improve the pattern further

precompute_select_shift, // column 24
transcript_accumulator_empty_shift, // column 23
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

column number comments are off here

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

thanks, fixed

entities.precompute_select, // column 24
entities.transcript_accumulator_empty, // column 23
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

also here

: Base(
// If we want a fixed size, use 2^(CONST_ECCVM_LOG_N).
// Otherwise, compute the real circuit size from the builder.
fixed_size ? (1UL << CONST_ECCVM_LOG_N)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this is another case where the logic is too complicated for a single inline conditional. I'd break it into separate readable variables

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

that's fair, changed the way it's initialized

@@ -92,6 +92,9 @@ class TranslatorProvingKey {

inline void compute_mini_circuit_dyadic_size(const Circuit& circuit)
{
// Check that the Translator Circuit does not exceed the fixed upper bound, the current value 8192 corresponds
// to 10 rounds of folding (i.e. 20 circuits)
ASSERT(circuit.num_gates < Flavor::MINIMUM_MINI_CIRCUIT_SIZE);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

can convert in the same way described above

* @brief Containter for transcript accumulators, they stand out as the only to-be-shifted wires that are always
* populated until the dyadic size of the circuit.
*/
template <typename DataType> class WireToBeShiftedAccumulatorEntities {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

General question: Are the updates to the flavors here just to coherently organize polynomials into groups that are independent/dependent on the "fixed size" for commitment efficiency?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That's right + wanted to avoid duplication.
In the commitment phase, the iteration was over the get_wires(), now its over get_wires_without_accumulators() (possibly short) and get_accumulators() (always max size).

{
PROFILE_THIS_NAME("ECCVMProver(CircuitBuilder&)");

// TODO(https://github.com/AztecProtocol/barretenberg/issues/939): Remove redundancy between
// ProvingKey/ProverPolynomials and update the model to reflect what's done in all other proving systems.

// Construct the proving key; populates all polynomials except for witness polys
key = std::make_shared<ProvingKey>(builder);
key = std::make_shared<ProvingKey>(builder, fixed_size);
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

the compiler was choosing the wrong constructor, so I added this condition

};

// Check that the Mega selectors are fixed.
compare_selectors(civc_vk_2.mega->get_selectors(), civc_vk_20.mega->get_selectors());
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is a nicely designed test but just checking the selectors here is in general not sufficient. For example, this would not catch a difference in copy constraints between the two circuits. The best thing to do is to simply check equality on the VKs themselves. At least for Mega, this requires first setting the pcs_verification_key = nullptr in both since in general that wont point to the same address. (See for example the test GenerateResetKernelVKFromConstraints). I assume there is a similar issue for the eccvm/translator

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

thanks for pointing this out

// Check that the ECCVM selectors are fixed.
compare_selectors(civc_vk_2.eccvm->get_all(), civc_vk_20.eccvm->get_all());
// Check the equality of the ECCVM components of the ClientIVC VKeys.
EXPECT_EQ(*civc_vk_2.eccvm.get(), *civc_vk_2.eccvm.get());
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks like youre checking vk_2 against itself here and below!

Copy link
Contributor

@ledwards2225 ledwards2225 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM pending passing tests!

@iakovenkos iakovenkos merged commit 1afddbd into master Feb 11, 2025
25 checks passed
@iakovenkos iakovenkos deleted the si/const_vk_client_ivc branch February 11, 2025 16:26
sklppy88 pushed a commit that referenced this pull request Feb 11, 2025
🤖 I have created a release *beep* *boop*
---


<details><summary>aztec-package: 0.76.2</summary>

##
[0.76.2](aztec-package-v0.76.1...aztec-package-v0.76.2)
(2025-02-11)


### Miscellaneous

* **logging:** Support explicit FORCE_COLOR parameter
([#11902](#11902))
([3b3f859](3b3f859))
</details>

<details><summary>barretenberg.js: 0.76.2</summary>

##
[0.76.2](barretenberg.js-v0.76.1...barretenberg.js-v0.76.2)
(2025-02-11)


### Miscellaneous

* **barretenberg.js:** Synchronize aztec-packages versions
</details>

<details><summary>aztec-packages: 0.76.2</summary>

##
[0.76.2](aztec-packages-v0.76.1...aztec-packages-v0.76.2)
(2025-02-11)


### Features

* Batch writes to the proving broker database
([#11900](#11900))
([608f887](608f887))


### Bug Fixes

* Cleanup also post test_kind.sh
([#11886](#11886))
([50cdb15](50cdb15))
* Dont skip wasm civc tests
([#11909](#11909))
([0395e0b](0395e0b))
* Note hash collision
([#11869](#11869))
([f289b7c](f289b7c))
* Orchestrator test
([#11901](#11901))
([f1bb51c](f1bb51c))
* Smt_verification: negative bitvecs, changed gates indicies.
acir_formal_proofs: noir-style signed division
([#11649](#11649))
([4146496](4146496))
* Update path of stern logs
([#11906](#11906))
([05afb5b](05afb5b))


### Miscellaneous

* Arm runner start fix
([#11903](#11903))
([6c83c40](6c83c40))
* Fixing the sizes of VMs in CIVC
([#11793](#11793))
([1afddbd](1afddbd))
* **logging:** Support explicit FORCE_COLOR parameter
([#11902](#11902))
([3b3f859](3b3f859))
* Misc fixes to devnet deploy flow
([#11738](#11738))
([bc4cca7](bc4cca7))
* Remove warnings from noir protocol circuits
([#11803](#11803))
([c6cc3d3](c6cc3d3))
* Replace relative paths to noir-protocol-circuits
([74d6e6a](74d6e6a))
* Replacing use of capsules 1.0 with pxe_db + nuking capsules 1.0
([#11885](#11885))
([72be678](72be678))
</details>

<details><summary>barretenberg: 0.76.2</summary>

##
[0.76.2](barretenberg-v0.76.1...barretenberg-v0.76.2)
(2025-02-11)


### Bug Fixes

* Note hash collision
([#11869](#11869))
([f289b7c](f289b7c))
* Smt_verification: negative bitvecs, changed gates indicies.
acir_formal_proofs: noir-style signed division
([#11649](#11649))
([4146496](4146496))


### Miscellaneous

* Fixing the sizes of VMs in CIVC
([#11793](#11793))
([1afddbd](1afddbd))
</details>

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).
AztecBot added a commit to AztecProtocol/barretenberg that referenced this pull request Feb 12, 2025
🤖 I have created a release *beep* *boop*
---


<details><summary>aztec-package: 0.76.2</summary>

##
[0.76.2](AztecProtocol/aztec-packages@aztec-package-v0.76.1...aztec-package-v0.76.2)
(2025-02-11)


### Miscellaneous

* **logging:** Support explicit FORCE_COLOR parameter
([#11902](AztecProtocol/aztec-packages#11902))
([3b3f859](AztecProtocol/aztec-packages@3b3f859))
</details>

<details><summary>barretenberg.js: 0.76.2</summary>

##
[0.76.2](AztecProtocol/aztec-packages@barretenberg.js-v0.76.1...barretenberg.js-v0.76.2)
(2025-02-11)


### Miscellaneous

* **barretenberg.js:** Synchronize aztec-packages versions
</details>

<details><summary>aztec-packages: 0.76.2</summary>

##
[0.76.2](AztecProtocol/aztec-packages@aztec-packages-v0.76.1...aztec-packages-v0.76.2)
(2025-02-11)


### Features

* Batch writes to the proving broker database
([#11900](AztecProtocol/aztec-packages#11900))
([608f887](AztecProtocol/aztec-packages@608f887))


### Bug Fixes

* Cleanup also post test_kind.sh
([#11886](AztecProtocol/aztec-packages#11886))
([50cdb15](AztecProtocol/aztec-packages@50cdb15))
* Dont skip wasm civc tests
([#11909](AztecProtocol/aztec-packages#11909))
([0395e0b](AztecProtocol/aztec-packages@0395e0b))
* Note hash collision
([#11869](AztecProtocol/aztec-packages#11869))
([f289b7c](AztecProtocol/aztec-packages@f289b7c))
* Orchestrator test
([#11901](AztecProtocol/aztec-packages#11901))
([f1bb51c](AztecProtocol/aztec-packages@f1bb51c))
* Smt_verification: negative bitvecs, changed gates indicies.
acir_formal_proofs: noir-style signed division
([#11649](AztecProtocol/aztec-packages#11649))
([4146496](AztecProtocol/aztec-packages@4146496))
* Update path of stern logs
([#11906](AztecProtocol/aztec-packages#11906))
([05afb5b](AztecProtocol/aztec-packages@05afb5b))


### Miscellaneous

* Arm runner start fix
([#11903](AztecProtocol/aztec-packages#11903))
([6c83c40](AztecProtocol/aztec-packages@6c83c40))
* Fixing the sizes of VMs in CIVC
([#11793](AztecProtocol/aztec-packages#11793))
([1afddbd](AztecProtocol/aztec-packages@1afddbd))
* **logging:** Support explicit FORCE_COLOR parameter
([#11902](AztecProtocol/aztec-packages#11902))
([3b3f859](AztecProtocol/aztec-packages@3b3f859))
* Misc fixes to devnet deploy flow
([#11738](AztecProtocol/aztec-packages#11738))
([bc4cca7](AztecProtocol/aztec-packages@bc4cca7))
* Remove warnings from noir protocol circuits
([#11803](AztecProtocol/aztec-packages#11803))
([c6cc3d3](AztecProtocol/aztec-packages@c6cc3d3))
* Replace relative paths to noir-protocol-circuits
([74d6e6a](AztecProtocol/aztec-packages@74d6e6a))
* Replacing use of capsules 1.0 with pxe_db + nuking capsules 1.0
([#11885](AztecProtocol/aztec-packages#11885))
([72be678](AztecProtocol/aztec-packages@72be678))
</details>

<details><summary>barretenberg: 0.76.2</summary>

##
[0.76.2](AztecProtocol/aztec-packages@barretenberg-v0.76.1...barretenberg-v0.76.2)
(2025-02-11)


### Bug Fixes

* Note hash collision
([#11869](AztecProtocol/aztec-packages#11869))
([f289b7c](AztecProtocol/aztec-packages@f289b7c))
* Smt_verification: negative bitvecs, changed gates indicies.
acir_formal_proofs: noir-style signed division
([#11649](AztecProtocol/aztec-packages#11649))
([4146496](AztecProtocol/aztec-packages@4146496))


### Miscellaneous

* Fixing the sizes of VMs in CIVC
([#11793](AztecProtocol/aztec-packages#11793))
([1afddbd](AztecProtocol/aztec-packages@1afddbd))
</details>

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Fixed ECCVM/Translator circuit size
2 participants