You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mxnet.apache.org by ha...@apache.org on 2018/06/29 15:06:18 UTC
[incubator-mxnet] branch master updated: fix flaky test_sparse_dot
and incorrect handling of empty sparse tensors (#11389)
This is an automated email from the ASF dual-hosted git repository.
haibin pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-mxnet.git
The following commit(s) were added to refs/heads/master by this push:
new 39ca251 fix flaky test_sparse_dot and incorrect handling of empty sparse tensors (#11389)
39ca251 is described below
commit 39ca251a1283de886f674967e2d6c4a6b875c847
Author: Hao Jin <ha...@users.noreply.github.com>
AuthorDate: Fri Jun 29 11:06:11 2018 -0400
fix flaky test_sparse_dot and incorrect handling of empty sparse tensors (#11389)
---
include/mxnet/ndarray.h | 4 +++-
src/operator/tensor/dot-inl.cuh | 2 +-
src/operator/tensor/dot-inl.h | 2 +-
src/operator/tensor/init_op.cu | 1 +
src/operator/tensor/init_op.h | 2 ++
tests/python/unittest/test_sparse_operator.py | 6 +++---
6 files changed, 11 insertions(+), 6 deletions(-)
diff --git a/include/mxnet/ndarray.h b/include/mxnet/ndarray.h
index faffe1b..d3f4440 100644
--- a/include/mxnet/ndarray.h
+++ b/include/mxnet/ndarray.h
@@ -202,7 +202,7 @@ class NDArray {
/*! returns the dtypes of all aux data */
const std::vector<int>& aux_types() const {
CHECK_NE(storage_type(), kDefaultStorage)
- << "aux_types() is not intended for kDefaultStorage.";
+ << "aux_types() is not intended for kDefaultStorage.";
return ptr_->aux_types;
}
@@ -214,6 +214,8 @@ class NDArray {
* the shape is known and need to be reset using this function.
*/
inline void set_aux_shape(size_t index, const TShape& shape) const {
+ CHECK_NE(storage_type(), kDefaultStorage)
+ << "set_aux_shape() is not intended for kDefaultStorage.";
ptr_->set_aux_shape(index, shape);
}
diff --git a/src/operator/tensor/dot-inl.cuh b/src/operator/tensor/dot-inl.cuh
index c507a9a..8aedec0 100644
--- a/src/operator/tensor/dot-inl.cuh
+++ b/src/operator/tensor/dot-inl.cuh
@@ -1053,7 +1053,7 @@ inline void DotDnsCsrDnsImpl(const OpContext& ctx, const gpu& gpu_dev,
TBlob csr_indices = rhs.aux_data(csr::kIdx);
TBlob csr_indptr = rhs.aux_data(csr::kIndPtr);
if (!rhs.storage_initialized()) {
- FillZerosCsrImpl(s, *ret);
+ Fill(s, ret->data(), req, 0);
return;
}
diff --git a/src/operator/tensor/dot-inl.h b/src/operator/tensor/dot-inl.h
index 675cbe8..5e46910 100644
--- a/src/operator/tensor/dot-inl.h
+++ b/src/operator/tensor/dot-inl.h
@@ -1139,7 +1139,7 @@ inline void DotDnsCsrDnsImpl(const OpContext& ctx, const cpu& cpu_dev,
CHECK_EQ(rhs.storage_type(), kCSRStorage);
mshadow::Stream<cpu>* s = ctx.get_stream<cpu>();
if (!rhs.storage_initialized()) {
- FillZerosCsrImpl(s, *ret);
+ Fill(s, ret->data(), req, 0);
return;
}
diff --git a/src/operator/tensor/init_op.cu b/src/operator/tensor/init_op.cu
index 5841408fa..81d835e 100644
--- a/src/operator/tensor/init_op.cu
+++ b/src/operator/tensor/init_op.cu
@@ -34,6 +34,7 @@ namespace op {
* \param dst - NDArray which is to be set to "all zeroes"
*/
void FillZerosCsrImpl(mshadow::Stream<mshadow::gpu> *s, const NDArray& dst) {
+ CHECK_EQ(dst.storage_type(), kCSRStorage) << "dst is not a CSR NDArray";
dst.set_aux_shape(csr::kIdx, mshadow::Shape1(0));
dst.CheckAndAllocAuxData(csr::kIndPtr, mshadow::Shape1(dst.shape()[0] + 1));
TBlob indptr_data = dst.aux_data(csr::kIndPtr);
diff --git a/src/operator/tensor/init_op.h b/src/operator/tensor/init_op.h
index 6c96605..4af3a40 100644
--- a/src/operator/tensor/init_op.h
+++ b/src/operator/tensor/init_op.h
@@ -344,6 +344,7 @@ inline void FillDnsZerosRspImpl(mshadow::Stream<xpu> *s, NDArray *dst) {
*/
template<typename xpu>
void FillZerosRspImpl(mshadow::Stream<xpu> *, const NDArray& dst) {
+ CHECK_EQ(dst.storage_type(), kRowSparseStorage) << "dst should be an RSP NDArray";
if (dst.storage_initialized()) {
// reset the shapes if it's not zeros (set_aux_shape() will set storage_shape to zero as well)
dst.set_aux_shape(rowsparse::kIdx, TShape(mshadow::Shape1(0)));
@@ -356,6 +357,7 @@ void FillZerosRspImpl(mshadow::Stream<xpu> *, const NDArray& dst) {
* \param dst - NDArray which is to be set to "all zeroes"
*/
inline void FillZerosCsrImpl(mshadow::Stream<mshadow::cpu> *s, const NDArray& dst) {
+ CHECK_EQ(dst.storage_type(), kCSRStorage) << "dst is not a CSR NDArray";
dst.set_aux_shape(csr::kIdx, mshadow::Shape1(0));
dst.CheckAndAllocAuxData(csr::kIndPtr, mshadow::Shape1(dst.shape()[0] + 1));
TBlob indptr_data = dst.aux_data(csr::kIndPtr);
diff --git a/tests/python/unittest/test_sparse_operator.py b/tests/python/unittest/test_sparse_operator.py
index 70af2bc..09546ac 100644
--- a/tests/python/unittest/test_sparse_operator.py
+++ b/tests/python/unittest/test_sparse_operator.py
@@ -1278,7 +1278,7 @@ def test_sparse_dot():
rhs = rhs_nd.tostype(rhs_stype)
out = mx.nd.dot(lhs, rhs, forward_stype=forward_stype,
transpose_a=trans_a, transpose_b=trans_b)
- assert_almost_equal(out.tostype('default').asnumpy(), out_np, rtol=1e-4, atol=1e-5)
+ assert_almost_equal(out.tostype('default').asnumpy(), out_np, rtol=1e-3, atol=1e-5)
lhs_var = mx.symbol.Variable('lhs', stype=lhs_stype)
rhs_var = mx.symbol.Variable('rhs', stype=rhs_stype)
out = mx.symbol.sparse.dot(lhs_var, rhs_var,
@@ -1295,7 +1295,7 @@ def test_sparse_dot():
out = mx.nd.dot(lhs_nd, rhs_nd, transpose_a=trans_lhs)
out_dns = mx.nd.dot(lhs_dns, rhs_dns, transpose_a=trans_lhs)
out_np = out_dns.asnumpy()
- assert_almost_equal(out.asnumpy(), out_np, rtol=1e-4, atol=1e-5)
+ assert_almost_equal(out.asnumpy(), out_np, rtol=1e-3, atol=1e-5)
# test symbolic forward
lhs = mx.symbol.Variable('lhs', stype='csr')
@@ -1324,7 +1324,7 @@ def test_sparse_dot():
out = mx.nd.sparse.dot(lhs_nd, rhs_nd, transpose_a=trans_lhs, transpose_b=trans_rhs, forward_stype=forward_stype)
out_dns = mx.nd.dot(lhs_nd, rhs_dns, transpose_a=trans_lhs, transpose_b=trans_rhs, forward_stype=forward_stype)
out_np = out_dns.asnumpy()
- assert_almost_equal(out.asnumpy(), out_np, rtol=1e-4, atol=1e-5)
+ assert_almost_equal(out.asnumpy(), out_np, rtol=1e-3, atol=1e-5)
# test symbolic forward
lhs = mx.symbol.Variable('lhs', stype='default')