Getting algorithm run time information
It might be interesting to know in which algorithms the most time is spent in a
workflow. This can be achieved with builtin Gaudi services, and auditors,
specifically using either the TimelineSvc
and/or the AlgTimingAuditor
depending on the desired level of detail.
AlgTimingAuditor
The AlgTimingAuditor
in combination with the AuditorSvc
allow to easily get
an overview over the execution time of a workflow and in which algorithms,
services or tools time is spent. In order to configure it, you need to simply do
the following
from Configurables import AuditorSvc, AlgTimingAuditor, EventDataSvc
from k4FWCore import ApplicationMgr
# List of your algorithms that you want to run
algList = []
# setup the AuditorSvc and add the AlgTimingAuditor to it
auditorSvc = AuditorSvc
auditorSvc.Auditors = [AlgTimingAuditor()]
appMgr = ApplicationMgr(
TopAlg=algList,
EvtSel="NONE",
ExtSvc=[EventDataSvc("EventDataSvc", auditorSvc)]
)
This will result in an output similar to this one
AlgTimingAuditor INFO -------------------------------------------------------------------
AlgTimingAuditor INFO Algorithm | exec (ms) | count | total (s)
AlgTimingAuditor INFO -------------------------------------------------------------------
AlgTimingAuditor INFO EVENT LOOP | 7210 | 3 | 21.63
AlgTimingAuditor INFO -------------------------------------------------------------------
Per Algorithm timing
In order to enable a more detailed output and auditing, it is necessary to enable them via
appMgr.AuditAlgorithms = True
appMgr.AuditTools = True
appMgr.AuditServices = True
This will result in output like
AlgTimingAuditor INFO -------------------------------------------------------------------
AlgTimingAuditor INFO Algorithm | exec (ms) | count | total (s)
AlgTimingAuditor INFO -------------------------------------------------------------------
AlgTimingAuditor INFO | 0 | 0 | 0
AlgTimingAuditor INFO IncidentSvc | 0 | 0 | 0
AlgTimingAuditor INFO EventPersistencySvc | 0 | 0 | 0
AlgTimingAuditor INFO | 0 | 0 | 0
AlgTimingAuditor INFO | 0 | 0 | 0
AlgTimingAuditor INFO | 0 | 0 | 0
AlgTimingAuditor INFO Gaudi::Utils::SignalMonitorSvc | 0 | 0 | 0
AlgTimingAuditor INFO | 0 | 0 | 0
AlgTimingAuditor INFO TimelineSvc | 0 | 0 | 0
AlgTimingAuditor INFO PodioInput | 67.34 | 3 | 0.202
AlgTimingAuditor INFO AlgExecStateSvc | 0 | 0 | 0
AlgTimingAuditor INFO MyAIDAProcessor | 56.44 | 3 | 0.1693
AlgTimingAuditor INFO RndmGenSvc | 0 | 0 | 0
AlgTimingAuditor INFO RndmGenSvc.Engine | 0 | 0 | 0
AlgTimingAuditor INFO ToolSvc | 0 | 0 | 0
AlgTimingAuditor INFO ToolSvc.InputConversion | 0 | 0 | 0
AlgTimingAuditor INFO MyStatusmonitor | 0.02489 | 3 | 7.467e-05
AlgTimingAuditor INFO MySplitCollectionByLayer | 0.04234 | 3 | 0.000127
AlgTimingAuditor INFO VXDPlanarDigiProcessor_CMOSVXD | 0.5061 | 3 | 0.001518
AlgTimingAuditor INFO SITPlanarDigiProcessor | 0.4672 | 3 | 0.001402
AlgTimingAuditor INFO EDM4hepOutput | 97.03 | 3 | 0.2911
AlgTimingAuditor INFO HistogramDataSvc | 0 | 0 | 0
AlgTimingAuditor INFO HistogramPersistencySvc | 0 | 0 | 0
AlgTimingAuditor INFO -------------------------------------------------------------------
TimelineSvc
Using the TimelineSvc
it is possible to get the exact start and end times for
each algorithm and event. It’s output can be used for very detailed analysis
later. It can be configured as
from Configurables import TimelineSvc, EventDataSvc
from k4FWCore import ApplicationMgr
# List of your algorithms that you want to run
algList = []
timelineSvc = TimelineSvc(RecordTimeline=True, DumpTimeline=True, TimelineFile="timeline.csv")
appMgr = ApplicationMgr(
TopAlg=algList,
EvtSel="NONE",
ExtSvc=[EventDataSvc("EventDataSvc", timelineSvc)]
)
This will create timelines.csv
file that looks similar to
#start end algorithm thread slot event
1745848335520532076 1745848335574872001 PodioInput 135806878369600 0 0
1745848335574879058 1745848335631430347 MyAIDAProcessor 135806878369600 0 0
1745848335631436925 1745848335631466797 MyStatusmonitor 135806878369600 0 0
1745848335631467617 1745848335631525405 MySplitCollectionByLayer 135806878369600 0 0
1745848335631526275 1745848335632537227 VXDPlanarDigiProcessor_CMOSVXD5 135806878369600 0 0
1745848335632538493 1745848335633010729 SITPlanarDigiProcessor 135806878369600 0 0
1745848335633012309 1745848335633141450 FTDPixelPlanarDigiProcessor 135806878369600 0 0
1745848335633142527 1745848335633573502 FTDStripPlanarDigiProcessor 135806878369600 0 0
1745848335633574995 1745848335634521760 FTDDDSpacePointBuilder 135806878369600 0 0
each line has
the start time of the algorithm in nanoseconds
the end time of the algorithm in nanoseconds
the algorithm name
the thread-id
the (thread) slot in which the event was processed in Gaudi
the event number
Note
The event number is a sequential number inside Gaudi and does not necessarily
correspond with the event number that can be obtained from the EventHeader
Visualization using hivetimeline.py
The hivetimeline.py
tool that comes with Gaudi can be used to visualize the
output of the TimelineSvc
. It has some limitations, e.g. the number of
algorithms it supports for visualization, but it might be useful to have a first
quick look.