-
Notifications
You must be signed in to change notification settings - Fork 237
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
feat: IVC bench #4515
Merged
Merged
feat: IVC bench #4515
Changes from all commits
Commits
Show all changes
32 commits
Select commit
Hold shift + click to select a range
38a7327
gob recusion test with goblin.merge
ledwards2225 d5c3dbe
new folding test suite
ledwards2225 1b25736
Merge branch 'master' into lde/goblin_with_folding
ledwards2225 bb08bbe
Merge branch 'master' into lde/goblin_with_folding
ledwards2225 bb728f7
WiP; cant fold recursive folding verifier circuit
ledwards2225 81a5a93
Don't destroy shared_ptr; hack around different PI sizes.
codygunton 668caca
Cleanup (Ultra already decided yeah?)
codygunton 2be164d
Touch up example
codygunton ec5cf1f
Fix size printing
codygunton 0b9e153
Move to new Bb module
codygunton 7e1d64c
Use correct suite name
codygunton a67f8a2
Pseudocode
codygunton 68f3e89
functionality in place; cleanup needed
ledwards2225 0690ac8
ivc prove and verify methods
ledwards2225 2a72e9e
Merge branch 'master' into lde/goblin_with_folding
ledwards2225 a69d34c
Cleanup and commenting
ledwards2225 600a17b
Merge branch 'master' into lde/goblin_with_folding
ledwards2225 416097a
verify final fold proof + typo
ledwards2225 cf24036
Merge branch 'master' into lde/goblin_with_folding
ledwards2225 f61b191
chaotic WiP
ledwards2225 54db43d
updates based on review
ledwards2225 56c02f0
Merge branch 'master' into lde/goblin_with_folding
ledwards2225 66a65fd
Merge branch 'lde/goblin_with_folding' into lde/ivc_bench
ledwards2225 af684ee
ivc bench is building
ledwards2225 57799db
Merge branch 'master' into lde/ivc_bench
ledwards2225 aa614d6
basic full ivc bench in place
ledwards2225 292543b
more benches plus pinning test
ledwards2225 42b3a04
kill prints
ledwards2225 b2587db
Merge branch 'master' into lde/ivc_bench
ledwards2225 0e404bc
cleanup
ledwards2225 93a2470
more cleanup
ledwards2225 91fbbfb
move folding kernel pinning to ivc
ledwards2225 File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,10 +1,11 @@ | ||
add_subdirectory(basics_bench) | ||
add_subdirectory(decrypt_bench) | ||
add_subdirectory(goblin_bench) | ||
add_subdirectory(ipa_bench) | ||
add_subdirectory(ivc_bench) | ||
add_subdirectory(pippenger_bench) | ||
add_subdirectory(plonk_bench) | ||
add_subdirectory(ultra_bench) | ||
add_subdirectory(goblin_bench) | ||
add_subdirectory(basics_bench) | ||
add_subdirectory(protogalaxy_bench) | ||
add_subdirectory(relations_bench) | ||
add_subdirectory(widgets_bench) | ||
add_subdirectory(protogalaxy_bench) | ||
add_subdirectory(ultra_bench) | ||
add_subdirectory(widgets_bench) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
1 change: 1 addition & 0 deletions
1
barretenberg/cpp/src/barretenberg/benchmark/ivc_bench/CMakeLists.txt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
barretenberg_module(ivc_bench client_ivc stdlib_recursion stdlib_sha256 stdlib_merkle_tree stdlib_primitives) |
178 changes: 178 additions & 0 deletions
178
barretenberg/cpp/src/barretenberg/benchmark/ivc_bench/ivc.bench.cpp
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,178 @@ | ||
|
||
#include <benchmark/benchmark.h> | ||
|
||
#include "barretenberg/benchmark/ultra_bench/mock_proofs.hpp" | ||
#include "barretenberg/client_ivc/client_ivc.hpp" | ||
#include "barretenberg/common/op_count_google_bench.hpp" | ||
#include "barretenberg/goblin/goblin.hpp" | ||
#include "barretenberg/goblin/mock_circuits.hpp" | ||
#include "barretenberg/proof_system/circuit_builder/ultra_circuit_builder.hpp" | ||
#include "barretenberg/ultra_honk/ultra_composer.hpp" | ||
|
||
using namespace benchmark; | ||
using namespace bb; | ||
|
||
namespace { | ||
|
||
/** | ||
* @brief Benchmark suite for the aztec client PG-Goblin IVC scheme | ||
* | ||
*/ | ||
class IvcBench : public benchmark::Fixture { | ||
public: | ||
using Builder = GoblinUltraCircuitBuilder; | ||
|
||
// Number of function circuits to accumulate(based on Zacs target numbers) | ||
static constexpr size_t NUM_ITERATIONS_MEDIUM_COMPLEXITY = 6; | ||
|
||
void SetUp([[maybe_unused]] const ::benchmark::State& state) override | ||
{ | ||
bb::srs::init_crs_factory("../srs_db/ignition"); | ||
bb::srs::init_grumpkin_crs_factory("../srs_db/grumpkin"); | ||
} | ||
|
||
/** | ||
* @brief Perform a specified number of function circuit accumulation rounds | ||
* @details Each round "accumulates" a mock function circuit and a mock kernel circuit. Each round thus consists of | ||
* the generation of two circuits, two folding proofs and two Merge proofs. To match the sizes called out in the | ||
* spec | ||
* (https://github.com/AztecProtocol/aztec-packages/blob/master/yellow-paper/docs/cryptography/performance-targets.md) | ||
* we set the size of the function circuit to be 2^17. The first one should be 2^19 but we can't currently support | ||
* folding circuits of unequal size. | ||
* | ||
*/ | ||
static void perform_ivc_accumulation_rounds(State& state, ClientIVC& ivc) | ||
{ | ||
// Initialize IVC with function circuit | ||
Builder function_circuit{ ivc.goblin.op_queue }; | ||
GoblinMockCircuits::construct_mock_function_circuit(function_circuit); | ||
ivc.initialize(function_circuit); | ||
|
||
// Accumulate kernel circuit (first kernel mocked as simple circuit since no folding proofs yet) | ||
Builder kernel_circuit{ ivc.goblin.op_queue }; | ||
GoblinMockCircuits::construct_mock_function_circuit(kernel_circuit); | ||
auto kernel_fold_proof = ivc.accumulate(kernel_circuit); | ||
|
||
auto NUM_CIRCUITS = static_cast<size_t>(state.range(0)); | ||
NUM_CIRCUITS -= 1; // Subtract one to account for the "initialization" round above | ||
for (size_t circuit_idx = 0; circuit_idx < NUM_CIRCUITS; ++circuit_idx) { | ||
|
||
// Accumulate function circuit | ||
Builder function_circuit{ ivc.goblin.op_queue }; | ||
GoblinMockCircuits::construct_mock_function_circuit(function_circuit); | ||
auto function_fold_proof = ivc.accumulate(function_circuit); | ||
|
||
// Accumulate kernel circuit | ||
Builder kernel_circuit{ ivc.goblin.op_queue }; | ||
GoblinMockCircuits::construct_mock_folding_kernel(kernel_circuit, function_fold_proof, kernel_fold_proof); | ||
auto kernel_fold_proof = ivc.accumulate(kernel_circuit); | ||
} | ||
} | ||
}; | ||
|
||
/** | ||
* @brief Benchmark the prover work for the full PG-Goblin IVC protocol | ||
* | ||
*/ | ||
BENCHMARK_DEFINE_F(IvcBench, Full)(benchmark::State& state) | ||
{ | ||
ClientIVC ivc; | ||
|
||
for (auto _ : state) { | ||
BB_REPORT_OP_COUNT_IN_BENCH(state); | ||
// Perform a specified number of iterations of function/kernel accumulation | ||
perform_ivc_accumulation_rounds(state, ivc); | ||
|
||
// Construct IVC scheme proof (fold, decider, merge, eccvm, translator) | ||
ivc.prove(); | ||
} | ||
} | ||
|
||
/** | ||
* @brief Benchmark only the accumulation rounds | ||
* | ||
*/ | ||
BENCHMARK_DEFINE_F(IvcBench, Accumulate)(benchmark::State& state) | ||
{ | ||
ClientIVC ivc; | ||
|
||
// Perform a specified number of iterations of function/kernel accumulation | ||
for (auto _ : state) { | ||
perform_ivc_accumulation_rounds(state, ivc); | ||
} | ||
} | ||
|
||
/** | ||
* @brief Benchmark only the Decider component | ||
* | ||
*/ | ||
BENCHMARK_DEFINE_F(IvcBench, Decide)(benchmark::State& state) | ||
{ | ||
ClientIVC ivc; | ||
|
||
BB_REPORT_OP_COUNT_IN_BENCH(state); | ||
// Perform a specified number of iterations of function/kernel accumulation | ||
perform_ivc_accumulation_rounds(state, ivc); | ||
|
||
// Construct eccvm proof, measure only translator proof construction | ||
for (auto _ : state) { | ||
ivc.decider_prove(); | ||
} | ||
} | ||
|
||
/** | ||
* @brief Benchmark only the ECCVM component | ||
* | ||
*/ | ||
BENCHMARK_DEFINE_F(IvcBench, ECCVM)(benchmark::State& state) | ||
{ | ||
ClientIVC ivc; | ||
|
||
BB_REPORT_OP_COUNT_IN_BENCH(state); | ||
// Perform a specified number of iterations of function/kernel accumulation | ||
perform_ivc_accumulation_rounds(state, ivc); | ||
|
||
// Construct and measure eccvm only | ||
for (auto _ : state) { | ||
ivc.goblin.prove_eccvm(); | ||
} | ||
} | ||
|
||
/** | ||
* @brief Benchmark only the Translator component | ||
* | ||
*/ | ||
BENCHMARK_DEFINE_F(IvcBench, Translator)(benchmark::State& state) | ||
{ | ||
ClientIVC ivc; | ||
|
||
BB_REPORT_OP_COUNT_IN_BENCH(state); | ||
// Perform a specified number of iterations of function/kernel accumulation | ||
perform_ivc_accumulation_rounds(state, ivc); | ||
|
||
// Construct eccvm proof, measure only translator proof construction | ||
ivc.goblin.prove_eccvm(); | ||
for (auto _ : state) { | ||
ivc.goblin.prove_translator(); | ||
} | ||
} | ||
|
||
#define ARGS \ | ||
Arg(IvcBench::NUM_ITERATIONS_MEDIUM_COMPLEXITY) \ | ||
->Arg(1 << 0) \ | ||
->Arg(1 << 1) \ | ||
->Arg(1 << 2) \ | ||
->Arg(1 << 3) \ | ||
->Arg(1 << 4) \ | ||
->Arg(1 << 5) \ | ||
->Arg(1 << 6) | ||
|
||
BENCHMARK_REGISTER_F(IvcBench, Full)->Unit(benchmark::kMillisecond)->ARGS; | ||
BENCHMARK_REGISTER_F(IvcBench, Accumulate)->Unit(benchmark::kMillisecond)->ARGS; | ||
BENCHMARK_REGISTER_F(IvcBench, Decide)->Unit(benchmark::kMillisecond)->ARGS; | ||
BENCHMARK_REGISTER_F(IvcBench, ECCVM)->Unit(benchmark::kMillisecond)->ARGS; | ||
BENCHMARK_REGISTER_F(IvcBench, Translator)->Unit(benchmark::kMillisecond)->ARGS; | ||
|
||
} // namespace | ||
|
||
BENCHMARK_MAIN(); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
42 changes: 42 additions & 0 deletions
42
barretenberg/cpp/src/barretenberg/client_ivc/mock_kernel_pinning.test.cpp
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,42 @@ | ||
#include "barretenberg/client_ivc/client_ivc.hpp" | ||
#include "barretenberg/goblin/mock_circuits.hpp" | ||
#include "barretenberg/proof_system/circuit_builder/goblin_ultra_circuit_builder.hpp" | ||
#include "barretenberg/ultra_honk/ultra_composer.hpp" | ||
#include <gtest/gtest.h> | ||
|
||
using namespace bb; | ||
|
||
/** | ||
* @brief For benchmarking, we want to be sure that our mocking functions create circuits of a known size. We control | ||
* this, to the degree that matters for proof construction time, using these "pinning tests" that fix values. | ||
* | ||
*/ | ||
class MockKernelTest : public ::testing::Test { | ||
protected: | ||
static void SetUpTestSuite() { srs::init_crs_factory("../srs_db/ignition"); } | ||
}; | ||
|
||
TEST_F(MockKernelTest, PinFoldingKernelSizes) | ||
{ | ||
ClientIVC ivc; | ||
|
||
// Accumulate three circuits to generate two folding proofs for input to folding kernel | ||
GoblinUltraCircuitBuilder circuit_1{ ivc.goblin.op_queue }; | ||
GoblinMockCircuits::construct_mock_function_circuit(circuit_1); | ||
ivc.initialize(circuit_1); | ||
|
||
GoblinUltraCircuitBuilder circuit_2{ ivc.goblin.op_queue }; | ||
GoblinMockCircuits::construct_mock_function_circuit(circuit_2); | ||
auto fold_proof_1 = ivc.accumulate(circuit_2); | ||
|
||
GoblinUltraCircuitBuilder circuit_3{ ivc.goblin.op_queue }; | ||
GoblinMockCircuits::construct_mock_function_circuit(circuit_3); | ||
auto fold_proof_2 = ivc.accumulate(circuit_3); | ||
|
||
// Construct kernel circuit | ||
GoblinUltraCircuitBuilder kernel_circuit{ ivc.goblin.op_queue }; | ||
GoblinMockCircuits::construct_mock_folding_kernel(kernel_circuit, fold_proof_1, fold_proof_2); | ||
GoblinUltraComposer composer; | ||
auto instance = composer.create_instance(kernel_circuit); | ||
EXPECT_EQ(instance->proving_key->log_circuit_size, 17); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
added ivc_bench and alphabetized