Skip to content

Commit 420d6f2

Browse files
ceno-cli conntinuation proofs e2e (#1094)
Build on top of #1092 ### change scopes - [x] verify api for continuation proofs - [x] exclude init tables on shard > 0 - [x] ceno-cli with multiple proofs - [x] separate fixed commitment into 2 set, one for first shard, the other for non-first shards - [x] multi-shards ci integration test ### design rationales `prover_id` and `num_provers` are exposed as CLI arguments to specify the number of physical provers in a cluster, each mark with a prover_id. The overall trace data is divided into `shards`, which are distributed evenly among the provers. The number of shards are in general agnostic to number of provers. Each prover is assigned `n` shard where n can be even empty Shard distribution follows a balanced allocation strategy — for example, if there are 10 shards and 3 provers, the shard counts will be distributed as 4, 3, and 3, ensuring an even workload across all provers. --------- Co-authored-by: xkx <[email protected]>
1 parent 284b176 commit 420d6f2

File tree

34 files changed

+1416
-709
lines changed

34 files changed

+1416
-709
lines changed

.github/workflows/integration.yml

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,18 @@ jobs:
6363
RUSTFLAGS: "-C opt-level=3"
6464
run: cargo run --release --package ceno_zkvm --bin e2e -- --platform=ceno --hints=10 --public-io=4191 examples/target/riscv32im-ceno-zkvm-elf/release/examples/fibonacci
6565

66+
- name: Run 3 shards fibonacci (debug)
67+
env:
68+
RUST_LOG: debug
69+
RUSTFLAGS: "-C opt-level=3"
70+
MOCK_PROVING: 1
71+
run: cargo run --package ceno_zkvm --features sanity-check --bin e2e -- --platform=ceno --min-cycle-per-shard=10 --max-cycle-per-shard=20000 --hints=10 --public-io=4191 examples/target/riscv32im-ceno-zkvm-elf/debug/examples/fibonacci
72+
73+
- name: Run 3 shards fibonacci (release)
74+
env:
75+
RUSTFLAGS: "-C opt-level=3"
76+
run: cargo run --release --package ceno_zkvm --features sanity-check --bin e2e -- --platform=ceno --min-cycle-per-shard=10 --max-cycle-per-shard=20000 --hints=10 --public-io=4191 examples/target/riscv32im-ceno-zkvm-elf/release/examples/fibonacci
77+
6678
# note: the global chip does not support goldilocks field yet
6779
# - name: Run fibonacci (release + goldilocks)
6880
# env:
@@ -81,6 +93,18 @@ jobs:
8193
RUSTFLAGS: "-C opt-level=3"
8294
run: cargo run --release --package ceno_zkvm --bin e2e -- --platform=ceno examples/target/riscv32im-ceno-zkvm-elf/release/examples/ceno_rt_alloc
8395

96+
- name: Run 3 shards Guest Heap Alloc (debug)
97+
env:
98+
RUST_LOG: debug
99+
RUSTFLAGS: "-C opt-level=3"
100+
MOCK_PROVING: 1
101+
run: cargo run --package ceno_zkvm --features sanity-check --bin e2e -- --platform=ceno --min-cycle-per-shard=10 --max-cycle-per-shard=300 examples/target/riscv32im-ceno-zkvm-elf/debug/examples/ceno_rt_alloc
102+
103+
- name: Run 3 shards Guest Heap Alloc (release)
104+
env:
105+
RUSTFLAGS: "-C opt-level=3"
106+
run: cargo run --release --package ceno_zkvm --bin e2e -- --platform=ceno --min-cycle-per-shard=10 --max-cycle-per-shard=1600 examples/target/riscv32im-ceno-zkvm-elf/release/examples/keccak_syscall
107+
84108
# note: the global chip does not support goldilocks field yet
85109
# - name: Run Guest Heap Alloc (release + goldilocks)
86110
# env:
@@ -92,6 +116,11 @@ jobs:
92116
RUSTFLAGS: "-C opt-level=3"
93117
run: cargo run --release --package ceno_zkvm --bin e2e -- --platform=ceno examples/target/riscv32im-ceno-zkvm-elf/release/examples/keccak_syscall
94118

119+
- name: Run 3 shard keccak_syscall (release)
120+
env:
121+
RUSTFLAGS: "-C opt-level=3"
122+
run: cargo run --release --package ceno_zkvm --bin e2e -- --platform=ceno --min-cycle-per-shard=10 --max-cycle-per-shard=1600 examples/target/riscv32im-ceno-zkvm-elf/release/examples/keccak_syscall
123+
95124
- name: Run secp256k1_add_syscall (release)
96125
env:
97126
RUSTFLAGS: "-C opt-level=3"

ceno_cli/src/commands/common_args/ceno.rs

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -78,13 +78,21 @@ pub struct CenoOptions {
7878
#[arg(long)]
7979
pub out_vk: Option<PathBuf>,
8080

81-
/// shard id
81+
/// prover id
8282
#[arg(long, default_value = "0")]
83-
shard_id: u32,
83+
prover_id: u32,
8484

85-
/// number of total shards.
85+
/// number of available prover.
8686
#[arg(long, default_value = "1")]
87-
max_num_shards: u32,
87+
num_provers: u32,
88+
89+
// min cycle per shard
90+
#[arg(long, default_value = "16777216")] // 16777216 = 2^24
91+
min_cycle_per_shard: u64,
92+
93+
// max cycle per shard
94+
#[arg(long, default_value = "536870912")] // 536870912 = 2^29
95+
max_cycle_per_shard: u64,
8896

8997
/// Profiling granularity.
9098
/// Setting any value restricts logs to profiling information
@@ -345,7 +353,12 @@ fn run_elf_inner<
345353
std::fs::read(elf_path).context(format!("failed to read {}", elf_path.display()))?;
346354
let program = Program::load_elf(&elf_bytes, u32::MAX).context("failed to load elf")?;
347355
print_cargo_message("Loaded", format_args!("{}", elf_path.display()));
348-
let shards = Shards::new(options.shard_id as usize, options.max_num_shards as usize);
356+
let multi_prover = MultiProver::new(
357+
options.prover_id as usize,
358+
options.num_provers as usize,
359+
options.min_cycle_per_shard,
360+
options.max_cycle_per_shard,
361+
);
349362

350363
let public_io = options
351364
.read_public_io()
@@ -394,7 +407,7 @@ fn run_elf_inner<
394407
create_prover(backend.clone()),
395408
program,
396409
platform,
397-
shards,
410+
multi_prover,
398411
&hints,
399412
&public_io,
400413
options.max_steps,
@@ -439,12 +452,12 @@ fn prove_inner<
439452
checkpoint: Checkpoint,
440453
) -> anyhow::Result<()> {
441454
let result = run_elf_inner::<E, PCS, P>(args, compilation_options, elf_path, checkpoint)?;
442-
let zkvm_proof = result.proof.expect("PrepSanityCheck should yield proof.");
455+
let zkvm_proofs = result.proofs.expect("PrepSanityCheck should yield proof.");
443456
let vk = result.vk.expect("PrepSanityCheck should yield vk.");
444457

445458
let start = std::time::Instant::now();
446459
let verifier = ZKVMVerifier::new(vk);
447-
if let Err(e) = verify(&zkvm_proof, &verifier) {
460+
if let Err(e) = verify(zkvm_proofs.clone(), &verifier) {
448461
bail!("Verification failed: {e:?}");
449462
}
450463
print_cargo_message(
@@ -457,7 +470,7 @@ fn prove_inner<
457470
print_cargo_message("Writing", format_args!("proof to {}", path.display()));
458471
let proof_file =
459472
File::create(&path).context(format!("failed to create {}", path.display()))?;
460-
bincode::serialize_into(proof_file, &zkvm_proof)
473+
bincode::serialize_into(proof_file, &zkvm_proofs)
461474
.context("failed to serialize zkvm proof")?;
462475
}
463476
if let Some(out_vk) = args.out_vk.as_ref() {

ceno_cli/src/commands/verify.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ fn run_inner<E: ExtensionField, PCS: PolynomialCommitmentScheme<E> + Serialize>(
5353
) -> anyhow::Result<()> {
5454
let start = std::time::Instant::now();
5555

56-
let zkvm_proof: ZKVMProof<E, PCS> =
56+
let zkvm_proofs: Vec<ZKVMProof<E, PCS>> =
5757
bincode::deserialize_from(File::open(&args.proof).context("Failed to open proof file")?)
5858
.context("Failed to deserialize proof file")?;
5959
print_cargo_message(
@@ -80,7 +80,7 @@ fn run_inner<E: ExtensionField, PCS: PolynomialCommitmentScheme<E> + Serialize>(
8080

8181
let start = std::time::Instant::now();
8282
let verifier = ZKVMVerifier::new(vk);
83-
if let Err(e) = verify(&zkvm_proof, &verifier) {
83+
if let Err(e) = verify(zkvm_proofs, &verifier) {
8484
bail!("Verification failed: {e:?}");
8585
}
8686

ceno_zkvm/benches/fibonacci.rs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ use criterion::*;
1313
use ff_ext::BabyBearExt4;
1414
use gkr_iop::cpu::default_backend_config;
1515

16-
use ceno_zkvm::{e2e::Shards, scheme::verifier::ZKVMVerifier};
16+
use ceno_zkvm::{e2e::MultiProver, scheme::verifier::ZKVMVerifier};
1717
use mpcs::BasefoldDefault;
1818
use transcript::BasicTranscript;
1919

@@ -54,13 +54,16 @@ fn fibonacci_prove(c: &mut Criterion) {
5454
create_prover(backend.clone()),
5555
program.clone(),
5656
platform.clone(),
57-
Shards::default(),
57+
MultiProver::default(),
5858
&Vec::from(&hints),
5959
&[],
6060
max_steps,
6161
Checkpoint::Complete,
6262
);
63-
let proof = result.proof.expect("PrepSanityCheck do not provide proof");
63+
let proof = result
64+
.proofs
65+
.expect("PrepSanityCheck do not provide proof")
66+
.remove(0);
6467
let vk = result.vk.expect("PrepSanityCheck do not provide verifier");
6568

6669
println!("e2e proof {}", proof);
@@ -92,7 +95,7 @@ fn fibonacci_prove(c: &mut Criterion) {
9295
create_prover(backend.clone()),
9396
program.clone(),
9497
platform.clone(),
95-
Shards::default(),
98+
MultiProver::default(),
9699
&Vec::from(&hints),
97100
&[],
98101
max_steps,

ceno_zkvm/benches/fibonacci_witness.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ use std::{fs, path::PathBuf, time::Duration};
99
mod alloc;
1010
use criterion::*;
1111

12-
use ceno_zkvm::e2e::Shards;
12+
use ceno_zkvm::e2e::MultiProver;
1313
use ff_ext::BabyBearExt4;
1414
use gkr_iop::cpu::default_backend_config;
1515
use mpcs::BasefoldDefault;
@@ -66,7 +66,7 @@ fn fibonacci_witness(c: &mut Criterion) {
6666
create_prover(backend.clone()),
6767
program.clone(),
6868
platform.clone(),
69-
Shards::default(),
69+
MultiProver::default(),
7070
&Vec::from(&hints),
7171
&[],
7272
max_steps,

ceno_zkvm/benches/is_prime.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ use ceno_zkvm::{
88
scheme::{create_backend, create_prover},
99
};
1010
mod alloc;
11-
use ceno_zkvm::e2e::Shards;
11+
use ceno_zkvm::e2e::MultiProver;
1212
use criterion::*;
1313
use ff_ext::BabyBearExt4;
1414
use gkr_iop::cpu::default_backend_config;
@@ -63,7 +63,7 @@ fn is_prime_1(c: &mut Criterion) {
6363
create_prover(backend.clone()),
6464
program.clone(),
6565
platform.clone(),
66-
Shards::default(),
66+
MultiProver::default(),
6767
&hints,
6868
&[],
6969
max_steps,

ceno_zkvm/benches/keccak.rs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ use ceno_zkvm::{
88
scheme::{create_backend, create_prover},
99
};
1010
mod alloc;
11-
use ceno_zkvm::{e2e::Shards, scheme::verifier::ZKVMVerifier};
11+
use ceno_zkvm::{e2e::MultiProver, scheme::verifier::ZKVMVerifier};
1212
use criterion::*;
1313
use ff_ext::BabyBearExt4;
1414
use gkr_iop::cpu::default_backend_config;
@@ -51,13 +51,16 @@ fn keccak_prove(c: &mut Criterion) {
5151
create_prover(backend.clone()),
5252
program.clone(),
5353
platform.clone(),
54-
Shards::default(),
54+
MultiProver::default(),
5555
&Vec::from(&hints),
5656
&[],
5757
max_steps,
5858
Checkpoint::Complete,
5959
);
60-
let proof = result.proof.expect("PrepSanityCheck do not provide proof");
60+
let proof = result
61+
.proofs
62+
.expect("PrepSanityCheck do not provide proof")
63+
.remove(0);
6164
let vk = result.vk.expect("PrepSanityCheck do not provide verifier");
6265

6366
println!("e2e proof {}", proof);
@@ -86,7 +89,7 @@ fn keccak_prove(c: &mut Criterion) {
8689
create_prover(backend.clone()),
8790
program.clone(),
8891
platform.clone(),
89-
Shards::default(),
92+
MultiProver::default(),
9093
&Vec::from(&hints),
9194
&[],
9295
max_steps,

ceno_zkvm/benches/quadratic_sorting.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ use ceno_zkvm::{
88
scheme::{create_backend, create_prover},
99
};
1010
mod alloc;
11-
use ceno_zkvm::e2e::Shards;
11+
use ceno_zkvm::e2e::MultiProver;
1212
use criterion::*;
1313
use ff_ext::BabyBearExt4;
1414
use gkr_iop::cpu::default_backend_config;
@@ -64,7 +64,7 @@ fn quadratic_sorting_1(c: &mut Criterion) {
6464
create_prover(backend.clone()),
6565
program.clone(),
6666
platform.clone(),
67-
Shards::default(),
67+
MultiProver::default(),
6868
&hints,
6969
&[],
7070
max_steps,

ceno_zkvm/benches/riscv_add.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ fn bench_add(c: &mut Criterion) {
5555

5656
let pk = zkvm_cs
5757
.clone()
58-
.key_gen::<Pcs>(pp, vp, zkvm_fixed_traces)
58+
.key_gen::<Pcs>(pp, vp, 0, zkvm_fixed_traces)
5959
.expect("keygen failed");
6060

6161
let (max_num_variables, security_level) = default_backend_config();

0 commit comments

Comments
 (0)