Skip to content

Commit

Permalink
Support for non-immediate proof maintenance (#4563)
Browse files Browse the repository at this point in the history
When doing large real-world proofs with a high degree of parallelism,
the bandwidth is overtaken by the writing of the proof to disk on every
proof iteration, slowing the process considerably.

This PR introduces the ability to write to disk and perform the callback
on every `maintenance_iterations` of the parallel proof, set by default
to 32.

EDIT: Actually, perhaps it's a better idea to write the proof every
`max_workers` iterations.

---------

Co-authored-by: rv-jenkins <[email protected]>
Co-authored-by: devops <[email protected]>
Co-authored-by: Noah Watson <[email protected]>
Co-authored-by: Georgy Lukyanov <[email protected]>
  • Loading branch information
5 people authored Aug 6, 2024
1 parent e72b530 commit 3d4c2c5
Showing 1 changed file with 12 additions and 5 deletions.
17 changes: 12 additions & 5 deletions pyk/src/pyk/proof/proof.py
Original file line number Diff line number Diff line change
Expand Up @@ -326,6 +326,7 @@ def parallel_advance_proof(
fail_fast: bool = False,
max_workers: int = 1,
callback: Callable[[P], None] = (lambda x: None),
maintenance_rate: int = 1,
) -> None:
"""Advance proof with multithreaded strategy.
Expand All @@ -347,7 +348,8 @@ def parallel_advance_proof(
fail_fast: If the proof is failing after finishing a step,
halt execution even if there are still available steps.
max_workers: Maximum number of worker threads the pool can spawn.
callback: Callable to run in between each completed step, useful for getting real-time information about the proof.
callback: Callable to run during proof maintenance, useful for getting real-time information about the proof.
maintenance_rate: Number of iterations between proof maintenance (writing to disk and executing callback).
"""
pending: set[Future[Any]] = set()
explored: set[PS] = set()
Expand Down Expand Up @@ -376,9 +378,10 @@ def submit_steps(_steps: Iterable[PS]) -> None:
proof_results = future.result()
for result in proof_results:
proof.commit(result)
proof.write_proof_data()
callback(proof)
iterations += 1
if iterations % maintenance_rate == 0:
proof.write_proof_data()
callback(proof)
if max_iterations is not None and max_iterations <= iterations:
break
if fail_fast and proof.failed:
Expand Down Expand Up @@ -502,6 +505,7 @@ def advance_proof(
max_iterations: int | None = None,
fail_fast: bool = False,
callback: Callable[[P], None] = (lambda x: None),
maintenance_rate: int = 1,
) -> None:
"""Advance a proof.
Expand All @@ -513,6 +517,7 @@ def advance_proof(
fail_fast: If the proof is failing after finishing a step,
halt execution even if there are still available steps.
callback: Callable to run in between each completed step, useful for getting real-time information about the proof.
maintenance_rate: Number of iterations between proof maintenance (writing to disk and executing callback).
"""
iterations = 0
_LOGGER.info(f'Initializing proof: {proof.id}')
Expand All @@ -533,7 +538,9 @@ def advance_proof(
results = self.step_proof(step)
for result in results:
proof.commit(result)
proof.write_proof_data()
callback(proof)
if iterations % maintenance_rate == 0:
proof.write_proof_data()
callback(proof)

if proof.failed:
proof.failure_info = self.failure_info(proof)

0 comments on commit 3d4c2c5

Please sign in to comment.