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
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  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.LineageParser')
  29. @mock.patch('os.path.isdir')
  30. def test_get_summary_lineage_success(self, isdir_mock, parser_mock, qurier_mock):
  31. """Test the function of get_summary_lineage."""
  32. isdir_mock.return_value = True
  33. parser_mock.return_value = MagicMock()
  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.common.utils.validate_path')
  50. @mock.patch.object(SummaryPathParser, 'get_lineage_summaries')
  51. def test_get_summary_lineage_failed2(self, mock_summary, mock_valid):
  52. """Test get_summary_lineage failed."""
  53. mock_summary.return_value = []
  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.lineage_parser.FileHandler')
  62. @mock.patch('mindinsight.lineagemgr.lineage_parser.LineageParser._parse_summary_log')
  63. @mock.patch('mindinsight.lineagemgr.common.utils.validate_path')
  64. @mock.patch.object(SummaryPathParser, 'get_lineage_summaries')
  65. def test_get_summary_lineage_failed3(self,
  66. mock_summary,
  67. mock_valid,
  68. mock_parser,
  69. mock_file_handler):
  70. """Test get_summary_lineage failed."""
  71. mock_summary.return_value = ['/path/to/summary/file']
  72. mock_valid.return_value = '/path/to/summary_dir'
  73. mock_parser.return_value = None
  74. mock_file_handler = MagicMock()
  75. mock_file_handler.size = 1
  76. result = get_summary_lineage('/path/to/summary_dir')
  77. assert {} == result
  78. @mock.patch('mindinsight.lineagemgr.api.model.validate_path')
  79. def test_convert_relative_path_to_abspath(self, validate_path_mock):
  80. """Test the function of converting realtive path to abspath."""
  81. validate_path_mock.return_value = '/path/to/summary_base_dir/summary_dir'
  82. summary_base_dir = '/path/to/summary_base_dir'
  83. search_condition = {
  84. 'summary_dir': {
  85. 'in': ['/path/to/summary_base_dir']
  86. }
  87. }
  88. result = _convert_relative_path_to_abspath(summary_base_dir,
  89. search_condition)
  90. self.assertDictEqual(
  91. result, {'summary_dir': {'in': ['/path/to/summary_base_dir/summary_dir']}})
  92. search_condition = {
  93. 'summary_dir': {
  94. 'in': ['./summary_dir']
  95. }
  96. }
  97. result = _convert_relative_path_to_abspath(summary_base_dir, search_condition)
  98. self.assertDictEqual(
  99. result, {'summary_dir': {'in': ['/path/to/summary_base_dir/summary_dir']}}
  100. )
  101. search_condition = {
  102. 'summary_dir': {
  103. 'eq': '/summary_dir'
  104. }
  105. }
  106. result = _convert_relative_path_to_abspath(summary_base_dir, search_condition)
  107. self.assertDictEqual(
  108. result, {'summary_dir': {'eq': '/path/to/summary_base_dir/summary_dir'}})
  109. search_condition = {
  110. 'summary_dir': None
  111. }
  112. result = _convert_relative_path_to_abspath(summary_base_dir, search_condition)
  113. self.assertDictEqual(
  114. result, search_condition
  115. )
  116. class TestFilterAPI(TestCase):
  117. """Test the function of filter_summary_lineage."""
  118. @mock.patch('mindinsight.lineagemgr.api.model.LineageOrganizer')
  119. @mock.patch('mindinsight.lineagemgr.api.model.Querier')
  120. @mock.patch('mindinsight.lineagemgr.lineage_parser.SummaryPathParser.get_lineage_summaries')
  121. @mock.patch('mindinsight.lineagemgr.api.model._convert_relative_path_to_abspath')
  122. @mock.patch('mindinsight.lineagemgr.api.model.normalize_summary_dir')
  123. def test_filter_summary_lineage(self, validate_path_mock, convert_path_mock,
  124. latest_summary_mock, qurier_mock, organizer_mock):
  125. """Test the function of filter_summary_lineage."""
  126. convert_path_mock.return_value = {
  127. 'summary_dir': {
  128. 'in': ['/path/to/summary_base_dir']
  129. },
  130. 'loss': {
  131. 'gt': 2.0
  132. }
  133. }
  134. organizer_mock = MagicMock()
  135. organizer_mock.super_lineage_objs = None
  136. validate_path_mock.return_value = True
  137. latest_summary_mock.return_value = ['/path/to/summary_base_dir/summary_dir']
  138. mock_querier = MagicMock()
  139. qurier_mock.return_value = mock_querier
  140. mock_querier.filter_summary_lineage.return_value = [{'loss': 3.0}]
  141. summary_base_dir = '/path/to/summary_base_dir'
  142. result = filter_summary_lineage(summary_base_dir)
  143. self.assertEqual(result, [{'loss': 3.0}])
  144. def test_invalid_path(self):
  145. """Test filter_summary_lineage with invalid path."""
  146. invalid_path = '../fake_dir'
  147. self.assertRaisesRegex(
  148. LineageParamSummaryPathError,
  149. 'The summary path is invalid.',
  150. filter_summary_lineage,
  151. invalid_path
  152. )
  153. @mock.patch('mindinsight.lineagemgr.api.model.validate_condition')
  154. @mock.patch('mindinsight.lineagemgr.api.model.normalize_summary_dir')
  155. def test_invalid_search_condition(self, mock_path, mock_valid):
  156. """Test filter_summary_lineage with invalid invalid param."""
  157. mock_path.return_value = None
  158. mock_valid.side_effect = LineageParamTypeError(
  159. 'Invalid search_condition type.')
  160. self.assertRaisesRegex(
  161. LineageSearchConditionParamError,
  162. 'Invalid search_condition type.',
  163. filter_summary_lineage,
  164. '/path/to/summary/dir',
  165. 'invalid_condition'
  166. )
  167. @mock.patch('mindinsight.lineagemgr.api.model.validate_search_model_condition')
  168. @mock.patch('mindinsight.lineagemgr.api.model.validate_condition')
  169. @mock.patch('mindinsight.lineagemgr.common.utils.validate_path')
  170. @mock.patch('mindinsight.lineagemgr.api.model._convert_relative_path_to_abspath')
  171. def test_failed_to_convert_path(self, mock_convert, *args):
  172. """Test filter_summary_lineage with invalid invalid param."""
  173. mock_convert.side_effect = LineageParamValueError('invalid path')
  174. args[0].return_value = None
  175. self.assertRaisesRegex(
  176. LineageParamSummaryPathError,
  177. 'invalid path',
  178. filter_summary_lineage,
  179. '/path/to/summary/dir',
  180. {}
  181. )
  182. @mock.patch('mindinsight.lineagemgr.api.model._convert_relative_path_to_abspath')
  183. @mock.patch('mindinsight.lineagemgr.api.model.validate_search_model_condition')
  184. @mock.patch('mindinsight.lineagemgr.api.model.validate_condition')
  185. @mock.patch('mindinsight.lineagemgr.api.model.normalize_summary_dir')
  186. @mock.patch.object(SummaryPathParser, 'get_lineage_summaries')
  187. def test_failed_to_get_summary_filesh(self, mock_parse, *args):
  188. """Test filter_summary_lineage with invalid invalid param."""
  189. path = '/path/to/summary/dir'
  190. mock_parse.return_value = []
  191. args[0].return_value = path
  192. self.assertRaisesRegex(
  193. LineageFileNotFoundError,
  194. 'There is no summary log file under summary_base_dir.',
  195. filter_summary_lineage,
  196. path
  197. )
  198. @mock.patch('mindinsight.lineagemgr.api.model._convert_relative_path_to_abspath')
  199. @mock.patch('mindinsight.lineagemgr.api.model.validate_search_model_condition')
  200. @mock.patch('mindinsight.lineagemgr.api.model.validate_condition')
  201. @mock.patch('mindinsight.lineagemgr.api.model.normalize_summary_dir')
  202. @mock.patch.object(SummaryPathParser, 'get_lineage_summaries')
  203. @mock.patch('mindinsight.lineagemgr.api.model.Querier')
  204. def test_failed_to_querier(self, mock_query, mock_parse, *args):
  205. """Test filter_summary_lineage with invalid invalid param."""
  206. mock_query.side_effect = LineageSummaryParseException()
  207. mock_parse.return_value = ['/path/to/summary/file']
  208. args[0].return_value = None
  209. res = filter_summary_lineage('/path/to/summary')
  210. assert res == {'object': [], 'count': 0}
  211. mock_query.side_effect = LineageQuerierParamException(['keys'], 'key')
  212. self.assertRaisesRegex(
  213. LineageQuerySummaryDataError,
  214. 'Filter summary lineage failed.',
  215. filter_summary_lineage,
  216. '/path/to/summary/dir'
  217. )

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