Skip to content

Commit b95724b

Browse files
authored
Merge pull request tensorflow#15632 from drpngx/branch_180053468
Branch 180053468
2 parents e1ded7f + 729be24 commit b95724b

3 files changed

Lines changed: 81 additions & 37 deletions

File tree

tensorflow/contrib/cudnn_rnn/python/kernel_tests/cudnn_rnn_test.py

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -314,6 +314,47 @@ def testLayerBasic(self):
314314
self.assertEqual(0, total_sum2_v)
315315
self.assertEqual(0, total_sum3_v)
316316

317+
def testSaveableGraphDeviceAssignment(self):
318+
num_layers = 4
319+
num_units = 2
320+
batch_size = 8
321+
direction = CUDNN_RNN_UNIDIRECTION
322+
dir_count = 1
323+
324+
def DeviceFn(op):
325+
if op.type in ("Variable", "VariableV2"):
326+
return "/cpu:0"
327+
else:
328+
return "/gpu:0"
329+
330+
with ops.Graph().as_default() as g:
331+
with ops.device(DeviceFn):
332+
with vs.variable_scope("main"):
333+
kernel_initializer = init_ops.constant_initializer(3.14)
334+
bias_initializer = init_ops.constant_initializer(1.59)
335+
inputs = random_ops.random_uniform(
336+
[num_layers * dir_count, batch_size, num_units],
337+
dtype=dtypes.float32)
338+
339+
lstm = cudnn_rnn.CudnnLSTM(num_layers, num_units,
340+
direction=direction,
341+
kernel_initializer=kernel_initializer,
342+
bias_initializer=bias_initializer,
343+
name="awesome_lstm")
344+
outputs = lstm(inputs)
345+
346+
# saver is created in the scope of DeviceFn.
347+
saver = saver_lib.Saver()
348+
349+
with self.test_session(use_gpu=True, graph=g) as sess:
350+
save_path = os.path.join(self.get_temp_dir(),
351+
"test-saveable-device-assignment")
352+
sess.run(variables.global_variables_initializer())
353+
354+
saver.save(sess, save_path)
355+
saver.restore(sess, save_path)
356+
sess.run(outputs)
357+
317358

318359
# TODO(jamesqin): Transform to parameterized test after it is included in the
319360
# TF open source codebase.

tensorflow/contrib/cudnn_rnn/python/layers/cudnn_rnn.py

Lines changed: 18 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -450,17 +450,18 @@ def _canonical_to_opaque(self, cu_weights, cu_biases):
450450
raise RuntimeError(
451451
"%s._canonical_to_opaque invoked before input shape is known" %
452452
type(self).__name__)
453-
return cudnn_rnn_ops.cudnn_rnn_canonical_to_opaque_params(
454-
rnn_mode=self._rnn_mode,
455-
num_layers=self._num_layers,
456-
num_units=self._num_units,
457-
input_size=self._input_size,
458-
weights=cu_weights,
459-
biases=cu_biases,
460-
input_mode=self._input_mode,
461-
seed=self._seed,
462-
dropout=self._dropout,
463-
direction=self._direction)
453+
with ops.device("/gpu:0"):
454+
return cudnn_rnn_ops.cudnn_rnn_canonical_to_opaque_params(
455+
rnn_mode=self._rnn_mode,
456+
num_layers=self._num_layers,
457+
num_units=self._num_units,
458+
input_size=self._input_size,
459+
weights=cu_weights,
460+
biases=cu_biases,
461+
input_mode=self._input_mode,
462+
seed=self._seed,
463+
dropout=self._dropout,
464+
direction=self._direction)
464465

465466
def _forward(self, inputs, h, c, opaque_params, training):
466467
output, output_h, output_c = cudnn_rnn_ops._cudnn_rnn( # pylint:disable=protected-access
@@ -489,12 +490,12 @@ def _create_saveable(self):
489490
if self._saveable is not None:
490491
raise RuntimeError("Cudnn saveable already created.")
491492
self._saveable = self._saveable_cls( # pylint:disable=not-callable
492-
self.trainable_variables[0],
493-
self.num_layers,
494-
self.num_units,
495-
self.input_size,
496-
self.input_mode,
497-
self.direction,
493+
opaque_params=self.trainable_variables[0],
494+
num_layers=self.num_layers,
495+
num_units=self.num_units,
496+
input_size=self.input_size,
497+
input_mode=self.input_mode,
498+
direction=self.direction,
498499
scope=vs.get_variable_scope(),
499500
name="%s_saveable" % self.trainable_variables[0].op.name)
500501
ops.add_to_collection(ops.GraphKeys.SAVEABLE_OBJECTS, self._saveable)

tensorflow/contrib/cudnn_rnn/python/ops/cudnn_rnn_ops.py

Lines changed: 22 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ class CudnnCompatibleLSTMCell(lstm_ops.LSTMBlockCell):
7272
def __init__(self, num_units, reuse=None):
7373
super(CudnnCompatibleLSTMCell, self).__init__(
7474
num_units, forget_bias=0, cell_clip=None, use_peephole=False,
75-
reuse=reuse)
75+
reuse=reuse, name="cudnn_compatible_lstm_cell")
7676
self._names.update({"scope": "cudnn_compatible_lstm_cell"})
7777

7878

@@ -303,16 +303,17 @@ def _OpaqueParamsToCanonical(self):
303303
Returns:
304304
2 list for weights and biases respectively.
305305
"""
306-
weights, biases = gen_cudnn_rnn_ops.cudnn_rnn_params_to_canonical(
307-
num_layers=self._num_layers,
308-
num_units=self._num_units,
309-
input_size=self._input_size,
310-
params=self._variables,
311-
num_params=self._num_params,
312-
rnn_mode=self._rnn_mode,
313-
input_mode=self._input_mode,
314-
direction=self._direction)
315-
return (weights, biases)
306+
with ops.device("/gpu:0"):
307+
weights, biases = gen_cudnn_rnn_ops.cudnn_rnn_params_to_canonical(
308+
num_layers=self._num_layers,
309+
num_units=self._num_units,
310+
input_size=self._input_size,
311+
params=self._variables,
312+
num_params=self._num_params,
313+
rnn_mode=self._rnn_mode,
314+
input_mode=self._input_mode,
315+
direction=self._direction)
316+
return (weights, biases)
316317

317318
def _CanonicalToOpaqueParams(self, cu_weights, cu_biases):
318319
"""Converts from Cudnn canonical format to opaque params.
@@ -323,15 +324,16 @@ def _CanonicalToOpaqueParams(self, cu_weights, cu_biases):
323324
Returns:
324325
a single opaque tensor.
325326
"""
326-
return gen_cudnn_rnn_ops.cudnn_rnn_canonical_to_params(
327-
num_layers=self._num_layers,
328-
num_units=self._num_units,
329-
input_size=self._input_size,
330-
weights=cu_weights,
331-
biases=cu_biases,
332-
rnn_mode=self._rnn_mode,
333-
input_mode=self._input_mode,
334-
direction=self._direction)
327+
with ops.device("/gpu:0"):
328+
return gen_cudnn_rnn_ops.cudnn_rnn_canonical_to_params(
329+
num_layers=self._num_layers,
330+
num_units=self._num_units,
331+
input_size=self._input_size,
332+
weights=cu_weights,
333+
biases=cu_biases,
334+
rnn_mode=self._rnn_mode,
335+
input_mode=self._input_mode,
336+
direction=self._direction)
335337

336338
def _TransformCanonical(self, cu_weights, cu_biases):
337339
r"""Transform from Cudnn canonical to tf canonical.

0 commit comments

Comments
 (0)