!12738 Add heartbeat check in summary and delete test cases that do not exit
From: @ouwenchang Reviewed-by: @yelihua Signed-off-by:pull/12738/MERGE
commit
8fb01aabd4
@ -1,151 +0,0 @@
|
|||||||
# Copyright 2020 Huawei Technologies Co., Ltd
|
|
||||||
#
|
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
# you may not use this file except in compliance with the License.
|
|
||||||
# You may obtain a copy of the License at
|
|
||||||
#
|
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
#
|
|
||||||
# Unless required by applicable law or agreed to in writing, software
|
|
||||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
# See the License for the specific language governing permissions and
|
|
||||||
# limitations under the License.
|
|
||||||
# ============================================================================
|
|
||||||
"""Test summary function of ops params valid check."""
|
|
||||||
import os
|
|
||||||
import tempfile
|
|
||||||
import shutil
|
|
||||||
from enum import Enum
|
|
||||||
|
|
||||||
import numpy as np
|
|
||||||
import pytest
|
|
||||||
|
|
||||||
import mindspore.nn as nn
|
|
||||||
from mindspore.common.tensor import Tensor
|
|
||||||
from mindspore.ops import operations as P
|
|
||||||
from mindspore.train.summary.summary_record import SummaryRecord
|
|
||||||
|
|
||||||
|
|
||||||
class SummaryEnum(Enum):
|
|
||||||
"""Summary enum."""
|
|
||||||
IMAGE = P.ImageSummary.__name__
|
|
||||||
SCALAR = P.ScalarSummary.__name__
|
|
||||||
TENSOR = P.TensorSummary.__name__
|
|
||||||
HISTOGRAM = P.HistogramSummary.__name__
|
|
||||||
|
|
||||||
|
|
||||||
class SummaryNet(nn.Cell):
|
|
||||||
"""Summary net definition."""
|
|
||||||
def __init__(self, summary_type, tag, data):
|
|
||||||
super(SummaryNet, self).__init__()
|
|
||||||
self.tag = tag
|
|
||||||
self.data = data
|
|
||||||
self.summary_fn = getattr(P, summary_type)()
|
|
||||||
self.one = Tensor(np.array([1]).astype(np.float32))
|
|
||||||
self.add = P.Add()
|
|
||||||
|
|
||||||
def construct(self):
|
|
||||||
self.summary_fn(self.tag, self.data)
|
|
||||||
return self.add(self.one, self.one)
|
|
||||||
|
|
||||||
|
|
||||||
class TestSummaryOps:
|
|
||||||
"""Test summary operators."""
|
|
||||||
summary_dir = ''
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def run_case(cls, net):
|
|
||||||
""" run_case """
|
|
||||||
net.set_train()
|
|
||||||
steps = 10
|
|
||||||
with SummaryRecord(cls.summary_dir) as test_writer:
|
|
||||||
for i in range(1, steps):
|
|
||||||
net()
|
|
||||||
test_writer.record(i)
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def setup_class(cls):
|
|
||||||
"""Run before class."""
|
|
||||||
if not os.path.exists(cls.summary_dir):
|
|
||||||
cls.summary_dir = tempfile.mkdtemp(suffix='_summary')
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def teardown_class(cls):
|
|
||||||
"""Run after class."""
|
|
||||||
if os.path.exists(cls.summary_dir):
|
|
||||||
shutil.rmtree(cls.summary_dir)
|
|
||||||
|
|
||||||
@pytest.mark.parametrize(
|
|
||||||
"summary_type, value",
|
|
||||||
[
|
|
||||||
(SummaryEnum.SCALAR.value, Tensor(1)),
|
|
||||||
(SummaryEnum.SCALAR.value, Tensor(np.array([1]))),
|
|
||||||
(SummaryEnum.IMAGE.value, Tensor(np.array([[[[1], [2], [3], [4]]]]))),
|
|
||||||
(SummaryEnum.TENSOR.value, Tensor(np.array([[1], [2], [3], [4]]))),
|
|
||||||
(SummaryEnum.HISTOGRAM.value, Tensor(np.array([[1], [2], [3], [4]]))),
|
|
||||||
])
|
|
||||||
def test_summary_success(self, summary_type, value):
|
|
||||||
"""Test summary success with valid tag and valid data."""
|
|
||||||
net = SummaryNet(summary_type, tag='tag', data=value)
|
|
||||||
TestSummaryOps.run_case(net)
|
|
||||||
|
|
||||||
@pytest.mark.parametrize(
|
|
||||||
"summary_type",
|
|
||||||
[
|
|
||||||
SummaryEnum.SCALAR.value,
|
|
||||||
SummaryEnum.IMAGE.value,
|
|
||||||
SummaryEnum.HISTOGRAM.value,
|
|
||||||
SummaryEnum.TENSOR.value
|
|
||||||
])
|
|
||||||
def test_summary_tag_is_none(self, summary_type):
|
|
||||||
"""Test summary tag is None, all summary operator validation rules are consistent."""
|
|
||||||
net = SummaryNet(summary_type, tag=None, data=Tensor(0))
|
|
||||||
with pytest.raises(TypeError):
|
|
||||||
TestSummaryOps.run_case(net)
|
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.parametrize(
|
|
||||||
"summary_type",
|
|
||||||
[
|
|
||||||
SummaryEnum.SCALAR.value,
|
|
||||||
SummaryEnum.IMAGE.value,
|
|
||||||
SummaryEnum.HISTOGRAM.value,
|
|
||||||
SummaryEnum.TENSOR.value
|
|
||||||
])
|
|
||||||
def test_summary_tag_is_empty_string(self, summary_type):
|
|
||||||
"""Test summary tag is a empty string, all summary operator validation rules are consistent."""
|
|
||||||
net = SummaryNet(summary_type, tag='', data=Tensor(0))
|
|
||||||
with pytest.raises(ValueError):
|
|
||||||
TestSummaryOps.run_case(net)
|
|
||||||
|
|
||||||
@pytest.mark.parametrize("tag", [123, True, Tensor(0)])
|
|
||||||
def test_summary_tag_is_not_string(self, tag):
|
|
||||||
"""Test summary tag is not a string, all summary operator validation rules are consistent."""
|
|
||||||
# All summary operator validation rules are consistent, so we only test scalar summary.
|
|
||||||
net = SummaryNet(SummaryEnum.SCALAR.value, tag=tag, data=Tensor(0))
|
|
||||||
with pytest.raises(TypeError):
|
|
||||||
TestSummaryOps.run_case(net)
|
|
||||||
|
|
||||||
@pytest.mark.parametrize("value", [123, True, 'data'])
|
|
||||||
def test_summary_value_type_invalid(self, value):
|
|
||||||
"""Test the type of summary value is invalid, all summary operator validation rules are consistent."""
|
|
||||||
# All summary operator validation rules are consistent, so we only test scalar summary.
|
|
||||||
net = SummaryNet(SummaryEnum.SCALAR.value, tag='tag', data=value)
|
|
||||||
with pytest.raises(TypeError):
|
|
||||||
TestSummaryOps.run_case(net)
|
|
||||||
|
|
||||||
@pytest.mark.parametrize(
|
|
||||||
"summary_type, value",
|
|
||||||
[
|
|
||||||
(SummaryEnum.IMAGE.value, Tensor(np.array([1, 2]))),
|
|
||||||
(SummaryEnum.SCALAR.value, Tensor(np.array([1, 2]))),
|
|
||||||
(SummaryEnum.TENSOR.value, Tensor(0)),
|
|
||||||
(SummaryEnum.HISTOGRAM.value, Tensor(0))
|
|
||||||
])
|
|
||||||
|
|
||||||
def test_value_shape_invalid(self, summary_type, value):
|
|
||||||
"""Test invalid shape of every summary operators."""
|
|
||||||
net = SummaryNet(summary_type, tag='tag', data=value)
|
|
||||||
with pytest.raises(ValueError):
|
|
||||||
TestSummaryOps.run_case(net)
|
|
Loading…
Reference in new issue