add mobench support to ProveKit v1#430
Open
dcbuild3r wants to merge 1474 commits into
Open
Conversation
Unify the duplicated PrefixCovector struct and six shared functions (expand_powers, make_public_weight, build_prefix_covectors, compute_alpha_evals, compute_public_eval) from prover and verifier into a single implementation in provekit-common. The prover's vestigial 'deferred: bool' field (always false) is dropped. Also removes empty test modules from common/lib.rs.
…e helper Replace ~250 lines of near-identical AND/XOR match arms with a single process_binop_opcode method that handles all four operand combinations (witness/witness, constant/witness, witness/constant, constant/constant) and dispatches to the correct ops vector.
Verifier::verify() used self.whir_for_witness.take().unwrap() which would panic if called twice. Replace with .take().context() for a descriptive error message instead of a bare panic.
…notations Use destructuring in from_noir_proof_scheme for clearer construction. Add #[must_use] to public constructors and accessors (PublicInputs::new, from_vec, len, is_empty, hash, ConstantOrR1CSWitness::to_tuple, Prover/Verifier::from_noir_proof_scheme, size).
…itch to base64 - Parallelize right-multiply (A * witness) over rows via into_par_iter. Left-multiply intentionally stays sequential (38 MB per accumulator makes fold-reduce prohibitive; callers already parallelize via rayon::join). - Avoid redundant allocations in calculate_witness_bounds: compute C element-wise and resize a/b/c in-place instead of pad_to_power_of_two. - Switch human-readable serde encoding from hex (100% overhead) to base64 (33% overhead), cutting proof file size ~25%. Deserializer auto-detects hex for backwards compatibility.
…efault
- Remove empty #[cfg(test)] mod tests {} from prover, r1cs-compiler
- Remove commented-out 'pub mod file_io' from utils
- Fix verify.rs docstring ('Prove' -> 'Verify')
- Collapse split use-path in common/whir_r1cs.rs
- Align struct field formatting in r1cs-compiler/whir_r1cs.rs
- Disable jemalloc as default feature in CLI (opt-in instead)
- Switch whir dependency from local path (../../whir) to pinned git revision for reproducible builds. - Enable profiling-allocator as default CLI feature; make jemalloc depend on profiling-allocator.
… matrix ops Remove r1cs.clone() and alpha.clone() by taking references, add SparseMatrix::transpose() for parallel right-multiply, parallelize verifier key and proof file reads with rayon::join, truncate eq_alpha allocation to actual entry count, and take owned NoirProof to avoid proof clone. End-to-end verify drops from ~2s to ~510ms on complete_age_check.
…kward-compatible read
…te clones Consume objects as soon as they finish their job to reduce peak memory: - PrefixCovector: store only short alpha-weight prefix, zero-pad via logical_size (~192 MB savings vs full-domain Covector) - CompressedR1CS: serialize R1CS during commits, decompress at sumcheck (~61 MB savings during commit phase) - CompressedLayers: serialize w2_layers during commit_w1, decompress before solve_w2 (~271 MB savings during commit_w1) - Remove padded_witness from WhirR1CSCommitment, pass full_witness as parameter to prove() instead of cloning+storing - Shrink get_public_weights to tiny prefix (~64 MB savings) - Take ownership of alphas in create_weights to avoid copy+coexistence - Early drops: acir_map after solve_w2, witness consumed via into_iter - Extract solve_witness_vec as free function so layers drop on return - commit() takes (num_witnesses, num_constraints) instead of &R1CS - Work with raw Vec<FieldElement> instead of CoefficientList/EvaluationsList - Drop program and witness_generator after witness generation Global peak reduced from ~1.8 GB to ~1.22 GB for complete_age_check.
Update whir dependency from PR 217 (ec295ced) to PR 225 (d67518d1) which introduces an ownership-based prove() API with Cow parameters. Adapt provekit to the new API: wrap vectors/witnesses/evaluations in Cow::Owned, implement the new as_any() LinearForm requirement, and replace the removed Domain type in gnark_config with GeneralEvaluationDomain. Fix a pre-existing bug in PrefixCovector::mle_evaluate that used the wrong variable ordering for whir's big-endian MLE convention. The leading point variables select upper/lower array halves, so the (1-p) zero-padding factor must apply to point[..r] (head) with the prefix MLE evaluated at point[r..] (tail), not the reverse.
…cross-evals, PrefixCovector tests - Remove R1CSSolver trait, convert test_witness_satisfaction to free fn (#3) - Make w2_layers compression conditional on has_challenges (#4) - Parallelize cross-evaluation dot products with rayon::join (~12% prove speedup) (#6) - Add debug_assert in PrefixCovector::accumulate (#11) - Add PrefixCovector unit tests: size, mle_evaluate, accumulate, prefix=logical (#2) - Fix clippy: &mut Vec -> &mut [] in solve_witness_vec
Reduce proving memory
…256 compression functions
…optimize protocol
…ale TODO, use explicit type on flat
feat: port provekit to zkWHIR 2.0
This file contains hidden or 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
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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.
Summary
provespanAndroid mobench fix note
The earlier failing run was https://github.com/worldfnd/provekit/actions/runs/26002840796. The missing Vivo Y21 monolithic cell did not recover a BrowserStack session payload or
summary.json; available artifacts only show the BrowserStack fetch timeout after 7200s for buildb1ebace919a1b8cad3861313180ac9a18a7e461d. I grepped the recovered Android artifacts and job log forlowmemorykiller,Process * was killed,oom_reaper,SIGKILL, and abnormal signal text; there was no hit because BrowserStack did not return the killed session logs for that cell.Before/failure memory from that run:
What changed:
profile_phase("prove")wraps only the prover entry point. Previouslyprepared.clone()ran insideprofile_phase("prove"), so clone cost and peak memory were charged to proving.failure.jsonnow records attempts, fetch timeout seconds, build id, and any LMK/OOM/SIGKILL lines recovered from attempt/device logs.After numbers: pending the fresh BrowserStack rerun on this commit.
Validation
cargo fmt --allcargo test -p bench-mobile --libcargo test -p bench-mobile --test examples_smokecargo test -p bench-mobile --test passport_smokecargo check -p provekit-ffi --target aarch64-linux-androidwith NDK 26.1aarch64-linux-android34-clangruby -e 'require "yaml"; YAML.load_file(".github/workflows/mobile-bench-reusable.yml")'git diff --check