提交 58c9da99 authored 作者: f0k's avatar f0k

Nicer metaopt verbose output and conv_meta.verbose config flag to enable it

上级 cd26cc10
...@@ -858,14 +858,19 @@ class LocalMetaOptimizer(LocalOptimizer): ...@@ -858,14 +858,19 @@ class LocalMetaOptimizer(LocalOptimizer):
missing.add(input) missing.add(input)
if missing: if missing:
givens.update(self.provide_inputs(node, missing)) givens.update(self.provide_inputs(node, missing))
missing.difference_update(givens.keys())
# ensure we have data for all input variables that need it # ensure we have data for all input variables that need it
if any(var not in givens for var in missing): if missing:
if self.verbose: if self.verbose:
print ("%s skipping %s (cannot create test inputs)" % print ("%s cannot meta-optimize %s, "
(self.__class__.__name__, node)) "%d of %d input shapes unknown" %
(self.__class__.__name__, node, len(missing), node.nin))
return return
# now we can apply the different optimizations in turn, # now we can apply the different optimizations in turn,
# compile the resulting subgraphs and time their execution # compile the resulting subgraphs and time their execution
if self.verbose:
print ("%s meta-optimizing %s (%d choices):" %
(self.__class__.__name__, node, len(self.optimizers)))
timings = [] timings = []
for opt in self.optimizers: for opt in self.optimizers:
outputs = opt.transform(node) outputs = opt.transform(node)
...@@ -878,15 +883,20 @@ class LocalMetaOptimizer(LocalOptimizer): ...@@ -878,15 +883,20 @@ class LocalMetaOptimizer(LocalOptimizer):
timing = min(self.time_call(fn) for _ in range(3)) timing = min(self.time_call(fn) for _ in range(3))
except Exception as e: except Exception as e:
if self.verbose: if self.verbose:
print e print "* %s: exception" % opt, e
continue continue
else: else:
if self.verbose: if self.verbose:
print opt, timing print "* %s: %.5g sec" % (opt, timing)
timings.append((timing, outputs)) timings.append((timing, outputs, opt))
else:
if self.verbose:
print "* %s: not applicable" % opt
# finally, we choose the fastest one # finally, we choose the fastest one
if timings: if timings:
timings.sort() timings.sort()
if self.verbose:
print "= %s" % timings[0][2]
return timings[0][1] return timings[0][1]
return return
......
...@@ -1361,9 +1361,14 @@ class LocalCudaMetaOptimizer(LocalMetaOptimizer): ...@@ -1361,9 +1361,14 @@ class LocalCudaMetaOptimizer(LocalMetaOptimizer):
# Convolution Meta-optimizer # Convolution Meta-optimizer
theano.configparser.AddConfigVar('conv_meta.verbose',
"Enable verbose output for conv_meta optimizer",
theano.configparser.BoolParam(False), in_c_key=False)
class ConvMetaOptimizer(LocalCudaMetaOptimizer): class ConvMetaOptimizer(LocalCudaMetaOptimizer):
def __init__(self, optimizers): def __init__(self, optimizers):
super(ConvMetaOptimizer, self).__init__([GpuConv], optimizers) super(ConvMetaOptimizer, self).__init__([GpuConv], optimizers)
self.verbose = config.conv_meta.verbose
def provide_inputs(self, node, inputs): def provide_inputs(self, node, inputs):
# We need to provide dummy data for the given inputs. # We need to provide dummy data for the given inputs.
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论