Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
I
interface-test
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
董子豪
interface-test
Commits
8538d2a6
Commit
8538d2a6
authored
Aug 25, 2021
by
董子豪
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
add bench window-post aggregation
parent
4fd5bf1f
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
87 additions
and
1019 deletions
+87
-1019
main.go
cmd/bench/main.go
+87
-0
main.go
cmd/lotus-bench/main.go
+0
-1019
No files found.
cmd/bench/main.go
0 → 100644
View file @
8538d2a6
package
main
import
(
"os"
"github.com/urfave/cli/v2"
"github.com/docker/go-units"
"github.com/filecoin-project/go-state-types/abi"
logging
"github.com/ipfs/go-log/v2"
"fil_integrate/seal"
)
var
log
=
logging
.
Logger
(
"bench"
)
func
main
()
{
logging
.
SetLogLevel
(
"*"
,
"INFO"
)
log
.
Info
(
"Starting bench"
)
app
:=
&
cli
.
App
{
Name
:
"bench"
,
Usage
:
"Benchmark performance of seal and window-post"
,
Version
:
"1.11.1"
,
Commands
:
[]
*
cli
.
Command
{
testSealCmd
,
testAggregationCmd
,
},
}
if
err
:=
app
.
Run
(
os
.
Args
);
err
!=
nil
{
log
.
Warnf
(
"%+v"
,
err
)
return
}
}
var
testSealCmd
=
&
cli
.
Command
{
Name
:
"test-seal"
,
Usage
:
"Test interface"
,
Action
:
func
(
c
*
cli
.
Context
)
error
{
// Test 8MiB sector
err
:=
seal
.
TestSealAndUnseal
()
if
err
!=
nil
{
return
err
}
return
nil
},
}
var
testAggregationCmd
=
&
cli
.
Command
{
Name
:
"test-aggregation"
,
Usage
:
"Test interface"
,
Flags
:
[]
cli
.
Flag
{
&
cli
.
StringFlag
{
Name
:
"sector-size"
,
Value
:
"2KiB"
,
Usage
:
"size of the sectors in bytes"
,
},
&
cli
.
IntFlag
{
Name
:
"num-sectors"
,
Value
:
4
,
Usage
:
"How many sectors used in single window post"
,
},
&
cli
.
IntFlag
{
Name
:
"num-agg"
,
Value
:
4
,
Usage
:
"How many window-post proofs used to aggregate"
,
},
},
Action
:
func
(
c
*
cli
.
Context
)
error
{
log
.
Info
(
"testing"
)
sectorSizeInt
,
err
:=
units
.
RAMInBytes
(
c
.
String
(
"sector-size"
))
if
err
!=
nil
{
return
err
}
sectorSize
:=
abi
.
SectorSize
(
sectorSizeInt
)
numSectors
:=
c
.
Int
(
"num-sectors"
)
numAggregate
:=
c
.
Int
(
"num-agg"
)
err
=
seal
.
TestAggregateWindowPoSt
(
sectorSize
,
numSectors
,
numAggregate
)
if
err
!=
nil
{
return
err
}
return
nil
},
}
\ No newline at end of file
cmd/lotus-bench/main.go
deleted
100644 → 0
View file @
4fd5bf1f
package
main
import
(
"context"
"encoding/json"
"fmt"
"io/ioutil"
"math/big"
"math/rand"
"os"
"os/signal"
"path/filepath"
"time"
"syscall"
saproof2
"github.com/filecoin-project/specs-actors/v2/actors/runtime/proof"
"github.com/docker/go-units"
logging
"github.com/ipfs/go-log/v2"
"github.com/minio/blake2b-simd"
"github.com/mitchellh/go-homedir"
"github.com/urfave/cli/v2"
"golang.org/x/xerrors"
// "github.com/ipfs/go-cid"
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-state-types/network"
paramfetch
"github.com/filecoin-project/go-paramfetch"
"github.com/filecoin-project/go-state-types/abi"
proof5
"github.com/filecoin-project/specs-actors/v5/actors/runtime/proof"
"github.com/filecoin-project/specs-storage/storage"
"fil_integrate/extern/sector-storage/ffiwrapper"
"fil_integrate/extern/sector-storage/ffiwrapper/basicfs"
"fil_integrate/extern/sector-storage/storiface"
ffi
"github.com/filecoin-project/filecoin-ffi"
"fil_integrate/build"
"fil_integrate/seal"
)
var
log
=
logging
.
Logger
(
"lotus-bench"
)
var
NewestNetworkVersion
=
network
.
Version11
const
arp
=
abi
.
RegisteredAggregationProof_SnarkPackV1
type
SealedOut
struct
{
Proof
storage
.
Proof
Commr
[]
byte
Commd
[]
byte
}
type
BenchResults
struct
{
EnvVar
map
[
string
]
string
SectorSize
abi
.
SectorSize
SectorNumber
int
SealingSum
SealingResult
SealingResults
[]
SealingResult
PostGenerateCandidates
time
.
Duration
PostWinningProofCold
time
.
Duration
PostWinningProofHot
time
.
Duration
VerifyWinningPostCold
time
.
Duration
VerifyWinningPostHot
time
.
Duration
PostWindowProofCold
time
.
Duration
PostWindowProofHot
time
.
Duration
VerifyWindowPostCold
time
.
Duration
VerifyWindowPostHot
time
.
Duration
}
func
(
bo
*
BenchResults
)
SumSealingTime
()
error
{
if
len
(
bo
.
SealingResults
)
<=
0
{
return
xerrors
.
Errorf
(
"BenchResults SealingResults len <= 0"
)
}
if
len
(
bo
.
SealingResults
)
!=
bo
.
SectorNumber
{
return
xerrors
.
Errorf
(
"BenchResults SealingResults len(%d) != bo.SectorNumber(%d)"
,
len
(
bo
.
SealingResults
),
bo
.
SectorNumber
)
}
for
_
,
sealing
:=
range
bo
.
SealingResults
{
bo
.
SealingSum
.
AddPiece
+=
sealing
.
AddPiece
bo
.
SealingSum
.
PreCommit1
+=
sealing
.
PreCommit1
bo
.
SealingSum
.
PreCommit2
+=
sealing
.
PreCommit2
bo
.
SealingSum
.
Commit1
+=
sealing
.
Commit1
bo
.
SealingSum
.
Commit2
+=
sealing
.
Commit2
bo
.
SealingSum
.
Verify
+=
sealing
.
Verify
bo
.
SealingSum
.
Unseal
+=
sealing
.
Unseal
}
return
nil
}
type
SealingResult
struct
{
AddPiece
time
.
Duration
PreCommit1
time
.
Duration
PreCommit2
time
.
Duration
Commit1
time
.
Duration
Commit2
time
.
Duration
Verify
time
.
Duration
Unseal
time
.
Duration
}
type
Commit2In
struct
{
SectorNum
int64
Phase1Out
[]
byte
SectorSize
uint64
}
func
main
()
{
logging
.
SetLogLevel
(
"*"
,
"INFO"
)
log
.
Info
(
"Starting lotus-bench"
)
app
:=
&
cli
.
App
{
Name
:
"lotus-bench"
,
Usage
:
"Benchmark performance of lotus on your hardware"
,
Version
:
build
.
UserVersion
(),
Commands
:
[]
*
cli
.
Command
{
proveCmd
,
testSealCmd
,
testAggregationCmd
,
sealBenchCmd
,
},
}
if
err
:=
app
.
Run
(
os
.
Args
);
err
!=
nil
{
log
.
Warnf
(
"%+v"
,
err
)
return
}
}
var
testSealCmd
=
&
cli
.
Command
{
Name
:
"test-seal"
,
Usage
:
"Test interface"
,
Action
:
func
(
c
*
cli
.
Context
)
error
{
err
:=
seal
.
TestSealAndUnseal
()
if
err
!=
nil
{
return
err
}
return
nil
},
}
var
testAggregationCmd
=
&
cli
.
Command
{
Name
:
"test-aggregation"
,
Usage
:
"Test interface"
,
Flags
:
[]
cli
.
Flag
{
&
cli
.
StringFlag
{
Name
:
"sector-size"
,
Value
:
"2KiB"
,
Usage
:
"size of the sectors in bytes"
,
},
&
cli
.
IntFlag
{
Name
:
"num-sectors"
,
Value
:
4
,
Usage
:
"How many sectors used in single window post"
,
},
&
cli
.
IntFlag
{
Name
:
"num-agg"
,
Value
:
4
,
Usage
:
"How many window-post proofs used to aggregate"
,
},
},
Action
:
func
(
c
*
cli
.
Context
)
error
{
log
.
Info
(
"testing"
)
sectorSizeInt
,
err
:=
units
.
RAMInBytes
(
c
.
String
(
"sector-size"
))
if
err
!=
nil
{
return
err
}
sectorSize
:=
abi
.
SectorSize
(
sectorSizeInt
)
numSectors
:=
c
.
Int
(
"num-sectors"
)
numAggregate
:=
c
.
Int
(
"num-agg"
)
err
=
seal
.
TestAggregateWindowPoSt
(
sectorSize
,
numSectors
,
numAggregate
)
if
err
!=
nil
{
return
err
}
return
nil
},
}
var
sealBenchCmd
=
&
cli
.
Command
{
Name
:
"sealing"
,
Usage
:
"Benchmark seal and winning post and window post"
,
Flags
:
[]
cli
.
Flag
{
&
cli
.
StringFlag
{
Name
:
"storage-dir"
,
Value
:
"~/.lotus-bench"
,
Usage
:
"path to the storage directory that will store sectors long term"
,
},
&
cli
.
StringFlag
{
Name
:
"sector-size"
,
Value
:
"512MiB"
,
Usage
:
"size of the sectors in bytes, i.e. 32GiB"
,
},
&
cli
.
BoolFlag
{
Name
:
"no-gpu"
,
Usage
:
"disable gpu usage for the benchmark run"
,
},
&
cli
.
StringFlag
{
Name
:
"miner-addr"
,
Usage
:
"pass miner address (only necessary if using existing sectorbuilder)"
,
Value
:
"t01000"
,
},
&
cli
.
StringFlag
{
Name
:
"benchmark-existing-sectorbuilder"
,
Usage
:
"pass a directory to run post timings on an existing sectorbuilder"
,
},
&
cli
.
BoolFlag
{
Name
:
"json-out"
,
Usage
:
"output results in json format"
,
},
&
cli
.
BoolFlag
{
Name
:
"skip-commit2"
,
Usage
:
"skip the commit2 (snark) portion of the benchmark"
,
},
&
cli
.
BoolFlag
{
Name
:
"skip-unseal"
,
Usage
:
"skip the unseal portion of the benchmark"
,
},
&
cli
.
StringFlag
{
Name
:
"ticket-preimage"
,
Usage
:
"ticket random"
,
},
&
cli
.
StringFlag
{
Name
:
"save-commit2-input"
,
Usage
:
"save commit2 input to a file"
,
},
&
cli
.
IntFlag
{
Name
:
"num-sectors"
,
Usage
:
"select number of sectors to seal"
,
Value
:
1
,
},
&
cli
.
IntFlag
{
Name
:
"parallel"
,
Usage
:
"num run in parallel"
,
Value
:
1
,
},
},
Action
:
func
(
c
*
cli
.
Context
)
error
{
if
c
.
Bool
(
"no-gpu"
)
{
err
:=
os
.
Setenv
(
"BELLMAN_NO_GPU"
,
"1"
)
if
err
!=
nil
{
return
xerrors
.
Errorf
(
"setting no-gpu flag: %w"
,
err
)
}
}
robench
:=
c
.
String
(
"benchmark-existing-sectorbuilder"
)
var
sbdir
string
if
robench
==
""
{
sdir
,
err
:=
homedir
.
Expand
(
c
.
String
(
"storage-dir"
))
if
err
!=
nil
{
return
err
}
err
=
os
.
MkdirAll
(
sdir
,
0775
)
//nolint:gosec
if
err
!=
nil
{
return
xerrors
.
Errorf
(
"creating sectorbuilder dir: %w"
,
err
)
}
tsdir
,
err
:=
ioutil
.
TempDir
(
sdir
,
"bench"
)
if
err
!=
nil
{
return
err
}
// defer func() {
// if err := os.RemoveAll(tsdir); err != nil {
// log.Warn("remove all: ", err)
// }
// }()
// TODO: pretty sure this isnt even needed?
if
err
:=
os
.
MkdirAll
(
tsdir
,
0775
);
err
!=
nil
{
return
err
}
sbdir
=
tsdir
}
else
{
exp
,
err
:=
homedir
.
Expand
(
robench
)
if
err
!=
nil
{
return
err
}
sbdir
=
exp
}
// miner address
maddr
,
err
:=
address
.
NewFromString
(
c
.
String
(
"miner-addr"
))
if
err
!=
nil
{
return
err
}
amid
,
err
:=
address
.
IDFromAddress
(
maddr
)
if
err
!=
nil
{
return
err
}
mid
:=
abi
.
ActorID
(
amid
)
// sector size
sectorSizeInt
,
err
:=
units
.
RAMInBytes
(
c
.
String
(
"sector-size"
))
if
err
!=
nil
{
return
err
}
sectorSize
:=
abi
.
SectorSize
(
sectorSizeInt
)
// Only fetch parameters if actually needed
skipc2
:=
c
.
Bool
(
"skip-commit2"
)
if
!
skipc2
{
if
err
:=
paramfetch
.
GetParams
(
ReqContext
(
c
),
build
.
ParametersJSON
(),
build
.
SrsJSON
(),
uint64
(
sectorSize
));
err
!=
nil
{
return
xerrors
.
Errorf
(
"getting params: %w"
,
err
)
}
}
sbfs
:=
&
basicfs
.
Provider
{
Root
:
sbdir
,
}
sb
,
err
:=
ffiwrapper
.
New
(
sbfs
)
if
err
!=
nil
{
return
err
}
sectorNumber
:=
c
.
Int
(
"num-sectors"
)
var
sealTimings
[]
SealingResult
var
sealedSectors
[]
saproof2
.
SectorInfo
if
robench
==
""
{
var
err
error
parCfg
:=
ParCfg
{
PreCommit1
:
c
.
Int
(
"parallel"
),
PreCommit2
:
1
,
Commit
:
1
,
}
// sealTimings, sealedSectors, err = myRunSeals(sb, sbfs, sectorNumber, parCfg, mid, sectorSize, []byte(c.String("ticket-preimage")), c.String("save-commit2-input"), skipc2, c.Bool("skip-unseal"))
sealTimings
,
sealedSectors
,
err
=
runSeals
(
sb
,
sbfs
,
sectorNumber
,
parCfg
,
mid
,
sectorSize
,
[]
byte
(
c
.
String
(
"ticket-preimage"
)),
c
.
String
(
"save-commit2-input"
),
skipc2
,
c
.
Bool
(
"skip-unseal"
))
if
err
!=
nil
{
return
xerrors
.
Errorf
(
"failed to run seals: %w"
,
err
)
}
}
else
{
// TODO: implement sbfs.List() and use that for all cases (preexisting sectorbuilder or not)
// TODO: this assumes we only ever benchmark a preseal
// sectorbuilder directory... we need a better way to handle
// this in other cases
fdata
,
err
:=
ioutil
.
ReadFile
(
filepath
.
Join
(
sbdir
,
"pre-seal-"
+
maddr
.
String
()
+
".json"
))
if
err
!=
nil
{
return
err
}
var
genmm
map
[
string
]
build
.
Miner
if
err
:=
json
.
Unmarshal
(
fdata
,
&
genmm
);
err
!=
nil
{
return
err
}
genm
,
ok
:=
genmm
[
maddr
.
String
()]
if
!
ok
{
return
xerrors
.
Errorf
(
"preseal file didnt have expected miner in it"
)
}
for
_
,
s
:=
range
genm
.
Sectors
{
sealedSectors
=
append
(
sealedSectors
,
saproof2
.
SectorInfo
{
SealedCID
:
s
.
CommR
,
SectorNumber
:
s
.
SectorID
,
SealProof
:
s
.
ProofType
,
})
}
}
bo
:=
BenchResults
{
SectorSize
:
sectorSize
,
SectorNumber
:
sectorNumber
,
SealingResults
:
sealTimings
,
}
if
err
:=
bo
.
SumSealingTime
();
err
!=
nil
{
return
err
}
var
challenge
[
32
]
byte
rand
.
Read
(
challenge
[
:
])
beforePost
:=
time
.
Now
()
if
!
skipc2
{
log
.
Info
(
"generating winning post candidates"
)
wipt
,
err
:=
spt
(
sectorSize
)
.
RegisteredWinningPoStProof
()
if
err
!=
nil
{
return
err
}
fcandidates
,
err
:=
ffiwrapper
.
ProofVerifier
.
GenerateWinningPoStSectorChallenge
(
context
.
TODO
(),
wipt
,
mid
,
challenge
[
:
],
uint64
(
len
(
sealedSectors
)))
if
err
!=
nil
{
return
err
}
candidates
:=
make
([]
saproof2
.
SectorInfo
,
len
(
fcandidates
))
for
i
,
fcandidate
:=
range
fcandidates
{
candidates
[
i
]
=
sealedSectors
[
fcandidate
]
}
gencandidates
:=
time
.
Now
()
log
.
Info
(
"computing winning post snark (cold)"
)
proof1
,
err
:=
sb
.
GenerateWinningPoSt
(
context
.
TODO
(),
mid
,
candidates
,
challenge
[
:
])
if
err
!=
nil
{
return
err
}
winningpost1
:=
time
.
Now
()
log
.
Info
(
"computing winning post snark (hot)"
)
proof2
,
err
:=
sb
.
GenerateWinningPoSt
(
context
.
TODO
(),
mid
,
candidates
,
challenge
[
:
])
if
err
!=
nil
{
return
err
}
winnningpost2
:=
time
.
Now
()
pvi1
:=
saproof2
.
WinningPoStVerifyInfo
{
Randomness
:
abi
.
PoStRandomness
(
challenge
[
:
]),
Proofs
:
proof1
,
ChallengedSectors
:
candidates
,
Prover
:
mid
,
}
ok
,
err
:=
ffiwrapper
.
ProofVerifier
.
VerifyWinningPoSt
(
context
.
TODO
(),
pvi1
)
if
err
!=
nil
{
return
err
}
if
!
ok
{
log
.
Error
(
"post verification failed"
)
}
verifyWinningPost1
:=
time
.
Now
()
pvi2
:=
saproof2
.
WinningPoStVerifyInfo
{
Randomness
:
abi
.
PoStRandomness
(
challenge
[
:
]),
Proofs
:
proof2
,
ChallengedSectors
:
candidates
,
Prover
:
mid
,
}
ok
,
err
=
ffiwrapper
.
ProofVerifier
.
VerifyWinningPoSt
(
context
.
TODO
(),
pvi2
)
if
err
!=
nil
{
return
err
}
if
!
ok
{
log
.
Error
(
"post verification failed"
)
}
verifyWinningPost2
:=
time
.
Now
()
log
.
Info
(
"computing window post snark (cold)"
)
wproof1
,
_
,
err
:=
sb
.
GenerateWindowPoSt
(
context
.
TODO
(),
mid
,
sealedSectors
,
challenge
[
:
])
if
err
!=
nil
{
return
err
}
windowpost1
:=
time
.
Now
()
log
.
Info
(
"computing window post snark (hot)"
)
wproof2
,
_
,
err
:=
sb
.
GenerateWindowPoSt
(
context
.
TODO
(),
mid
,
sealedSectors
,
challenge
[
:
])
if
err
!=
nil
{
return
err
}
windowpost2
:=
time
.
Now
()
wpvi1
:=
saproof2
.
WindowPoStVerifyInfo
{
Randomness
:
challenge
[
:
],
Proofs
:
wproof1
,
ChallengedSectors
:
sealedSectors
,
Prover
:
mid
,
}
ok
,
err
=
ffiwrapper
.
ProofVerifier
.
VerifyWindowPoSt
(
context
.
TODO
(),
wpvi1
)
if
err
!=
nil
{
return
err
}
if
!
ok
{
log
.
Error
(
"window post verification failed"
)
}
verifyWindowpost1
:=
time
.
Now
()
wpvi2
:=
saproof2
.
WindowPoStVerifyInfo
{
Randomness
:
challenge
[
:
],
Proofs
:
wproof2
,
ChallengedSectors
:
sealedSectors
,
Prover
:
mid
,
}
ok
,
err
=
ffiwrapper
.
ProofVerifier
.
VerifyWindowPoSt
(
context
.
TODO
(),
wpvi2
)
if
err
!=
nil
{
return
err
}
if
!
ok
{
log
.
Error
(
"window post verification failed"
)
}
verifyWindowpost2
:=
time
.
Now
()
bo
.
PostGenerateCandidates
=
gencandidates
.
Sub
(
beforePost
)
bo
.
PostWinningProofCold
=
winningpost1
.
Sub
(
gencandidates
)
bo
.
PostWinningProofHot
=
winnningpost2
.
Sub
(
winningpost1
)
bo
.
VerifyWinningPostCold
=
verifyWinningPost1
.
Sub
(
winnningpost2
)
bo
.
VerifyWinningPostHot
=
verifyWinningPost2
.
Sub
(
verifyWinningPost1
)
bo
.
PostWindowProofCold
=
windowpost1
.
Sub
(
verifyWinningPost2
)
bo
.
PostWindowProofHot
=
windowpost2
.
Sub
(
windowpost1
)
bo
.
VerifyWindowPostCold
=
verifyWindowpost1
.
Sub
(
windowpost2
)
bo
.
VerifyWindowPostHot
=
verifyWindowpost2
.
Sub
(
verifyWindowpost1
)
}
bo
.
EnvVar
=
make
(
map
[
string
]
string
)
for
_
,
envKey
:=
range
[]
string
{
"BELLMAN_NO_GPU"
,
"FIL_PROOFS_MAXIMIZE_CACHING"
,
"FIL_PROOFS_USE_GPU_COLUMN_BUILDER"
,
"FIL_PROOFS_USE_GPU_TREE_BUILDER"
,
"FIL_PROOFS_USE_MULTICORE_SDR"
,
"BELLMAN_CUSTOM_GPU"
}
{
envValue
,
found
:=
os
.
LookupEnv
(
envKey
)
if
found
{
bo
.
EnvVar
[
envKey
]
=
envValue
}
}
if
c
.
Bool
(
"json-out"
)
{
data
,
err
:=
json
.
MarshalIndent
(
bo
,
""
,
" "
)
if
err
!=
nil
{
return
err
}
fmt
.
Println
(
string
(
data
))
}
else
{
fmt
.
Println
(
"environment variable list:"
)
for
envKey
,
envValue
:=
range
bo
.
EnvVar
{
fmt
.
Printf
(
"%s=%s
\n
"
,
envKey
,
envValue
)
}
fmt
.
Printf
(
"----
\n
results (v28) SectorSize:(%d), SectorNumber:(%d)
\n
"
,
sectorSize
,
sectorNumber
)
if
robench
==
""
{
fmt
.
Printf
(
"seal: addPiece: %s (%s)
\n
"
,
bo
.
SealingSum
.
AddPiece
,
bps
(
bo
.
SectorSize
,
bo
.
SectorNumber
,
bo
.
SealingSum
.
AddPiece
))
fmt
.
Printf
(
"seal: preCommit phase 1: %s (%s)
\n
"
,
bo
.
SealingSum
.
PreCommit1
,
bps
(
bo
.
SectorSize
,
bo
.
SectorNumber
,
bo
.
SealingSum
.
PreCommit1
))
fmt
.
Printf
(
"seal: preCommit phase 2: %s (%s)
\n
"
,
bo
.
SealingSum
.
PreCommit2
,
bps
(
bo
.
SectorSize
,
bo
.
SectorNumber
,
bo
.
SealingSum
.
PreCommit2
))
fmt
.
Printf
(
"seal: commit phase 1: %s (%s)
\n
"
,
bo
.
SealingSum
.
Commit1
,
bps
(
bo
.
SectorSize
,
bo
.
SectorNumber
,
bo
.
SealingSum
.
Commit1
))
fmt
.
Printf
(
"seal: commit phase 2: %s (%s)
\n
"
,
bo
.
SealingSum
.
Commit2
,
bps
(
bo
.
SectorSize
,
bo
.
SectorNumber
,
bo
.
SealingSum
.
Commit2
))
fmt
.
Printf
(
"seal: verify: %s
\n
"
,
bo
.
SealingSum
.
Verify
)
if
!
c
.
Bool
(
"skip-unseal"
)
{
fmt
.
Printf
(
"unseal: %s (%s)
\n
"
,
bo
.
SealingSum
.
Unseal
,
bps
(
bo
.
SectorSize
,
bo
.
SectorNumber
,
bo
.
SealingSum
.
Unseal
))
}
fmt
.
Println
(
""
)
}
if
!
skipc2
{
fmt
.
Printf
(
"generate candidates: %s (%s)
\n
"
,
bo
.
PostGenerateCandidates
,
bps
(
bo
.
SectorSize
,
len
(
bo
.
SealingResults
),
bo
.
PostGenerateCandidates
))
fmt
.
Printf
(
"compute winning post proof (cold): %s
\n
"
,
bo
.
PostWinningProofCold
)
fmt
.
Printf
(
"compute winning post proof (hot): %s
\n
"
,
bo
.
PostWinningProofHot
)
fmt
.
Printf
(
"verify winning post proof (cold): %s
\n
"
,
bo
.
VerifyWinningPostCold
)
fmt
.
Printf
(
"verify winning post proof (hot): %s
\n\n
"
,
bo
.
VerifyWinningPostHot
)
fmt
.
Printf
(
"compute window post proof (cold): %s
\n
"
,
bo
.
PostWindowProofCold
)
fmt
.
Printf
(
"compute window post proof (hot): %s
\n
"
,
bo
.
PostWindowProofHot
)
fmt
.
Printf
(
"verify window post proof (cold): %s
\n
"
,
bo
.
VerifyWindowPostCold
)
fmt
.
Printf
(
"verify window post proof (hot): %s
\n
"
,
bo
.
VerifyWindowPostHot
)
}
}
return
nil
},
}
type
ParCfg
struct
{
PreCommit1
int
PreCommit2
int
Commit
int
}
func
runSeals
(
sb
*
ffiwrapper
.
Sealer
,
sbfs
*
basicfs
.
Provider
,
numSectors
int
,
par
ParCfg
,
mid
abi
.
ActorID
,
sectorSize
abi
.
SectorSize
,
ticketPreimage
[]
byte
,
saveC2inp
string
,
skipc2
,
skipunseal
bool
)
([]
SealingResult
,
[]
saproof2
.
SectorInfo
,
error
)
{
var
pieces
[]
abi
.
PieceInfo
sealTimings
:=
make
([]
SealingResult
,
numSectors
)
sealedSectors
:=
make
([]
saproof2
.
SectorInfo
,
numSectors
)
sealout
:=
make
([]
SealedOut
,
numSectors
)
infos
:=
make
([]
proof5
.
AggregateSealVerifyInfo
,
numSectors
)
proofs
:=
make
([][]
byte
,
numSectors
)
preCommit2Sema
:=
make
(
chan
struct
{},
par
.
PreCommit2
)
commitSema
:=
make
(
chan
struct
{},
par
.
Commit
)
if
numSectors
%
par
.
PreCommit1
!=
0
{
return
nil
,
nil
,
fmt
.
Errorf
(
"parallelism factor must cleanly divide numSectors"
)
}
for
i
:=
abi
.
SectorNumber
(
0
);
i
<
abi
.
SectorNumber
(
numSectors
);
i
++
{
sid
:=
storage
.
SectorRef
{
ID
:
abi
.
SectorID
{
Miner
:
mid
,
Number
:
i
,
},
ProofType
:
spt
(
sectorSize
),
}
start
:=
time
.
Now
()
log
.
Infof
(
"[%d] Writing piece into sector..."
,
i
)
r
:=
rand
.
New
(
rand
.
NewSource
(
100
+
int64
(
i
)))
var
size1
abi
.
SectorSize
=
sectorSize
/
2
var
existing
[]
abi
.
UnpaddedPieceSize
pi
,
err
:=
sb
.
AddPiece
(
context
.
TODO
(),
sid
,
existing
,
abi
.
PaddedPieceSize
(
size1
)
.
Unpadded
(),
r
)
if
err
!=
nil
{
return
nil
,
nil
,
err
}
pieces
=
append
(
pieces
,
pi
)
existing
=
append
(
existing
,
pi
.
Size
.
Unpadded
())
pi
,
err
=
sb
.
AddPiece
(
context
.
TODO
(),
sid
,
existing
,
abi
.
PaddedPieceSize
(
sectorSize
-
size1
)
.
Unpadded
(),
r
)
if
err
!=
nil
{
return
nil
,
nil
,
err
}
pieces
=
append
(
pieces
,
pi
)
existing
=
append
(
existing
,
pi
.
Size
.
Unpadded
())
sealTimings
[
i
]
.
AddPiece
=
time
.
Since
(
start
)
}
sectorsPerWorker
:=
numSectors
/
par
.
PreCommit1
errs
:=
make
(
chan
error
,
par
.
PreCommit1
)
for
wid
:=
0
;
wid
<
par
.
PreCommit1
;
wid
++
{
go
func
(
worker
int
)
{
sealerr
:=
func
()
error
{
start
:=
worker
*
sectorsPerWorker
end
:=
start
+
sectorsPerWorker
for
i
:=
abi
.
SectorNumber
(
start
);
i
<
abi
.
SectorNumber
(
end
);
i
++
{
sid
:=
storage
.
SectorRef
{
ID
:
abi
.
SectorID
{
Miner
:
mid
,
Number
:
i
,
},
ProofType
:
spt
(
sectorSize
),
}
start
:=
time
.
Now
()
trand
:=
blake2b
.
Sum256
(
ticketPreimage
)
ticket
:=
abi
.
SealRandomness
(
trand
[
:
])
log
.
Infof
(
"[%d] Running replication(1)..."
,
i
)
piece
:=
[]
abi
.
PieceInfo
{
pieces
[
2
*
i
],
pieces
[
2
*
i
+
1
]}
pc1o
,
err
:=
sb
.
SealPreCommit1
(
context
.
TODO
(),
sid
,
ticket
,
piece
)
if
err
!=
nil
{
return
xerrors
.
Errorf
(
"commit: %w"
,
err
)
}
precommit1
:=
time
.
Now
()
preCommit2Sema
<-
struct
{}{}
pc2Start
:=
time
.
Now
()
log
.
Infof
(
"[%d] Running replication(2)..."
,
i
)
cids
,
err
:=
sb
.
SealPreCommit2
(
context
.
TODO
(),
sid
,
pc1o
)
if
err
!=
nil
{
return
xerrors
.
Errorf
(
"commit: %w"
,
err
)
}
precommit2
:=
time
.
Now
()
<-
preCommit2Sema
sealedSectors
[
i
]
=
saproof2
.
SectorInfo
{
SealProof
:
sid
.
ProofType
,
SectorNumber
:
i
,
SealedCID
:
cids
.
Sealed
,
}
seed
:=
[]
byte
{
1
,
2
,
3
,
4
,
5
,
6
,
7
,
8
,
9
,
10
,
11
,
12
,
13
,
14
,
15
,
16
,
17
,
18
,
19
,
20
,
21
,
22
,
23
,
24
,
25
,
26
,
27
,
28
,
29
,
30
,
31
,
255
}
commitSema
<-
struct
{}{}
commitStart
:=
time
.
Now
()
log
.
Infof
(
"[%d] Generating PoRep for sector (1)"
,
i
)
c1o
,
err
:=
sb
.
SealCommit1
(
context
.
TODO
(),
sid
,
ticket
,
seed
,
piece
,
cids
)
if
err
!=
nil
{
return
err
}
sealcommit1
:=
time
.
Now
()
log
.
Infof
(
"[%d] Generating PoRep for sector (2)"
,
i
)
if
saveC2inp
!=
""
{
c2in
:=
Commit2In
{
SectorNum
:
int64
(
i
),
Phase1Out
:
c1o
,
SectorSize
:
uint64
(
sectorSize
),
}
b
,
err
:=
json
.
Marshal
(
&
c2in
)
if
err
!=
nil
{
return
err
}
if
err
:=
ioutil
.
WriteFile
(
saveC2inp
,
b
,
0664
);
err
!=
nil
{
log
.
Warnf
(
"%+v"
,
err
)
}
}
var
proof
storage
.
Proof
if
!
skipc2
{
proof
,
err
=
sb
.
SealCommit2
(
context
.
TODO
(),
sid
,
c1o
)
if
err
!=
nil
{
return
err
}
}
commd
,
err
:=
cids
.
Unsealed
.
MarshalJSON
()
commr
,
err
:=
cids
.
Sealed
.
MarshalJSON
()
sealout
[
i
]
=
SealedOut
{
Proof
:
proof
,
Commd
:
commd
,
Commr
:
commr
,
}
infos
[
i
]
=
proof5
.
AggregateSealVerifyInfo
{
InteractiveRandomness
:
seed
,
SealedCID
:
cids
.
Sealed
,
UnsealedCID
:
cids
.
Unsealed
,
Number
:
i
,
Randomness
:
ticket
,
}
proofs
[
i
]
=
[]
byte
(
proof
)
sealcommit2
:=
time
.
Now
()
<-
commitSema
if
!
skipc2
{
svi
:=
saproof2
.
SealVerifyInfo
{
SectorID
:
abi
.
SectorID
{
Miner
:
mid
,
Number
:
i
},
SealedCID
:
cids
.
Sealed
,
SealProof
:
sid
.
ProofType
,
Proof
:
proof
,
DealIDs
:
nil
,
Randomness
:
ticket
,
InteractiveRandomness
:
seed
,
UnsealedCID
:
cids
.
Unsealed
,
}
ok
,
err
:=
ffiwrapper
.
ProofVerifier
.
VerifySeal
(
svi
)
if
err
!=
nil
{
return
err
}
if
!
ok
{
return
xerrors
.
Errorf
(
"porep proof for sector %d was invalid"
,
i
)
}
}
verifySeal
:=
time
.
Now
()
if
!
skipunseal
{
log
.
Infof
(
"[%d] Unsealing sector"
,
i
)
{
p
,
done
,
err
:=
sbfs
.
AcquireSector
(
context
.
TODO
(),
sid
,
storiface
.
FTUnsealed
,
storiface
.
FTNone
,
storiface
.
PathSealing
)
if
err
!=
nil
{
return
xerrors
.
Errorf
(
"acquire unsealed sector for removing: %w"
,
err
)
}
done
()
if
err
:=
os
.
Remove
(
p
.
Unsealed
);
err
!=
nil
{
return
xerrors
.
Errorf
(
"removing unsealed sector: %w"
,
err
)
}
}
err
:=
sb
.
UnsealPiece
(
context
.
TODO
(),
sid
,
0
,
abi
.
PaddedPieceSize
(
sectorSize
)
.
Unpadded
(),
ticket
,
cids
.
Unsealed
)
if
err
!=
nil
{
return
err
}
outPath
:=
filepath
.
Join
(
sbfs
.
Root
,
storiface
.
FTUnsealed
.
String
(),
"unsealed.dat"
)
out
,
err
:=
os
.
OpenFile
(
outPath
,
os
.
O_RDWR
|
os
.
O_CREATE
,
0755
)
if
err
!=
nil
{
return
xerrors
.
Errorf
(
"openning partial file '%s': %w"
,
outPath
,
err
)
}
defer
out
.
Close
()
ok
,
err
:=
sb
.
ReadPiece
(
context
.
TODO
(),
out
,
sid
,
0
,
abi
.
PaddedPieceSize
(
sectorSize
)
.
Unpadded
())
if
err
!=
nil
{
return
err
}
if
!
ok
{
return
xerrors
.
Errorf
(
"Read pieces error!"
)
}
}
unseal
:=
time
.
Now
()
sealTimings
[
i
]
.
PreCommit1
=
precommit1
.
Sub
(
start
)
sealTimings
[
i
]
.
PreCommit2
=
precommit2
.
Sub
(
pc2Start
)
sealTimings
[
i
]
.
Commit1
=
sealcommit1
.
Sub
(
commitStart
)
sealTimings
[
i
]
.
Commit2
=
sealcommit2
.
Sub
(
sealcommit1
)
sealTimings
[
i
]
.
Verify
=
verifySeal
.
Sub
(
sealcommit2
)
sealTimings
[
i
]
.
Unseal
=
unseal
.
Sub
(
verifySeal
)
}
return
nil
}()
if
sealerr
!=
nil
{
errs
<-
sealerr
return
}
errs
<-
nil
}(
wid
)
}
for
i
:=
0
;
i
<
par
.
PreCommit1
;
i
++
{
err
:=
<-
errs
if
err
!=
nil
{
return
nil
,
nil
,
err
}
}
log
.
Infof
(
"writing all output"
)
writeSealedOut
(
sbfs
.
Root
,
sealout
)
log
.
Infof
(
"Aggregate Seal Proofs"
)
aggregateSeal
:=
time
.
Now
()
aggregateProof
,
err
:=
ffi
.
AggregateSealProofs
(
proof5
.
AggregateSealVerifyProofAndInfos
{
Miner
:
abi
.
ActorID
(
mid
),
SealProof
:
spt
(
sectorSize
),
AggregateProof
:
arp
,
Infos
:
infos
,
},
proofs
)
if
err
!=
nil
{
return
nil
,
nil
,
xerrors
.
Errorf
(
"aggregating proofs: %w"
,
err
)
}
verifyAggregate
:=
time
.
Now
()
ok
,
err
:=
ffi
.
VerifyAggregateSeals
(
proof5
.
AggregateSealVerifyProofAndInfos
{
Miner
:
abi
.
ActorID
(
mid
),
SealProof
:
spt
(
sectorSize
),
AggregateProof
:
arp
,
Infos
:
infos
,
Proof
:
aggregateProof
,
})
if
ok
{
fmt
.
Println
(
"Aggregate proof is true"
)
}
else
{
fmt
.
Println
(
"Aggregate proof is false"
)
}
verifyDone
:=
time
.
Now
()
fmt
.
Println
(
"--------------------------"
)
fmt
.
Println
(
"Aggregate Proofs size is %d"
,
len
(
aggregateProof
))
fmt
.
Println
(
"Aggregate Seal Proofs using %s"
,
verifyAggregate
.
Sub
(
aggregateSeal
))
fmt
.
Println
(
"Verify Aggregate Seal Proofs using %s"
,
verifyDone
.
Sub
(
verifyAggregate
))
fmt
.
Println
(
"--------------------------"
)
return
sealTimings
,
sealedSectors
,
nil
}
var
proveCmd
=
&
cli
.
Command
{
Name
:
"prove"
,
Usage
:
"Benchmark a proof computation"
,
ArgsUsage
:
"[input.json]"
,
Flags
:
[]
cli
.
Flag
{
&
cli
.
BoolFlag
{
Name
:
"no-gpu"
,
Usage
:
"disable gpu usage for the benchmark run"
,
},
&
cli
.
StringFlag
{
Name
:
"miner-addr"
,
Usage
:
"pass miner address (only necessary if using existing sectorbuilder)"
,
Value
:
"t01000"
,
},
},
Action
:
func
(
c
*
cli
.
Context
)
error
{
if
c
.
Bool
(
"no-gpu"
)
{
err
:=
os
.
Setenv
(
"BELLMAN_NO_GPU"
,
"1"
)
if
err
!=
nil
{
return
xerrors
.
Errorf
(
"setting no-gpu flag: %w"
,
err
)
}
}
if
!
c
.
Args
()
.
Present
()
{
return
xerrors
.
Errorf
(
"Usage: lotus-bench prove [input.json]"
)
}
inb
,
err
:=
ioutil
.
ReadFile
(
c
.
Args
()
.
First
())
if
err
!=
nil
{
return
xerrors
.
Errorf
(
"reading input file: %w"
,
err
)
}
var
c2in
Commit2In
if
err
:=
json
.
Unmarshal
(
inb
,
&
c2in
);
err
!=
nil
{
return
xerrors
.
Errorf
(
"unmarshalling input file: %w"
,
err
)
}
if
err
:=
paramfetch
.
GetParams
(
ReqContext
(
c
),
build
.
ParametersJSON
(),
build
.
SrsJSON
(),
c2in
.
SectorSize
);
err
!=
nil
{
return
xerrors
.
Errorf
(
"getting params: %w"
,
err
)
}
maddr
,
err
:=
address
.
NewFromString
(
c
.
String
(
"miner-addr"
))
if
err
!=
nil
{
return
err
}
mid
,
err
:=
address
.
IDFromAddress
(
maddr
)
if
err
!=
nil
{
return
err
}
sb
,
err
:=
ffiwrapper
.
New
(
nil
)
if
err
!=
nil
{
return
err
}
ref
:=
storage
.
SectorRef
{
ID
:
abi
.
SectorID
{
Miner
:
abi
.
ActorID
(
mid
),
Number
:
abi
.
SectorNumber
(
c2in
.
SectorNum
),
},
ProofType
:
spt
(
abi
.
SectorSize
(
c2in
.
SectorSize
)),
}
fmt
.
Printf
(
"----
\n
start proof computation
\n
"
)
start
:=
time
.
Now
()
proof
,
err
:=
sb
.
SealCommit2
(
context
.
TODO
(),
ref
,
c2in
.
Phase1Out
)
if
err
!=
nil
{
return
err
}
sealCommit2
:=
time
.
Now
()
fmt
.
Printf
(
"proof: %x
\n
"
,
proof
)
fmt
.
Printf
(
"----
\n
results (v28) (%d)
\n
"
,
c2in
.
SectorSize
)
dur
:=
sealCommit2
.
Sub
(
start
)
fmt
.
Printf
(
"seal: commit phase 2: %s (%s)
\n
"
,
dur
,
bps
(
abi
.
SectorSize
(
c2in
.
SectorSize
),
1
,
dur
))
return
nil
},
}
func
bps
(
sectorSize
abi
.
SectorSize
,
sectorNum
int
,
d
time
.
Duration
)
string
{
bdata
:=
new
(
big
.
Int
)
.
SetUint64
(
uint64
(
sectorSize
))
bdata
=
bdata
.
Mul
(
bdata
,
big
.
NewInt
(
int64
(
sectorNum
)))
bdata
=
bdata
.
Mul
(
bdata
,
big
.
NewInt
(
time
.
Second
.
Nanoseconds
()))
bps
:=
bdata
.
Div
(
bdata
,
big
.
NewInt
(
d
.
Nanoseconds
()))
return
build
.
SizeStr
(
bps
)
+
"/s"
}
func
spt
(
ssize
abi
.
SectorSize
)
abi
.
RegisteredSealProof
{
spt
,
err
:=
build
.
SealProofTypeFromSectorSize
(
ssize
,
NewestNetworkVersion
)
if
err
!=
nil
{
panic
(
err
)
}
return
spt
}
func
writeSealedOut
(
root
string
,
sealout
[]
SealedOut
)
error
{
// js, err := json.Marshal(tmps)
// if err != nil{
// return err
// }
jsonPath
:=
filepath
.
Join
(
root
,
"cache/Sealed.json"
)
file
,
err
:=
os
.
Create
(
jsonPath
)
if
err
!=
nil
{
return
err
}
defer
file
.
Close
()
encoder
:=
json
.
NewEncoder
(
file
)
err
=
encoder
.
Encode
(
sealout
)
if
err
!=
nil
{
return
err
}
return
nil
}
func
readSealOut
(
root
string
)
([]
SealedOut
,
error
)
{
jsonPath
:=
filepath
.
Join
(
root
,
"cache/Sealed.json"
)
file
,
err
:=
os
.
Open
(
jsonPath
)
if
err
!=
nil
{
return
nil
,
err
}
defer
file
.
Close
()
decoder
:=
json
.
NewDecoder
(
file
)
var
sealout
[]
SealedOut
err
=
decoder
.
Decode
(
&
sealout
)
if
err
!=
nil
{
return
nil
,
err
}
return
sealout
,
nil
}
func
DaemonContext
(
cctx
*
cli
.
Context
)
context
.
Context
{
if
mtCtx
,
ok
:=
cctx
.
App
.
Metadata
[
"traceContext"
];
ok
{
return
mtCtx
.
(
context
.
Context
)
}
return
context
.
Background
()
}
func
ReqContext
(
cctx
*
cli
.
Context
)
context
.
Context
{
tCtx
:=
DaemonContext
(
cctx
)
ctx
,
done
:=
context
.
WithCancel
(
tCtx
)
sigChan
:=
make
(
chan
os
.
Signal
,
2
)
go
func
()
{
<-
sigChan
done
()
}()
signal
.
Notify
(
sigChan
,
syscall
.
SIGTERM
,
syscall
.
SIGINT
,
syscall
.
SIGHUP
)
return
ctx
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment