提交 3b2f7b8a authored 作者: Frédéric Bastien's avatar Frédéric Bastien 提交者: GitHub

Merge pull request #6389 from affanv14/imptest

Improve tests for meta-optimizer
...@@ -25,7 +25,7 @@ from ..linalg import GpuCusolverSolve, cusolver_available, GpuCholesky ...@@ -25,7 +25,7 @@ from ..linalg import GpuCusolverSolve, cusolver_available, GpuCholesky
from .config import mode_with_gpu, mode_without_gpu, test_ctx_name, SkipTest from .config import mode_with_gpu, mode_without_gpu, test_ctx_name, SkipTest
import unittest import unittest
from theano.tensor.nnet import abstract_conv from theano.tensor.nnet import abstract_conv
from theano.gpuarray import dnn, blas from theano.gpuarray import dnn, blas, opt
def _check_stack_trace(thing): def _check_stack_trace(thing):
...@@ -773,55 +773,57 @@ class Conv_opt_test(unittest.TestCase): ...@@ -773,55 +773,57 @@ class Conv_opt_test(unittest.TestCase):
def optimizer_2d(self, input_shapes, direction, include_tags, exclude_tags, def optimizer_2d(self, input_shapes, direction, include_tags, exclude_tags,
op, border_mode='valid', subsample=(1, 1), op, border_mode='valid', subsample=(1, 1),
filter_dilation=(1, 1), num_groups=1): filter_dilation=(1, 1), num_groups=1, unshared=False,
optimiser=None):
inp1 = theano.shared(np.random.random(input_shapes[0]).astype(theano.config.floatX)) inp1 = theano.shared(np.random.random(input_shapes[0]).astype(theano.config.floatX))
inp2 = theano.shared(np.random.random(input_shapes[1]).astype(theano.config.floatX)) inp2 = theano.shared(np.random.random(input_shapes[1]).astype(theano.config.floatX))
if op is None:
inp1 = basic_ops.as_gpuarray_variable(inp1, test_ctx_name)
inp2 = basic_ops.as_gpuarray_variable(inp2, test_ctx_name)
if(direction == 0): if(direction == 0):
conv_op = abstract_conv.conv2d(inp1, conv_op = abstract_conv.AbstractConv2d(input_shapes[0],
inp2, input_shapes[1],
input_shapes[0], border_mode=border_mode,
input_shapes[1], subsample=subsample,
border_mode=border_mode, filter_dilation=filter_dilation,
subsample=subsample, num_groups=num_groups,
filter_dilation=filter_dilation, unshared=unshared)(inp1, inp2)
num_groups=num_groups)
if(direction == 1): if(direction == 1):
conv_op = abstract_conv.conv2d_grad_wrt_weights(inp1, conv_op = abstract_conv.AbstractConv2d_gradWeights(imshp=input_shapes[0],
inp2, kshp=input_shapes[2],
input_shapes[2], border_mode=border_mode,
input_shapes[0], subsample=subsample,
border_mode=border_mode, filter_dilation=filter_dilation,
subsample=subsample, num_groups=num_groups,
filter_dilation=filter_dilation, unshared=unshared)(inp1,
num_groups=num_groups) inp2,
input_shapes[2][-2:])
if(direction == 2): if(direction == 2):
conv_op = abstract_conv.conv2d_grad_wrt_inputs(inp1, conv_op = abstract_conv.AbstractConv2d_gradInputs(imshp=input_shapes[2],
inp2, kshp=input_shapes[1],
input_shapes[2], border_mode=border_mode,
input_shapes[1], subsample=subsample,
border_mode=border_mode, filter_dilation=filter_dilation,
subsample=subsample, num_groups=num_groups,
filter_dilation=filter_dilation, unshared=unshared)(inp2,
num_groups=num_groups) inp1,
input_shapes[2][-2:])
theano.config.metaopt.optimizer_including = include_tags theano.config.metaopt.optimizer_including = include_tags
theano.config.metaopt.optimizer_excluding = exclude_tags theano.config.metaopt.optimizer_excluding = exclude_tags
mode = mode_with_gpu.including('conv_meta').excluding('conv_dnn').excluding('conv_gemm') mode = mode_with_gpu.including('conv_meta').excluding('conv_dnn').excluding('conv_gemm')
ref_func = theano.function([], conv_op, mode=mode_with_gpu)
# All meta optimizer compile a new function. This need to know # All meta optimizer compile a new function. This need to know
# the current linker, but this information is not available, # the current linker, but this information is not available,
# so it use the default mode. # so it use the default mode.
if op is None: if op is None:
# No convolutions optimization takes place # No convolutions optimization takes place
with theano.change_flags(mode=mode): assert optimiser.transform(conv_op.owner) is None
with self.assertRaises(AssertionError):
theano.function([], conv_op, mode=mode)
return
else: else:
ref_func = theano.function([], conv_op, mode=mode_with_gpu)
with theano.change_flags(mode=mode): with theano.change_flags(mode=mode):
conv_func = theano.function([], conv_op, mode=mode) conv_func = theano.function([], conv_op, mode=mode)
assert any([isinstance(node.op, op) assert any([isinstance(node.op, op)
...@@ -830,52 +832,51 @@ class Conv_opt_test(unittest.TestCase): ...@@ -830,52 +832,51 @@ class Conv_opt_test(unittest.TestCase):
def optimizer_3d(self, input_shapes, direction, include_tags, exclude_tags, def optimizer_3d(self, input_shapes, direction, include_tags, exclude_tags,
op, border_mode='valid', subsample=(1, 1, 1), op, border_mode='valid', subsample=(1, 1, 1),
filter_dilation=(1, 1, 1), num_groups=1): filter_dilation=(1, 1, 1), num_groups=1, optimiser=None):
inp1 = theano.shared(np.random.random(input_shapes[0]).astype(theano.config.floatX)) inp1 = theano.shared(np.random.random(input_shapes[0]).astype(theano.config.floatX))
inp2 = theano.shared(np.random.random(input_shapes[1]).astype(theano.config.floatX)) inp2 = theano.shared(np.random.random(input_shapes[1]).astype(theano.config.floatX))
if op is None:
inp1 = basic_ops.as_gpuarray_variable(inp1, None)
inp2 = basic_ops.as_gpuarray_variable(inp2, None)
if(direction == 0): if(direction == 0):
conv_op = abstract_conv.conv3d(inp1, conv_op = abstract_conv.AbstractConv3d(input_shapes[0],
inp2, input_shapes[1],
input_shapes[0], border_mode=border_mode,
input_shapes[1], subsample=subsample,
border_mode=border_mode, filter_dilation=filter_dilation,
subsample=subsample, num_groups=num_groups)(inp1, inp2)
filter_dilation=filter_dilation,
num_groups=num_groups)
if(direction == 1): if(direction == 1):
conv_op = abstract_conv.conv3d_grad_wrt_weights(inp1, conv_op = abstract_conv.AbstractConv3d_gradWeights(input_shapes[0],
inp2, input_shapes[2],
input_shapes[2], border_mode=border_mode,
input_shapes[0], subsample=subsample,
border_mode=border_mode, filter_dilation=filter_dilation,
subsample=subsample, num_groups=num_groups)(inp1,
filter_dilation=filter_dilation, inp2,
num_groups=num_groups) input_shapes[2][-3:])
if(direction == 2): if(direction == 2):
conv_op = abstract_conv.conv3d_grad_wrt_inputs(inp1, conv_op = abstract_conv.AbstractConv3d_gradInputs(input_shapes[2],
inp2, input_shapes[1],
input_shapes[2], border_mode=border_mode,
input_shapes[1], subsample=subsample,
border_mode=border_mode, filter_dilation=filter_dilation,
subsample=subsample, num_groups=num_groups)(inp2,
filter_dilation=filter_dilation, inp1,
num_groups=num_groups) input_shapes[2][-3:])
theano.config.metaopt.optimizer_including = include_tags theano.config.metaopt.optimizer_including = include_tags
theano.config.metaopt.optimizer_excluding = exclude_tags theano.config.metaopt.optimizer_excluding = exclude_tags
mode = mode_with_gpu.including('conv_meta').excluding('conv_dnn').excluding('conv_gemm') mode = mode_with_gpu.including('conv_meta').excluding('conv_dnn').excluding('conv_gemm')
ref_func = theano.function([], conv_op, mode=mode_with_gpu)
# All meta optimizer compile a new function. This need to know # All meta optimizer compile a new function. This need to know
# the current linker, but this information is not available, # the current linker, but this information is not available,
# so it use the default mode. # so it use the default mode.
if op is None: if op is None:
# No convolutions optimization takes place # No convolutions optimization takes place
with theano.change_flags(mode=mode): assert optimiser.transform(conv_op.owner) is None
with self.assertRaises(AssertionError):
theano.function([], conv_op, mode=mode)
return return
elif op != 'conv3d2d': elif op != 'conv3d2d':
with theano.change_flags(mode=mode): with theano.change_flags(mode=mode):
...@@ -887,7 +888,7 @@ class Conv_opt_test(unittest.TestCase): ...@@ -887,7 +888,7 @@ class Conv_opt_test(unittest.TestCase):
conv_func = theano.function( conv_func = theano.function(
[], conv_op, [], conv_op,
mode=mode_with_gpu.including('conv_meta')) mode=mode_with_gpu.including('conv_meta'))
ref_func = theano.function([], conv_op, mode=mode_with_gpu)
utt.assert_allclose(conv_func(), ref_func()) utt.assert_allclose(conv_func(), ref_func())
def test_optimizers_2d(self): def test_optimizers_2d(self):
...@@ -1119,6 +1120,30 @@ class Conv_opt_test(unittest.TestCase): ...@@ -1119,6 +1120,30 @@ class Conv_opt_test(unittest.TestCase):
dnn.GpuDnnConvGradI, dnn.GpuDnnConvGradI,
num_groups=groups) num_groups=groups)
# test unshared for default optimizers
imshp2d = [(2, 2, 4, 4), (3, 2, 5, 3)]
kshp2d = [(2, 2, 2, 2, 3, 3), (2, 3, 1, 2, 3, 3)]
tshp2d = [(2, 2, 2, 2), (3, 2, 3, 1)]
for imshp, kshp, tshp, groups in zip(imshp2d, kshp2d, tshp2d, num_groups):
# forward pass
self.optimizer_2d([imshp, kshp, tshp], 0,
'',
'alternative',
blas.GpuCorrMM,
unshared=True)
# grad with respect to weights
self.optimizer_2d([imshp, tshp, kshp], 1,
'',
'alternative',
blas.GpuCorrMM_gradWeights,
unshared=True)
# grad with respect to inputs
self.optimizer_2d([tshp, kshp, imshp], 2,
'',
'alternative',
blas.GpuCorrMM_gradInputs,
unshared=True)
imshp3d = [(2, 6, 5, 5, 5), (2, 4, 5, 5, 5)] imshp3d = [(2, 6, 5, 5, 5), (2, 4, 5, 5, 5)]
kshp3d = [(3, 2, 3, 3, 3), (2, 2, 3, 3, 3)] kshp3d = [(3, 2, 3, 3, 3), (2, 2, 3, 3, 3)]
tshp3d = [(2, 3, 3, 3, 3), (2, 2, 3, 3, 3)] tshp3d = [(2, 3, 3, 3, 3), (2, 2, 3, 3, 3)]
...@@ -1158,91 +1183,128 @@ class Conv_opt_test(unittest.TestCase): ...@@ -1158,91 +1183,128 @@ class Conv_opt_test(unittest.TestCase):
dnn.GpuDnnConvGradI, dnn.GpuDnnConvGradI,
num_groups=groups) num_groups=groups)
def test_returns_none(self): def test_returns_none_2d(self):
if theano.config.cxx == "": if theano.config.cxx == "":
raise SkipTest("Need a c compiler.") raise SkipTest("Need a c compiler.")
# values given dont matter since it returns None # values given dont matter since it returns None
imshp = (2, 3, 5, 5) imshp = (2, 3, 5, 5)
kshp = (4, 3, 3, 3) kshp = (4, 3, 3, 3)
tshp = (2, 4, 3, 3) tshp = (2, 4, 3, 3)
exclude_string = ['conv_dnn:default', 'conv_gemm:default']
conv_direction = [0, 1, 2] conv_direction = [0, 1, 2]
optimisers = [[opt.local_abstractconv_gemm_alt,
opt.local_abstractconv_cudnn_alt],
[opt.local_abstractconv_gemm_gradweights_alt,
opt.local_abstractconv_cudnn_alt],
[opt.local_abstractconv_gradinputs_gemm_alt,
opt.local_abstractconv_cudnn_alt]]
# test that non default subsample returns None # test that non default subsample returns None
for string in exclude_string: for opt_direction, direction in zip(optimisers, conv_direction):
for direction in conv_direction: for optimiser in opt_direction:
self.optimizer_2d([imshp, kshp, tshp], self.optimizer_2d([imshp, kshp, tshp],
direction, direction,
'alternative', '',
string, '',
None, None,
subsample=(2, 2)) subsample=(2, 2),
optimiser=optimiser)
# test that non default num_groups returns None # test that non default num_groups returns None
for string in exclude_string: for opt_direction, direction in zip(optimisers, conv_direction):
for direction in conv_direction: for optimiser in opt_direction:
self.optimizer_2d([imshp, kshp, tshp], self.optimizer_2d([imshp, kshp, tshp],
direction, direction,
'alternative', '',
string, '',
None, None,
num_groups=3) num_groups=3,
optimiser=optimiser)
# test that border_mode=half returns None # test that border_mode=half returns None
for string in exclude_string: for opt_direction, direction in zip(optimisers, conv_direction):
for direction in conv_direction: for optimiser in opt_direction:
self.optimizer_2d([imshp, kshp, tshp], self.optimizer_2d([imshp, kshp, tshp],
direction, direction,
'alternative', '',
string, '',
None, None,
border_mode='half') border_mode='half',
optimiser=optimiser)
# test that Non-default filter dilation return None for # test that Non-default filter dilation return None for
# direction 1 # direction 1
for string in exclude_string: for optimiser in optimisers[1]:
direction = 1
self.optimizer_2d([imshp, kshp, tshp], self.optimizer_2d([imshp, kshp, tshp],
direction, 1,
'alternative', '',
'conv_dnn:default', '',
None, None,
filter_dilation=(2, 2)) filter_dilation=(2, 2),
optimiser=optimiser)
imshp = (2, 2, 4, 4)
kshp = (2, 2, 2, 2, 3, 3)
tshp = (2, 2, 2, 2)
shape_perms = [[imshp, kshp, tshp],
[imshp, tshp, kshp],
[tshp, kshp, imshp]]
# test unshared convolution returns None
for opt_direction, direction, perms in zip(optimisers, conv_direction,
shape_perms):
for optimiser in opt_direction:
self.optimizer_2d(perms,
direction,
'',
'',
None,
unshared=True,
optimiser=optimiser)
def test_returns_none_3d(self):
if theano.config.cxx == "":
raise SkipTest("Need a c compiler.")
imshp = (2, 3, 5, 5, 5) imshp = (2, 3, 5, 5, 5)
kshp = (4, 3, 3, 3, 3) kshp = (4, 3, 3, 3, 3)
tshp = (2, 4, 3, 3, 3) tshp = (2, 4, 3, 3, 3)
exclude_string = ['conv_dnn:default', 'conv_gemm:default'] conv_direction = [0, 1, 2]
optimisers = [[opt.local_abstractconv3d_alt,
opt.local_abstractconv3d_cudnn_alt],
[opt.local_abstractconv3d_gemm_gradweights_alt,
opt.local_abstractconv3d_cudnn_alt],
[opt.local_abstractconv3d_gradinputs_gemm_alt,
opt.local_abstractconv3d_cudnn_alt]]
# test that non default subsample returns None # test that non default subsample returns None
for string in exclude_string: for opt_direction, direction in zip(optimisers, conv_direction):
for direction in conv_direction: for optimiser in opt_direction:
self.optimizer_3d([imshp, kshp, tshp], self.optimizer_3d([imshp, kshp, tshp],
direction, direction,
'alternative', '',
string, '',
None, None,
subsample=(2, 2, 2)) subsample=(2, 2, 2),
optimiser=optimiser)
# test that non default num_groups returns None # test that non default num_groups returns None
for string in exclude_string: for opt_direction, direction in zip(optimisers, conv_direction):
for direction in conv_direction: for optimiser in opt_direction:
self.optimizer_3d([imshp, kshp, tshp], self.optimizer_3d([imshp, kshp, tshp],
direction, direction,
'alternative', '',
string, '',
None, None,
num_groups=3) num_groups=3,
optimiser=optimiser)
# test that border_mode=half returns None # test that border_mode=half returns None
for string in exclude_string: for opt_direction, direction in zip(optimisers, conv_direction):
for direction in conv_direction: for optimiser in opt_direction:
self.optimizer_3d([imshp, kshp, tshp], self.optimizer_3d([imshp, kshp, tshp],
direction, direction,
'alternative', '',
string, '',
None, None,
border_mode='half') border_mode='half',
optimiser=optimiser)
# test that Non-default filter dilation return None for # test that Non-default filter dilation return None for
# direction 1 # direction 1
for string in exclude_string: for optimiser in optimisers[1]:
direction = 1
self.optimizer_3d([imshp, kshp, tshp], self.optimizer_3d([imshp, kshp, tshp],
direction, 1,
'alternative', '',
string, '',
None, None,
filter_dilation=(2, 2, 2)) filter_dilation=(2, 2, 2),
optimiser=optimiser)
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论