def testMultipleReduces(self): with self.session() as sess: with ops.device("/device:IPU:0"): pa = array_ops.placeholder(np.float16, [3]) pb = array_ops.placeholder(np.float16, [3]) a = math_ops.cast(pa, np.float32) a = math_ops.reduce_sum(a) a = math_ops.cast(a, np.float16) b = math_ops.cast(pb, np.float32) b = math_ops.reduce_sum(b) b = math_ops.cast(b, np.float16) c = a + b report = ReportJSON(self, sess) report.reset() fd = {pa: [2.0, 0.5, 1.0], pb: [1.0, 1.0, 2.0]} result = sess.run(c, fd) self.assertAllClose(result, 7.5) report.parse_log() ok = [ '__seed*', 'host-exchange-local-copy-', 'Sum/reduce*/Reduce', 'Sum_1/reduce*/Reduce', 'add/add*/Add' ] report.assert_all_compute_sets_and_list(ok)
def testNoCastsF16ReduceWithReshape(self): with self.session() as sess: with ops.device("/device:IPU:0"): pa = array_ops.placeholder(np.float16, [3, 4]) a = gen_array_ops.reshape(pa, [4, 3]) a = math_ops.reduce_sum(a, axis=(1)) report = ReportJSON(self, sess) report.reset() fd = {pa: np.ones([3, 4])} result = sess.run(a, fd) self.assertAllClose(result, [3.0, 3.0, 3.0, 3.0]) report.parse_log() ok = [ '__seed*', 'Sum/reduce*/Reduce', ] report.assert_all_compute_sets_and_list(ok)
def testReduceMean(self): with self.session() as sess: shape = [2, 10000] with ops.device("/device:IPU:0"): pa = array_ops.placeholder(np.float16, shape) output = math_ops.reduce_mean(pa, axis=[1]) report = ReportJSON(self, sess) report.reset() val = np.finfo(np.float16).max / 2 result = sess.run(output, {pa: np.full(shape, val)}) self.assertAllClose(result, [val, val]) report.parse_log(assert_len=4) ok = [ '__seed*', 'host-exchange-local-copy-', 'Mean/fusion/Reduce', 'Mean/fusion*/Op/Multiply', 'Mean/convert*/Cast' ] report.assert_all_compute_sets_and_list(ok)
def testReductionSumVectorF16NoConverts(self): with self.session() as sess: with ops.device("/device:IPU:0"): pa = array_ops.placeholder(np.float16, [4096], name="a") output = math_ops.reduce_sum(pa, axis=[0]) report = ReportJSON(self, sess) report.reset() fd = {pa: np.ones([4096])} result = sess.run(output, fd) self.assertAllClose(result, 4096) report.parse_log() # Check that there are no casts to float at the beginning. ok = [ '__seed*', 'host-exchange-local-copy-', 'Sum/reduce*/ReduceOnTile/InToIntermediateNoExchange/Reduce', 'Sum/reduce*/ReduceFinalStage/IntermediateToOutput/Reduce' ] report.assert_all_compute_sets_and_list(ok)
def testDontRemoveCastsIfUsed(self): with self.session() as sess: with ops.device("/device:IPU:0"): pa = array_ops.placeholder(np.float16, [3]) b = math_ops.cast(pa, np.float32) const = array_ops.constant(1.0, np.float32) b = b + const c = math_ops.cast(b, np.float16) report = ReportJSON(self, sess) report.reset() fd = {pa: [2.0, 0.5, 1.0]} result = sess.run(c, fd) self.assertAllClose(result, [3.0, 1.5, 2.0]) report.parse_log(assert_len=4) ok = [ '__seed*', 'host-exchange-local-copy-', 'Cast/convert.*/Cast', 'add/fusion*/Add', 'Cast_1/convert.*/Cast' ] report.assert_all_compute_sets_and_list(ok)
def testConvolutionsDontMatchDifferentDevices(self): with self.session() as sess: with ops.device("/device:IPU:0"): x = array_ops.placeholder(np.float32, shape=[1, 4, 4, 2]) with variable_scope.variable_scope("vs", use_resource=True): with ipu.scopes.ipu_shard(0): y = layers.Conv2D( 2, 1, use_bias=False, kernel_initializer=init_ops.ones_initializer())(x) with ipu.scopes.ipu_shard(1): y = layers.Conv2D( 2, 1, use_bias=False, kernel_initializer=init_ops.ones_initializer())(y) report = ReportJSON(self, sess, sharded=True) sess.run(variables.global_variables_initializer()) report.reset() sess.run(y, {x: np.zeros([1, 4, 4, 2])}) report.parse_log() # Note how there are two convolutions ok = [ '__seed*', '*OnTileCopy*', 'vs/conv2d/Conv2D/convolution.*', 'Copy_vs/conv2d/Conv2D/convolution.*', 'vs/conv2d_1/Conv2D/convolution.*' ] report.assert_all_compute_sets_and_list(ok)