Skip to content

Commit 6fa878d

Browse files
author
Hanting Zhang
committed
checkpoint
1 parent 13fe808 commit 6fa878d

File tree

12 files changed

+7905
-58
lines changed

12 files changed

+7905
-58
lines changed

Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ tempfile = "3.6.0"
141141
camino = "1.1.6"
142142
thiserror = "1.0.44"
143143
tracing = "0.1.37"
144-
tracing-texray = "0.2.0"
144+
tracing-texray = { git = "https://github.com/winston-h-zhang/tracing-texray", branch = "shim" }
145145
tracing-subscriber = "0.3.17"
146146

147147
[[bin]]

benches/dev/600.txt

+1,691
Large diffs are not rendered by default.

benches/dev/900.txt

+3,132
Large diffs are not rendered by default.

benches/fibonacci.rs

+17-16
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,13 @@ use lurk::{
1313
field::LurkField,
1414
lem::{eval::evaluate, multiframe::MultiFrame, pointers::Ptr, store::Store},
1515
proof::nova::NovaProver,
16-
proof::Prover,
17-
public_parameters::{
18-
instance::{Instance, Kind},
19-
public_params,
20-
},
16+
proof::{nova::public_params, Prover},
2117
state::State,
2218
};
2319

20+
use tracing_subscriber::{fmt, prelude::*, EnvFilter, Registry};
21+
use tracing_texray::TeXRayLayer;
22+
2423
mod common;
2524
use common::set_bench_config;
2625

@@ -111,14 +110,8 @@ fn fibonacci_prove<M: measurement::Measurement>(
111110
let lang_pallas = Lang::<pallas::Scalar, Coproc<pallas::Scalar>>::new();
112111
let lang_rc = Arc::new(lang_pallas.clone());
113112

114-
// use cached public params
115-
let instance = Instance::new(
116-
prove_params.reduction_count,
117-
lang_rc.clone(),
118-
true,
119-
Kind::NovaPublicParams,
120-
);
121-
let pp = public_params::<_, _, MultiFrame<'_, _, _>>(&instance).unwrap();
113+
let pp =
114+
public_params::<_, _, MultiFrame<'_, _, _>>(prove_params.reduction_count, lang_rc.clone());
122115

123116
// Track the number of `Lurk frames / sec`
124117
let rc = prove_params.reduction_count as u64;
@@ -148,7 +141,8 @@ fn fibonacci_prove<M: measurement::Measurement>(
148141
b.iter_batched(
149142
|| frames,
150143
|frames| {
151-
let result = prover.prove(&pp, frames, &store);
144+
let result = tracing_texray::examine(tracing::info_span!("bang!"))
145+
.in_scope(|| prover.prove(&pp, frames, &store));
152146
let _ = black_box(result);
153147
},
154148
BatchSize::LargeInput,
@@ -159,12 +153,17 @@ fn fibonacci_prove<M: measurement::Measurement>(
159153

160154
fn fibonacci_benchmark(c: &mut Criterion) {
161155
// Uncomment to record the logs. May negatively impact performance
162-
//tracing_subscriber::fmt::init();
156+
let subscriber = Registry::default()
157+
.with(fmt::layer().pretty())
158+
.with(EnvFilter::from_default_env())
159+
.with(TeXRayLayer::new().width(120));
160+
tracing::subscriber::set_global_default(subscriber).unwrap();
161+
163162
set_bench_config();
164163
tracing::debug!("{:?}", lurk::config::LURK_CONFIG);
165164

166165
let reduction_counts = rc_env().unwrap_or_else(|_| vec![100]);
167-
let batch_sizes = [100, 200];
166+
let batch_sizes = [249, 374, 499];
168167

169168
let state = State::init_lurk_state().rccell();
170169

@@ -187,6 +186,8 @@ fn fibonacci_benchmark(c: &mut Criterion) {
187186
}
188187
}
189188

189+
// RUST_LOG=info LURK_RC=600 LURK_PERF=max-parallel-simple cargo criterion --bench fibonacci --features "cuda" 2> ./benches/gpu-spmvm/600.txt
190+
// RUST_LOG=info LURK_RC=900 LURK_PERF=max-parallel-simple cargo criterion --bench fibonacci --features "cuda" 2> ./benches/dev/900.txt
190191
cfg_if::cfg_if! {
191192
if #[cfg(feature = "flamegraph")] {
192193
criterion_group! {

benches/gpu-spmvm/1200.txt

+2,540
Large diffs are not rendered by default.

benches/gpu-spmvm/600.txt

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Compiling sppark v0.1.5
2+
Compiling pasta-msm v0.1.4 (https://github.com/lurk-lab/pasta-msm?branch=dev#182b971d)

benches/gpu-spmvm/900.txt

+423
Large diffs are not rendered by default.

examples/fibonacci.rs

+91-35
Original file line numberDiff line numberDiff line change
@@ -1,64 +1,120 @@
1+
use std::{cell::RefCell, rc::Rc, sync::Arc, time::Duration};
2+
3+
use anyhow::anyhow;
4+
5+
use pasta_curves::pallas;
6+
17
use lurk::{
8+
eval::lang::{Coproc, Lang},
29
field::LurkField,
3-
lem::{eval::evaluate_simple, pointers::Ptr, store::Store},
4-
{eval::lang::Coproc, state::State},
10+
lem::{eval::evaluate, multiframe::MultiFrame, pointers::Ptr, store::Store},
11+
proof::Prover,
12+
proof::{nova::NovaProver, RecursiveSNARKTrait},
13+
public_parameters::{
14+
instance::{Instance, Kind},
15+
public_params,
16+
},
17+
state::State,
518
};
6-
use pasta_curves::Fq;
719

8-
fn fib_expr<F: LurkField>(store: &Store<F>) -> Ptr {
20+
use tracing_subscriber::{fmt, prelude::*, EnvFilter, Registry};
21+
use tracing_texray::TeXRayLayer;
22+
23+
fn fib<F: LurkField>(store: &Store<F>, state: Rc<RefCell<State>>, _a: u64) -> Ptr {
924
let program = r#"
1025
(letrec ((next (lambda (a b) (next b (+ a b))))
1126
(fib (next 0 1)))
1227
(fib))
1328
"#;
1429

15-
store.read_with_default_state(program).unwrap()
30+
store.read(state, program).unwrap()
1631
}
1732

18-
// The env output in the `fib_frame`th frame of the above, infinite Fibonacci computation contains a binding of the
33+
// The env output in the `fib_frame`th frame of the above, infinite Fibonacci computation will contain a binding of the
1934
// nth Fibonacci number to `a`.
35+
// means of computing it.]
2036
fn fib_frame(n: usize) -> usize {
2137
11 + 16 * n
2238
}
2339

2440
// Set the limit so the last step will be filled exactly, since Lurk currently only pads terminal/error continuations.
25-
#[allow(dead_code)]
2641
fn fib_limit(n: usize, rc: usize) -> usize {
2742
let frame = fib_frame(n);
2843
rc * (frame / rc + usize::from(frame % rc != 0))
2944
}
3045

31-
fn lurk_fib(store: &Store<Fq>, n: usize, _rc: usize) -> Ptr {
32-
let frame_idx = fib_frame(n);
33-
// let limit = fib_limit(n, rc);
34-
let limit = frame_idx;
35-
let fib_expr = fib_expr(store);
36-
37-
let (output, ..) = evaluate_simple::<Fq, Coproc<Fq>>(None, fib_expr, store, limit).unwrap();
38-
39-
let target_env = &output[1];
40-
41-
// The result is the value of the second binding (of `A`), in the target env.
42-
// See relevant excerpt of execution trace below:
43-
//
44-
// INFO lurk::eval > Frame: 11
45-
// Expr: (NEXT B (+ A B))
46-
// Env: ((B . 1) (A . 0) ((NEXT . <FUNCTION (A) (LAMBDA (B) (NEXT B (+ A B)))>)))
47-
// Cont: Tail{ saved_env: (((NEXT . <FUNCTION (A) (LAMBDA (B) (NEXT B (+ A B)))>))), continuation: LetRec{var: FIB,
48-
// saved_env: (((NEXT . <FUNCTION (A) (LAMBDA (B) (NEXT B (+ A B)))>))), body: (FIB), continuation: Tail{ saved_env:
49-
// NIL, continuation: Outermost } } }
50-
51-
let (_, rest_bindings) = store.car_cdr(target_env).unwrap();
52-
let (second_binding, _) = store.car_cdr(&rest_bindings).unwrap();
53-
store.car_cdr(&second_binding).unwrap().1
46+
#[derive(Clone, Debug, Copy)]
47+
struct ProveParams {
48+
fib_n: usize,
49+
rc: usize,
5450
}
5551

52+
fn rc_env() -> anyhow::Result<Vec<usize>> {
53+
std::env::var("LURK_RC")
54+
.map_err(|e| anyhow!("Reduction count env var isn't set: {e}"))
55+
.and_then(|rc| {
56+
let vec: anyhow::Result<Vec<usize>> = rc
57+
.split(',')
58+
.map(|rc| {
59+
rc.parse::<usize>()
60+
.map_err(|e| anyhow!("Failed to parse RC: {e}"))
61+
})
62+
.collect();
63+
vec
64+
})
65+
}
66+
67+
fn fibonacci_prove(prove_params: ProveParams, state: &Rc<RefCell<State>>) {
68+
let limit = fib_limit(prove_params.fib_n, prove_params.rc);
69+
let lang_pallas = Lang::<pallas::Scalar, Coproc<pallas::Scalar>>::new();
70+
let lang_rc = Arc::new(lang_pallas.clone());
71+
72+
// use cached public params
73+
let instance = Instance::new(
74+
prove_params.rc,
75+
lang_rc.clone(),
76+
true,
77+
Kind::NovaPublicParams,
78+
);
79+
let pp = public_params::<_, _, MultiFrame<'_, _, _>>(&instance).unwrap();
80+
81+
let store = Store::default();
82+
83+
let ptr = fib::<pasta_curves::Fq>(&store, state.clone(), prove_params.fib_n as u64);
84+
let prover = NovaProver::new(prove_params.rc, lang_rc.clone());
85+
86+
let frames = &evaluate::<pasta_curves::Fq, Coproc<pasta_curves::Fq>>(None, ptr, &store, limit)
87+
.unwrap()
88+
.0;
89+
let (proof, z0, zi, num_steps) = tracing_texray::examine(tracing::info_span!("bang!"))
90+
.in_scope(|| prover.prove(&pp, frames, &store).unwrap());
91+
92+
let res = proof.verify(&pp, &z0, &zi, num_steps).unwrap();
93+
assert!(res);
94+
}
95+
96+
/// RUST_LOG=info LURK_RC=900 LURK_PERF=max-parallel-simple cargo run --release --example fibonacci --features "cuda"
5697
fn main() {
57-
let store = &Store::<Fq>::default();
58-
let n: usize = std::env::args().collect::<Vec<_>>()[1].parse().unwrap();
59-
let state = State::init_lurk_state();
98+
let subscriber = Registry::default()
99+
.with(fmt::layer().pretty())
100+
.with(EnvFilter::from_default_env())
101+
.with(TeXRayLayer::new().width(120));
102+
tracing::subscriber::set_global_default(subscriber).unwrap();
103+
104+
let rcs = rc_env().unwrap_or_else(|_| vec![100]);
105+
let batch_sizes = [249];
106+
107+
let state = State::init_lurk_state().rccell();
60108

61-
let fib = lurk_fib(store, n, 100);
109+
for rc in rcs.iter() {
110+
for fib_n in batch_sizes.iter() {
111+
let prove_params = ProveParams {
112+
fib_n: *fib_n,
113+
rc: *rc,
114+
};
115+
fibonacci_prove(prove_params, &state);
116+
}
117+
}
62118

63-
println!("Fib({n}) = {}", fib.fmt_to_string(store, &state));
119+
println!("success");
64120
}

src/lem/eval.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -96,15 +96,15 @@ fn build_frames<
9696
let mut pc = 0;
9797
let mut frames = vec![];
9898
let mut iterations = 0;
99-
tracing::info!("{}", &log_fmt(0, &input, &[], store));
99+
tracing::debug!("{}", &log_fmt(0, &input, &[], store));
100100
for _ in 0..limit {
101101
let mut emitted = vec![];
102102
let (frame, must_break) =
103103
compute_frame(lurk_step, cprocs_run, &input, store, lang, &mut emitted, pc)?;
104104

105105
iterations += 1;
106106
input = frame.output.clone();
107-
tracing::info!("{}", &log_fmt(iterations, &input, &emitted, store));
107+
tracing::debug!("{}", &log_fmt(iterations, &input, &emitted, store));
108108
let expr = frame.output[0];
109109
frames.push(frame);
110110

src/lem/multiframe.rs

+1
Original file line numberDiff line numberDiff line change
@@ -826,6 +826,7 @@ impl<'a, F: LurkField, C: Coprocessor<F>> nova::traits::circuit::StepCircuit<F>
826826
2 * self.lurk_step.input_params.len()
827827
}
828828

829+
#[tracing::instrument(skip_all, name = "synthesize")]
829830
fn synthesize<CS>(
830831
&self,
831832
cs: &mut CS,

src/lem/var_map.rs

+1-2
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ use std::collections::hash_map::Entry;
22

33
use anyhow::{bail, Result};
44
use fxhash::FxHashMap;
5-
use tracing::info;
65

76
use super::Var;
87

@@ -29,7 +28,7 @@ impl<V> VarMap<V> {
2928
}
3029
Entry::Occupied(mut o) => {
3130
let v = o.insert(v);
32-
info!("Variable {} has been overwritten", o.key());
31+
tracing::debug!("Variable {} has been overwritten", o.key());
3332
Some(v)
3433
}
3534
}

src/proof/nova.rs

+4-2
Original file line numberDiff line numberDiff line change
@@ -293,14 +293,16 @@ where
293293
assert_eq!(reduction_count, circuit_primary.frames().unwrap().len());
294294

295295
let mut r_snark = recursive_snark.unwrap_or_else(|| {
296-
RecursiveSNARK::new(
296+
let recursive_snark = RecursiveSNARK::new(
297297
&pp.pp,
298298
&circuit_primary,
299299
&circuit_secondary,
300300
z0_primary,
301301
&z0_secondary,
302302
)
303-
.expect("Failed to construct initial recursive snark")
303+
.expect("Failed to construct initial recursive snark");
304+
recursive_snark.write_abomonated(&pp.pp).unwrap();
305+
recursive_snark
304306
});
305307
r_snark
306308
.prove_step(&pp.pp, &circuit_primary, &circuit_secondary)

0 commit comments

Comments
 (0)