提交 078bdfb1 authored 作者: Frédéric Bastien's avatar Frédéric Bastien 提交者: GitHub

Merge pull request #6336 from affanv14/metatest

Add more tests for meta-optimizer
......@@ -1653,6 +1653,29 @@ def local_abstractconv_gemm(node):
return [rval]
# CorrMM opt used for Meta-optimizer
@local_optimizer([AbstractConv2d])
def local_abstractconv_gemm_def(node):
if not isinstance(node.op, AbstractConv2d):
return None
img, kern = node.inputs
if (not isinstance(img.type, GpuArrayType) or
not isinstance(kern.type, GpuArrayType)):
return None
border_mode = node.op.border_mode
subsample = node.op.subsample
filter_dilation = node.op.filter_dilation
if node.op.filter_flip:
kern = kern[:, :, ::-1, ::-1]
rval = GpuCorrMM(border_mode,
subsample,
filter_dilation,
node.op.num_groups)(gpu_contiguous(img),
gpu_contiguous(kern))
return [rval]
@local_optimizer([AbstractConv2d])
def local_abstractconv_gemm_alt(node):
if not isinstance(node.op, AbstractConv2d):
......@@ -1768,6 +1791,30 @@ def local_abstractconv3d_gemm(node):
return [rval]
# Corr3dMM opt used for Meta-optimizer
@local_optimizer([AbstractConv3d])
def local_abstractconv3d_gemm_def(node):
if not isinstance(node.op, AbstractConv3d):
return None
img, kern = node.inputs
if (not isinstance(img.type, GpuArrayType) or
not isinstance(kern.type, GpuArrayType)):
return None
border_mode = node.op.border_mode
subsample = node.op.subsample
filter_dilation = node.op.filter_dilation
if node.op.filter_flip:
kern = kern[:, :, ::-1, ::-1, ::-1]
# By default use GpuCorr3dMM
rval = GpuCorr3dMM(border_mode,
subsample,
filter_dilation,
node.op.num_groups)(gpu_contiguous(img),
gpu_contiguous(kern))
return [rval]
@local_optimizer([AbstractConv3d])
def local_abstractconv3d_alt(node):
if not isinstance(node.op, AbstractConv3d):
......@@ -2745,9 +2792,9 @@ conv_metaopt.register(local_abstractconv_gw_cudnn,
['default', 'cudnn', 'conv_dnn'])
conv_metaopt.register(local_abstractconv_gi_cudnn,
['default', 'cudnn', 'conv_dnn'])
conv_metaopt.register(local_abstractconv_gemm,
conv_metaopt.register(local_abstractconv_gemm_def,
['default', 'conv_gemm'])
conv_metaopt.register(local_abstractconv3d_gemm,
conv_metaopt.register(local_abstractconv3d_gemm_def,
['default', 'conv_gemm'])
conv_metaopt.register(local_abstractconv_gradweights_gemm,
['default', 'conv_gemm'])
......
......@@ -811,28 +811,52 @@ class Conv_opt_test(unittest.TestCase):
for imshp, kshp, tshp in zip(imshp2d, kshp2d, tshp2d):
# forward passes
self.optimizer_2d([imshp, kshp, tshp], 0,
'',
'conv_dnn:alternative',
blas.GpuCorrMM)
self.optimizer_2d([imshp, kshp, tshp], 0,
'alternative',
'conv_dnn:default',
blas.GpuCorrMM_gradWeights)
self.optimizer_2d([imshp, kshp, tshp], 0,
'',
'conv_gemm:alternative',
dnn.GpuDnnConv)
self.optimizer_2d([imshp, kshp, tshp], 0,
'alternative',
'conv_gemm:default',
dnn.GpuDnnConvGradW)
# backwards wrt weights
self.optimizer_2d([imshp, tshp, kshp], 1,
'',
'conv_dnn:alternative',
blas.GpuCorrMM_gradWeights)
self.optimizer_2d([imshp, tshp, kshp], 1,
'alternative',
'conv_dnn:default',
blas.GpuCorrMM)
self.optimizer_2d([imshp, tshp, kshp], 1,
'',
'conv_gemm:alternative',
dnn.GpuDnnConvGradW)
self.optimizer_2d([imshp, tshp, kshp], 1,
'alternative',
'conv_gemm:default',
dnn.GpuDnnConv)
# backwards wrt to inputs
self.optimizer_2d([tshp, kshp, imshp], 2,
'',
'conv_dnn:alternative',
blas.GpuCorrMM_gradInputs)
self.optimizer_2d([tshp, kshp, imshp], 2,
'alternative',
'conv_dnn:default',
blas.GpuCorrMM)
self.optimizer_2d([tshp, kshp, imshp], 2,
'',
'conv_gemm:alternative',
dnn.GpuDnnConvGradI)
self.optimizer_2d([tshp, kshp, imshp], 2,
'alternative',
'conv_gemm:default',
......@@ -848,6 +872,10 @@ class Conv_opt_test(unittest.TestCase):
for imshp, kshp, tshp in zip(imshp3d, kshp3d, tshp3d):
# forwards passes
self.optimizer_3d([imshp, kshp, tshp], 0,
'',
'conv_dnn:alternative:conv3d2d',
blas.GpuCorr3dMM)
self.optimizer_3d([imshp, kshp, tshp], 0,
'alternative',
'conv_dnn:default:conv3d2d',
......@@ -860,7 +888,15 @@ class Conv_opt_test(unittest.TestCase):
'alternative',
'conv_gemm:default:conv3d2d',
dnn.GpuDnnConvGradW)
self.optimizer_3d([imshp, kshp, tshp], 0,
'',
'conv_gemm:alternative:conv3d2d',
dnn.GpuDnnConv)
# backward pass wrt weight
self.optimizer_3d([imshp, tshp, kshp], 1,
'',
'conv_dnn:alternative',
blas.GpuCorr3dMM_gradWeights)
self.optimizer_3d([imshp, tshp, kshp], 1,
'alternative',
'conv_dnn:default',
......@@ -869,8 +905,16 @@ class Conv_opt_test(unittest.TestCase):
'alternative',
'conv_gemm:default',
dnn.GpuDnnConv)
self.optimizer_3d([imshp, tshp, kshp], 1,
'',
'conv_gemm:alternative',
dnn.GpuDnnConvGradW)
# backward pass wrt inputs
self.optimizer_3d([tshp, kshp, imshp], 2,
'',
'conv_dnn:alternative',
blas.GpuCorr3dMM_gradInputs)
self.optimizer_3d([tshp, kshp, imshp], 2,
'alternative',
'conv_dnn:default',
......@@ -879,6 +923,10 @@ class Conv_opt_test(unittest.TestCase):
'alternative',
'conv_gemm:default',
dnn.GpuDnnConv)
self.optimizer_3d([tshp, kshp, imshp], 2,
'',
'conv_gemm:alternative',
dnn.GpuDnnConvGradI)
def test_optimizers_non_default(self):
if theano.config.cxx == "":
......@@ -888,13 +936,24 @@ class Conv_opt_test(unittest.TestCase):
kshp2d = [(4, 3, 3, 3), (3, 2, 3, 3)]
filter_dilation = [(1, 1), (2, 2)]
for imshp, kshp, fdil in zip(imshp2d, kshp2d, filter_dilation):
self.optimizer_2d([imshp, kshp], 0,
'',
'conv_dnn:alternative',
blas.GpuCorrMM,
border_mode='full',
filter_dilation=fdil)
self.optimizer_2d([imshp, kshp], 0,
'alternative',
'conv_dnn:default',
blas.GpuCorrMM_gradInputs,
border_mode='full',
filter_dilation=fdil)
# works only for cudnn > 6.0
self.optimizer_2d([imshp, kshp], 0,
'',
'conv_gemm:alternative',
dnn.GpuDnnConv,
border_mode='full',
filter_dilation=fdil)
self.optimizer_2d([imshp, kshp], 0,
'alternative',
'conv_gemm:default',
......@@ -906,13 +965,24 @@ class Conv_opt_test(unittest.TestCase):
kshp3d = [(4, 3, 3, 3, 3), (3, 2, 3, 3, 3)]
filter_dilation = [(1, 1, 1), (2, 2, 2)]
for imshp, kshp, fdil in zip(imshp3d, kshp3d, filter_dilation):
self.optimizer_3d([imshp, kshp], 0,
'',
'conv_dnn:alternative:conv3d2d',
blas.GpuCorr3dMM,
border_mode='full',
filter_dilation=fdil)
self.optimizer_3d([imshp, kshp], 0,
'alternative',
'conv_dnn:default:conv3d2d',
blas.GpuCorr3dMM_gradInputs,
border_mode='full',
filter_dilation=fdil)
# works only for cudnn > 6.0
self.optimizer_3d([imshp, kshp], 0,
'',
'conv_gemm:alternative:conv3d2d',
dnn.GpuDnnConv,
border_mode='full',
filter_dilation=fdil)
self.optimizer_3d([imshp, kshp], 0,
'alternative',
'conv_gemm:default:conv3d2d',
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论