def _do_pack_unpack_test(self, tt): """Do a single pack-unpack test. Args: tt: A _test_tuple defining the parameters of the test to do. This test executes a graph that performs a pack of tower_grads followed by an unpack and verifies that the shapes and values of gradient tensors are unchanged, along with paired variables. """ with ops.Graph().as_default(): tower_grads, consts, _, vrbls = self._init_tensors( tt.num_devices, tt.in_shapes) packed_tg, packing = allreduce.pack_small_tensors( tower_grads, max_bytes=40, max_group=10) unpacked_tg = allreduce.unpack_small_tensors(packed_tg, packing) with self.test_session() as sess: sess.run(variables.global_variables_initializer()) packed = sess.run(packed_tg) for d in range(0, tt.num_devices): for t in range(0, len(tt.out_shapes)): num_elts = 0 for dim in tt.out_shapes[t]: num_elts = (num_elts or 1) * dim self.assertTrue(np.array_equal( np.array(range(tt.out_i[t], tt.out_i[t] + num_elts), dtype=np.float32).reshape(tt.out_shapes[t]), packed[d][t][0])) unpacked = sess.run(unpacked_tg) for d in range(0, tt.num_devices): for t in range(0, len(tt.in_shapes)): self.assertTrue(np.array_equal(consts[d][t], unpacked[d][t][0])) self.assertEqual(vrbls[d][t], unpacked_tg[d][t][1])
def _do_all_reduce_pack_test(self, tt): """Test that all-reduce results are the same with or without packing.""" with ops.Graph().as_default(): tower_grads, consts, _, _ = self._init_tensors( tt.num_devices, tt.in_shapes) dev_prefixes = ['/job:localhost'] num_workers = 1 alg = 'xring' shards = 1 gpu_indices = range(0, tt.num_devices) assert len(gpu_indices) == len(tower_grads) no_pack_all_reduce = allreduce.sum_gradients_all_reduce( dev_prefixes, tower_grads, num_workers, alg, shards, gpu_indices, agg_small_grads_max_bytes=0, agg_small_grads_max_group=1) packed_tg, packing = allreduce.pack_small_tensors(tower_grads, 100, 100) packed_all_reduce = allreduce.sum_gradients_all_reduce( dev_prefixes, packed_tg, num_workers, alg, shards, gpu_indices, agg_small_grads_max_bytes=0, agg_small_grads_max_group=1) unpacked_tg = allreduce.unpack_small_tensors(packed_all_reduce, packing) with self.test_session() as sess: sess.run(variables.global_variables_initializer()) no_pack_values = sess.run(no_pack_all_reduce) pack_unpack_values = sess.run(unpacked_tg) for d in range(1, tt.num_devices): for t in range(0, len(tt.in_shapes)): self.assertTrue(np.allclose(no_pack_values[d][t][0], tt.num_devices * consts[0][t])) self.assertTrue(np.array_equal(no_pack_values[d][t][0], pack_unpack_values[d][t][0]))
def testUnpackSmallTensors(self): packing = {'0:0': allreduce.GradPackTuple(indices=range(2), vars=['v_0_0', 'v_0_1'], shapes=[tf.TensorShape([4]), tf.TensorShape([4])]), '0:1': allreduce.GradPackTuple(indices=range(3, 5), vars=['v_0_3', 'v_0_4'], shapes=[tf.TensorShape([3, 3,]), tf.TensorShape([3, 3,])]), '1:0': allreduce.GradPackTuple(indices=range(2), vars=['v_1_0', 'v_1_1'], shapes=[tf.TensorShape([4]), tf.TensorShape([4])]), '1:1': allreduce.GradPackTuple(indices=range(3, 5), vars=['v_1_3', 'v_1_4'], shapes=[tf.TensorShape([3, 3,]), tf.TensorShape([3, 3,])])} t0 = tf.constant([0, 1, 2, 3, 4, 5, 6, 7], dtype=tf.float32) t1 = tf.constant([17, 17], dtype=tf.float32) t2 = tf.constant([0, 1, 2, 3, 4, 5, 6, 7, 8, 0, 1, 2, 3, 4, 5, 6, 7, 8], dtype=tf.float32) t3 = tf.constant([0], dtype=tf.float32) tower_grads = [] for d in range(0, 2): one_tower = [(t0, 'packing_var_placeholder'), (t2, 'packing_var_placeholder'), (t1, 'v_%d_2' % d), (t3, 'v_%d_5' %d)] tower_grads.append(one_tower) new_tower_grads = allreduce.unpack_small_tensors(tower_grads, packing) self.assertEqual(2, len(new_tower_grads)) for d, tg in enumerate(new_tower_grads): self.assertEqual(6, len(tg)) self.assertEqual('v_%d_0' % d, tg[0][1]) self.assertEqual('v_%d_1' % d, tg[1][1]) self.assertEqual('v_%d_2' % d, tg[2][1]) self.assertEqual('v_%d_3' % d, tg[3][1]) self.assertEqual('v_%d_4' % d, tg[4][1]) self.assertEqual('v_%d_5' % d, tg[5][1]) self.assertEqual(1, tg[0][0].shape.ndims) self.assertEqual(4, tg[0][0].shape.dims[0]) self.assertEqual(1, tg[1][0].shape.ndims) self.assertEqual(4, tg[1][0].shape.dims[0]) self.assertEqual(1, tg[2][0].shape.ndims) self.assertEqual(2, tg[2][0].shape.dims[0]) self.assertEqual(2, tg[3][0].shape.ndims) self.assertEqual(3, tg[3][0].shape.dims[0]) self.assertEqual(3, tg[3][0].shape.dims[1]) self.assertEqual(2, tg[4][0].shape.ndims) self.assertEqual(3, tg[4][0].shape.dims[0]) self.assertEqual(3, tg[4][0].shape.dims[1]) self.assertEqual(1, tg[5][0].shape.ndims) self.assertEqual(1, tg[5][0].shape.dims[0])