rbbt-util 5.31.14 → 5.32.4

Sign up to get free protection for your applications and to get access to all the features.
@@ -36,33 +36,7 @@ end
36
36
  batch_system = options.delete :batch_system
37
37
  batch_system ||= 'auto'
38
38
 
39
- HPC::BATCH_MODULE = case batch_system.to_s.downcase
40
- when 'slurm'
41
- HPC::SLURM
42
- when 'lsf'
43
- HPC::LSF
44
- when 'auto'
45
- case $previous_commands.last
46
- when 'slurm'
47
- HPC::SLURM
48
- when 'lsf'
49
- HPC::LSF
50
- else
51
- case Rbbt::Config.get(:batch_system, :batch, :batch_system, :hpc, :HPC, :BATCH).to_s.downcase
52
- when 'slurm'
53
- HPC::SLURM
54
- when 'lsf'
55
- HPC::LSF
56
- else
57
- case ENV["BATCH_SYSTEM"].to_s.downcase
58
- when 'slurm'
59
- HPC::SLURM
60
- when 'lsf'
61
- HPC::LSF
62
- end
63
- end
64
- end
65
- end
39
+ HPC::BATCH_MODULE = HPC.batch_system batch_system
66
40
 
67
41
  raise ParameterException.new("Could not detect batch_system: #{Misc.fingerprint batch_system}") if HPC::BATCH_MODULE.nil?
68
42
 
@@ -40,33 +40,7 @@ end
40
40
  batch_system = options.delete :batch_system
41
41
  batch_system ||= 'auto'
42
42
 
43
- HPC::BATCH_MODULE = case batch_system.to_s.downcase
44
- when 'slurm'
45
- HPC::SLURM
46
- when 'lsf'
47
- HPC::LSF
48
- when 'auto'
49
- case $previous_commands.last
50
- when 'slurm'
51
- HPC::SLURM
52
- when 'lsf'
53
- HPC::LSF
54
- else
55
- case Rbbt::Config.get(:batch_system, :batch, :batch_system, :hpc, :HPC, :BATCH).to_s.downcase
56
- when 'slurm'
57
- HPC::SLURM
58
- when 'lsf'
59
- HPC::LSF
60
- else
61
- case ENV["BATCH_SYSTEM"].to_s.downcase
62
- when 'slurm'
63
- HPC::SLURM
64
- when 'lsf'
65
- HPC::LSF
66
- end
67
- end
68
- end
69
- end
43
+ HPC::BATCH_MODULE = HPC.batch_system batch_system
70
44
 
71
45
  raise ParameterException.new("Could not detect batch_system: #{Misc.fingerprint batch_system}") if HPC::BATCH_MODULE.nil?
72
46
 
@@ -108,7 +82,7 @@ workdir.glob("**/command.batch").sort_by{|f| File.mtime(f)}.each do |fcmd|
108
82
  cmd = nil
109
83
  end
110
84
 
111
- if m = command_txt.match(/^BATCH_SYSTEM=(.*)/)
85
+ if m = command_txt.match(/^export BATCH_SYSTEM=(.*)/)
112
86
  job_batch_system = m[1].downcase
113
87
  else
114
88
  job_batch_system = nil
@@ -235,6 +209,8 @@ workdir.glob("**/command.batch").sort_by{|f| File.mtime(f)}.each do |fcmd|
235
209
  text = CMD.cmd('grep "^#SBATCH" |tail -n +5', :in => Open.read(fcmd)).read.strip
236
210
  when 'lsf'
237
211
  text = CMD.cmd('grep "^#BSUB" |tail -n +5', :in => Open.read(fcmd)).read.strip
212
+ else
213
+ text = ""
238
214
  end
239
215
  lines = text.split("\n").collect{|line| header, _sep, value = line.partition(/\s+/); Log.color(:yellow, header + ": ") + value}
240
216
  puts Log.color :yellow, lines * "\n"
@@ -34,33 +34,7 @@ EOF
34
34
  batch_system = $slurm_options.delete :batch_system
35
35
  batch_system ||= 'auto'
36
36
 
37
- HPC::BATCH_MODULE = case batch_system.to_s.downcase
38
- when 'slurm'
39
- HPC::SLURM
40
- when 'lsf'
41
- HPC::LSF
42
- when 'auto'
43
- case $previous_commands.last
44
- when 'slurm'
45
- HPC::SLURM
46
- when 'lsf'
47
- HPC::LSF
48
- else
49
- case Rbbt::Config.get(:batch_system, :batch, :batch_system, :hpc, :HPC, :BATCH).to_s.downcase
50
- when 'slurm'
51
- HPC::SLURM
52
- when 'lsf'
53
- HPC::LSF
54
- else
55
- case ENV["BATCH_SYSTEM"].to_s.downcase
56
- when 'slurm'
57
- HPC::SLURM
58
- when 'lsf'
59
- HPC::LSF
60
- end
61
- end
62
- end
63
- end
37
+ HPC::BATCH_MODULE = HPC.batch_system batch_system
64
38
 
65
39
  raise ParameterException.new("Could not detect batch_system: #{Misc.fingerprint batch_system}") if HPC::BATCH_MODULE.nil?
66
40
 
@@ -40,33 +40,7 @@ end
40
40
  batch_system = options.delete :batch_system
41
41
  batch_system ||= 'auto'
42
42
 
43
- HPC::BATCH_MODULE = case batch_system.to_s.downcase
44
- when 'slurm'
45
- HPC::SLURM
46
- when 'lsf'
47
- HPC::LSF
48
- when 'auto'
49
- case $previous_commands.last
50
- when 'slurm'
51
- HPC::SLURM
52
- when 'lsf'
53
- HPC::LSF
54
- else
55
- case Rbbt::Config.get(:batch_system, :batch, :batch_system, :hpc, :HPC, :BATCH).to_s.downcase
56
- when 'slurm'
57
- HPC::SLURM
58
- when 'lsf'
59
- HPC::LSF
60
- else
61
- case ENV["BATCH_SYSTEM"].to_s.downcase
62
- when 'slurm'
63
- HPC::SLURM
64
- when 'lsf'
65
- HPC::LSF
66
- end
67
- end
68
- end
69
- end
43
+ HPC::BATCH_MODULE = HPC.batch_system batch_system
70
44
 
71
45
  raise ParameterException.new("Could not detect batch_system: #{Misc.fingerprint batch_system}") if HPC::BATCH_MODULE.nil?
72
46
 
@@ -33,33 +33,7 @@ EOF
33
33
  batch_system = $slurm_options.delete :batch_system
34
34
  batch_system ||= 'auto'
35
35
 
36
- HPC::BATCH_MODULE = case batch_system.to_s.downcase
37
- when 'slurm'
38
- HPC::SLURM
39
- when 'lsf'
40
- HPC::LSF
41
- when 'auto'
42
- case $previous_commands.last
43
- when 'slurm'
44
- HPC::SLURM
45
- when 'lsf'
46
- HPC::LSF
47
- else
48
- case Rbbt::Config.get(:batch_system, :batch, :batch_system, :hpc, :HPC, :BATCH).to_s.downcase
49
- when 'slurm'
50
- HPC::SLURM
51
- when 'lsf'
52
- HPC::LSF
53
- else
54
- case ENV["BATCH_SYSTEM"].to_s.downcase
55
- when 'slurm'
56
- HPC::SLURM
57
- when 'lsf'
58
- HPC::LSF
59
- end
60
- end
61
- end
62
- end
36
+ HPC::BATCH_MODULE = HPC.batch_system batch_system
63
37
 
64
38
  raise ParameterException.new("Could not detect batch_system: #{Misc.fingerprint batch_system}") if HPC::BATCH_MODULE.nil?
65
39
 
@@ -8,9 +8,11 @@ $0 = "rbbt #{$previous_commands*" "} #{ File.basename(__FILE__) }" if $previous_
8
8
 
9
9
  options = SOPT.setup <<EOF
10
10
 
11
- Make a job forget all its dependencies and archive their meta-data
11
+ Make a job forget its dependencies and archive their meta-data
12
12
 
13
- $ #{$0} [options] <job_path>
13
+ $ #{$0} [options] <job_path> [<task_name>|<workflow>#<task_name>] ...
14
+
15
+ Specific dependencies can be specified as . Otherwise, all are forgoten.
14
16
 
15
17
  -h--help Print this help
16
18
  -p--purge Purge dependencies
@@ -26,7 +28,7 @@ if options[:help]
26
28
  exit 0
27
29
  end
28
30
 
29
- path = ARGV[0]
31
+ path, *remove = ARGV
30
32
 
31
33
  raise ParameterException, "No path given" if path.nil?
32
34
  step = Workflow.load_step path
@@ -34,10 +36,20 @@ step = Workflow.load_step path
34
36
  step.archive_deps
35
37
  step.copy_files_dir
36
38
  dependencies = step.dependencies
37
- step.set_info :dependencies, []
38
39
 
39
- if options[:purge]
40
+ if remove && remove.any?
41
+ remove_paths = dependencies.select do |dep|
42
+ remove.include?(dep.task_name) || remove.include?([dep.workflow.to_s, dep.task_name] * "#")
43
+ end.collect{|dep| dep.path }
44
+ else
45
+ remove_paths = dependencies.collect{|dep| dep.path }
46
+ end
47
+
48
+ step.set_info :dependencies, step.info[:dependencies].reject{|info| remove_paths.include? info.last}
49
+
50
+ if options[:purge] || options[:recursive_purge]
40
51
  dependencies.each do |dependency|
52
+ next unless remove_paths.include? dependency.path
41
53
  Step.purge(dependency.path, options[:recursive_purge])
42
54
  end
43
55
  end
@@ -1,6 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
3
  require 'rbbt/workflow'
4
+ require 'rbbt/workflow/util/trace'
4
5
 
5
6
  require 'rbbt-util'
6
7
  require 'fileutils'
@@ -16,30 +17,26 @@ require 'rbbt/util/R'
16
17
  $0 = "rbbt #{$previous_commands*""} #{ File.basename(__FILE__) }" if $previous_commands
17
18
 
18
19
  options = SOPT.setup <<EOF
19
- Examine the provenance of a job result
20
+ Examine the execution trace of a job or set of jobs
20
21
 
21
22
  $ rbbt workflow trace <job-result>
22
23
 
23
24
  -h--help Help
25
+ -fg--fix_gap Remove execution gaps
26
+ -rk--report_keys* Config keys and info fields to report
27
+ -p--plot* Plot file
24
28
  -w--width* Image Width
25
29
  -h--height* Image Height
26
- -p--plot* Plot file
27
30
  -s--size* Image Size (Height and Width)
28
- -fg--fix_gap Remove execution gaps
29
31
  -pd--plot_data Print plot data
30
32
  EOF
31
33
 
32
34
  SOPT.usage if options[:help]
33
35
 
36
+
34
37
  files = ARGV
35
38
  plot = options[:plot]
36
39
 
37
- width, height, size = options.values_at :width, :height, :size
38
-
39
- size = 800 if size.nil?
40
- width = size if width.nil?
41
- height = size if height.nil?
42
-
43
40
  def get_step(file)
44
41
  file = File.expand_path(file)
45
42
  file = file.sub(/\.(info|files)/,'')
@@ -47,191 +44,8 @@ def get_step(file)
47
44
  end
48
45
 
49
46
  jobs = []
50
- files.each do |file|
51
- step = get_step file
52
-
53
- jobs += step.rec_dependencies + [step]
54
-
55
- step.info[:archived_info].each do |path,ainfo|
56
- archived_step = Step.new path
57
- class << archived_step
58
- self
59
- end.define_method :info do
60
- ainfo
61
- end
62
- jobs << archived_step
63
- end if step.info[:archived_info]
64
- end
65
-
66
- jobs = jobs.select{|job| job.info[:done]}.sort_by{|job| job.info[:started]}
67
-
68
- data = TSV.setup({}, "Job~Workflow,Task,Start,End#:type=:list")
69
- min_start = nil
70
- max_done = nil
71
- jobs.each do |job|
72
- next unless job.info[:done]
73
- started = job.info[:started]
74
- ddone = job.info[:done]
75
-
76
- code = [job.workflow, job.task_name].compact.collect{|s| s.to_s} * "."
77
- code = code + '.' + job.name
78
-
79
- data[code] = [job.workflow.to_s, job.task_name, started, ddone]
80
- if min_start.nil?
81
- min_start = started
82
- else
83
- min_start = started if started < min_start
84
- end
85
-
86
- if max_done.nil?
87
- max_done = ddone
88
- else
89
- max_done = ddone if ddone > max_done
90
- end
91
- end
92
-
93
- data.add_field "Start.second" do |k,value|
94
- value["Start"] - min_start
95
- end
96
-
97
- data.add_field "End.second" do |k,value|
98
- value["End"] - min_start
99
- end
100
-
101
- if options[:fix_gap]
102
- ranges = []
103
- data.through do |k,values|
104
- start, eend = values.values_at "Start.second", "End.second"
105
-
106
- ranges << (start..eend)
107
- end
108
-
109
- gaps = {}
110
- last = nil
111
- Misc.collapse_ranges(ranges).each do |range|
112
- start = range.begin
113
- eend = range.end
114
- if last
115
- gaps[last] = start - last
116
- end
117
- last = eend
118
- end
119
-
120
- data.process "End.second" do |value,k,values|
121
- gap = Misc.sum(gaps.select{|pos,size| pos < values["Start.second"]}.collect{|pos,size| size})
122
- value - gap
123
- end
124
-
125
- data.process "Start.second" do |value,k,values|
126
- gap = Misc.sum(gaps.select{|pos,size| pos < values["Start.second"]}.collect{|pos,size| size})
127
- value - gap
128
- end
47
+ jobs = files.collect do |file|
48
+ get_step file
129
49
  end
130
50
 
131
- tasks_info = {}
132
-
133
- jobs.each do |dep|
134
- next unless dep.info[:done]
135
- task = [dep.workflow, dep.task_name].compact.collect{|s| s.to_s} * "#"
136
- info = tasks_info[task] ||= {}
137
-
138
- time = dep.info[:done] - dep.info[:started]
139
- info[:time] ||= []
140
- info[:time] << time
141
-
142
- cpus = nil
143
- spark = false
144
- shard = false
145
- dep.info[:config_keys].select do |kinfo|
146
- key, value, tokens = kinfo
147
- key = key.to_s
148
- cpus = value if key.include? 'cpu'
149
- spark = value if key == 'spark'
150
- shard = value if key == 'shard'
151
- end
152
-
153
- info[:cpus] = cpus || 1
154
- info[:spark] = spark
155
- info[:shard] = shard
156
- end
157
-
158
- stats = TSV.setup({}, "Task~Calls,Avg. Time,Total Time,Cpus,Spark,Shard#:type=:list")
159
-
160
- tasks_info.each do |task, info|
161
- time_lists, cpus, spark, shard = info.values_at :time, :cpus, :spark, :shard
162
- avg_time = Misc.mean(time_lists).to_i
163
- total_time = Misc.sum(time_lists)
164
- calls = time_lists.length
165
- stats[task] = [calls, avg_time, total_time, cpus, spark, shard]
166
- end
167
-
168
- raise "No jobs to process" if data.size == 0
169
-
170
- start = data.column("Start.second").values.flatten.collect{|v| v.to_i}.min
171
- eend = data.column("End.second").values.flatten.collect{|v| v.to_i}.max
172
- total = eend - start
173
- Log.info "Total time elapsed: #{total} seconds"
174
-
175
- if options[:fix_gap]
176
- total_gaps = Misc.sum(gaps.collect{|k,v| v})
177
- Log.info "Total gaps: #{total_gaps} seconds"
178
- end
179
-
180
- if options[:plot_data]
181
- puts data.to_s
182
- else
183
- puts stats.to_s
184
- end
185
-
186
- if plot
187
- data.R <<-EOF, [:svg]
188
- rbbt.require('tidyverse')
189
- rbbt.require('ggplot2')
190
-
191
- names(data) <- make.names(names(data))
192
- data$id = rownames(data)
193
- data$content = data$Task
194
- data$start = data$Start
195
- data$end = data$End
196
- data$Project = data$Workflow
197
-
198
- tasks = data
199
-
200
- #theme_gantt <- function(base_size=11, base_family="Source Sans Pro Light") {
201
- theme_gantt <- function(base_size=11, base_family="Sans Serif") {
202
- ret <- theme_bw(base_size, base_family) %+replace%
203
- theme(panel.background = element_rect(fill="#ffffff", colour=NA),
204
- axis.title.x=element_text(vjust=-0.2), axis.title.y=element_text(vjust=1.5),
205
- title=element_text(vjust=1.2, family="Source Sans Pro Semibold"),
206
- panel.border = element_blank(), axis.line=element_blank(),
207
- panel.grid.minor=element_blank(),
208
- panel.grid.major.y = element_blank(),
209
- panel.grid.major.x = element_line(size=0.5, colour="grey80"),
210
- axis.ticks=element_blank(),
211
- legend.position="bottom",
212
- axis.title=element_text(size=rel(1.2), family="Source Sans Pro Semibold"),
213
- strip.text=element_text(size=rel(1.5), family="Source Sans Pro Semibold"),
214
- strip.background=element_rect(fill="#ffffff", colour=NA),
215
- panel.spacing.y=unit(1.5, "lines"),
216
- legend.key = element_blank())
217
-
218
- ret
219
- }
220
-
221
- tasks.long <- tasks %>%
222
- gather(date.type, task.date, -c(Project, Task, id, Start.second, End.second)) %>%
223
- arrange(date.type, task.date) %>%
224
- mutate(id = factor(id, levels=rev(unique(id)), ordered=TRUE))
225
-
226
- x.breaks <- seq(length(tasks$Task) + 0.5 - 3, 0, by=-3)
227
-
228
- timeline <- ggplot(tasks.long, aes(y=id, yend=id, x=Start.second, xend=End.second, colour=Task)) +
229
- geom_segment() +
230
- geom_vline(xintercept=x.breaks, colour="grey80", linetype="dotted") +
231
- guides(colour=guide_legend(title=NULL)) +
232
- labs(x=NULL, y=NULL) +
233
- theme_gantt() + theme(axis.text.x=element_text(angle=45, hjust=1))
234
-
235
- rbbt.png_plot('#{plot}', 'plot(timeline)', width=#{width}, height=#{height}, pointsize=6)
236
- EOF
237
- end
51
+ puts Workflow.trace(jobs, options)