You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

test_model.py 11 kB

5 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  1. # Copyright 2020 Huawei Technologies Co., Ltd
  2. #
  3. # Licensed under the Apache License, Version 2.0 (the "License");
  4. # you may not use this file except in compliance with the License.
  5. # You may obtain a copy of the License at
  6. #
  7. # http://www.apache.org/licenses/LICENSE-2.0
  8. #
  9. # Unless required by applicable law or agreed to in writing, software
  10. # distributed under the License is distributed on an "AS IS" BASIS,
  11. # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. # See the License for the specific language governing permissions and
  13. # limitations under the License.
  14. # ============================================================================
  15. """Test the model module."""
  16. from unittest import TestCase, mock
  17. from unittest.mock import MagicMock
  18. from mindinsight.lineagemgr import get_summary_lineage, filter_summary_lineage
  19. from mindinsight.lineagemgr.api.model import _convert_relative_path_to_abspath
  20. from mindinsight.lineagemgr.common.exceptions.exceptions import LineageParamSummaryPathError, \
  21. LineageFileNotFoundError, LineageSummaryParseException, LineageQuerierParamException, \
  22. LineageQuerySummaryDataError, LineageSearchConditionParamError, LineageParamTypeError, \
  23. LineageParamValueError
  24. from mindinsight.lineagemgr.common.path_parser import SummaryPathParser
  25. class TestModel(TestCase):
  26. """Test the function of get_summary_lineage and filter_summary_lineage."""
  27. @mock.patch('mindinsight.lineagemgr.api.model.Querier')
  28. @mock.patch('mindinsight.lineagemgr.api.model.SummaryPathParser.get_latest_lineage_summary')
  29. @mock.patch('os.path.isdir')
  30. def test_get_summary_lineage_success(self, isdir_mock, latest_summary_mock, qurier_mock):
  31. """Test the function of get_summary_lineage."""
  32. isdir_mock.return_value = True
  33. latest_summary_mock.return_value = '/path/to/summary_dir/a_MS_lineage'
  34. mock_querier = MagicMock()
  35. qurier_mock.return_value = mock_querier
  36. mock_querier.get_summary_lineage.return_value = [{'algorithm': {'network': 'ResNet'}}]
  37. summary_dir = '/path/to/summary_dir'
  38. result = get_summary_lineage(summary_dir, keys=['algorithm'])
  39. self.assertEqual(result, {'algorithm': {'network': 'ResNet'}})
  40. def test_get_summary_lineage_failed(self):
  41. """Test get_summary_lineage failed."""
  42. invalid_path = '../fake_dir'
  43. self.assertRaisesRegex(
  44. LineageParamSummaryPathError,
  45. 'The summary path is invalid.',
  46. get_summary_lineage,
  47. invalid_path
  48. )
  49. @mock.patch('mindinsight.lineagemgr.api.model.validate_path')
  50. @mock.patch.object(SummaryPathParser, 'get_latest_lineage_summary')
  51. def test_get_summary_lineage_failed2(self, mock_summary, mock_valid):
  52. """Test get_summary_lineage failed."""
  53. mock_summary.return_value = None
  54. mock_valid.return_value = '/path/to/summary/dir'
  55. self.assertRaisesRegex(
  56. LineageFileNotFoundError,
  57. 'no summary log file under summary_dir',
  58. get_summary_lineage,
  59. '/path/to/summary_dir'
  60. )
  61. @mock.patch('mindinsight.lineagemgr.api.model.validate_path')
  62. @mock.patch('mindinsight.lineagemgr.api.model.Querier')
  63. @mock.patch.object(SummaryPathParser, 'get_latest_lineage_summary')
  64. def test_get_summary_lineage_failed3(self,
  65. mock_summary,
  66. mock_querier,
  67. mock_valid):
  68. """Test get_summary_lineage failed."""
  69. mock_summary.return_value = '/path/to/summary/file'
  70. mock_querier.return_value.get_summary_lineage.side_effect = \
  71. LineageSummaryParseException()
  72. mock_valid.return_value = '/path/to/summary_dir'
  73. res = get_summary_lineage('/path/to/summary_dir')
  74. assert res == {}
  75. mock_querier.side_effect = LineageQuerierParamException(
  76. ['keys'], 'key')
  77. self.assertRaisesRegex(
  78. LineageQuerySummaryDataError,
  79. 'Get summary lineage failed',
  80. get_summary_lineage,
  81. '/path/to/summary_dir'
  82. )
  83. @mock.patch('mindinsight.lineagemgr.api.model.validate_path')
  84. def test_convert_relative_path_to_abspath(self, validate_path_mock):
  85. """Test the function of converting realtive path to abspath."""
  86. validate_path_mock.return_value = '/path/to/summary_base_dir/summary_dir'
  87. summary_base_dir = '/path/to/summary_base_dir'
  88. search_condition = {
  89. 'summary_dir': {
  90. 'in': ['/path/to/summary_base_dir']
  91. }
  92. }
  93. result = _convert_relative_path_to_abspath(summary_base_dir,
  94. search_condition)
  95. self.assertDictEqual(
  96. result, {'summary_dir': {'in': ['/path/to/summary_base_dir/summary_dir']}})
  97. search_condition = {
  98. 'summary_dir': {
  99. 'in': ['./summary_dir']
  100. }
  101. }
  102. result = _convert_relative_path_to_abspath(summary_base_dir, search_condition)
  103. self.assertDictEqual(
  104. result, {'summary_dir': {'in': ['/path/to/summary_base_dir/summary_dir']}}
  105. )
  106. search_condition = {
  107. 'summary_dir': {
  108. 'eq': '/summary_dir'
  109. }
  110. }
  111. result = _convert_relative_path_to_abspath(summary_base_dir, search_condition)
  112. self.assertDictEqual(
  113. result, {'summary_dir': {'eq': '/path/to/summary_base_dir/summary_dir'}})
  114. search_condition = {
  115. 'summary_dir': None
  116. }
  117. result = _convert_relative_path_to_abspath(summary_base_dir, search_condition)
  118. self.assertDictEqual(
  119. result, search_condition
  120. )
  121. class TestFilterAPI(TestCase):
  122. """Test the function of filter_summary_lineage."""
  123. @mock.patch('mindinsight.lineagemgr.api.model.Querier')
  124. @mock.patch('mindinsight.lineagemgr.api.model.SummaryPathParser.get_latest_lineage_summaries')
  125. @mock.patch('mindinsight.lineagemgr.api.model._convert_relative_path_to_abspath')
  126. @mock.patch('mindinsight.lineagemgr.api.model.validate_path')
  127. def test_filter_summary_lineage(self, validate_path_mock, convert_path_mock,
  128. latest_summary_mock, qurier_mock):
  129. """Test the function of filter_summary_lineage."""
  130. convert_path_mock.return_value = {
  131. 'summary_dir': {
  132. 'in': ['/path/to/summary_base_dir']
  133. },
  134. 'loss': {
  135. 'gt': 2.0
  136. }
  137. }
  138. validate_path_mock.return_value = True
  139. latest_summary_mock.return_value = ['/path/to/summary_base_dir/summary_dir']
  140. mock_querier = MagicMock()
  141. qurier_mock.return_value = mock_querier
  142. mock_querier.filter_summary_lineage.return_value = [{'loss': 3.0}]
  143. summary_base_dir = '/path/to/summary_base_dir'
  144. result = filter_summary_lineage(summary_base_dir)
  145. self.assertEqual(result, [{'loss': 3.0}])
  146. def test_invalid_path(self):
  147. """Test filter_summary_lineage with invalid path."""
  148. invalid_path = '../fake_dir'
  149. self.assertRaisesRegex(
  150. LineageParamSummaryPathError,
  151. 'The summary path is invalid.',
  152. filter_summary_lineage,
  153. invalid_path
  154. )
  155. @mock.patch('mindinsight.lineagemgr.api.model.validate_condition')
  156. @mock.patch('mindinsight.lineagemgr.api.model.validate_path')
  157. def test_invalid_search_condition(self, mock_path, mock_valid):
  158. """Test filter_summary_lineage with invalid invalid param."""
  159. mock_path.return_value = None
  160. mock_valid.side_effect = LineageParamTypeError(
  161. 'Invalid search_condition type.')
  162. self.assertRaisesRegex(
  163. LineageSearchConditionParamError,
  164. 'Invalid search_condition type.',
  165. filter_summary_lineage,
  166. '/path/to/summary/dir',
  167. 'invalid_condition'
  168. )
  169. @mock.patch('mindinsight.lineagemgr.api.model.validate_search_model_condition')
  170. @mock.patch('mindinsight.lineagemgr.api.model.validate_condition')
  171. @mock.patch('mindinsight.lineagemgr.api.model.validate_path')
  172. @mock.patch('mindinsight.lineagemgr.api.model._convert_relative_path_to_abspath')
  173. def test_failed_to_convert_path(self, mock_convert, *args):
  174. """Test filter_summary_lineage with invalid invalid param."""
  175. mock_convert.side_effect = LineageParamValueError('invalid path')
  176. args[0].return_value = None
  177. self.assertRaisesRegex(
  178. LineageParamSummaryPathError,
  179. 'invalid path',
  180. filter_summary_lineage,
  181. '/path/to/summary/dir',
  182. {}
  183. )
  184. @mock.patch('mindinsight.lineagemgr.api.model._convert_relative_path_to_abspath')
  185. @mock.patch('mindinsight.lineagemgr.api.model.validate_search_model_condition')
  186. @mock.patch('mindinsight.lineagemgr.api.model.validate_condition')
  187. @mock.patch('mindinsight.lineagemgr.api.model.validate_path')
  188. @mock.patch.object(SummaryPathParser, 'get_latest_lineage_summaries')
  189. def test_failed_to_get_summary_filesh(self, mock_parse, *args):
  190. """Test filter_summary_lineage with invalid invalid param."""
  191. mock_parse.return_value = []
  192. args[0].return_value = None
  193. self.assertRaisesRegex(
  194. LineageFileNotFoundError,
  195. 'There is no summary log file under summary_base_dir.',
  196. filter_summary_lineage,
  197. '/path/to/summary/dir'
  198. )
  199. @mock.patch('mindinsight.lineagemgr.api.model._convert_relative_path_to_abspath')
  200. @mock.patch('mindinsight.lineagemgr.api.model.validate_search_model_condition')
  201. @mock.patch('mindinsight.lineagemgr.api.model.validate_condition')
  202. @mock.patch('mindinsight.lineagemgr.api.model.validate_path')
  203. @mock.patch.object(SummaryPathParser, 'get_latest_lineage_summaries')
  204. @mock.patch('mindinsight.lineagemgr.api.model.Querier')
  205. def test_failed_to_querier(self, mock_query, mock_parse, *args):
  206. """Test filter_summary_lineage with invalid invalid param."""
  207. mock_query.side_effect = LineageSummaryParseException()
  208. mock_parse.return_value = ['/path/to/summary/file']
  209. args[0].return_value = None
  210. res = filter_summary_lineage('/path/to/summary')
  211. assert res == {'object': [], 'count': 0}
  212. mock_query.side_effect = LineageQuerierParamException(['keys'], 'key')
  213. self.assertRaisesRegex(
  214. LineageQuerySummaryDataError,
  215. 'Filter summary lineage failed.',
  216. filter_summary_lineage,
  217. '/path/to/summary/dir'
  218. )

MindInsight为MindSpore提供了简单易用的调优调试能力。在训练过程中,可以将标量、张量、图像、计算图、模型超参、训练耗时等数据记录到文件中,通过MindInsight可视化页面进行查看及分析。