Skip to main content

sp1_prover/worker/
config.rs

1use std::env;
2
3use sp1_core_executor::SP1CoreOpts;
4
5use crate::worker::{
6    SP1ControllerConfig, SP1CoreProverConfig, SP1DeferredProverConfig, SP1ProverConfig,
7    SP1RecursionProverConfig,
8};
9
10#[derive(Clone)]
11pub struct SP1WorkerConfig {
12    pub controller_config: SP1ControllerConfig,
13    pub prover_config: SP1ProverConfig,
14}
15
16impl Default for SP1WorkerConfig {
17    fn default() -> Self {
18        // Build the core config using data from environment or default values.
19        //
20        // TODO: base default values on system information.
21
22        // Build the controller config.
23        let num_splicing_workers = env::var("SP1_WORKER_NUM_SPLICING_WORKERS")
24            .ok()
25            .and_then(|s| s.parse::<usize>().ok())
26            .unwrap_or(DEFAULT_NUM_SPLICING_WORKERS);
27        let splicing_buffer_size = env::var("SP1_WORKER_SPLICING_BUFFER_SIZE")
28            .ok()
29            .and_then(|s| s.parse::<usize>().ok())
30            .unwrap_or(DEFAULT_SPLICING_BUFFER_SIZE);
31        let max_reduce_arity = env::var("SP1_WORKER_MAX_REDUCE_ARITY")
32            .ok()
33            .and_then(|s| s.parse::<usize>().ok())
34            .unwrap_or(DEFAULT_MAX_REDUCE_ARITY);
35        let number_of_send_splice_workers_per_splice =
36            env::var("SP1_WORKER_NUMBER_OF_SEND_SPLICE_WORKERS_PER_SPLICE")
37                .ok()
38                .and_then(|s| s.parse::<usize>().ok())
39                .unwrap_or(DEFAULT_NUMBER_OF_SEND_SPLICE_WORKERS_PER_SPLICE);
40        let send_splice_input_buffer_size_per_splice =
41            env::var("SP1_WORKER_SEND_SPLICE_INPUT_BUFFER_SIZE_PER_SPLICE")
42                .ok()
43                .and_then(|s| s.parse::<usize>().ok())
44                .unwrap_or(DEFAULT_SEND_SPLICE_INPUT_BUFFER_SIZE_PER_SPLICE);
45        // Set the default global memory buffer size to twice the number of splicing workers, this means
46        // no worker will be blocked when emitting global memory shards.
47        let global_memory_buffer_size = env::var("SP1_WORKER_GLOBAL_MEMORY_BUFFER_SIZE")
48            .ok()
49            .and_then(|s| s.parse::<usize>().ok())
50            .unwrap_or(2 * num_splicing_workers);
51
52        // Whether or not to operate in fixed pk mode.
53        let use_fixed_pk = env::var("SP1_WORKER_USE_FIXED_PK")
54            .ok()
55            .and_then(|s| s.parse::<bool>().ok())
56            .unwrap_or(false);
57
58        // Whether or not to verify intermediates in core proof and recursion proofs.
59        let verify_intermediates = env::var("SP1_WORKER_VERIFY_INTERMEDIATES")
60            .ok()
61            .and_then(|s| s.parse::<bool>().ok())
62            .unwrap_or(true);
63
64        // Use default core options as a starting point.
65        let opts = SP1CoreOpts::default();
66        let controller_config = SP1ControllerConfig {
67            opts,
68            num_splicing_workers,
69            splicing_buffer_size,
70            max_reduce_arity,
71            number_of_send_splice_workers_per_splice,
72            send_splice_input_buffer_size_per_splice,
73            use_fixed_pk,
74            global_memory_buffer_size,
75        };
76
77        // Build the core prover config.
78        let num_core_workers = env::var("SP1_WORKER_NUM_CORE_WORKERS")
79            .ok()
80            .and_then(|s| s.parse::<usize>().ok())
81            .unwrap_or(DEFAULT_NUM_CORE_WORKERS);
82        let core_buffer_size = env::var("SP1_WORKER_CORE_BUFFER_SIZE")
83            .ok()
84            .and_then(|s| s.parse::<usize>().ok())
85            .unwrap_or(DEFAULT_CORE_BUFFER_SIZE);
86        let num_setup_workers = env::var("SP1_WORKER_NUM_SETUP_WORKERS")
87            .ok()
88            .and_then(|s| s.parse::<usize>().ok())
89            .unwrap_or(DEFAULT_NUM_SETUP_WORKERS);
90        let setup_buffer_size = env::var("SP1_WORKER_SETUP_BUFFER_SIZE")
91            .ok()
92            .and_then(|s| s.parse::<usize>().ok())
93            .unwrap_or(DEFAULT_SETUP_BUFFER_SIZE);
94        let normalize_program_cache_size = env::var("SP1_WORKER_NORMALIZE_PROGRAM_CACHE_SIZE")
95            .ok()
96            .and_then(|s| s.parse::<usize>().ok())
97            .unwrap_or(DEFAULT_NORMALIZE_PROGRAM_CACHE_SIZE);
98        let dump_shard_dir = env::var("SP1_DUMP_SHARD_DIR").ok();
99
100        let core_prover_config = SP1CoreProverConfig {
101            num_core_workers,
102            core_buffer_size,
103            num_setup_workers,
104            setup_buffer_size,
105            normalize_program_cache_size,
106            use_fixed_pk,
107            verify_intermediates,
108            dump_shard_dir,
109        };
110
111        // Build the recursion prover config.
112        let num_prepare_reduce_workers = env::var("SP1_WORKER_NUM_PREPARE_REDUCE_WORKERS")
113            .ok()
114            .and_then(|s| s.parse::<usize>().ok())
115            .unwrap_or(DEFAULT_NUM_PREPARE_REDUCE_WORKERS);
116        let prepare_reduce_buffer_size = env::var("SP1_WORKER_PREPARE_REDUCE_BUFFER_SIZE")
117            .ok()
118            .and_then(|s| s.parse::<usize>().ok())
119            .unwrap_or(DEFAULT_PREPARE_REDUCE_BUFFER_SIZE);
120        let num_recursion_executor_workers = env::var("SP1_WORKER_NUM_RECURSION_EXECUTOR_WORKERS")
121            .ok()
122            .and_then(|s| s.parse::<usize>().ok())
123            .unwrap_or(DEFAULT_NUM_RECURSION_EXECUTOR_WORKERS);
124        let recursion_executor_buffer_size = env::var("SP1_WORKER_RECURSION_EXECUTOR_BUFFER_SIZE")
125            .ok()
126            .and_then(|s| s.parse::<usize>().ok())
127            .unwrap_or(DEFAULT_RECURSION_EXECUTOR_BUFFER_SIZE);
128        let num_recursion_prover_workers = env::var("SP1_WORKER_NUM_RECURSION_PROVER_WORKERS")
129            .ok()
130            .and_then(|s| s.parse::<usize>().ok())
131            .unwrap_or(DEFAULT_NUM_RECURSION_PROVER_WORKERS);
132        let recursion_prover_buffer_size = env::var("SP1_WORKER_RECURSION_PROVER_BUFFER_SIZE")
133            .ok()
134            .and_then(|s| s.parse::<usize>().ok())
135            .unwrap_or(DEFAULT_RECURSION_PROVER_BUFFER_SIZE);
136        let max_compose_arity = env::var("SP1_WORKER_MAX_COMPOSE_ARITY")
137            .ok()
138            .and_then(|s| s.parse::<usize>().ok())
139            .unwrap_or(DEFAULT_MAX_COMPOSE_ARITY);
140
141        let recursion_prover_config = SP1RecursionProverConfig::new(
142            num_prepare_reduce_workers,
143            prepare_reduce_buffer_size,
144            num_recursion_executor_workers,
145            recursion_executor_buffer_size,
146            num_recursion_prover_workers,
147            recursion_prover_buffer_size,
148            max_compose_arity,
149            verify_intermediates,
150        );
151
152        // Build the deferred prover config.
153        let num_deferred_workers = env::var("SP1_WORKER_NUM_DEFERRED_WORKERS")
154            .ok()
155            .and_then(|s| s.parse::<usize>().ok())
156            .unwrap_or(DEFAULT_NUM_DEFERRED_WORKERS);
157        let deferred_buffer_size = env::var("SP1_WORKER_DEFERRED_BUFFER_SIZE")
158            .ok()
159            .and_then(|s| s.parse::<usize>().ok())
160            .unwrap_or(DEFAULT_DEFERRED_BUFFER_SIZE);
161
162        let deferred_prover_config =
163            SP1DeferredProverConfig { num_deferred_workers, deferred_buffer_size };
164
165        let prover_config =
166            SP1ProverConfig { core_prover_config, recursion_prover_config, deferred_prover_config };
167
168        // Get the local node config from parts above.
169        SP1WorkerConfig { controller_config, prover_config }
170    }
171}
172
173// Default values for the controller config.
174pub(crate) const DEFAULT_NUM_SPLICING_WORKERS: usize = 2;
175pub(crate) const DEFAULT_SPLICING_BUFFER_SIZE: usize = 2;
176pub(crate) const DEFAULT_MAX_REDUCE_ARITY: usize = 4;
177pub(crate) const DEFAULT_NUMBER_OF_SEND_SPLICE_WORKERS_PER_SPLICE: usize = 2;
178pub(crate) const DEFAULT_SEND_SPLICE_INPUT_BUFFER_SIZE_PER_SPLICE: usize = 2;
179
180// Default values for the core prover config.
181pub(crate) const DEFAULT_NUM_CORE_WORKERS: usize = 4;
182pub(crate) const DEFAULT_CORE_BUFFER_SIZE: usize = 4;
183pub(crate) const DEFAULT_NUM_SETUP_WORKERS: usize = 2;
184pub(crate) const DEFAULT_SETUP_BUFFER_SIZE: usize = 2;
185pub(crate) const DEFAULT_NORMALIZE_PROGRAM_CACHE_SIZE: usize = 5;
186pub(crate) const DEFAULT_MAX_COMPOSE_ARITY: usize = 4;
187
188// Default values for the recursion prover config.
189pub(crate) const DEFAULT_NUM_PREPARE_REDUCE_WORKERS: usize = DEFAULT_NUM_RECURSION_EXECUTOR_WORKERS;
190pub(crate) const DEFAULT_PREPARE_REDUCE_BUFFER_SIZE: usize = DEFAULT_RECURSION_EXECUTOR_BUFFER_SIZE;
191pub(crate) const DEFAULT_NUM_RECURSION_EXECUTOR_WORKERS: usize = 4;
192pub(crate) const DEFAULT_RECURSION_EXECUTOR_BUFFER_SIZE: usize = 4;
193pub(crate) const DEFAULT_NUM_RECURSION_PROVER_WORKERS: usize = 8;
194pub(crate) const DEFAULT_RECURSION_PROVER_BUFFER_SIZE: usize = 8;
195
196// Default values for the deferred prover config.
197pub(crate) const DEFAULT_NUM_DEFERRED_WORKERS: usize = 4;
198pub(crate) const DEFAULT_DEFERRED_BUFFER_SIZE: usize = 2;
199
200// Default values for the gas executor config.
201pub(crate) const DEFAULT_NUM_GAS_EXECUTOR_WORKERS: usize = 4;
202pub(crate) const DEFAULT_GAS_EXECUTOR_BUFFER_SIZE: usize = 4;