triton-model-analyzer 1.48.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (204) hide show
  1. model_analyzer/__init__.py +15 -0
  2. model_analyzer/analyzer.py +448 -0
  3. model_analyzer/cli/__init__.py +15 -0
  4. model_analyzer/cli/cli.py +193 -0
  5. model_analyzer/config/__init__.py +15 -0
  6. model_analyzer/config/generate/__init__.py +15 -0
  7. model_analyzer/config/generate/automatic_model_config_generator.py +164 -0
  8. model_analyzer/config/generate/base_model_config_generator.py +352 -0
  9. model_analyzer/config/generate/brute_plus_binary_parameter_search_run_config_generator.py +164 -0
  10. model_analyzer/config/generate/brute_run_config_generator.py +154 -0
  11. model_analyzer/config/generate/concurrency_sweeper.py +75 -0
  12. model_analyzer/config/generate/config_generator_interface.py +52 -0
  13. model_analyzer/config/generate/coordinate.py +143 -0
  14. model_analyzer/config/generate/coordinate_data.py +86 -0
  15. model_analyzer/config/generate/generator_utils.py +116 -0
  16. model_analyzer/config/generate/manual_model_config_generator.py +187 -0
  17. model_analyzer/config/generate/model_config_generator_factory.py +92 -0
  18. model_analyzer/config/generate/model_profile_spec.py +74 -0
  19. model_analyzer/config/generate/model_run_config_generator.py +154 -0
  20. model_analyzer/config/generate/model_variant_name_manager.py +150 -0
  21. model_analyzer/config/generate/neighborhood.py +536 -0
  22. model_analyzer/config/generate/optuna_plus_concurrency_sweep_run_config_generator.py +141 -0
  23. model_analyzer/config/generate/optuna_run_config_generator.py +838 -0
  24. model_analyzer/config/generate/perf_analyzer_config_generator.py +312 -0
  25. model_analyzer/config/generate/quick_plus_concurrency_sweep_run_config_generator.py +130 -0
  26. model_analyzer/config/generate/quick_run_config_generator.py +753 -0
  27. model_analyzer/config/generate/run_config_generator_factory.py +329 -0
  28. model_analyzer/config/generate/search_config.py +112 -0
  29. model_analyzer/config/generate/search_dimension.py +73 -0
  30. model_analyzer/config/generate/search_dimensions.py +85 -0
  31. model_analyzer/config/generate/search_parameter.py +49 -0
  32. model_analyzer/config/generate/search_parameters.py +388 -0
  33. model_analyzer/config/input/__init__.py +15 -0
  34. model_analyzer/config/input/config_command.py +483 -0
  35. model_analyzer/config/input/config_command_profile.py +1747 -0
  36. model_analyzer/config/input/config_command_report.py +267 -0
  37. model_analyzer/config/input/config_defaults.py +236 -0
  38. model_analyzer/config/input/config_enum.py +83 -0
  39. model_analyzer/config/input/config_field.py +216 -0
  40. model_analyzer/config/input/config_list_generic.py +112 -0
  41. model_analyzer/config/input/config_list_numeric.py +151 -0
  42. model_analyzer/config/input/config_list_string.py +111 -0
  43. model_analyzer/config/input/config_none.py +71 -0
  44. model_analyzer/config/input/config_object.py +129 -0
  45. model_analyzer/config/input/config_primitive.py +81 -0
  46. model_analyzer/config/input/config_status.py +75 -0
  47. model_analyzer/config/input/config_sweep.py +83 -0
  48. model_analyzer/config/input/config_union.py +113 -0
  49. model_analyzer/config/input/config_utils.py +128 -0
  50. model_analyzer/config/input/config_value.py +243 -0
  51. model_analyzer/config/input/objects/__init__.py +15 -0
  52. model_analyzer/config/input/objects/config_model_profile_spec.py +325 -0
  53. model_analyzer/config/input/objects/config_model_report_spec.py +173 -0
  54. model_analyzer/config/input/objects/config_plot.py +198 -0
  55. model_analyzer/config/input/objects/config_protobuf_utils.py +101 -0
  56. model_analyzer/config/input/yaml_config_validator.py +82 -0
  57. model_analyzer/config/run/__init__.py +15 -0
  58. model_analyzer/config/run/model_run_config.py +313 -0
  59. model_analyzer/config/run/run_config.py +168 -0
  60. model_analyzer/constants.py +76 -0
  61. model_analyzer/device/__init__.py +15 -0
  62. model_analyzer/device/device.py +24 -0
  63. model_analyzer/device/gpu_device.py +87 -0
  64. model_analyzer/device/gpu_device_factory.py +248 -0
  65. model_analyzer/entrypoint.py +307 -0
  66. model_analyzer/log_formatter.py +65 -0
  67. model_analyzer/model_analyzer_exceptions.py +24 -0
  68. model_analyzer/model_manager.py +255 -0
  69. model_analyzer/monitor/__init__.py +15 -0
  70. model_analyzer/monitor/cpu_monitor.py +69 -0
  71. model_analyzer/monitor/dcgm/DcgmDiag.py +191 -0
  72. model_analyzer/monitor/dcgm/DcgmFieldGroup.py +83 -0
  73. model_analyzer/monitor/dcgm/DcgmGroup.py +815 -0
  74. model_analyzer/monitor/dcgm/DcgmHandle.py +141 -0
  75. model_analyzer/monitor/dcgm/DcgmJsonReader.py +69 -0
  76. model_analyzer/monitor/dcgm/DcgmReader.py +623 -0
  77. model_analyzer/monitor/dcgm/DcgmStatus.py +57 -0
  78. model_analyzer/monitor/dcgm/DcgmSystem.py +412 -0
  79. model_analyzer/monitor/dcgm/__init__.py +15 -0
  80. model_analyzer/monitor/dcgm/common/__init__.py +13 -0
  81. model_analyzer/monitor/dcgm/common/dcgm_client_cli_parser.py +194 -0
  82. model_analyzer/monitor/dcgm/common/dcgm_client_main.py +86 -0
  83. model_analyzer/monitor/dcgm/dcgm_agent.py +887 -0
  84. model_analyzer/monitor/dcgm/dcgm_collectd_plugin.py +369 -0
  85. model_analyzer/monitor/dcgm/dcgm_errors.py +395 -0
  86. model_analyzer/monitor/dcgm/dcgm_field_helpers.py +546 -0
  87. model_analyzer/monitor/dcgm/dcgm_fields.py +815 -0
  88. model_analyzer/monitor/dcgm/dcgm_fields_collectd.py +671 -0
  89. model_analyzer/monitor/dcgm/dcgm_fields_internal.py +29 -0
  90. model_analyzer/monitor/dcgm/dcgm_fluentd.py +45 -0
  91. model_analyzer/monitor/dcgm/dcgm_monitor.py +138 -0
  92. model_analyzer/monitor/dcgm/dcgm_prometheus.py +326 -0
  93. model_analyzer/monitor/dcgm/dcgm_structs.py +2357 -0
  94. model_analyzer/monitor/dcgm/dcgm_telegraf.py +65 -0
  95. model_analyzer/monitor/dcgm/dcgm_value.py +151 -0
  96. model_analyzer/monitor/dcgm/dcgmvalue.py +155 -0
  97. model_analyzer/monitor/dcgm/denylist_recommendations.py +573 -0
  98. model_analyzer/monitor/dcgm/pydcgm.py +47 -0
  99. model_analyzer/monitor/monitor.py +143 -0
  100. model_analyzer/monitor/remote_monitor.py +137 -0
  101. model_analyzer/output/__init__.py +15 -0
  102. model_analyzer/output/file_writer.py +63 -0
  103. model_analyzer/output/output_writer.py +42 -0
  104. model_analyzer/perf_analyzer/__init__.py +15 -0
  105. model_analyzer/perf_analyzer/genai_perf_config.py +206 -0
  106. model_analyzer/perf_analyzer/perf_analyzer.py +882 -0
  107. model_analyzer/perf_analyzer/perf_config.py +479 -0
  108. model_analyzer/plots/__init__.py +15 -0
  109. model_analyzer/plots/detailed_plot.py +266 -0
  110. model_analyzer/plots/plot_manager.py +224 -0
  111. model_analyzer/plots/simple_plot.py +213 -0
  112. model_analyzer/record/__init__.py +15 -0
  113. model_analyzer/record/gpu_record.py +68 -0
  114. model_analyzer/record/metrics_manager.py +887 -0
  115. model_analyzer/record/record.py +280 -0
  116. model_analyzer/record/record_aggregator.py +256 -0
  117. model_analyzer/record/types/__init__.py +15 -0
  118. model_analyzer/record/types/cpu_available_ram.py +93 -0
  119. model_analyzer/record/types/cpu_used_ram.py +93 -0
  120. model_analyzer/record/types/gpu_free_memory.py +96 -0
  121. model_analyzer/record/types/gpu_power_usage.py +107 -0
  122. model_analyzer/record/types/gpu_total_memory.py +96 -0
  123. model_analyzer/record/types/gpu_used_memory.py +96 -0
  124. model_analyzer/record/types/gpu_utilization.py +108 -0
  125. model_analyzer/record/types/inter_token_latency_avg.py +60 -0
  126. model_analyzer/record/types/inter_token_latency_base.py +74 -0
  127. model_analyzer/record/types/inter_token_latency_max.py +60 -0
  128. model_analyzer/record/types/inter_token_latency_min.py +60 -0
  129. model_analyzer/record/types/inter_token_latency_p25.py +60 -0
  130. model_analyzer/record/types/inter_token_latency_p50.py +60 -0
  131. model_analyzer/record/types/inter_token_latency_p75.py +60 -0
  132. model_analyzer/record/types/inter_token_latency_p90.py +60 -0
  133. model_analyzer/record/types/inter_token_latency_p95.py +60 -0
  134. model_analyzer/record/types/inter_token_latency_p99.py +60 -0
  135. model_analyzer/record/types/output_token_throughput.py +105 -0
  136. model_analyzer/record/types/perf_client_response_wait.py +97 -0
  137. model_analyzer/record/types/perf_client_send_recv.py +97 -0
  138. model_analyzer/record/types/perf_latency.py +111 -0
  139. model_analyzer/record/types/perf_latency_avg.py +60 -0
  140. model_analyzer/record/types/perf_latency_base.py +74 -0
  141. model_analyzer/record/types/perf_latency_p90.py +60 -0
  142. model_analyzer/record/types/perf_latency_p95.py +60 -0
  143. model_analyzer/record/types/perf_latency_p99.py +60 -0
  144. model_analyzer/record/types/perf_server_compute_infer.py +97 -0
  145. model_analyzer/record/types/perf_server_compute_input.py +97 -0
  146. model_analyzer/record/types/perf_server_compute_output.py +97 -0
  147. model_analyzer/record/types/perf_server_queue.py +97 -0
  148. model_analyzer/record/types/perf_throughput.py +105 -0
  149. model_analyzer/record/types/time_to_first_token_avg.py +60 -0
  150. model_analyzer/record/types/time_to_first_token_base.py +74 -0
  151. model_analyzer/record/types/time_to_first_token_max.py +60 -0
  152. model_analyzer/record/types/time_to_first_token_min.py +60 -0
  153. model_analyzer/record/types/time_to_first_token_p25.py +60 -0
  154. model_analyzer/record/types/time_to_first_token_p50.py +60 -0
  155. model_analyzer/record/types/time_to_first_token_p75.py +60 -0
  156. model_analyzer/record/types/time_to_first_token_p90.py +60 -0
  157. model_analyzer/record/types/time_to_first_token_p95.py +60 -0
  158. model_analyzer/record/types/time_to_first_token_p99.py +60 -0
  159. model_analyzer/reports/__init__.py +15 -0
  160. model_analyzer/reports/html_report.py +195 -0
  161. model_analyzer/reports/pdf_report.py +50 -0
  162. model_analyzer/reports/report.py +86 -0
  163. model_analyzer/reports/report_factory.py +62 -0
  164. model_analyzer/reports/report_manager.py +1376 -0
  165. model_analyzer/reports/report_utils.py +42 -0
  166. model_analyzer/result/__init__.py +15 -0
  167. model_analyzer/result/constraint_manager.py +150 -0
  168. model_analyzer/result/model_config_measurement.py +354 -0
  169. model_analyzer/result/model_constraints.py +105 -0
  170. model_analyzer/result/parameter_search.py +246 -0
  171. model_analyzer/result/result_manager.py +430 -0
  172. model_analyzer/result/result_statistics.py +159 -0
  173. model_analyzer/result/result_table.py +217 -0
  174. model_analyzer/result/result_table_manager.py +646 -0
  175. model_analyzer/result/result_utils.py +42 -0
  176. model_analyzer/result/results.py +277 -0
  177. model_analyzer/result/run_config_measurement.py +658 -0
  178. model_analyzer/result/run_config_result.py +210 -0
  179. model_analyzer/result/run_config_result_comparator.py +110 -0
  180. model_analyzer/result/sorted_results.py +151 -0
  181. model_analyzer/state/__init__.py +15 -0
  182. model_analyzer/state/analyzer_state.py +76 -0
  183. model_analyzer/state/analyzer_state_manager.py +215 -0
  184. model_analyzer/triton/__init__.py +15 -0
  185. model_analyzer/triton/client/__init__.py +15 -0
  186. model_analyzer/triton/client/client.py +234 -0
  187. model_analyzer/triton/client/client_factory.py +57 -0
  188. model_analyzer/triton/client/grpc_client.py +104 -0
  189. model_analyzer/triton/client/http_client.py +107 -0
  190. model_analyzer/triton/model/__init__.py +15 -0
  191. model_analyzer/triton/model/model_config.py +556 -0
  192. model_analyzer/triton/model/model_config_variant.py +29 -0
  193. model_analyzer/triton/server/__init__.py +15 -0
  194. model_analyzer/triton/server/server.py +76 -0
  195. model_analyzer/triton/server/server_config.py +269 -0
  196. model_analyzer/triton/server/server_docker.py +229 -0
  197. model_analyzer/triton/server/server_factory.py +306 -0
  198. model_analyzer/triton/server/server_local.py +158 -0
  199. triton_model_analyzer-1.48.0.dist-info/METADATA +52 -0
  200. triton_model_analyzer-1.48.0.dist-info/RECORD +204 -0
  201. triton_model_analyzer-1.48.0.dist-info/WHEEL +5 -0
  202. triton_model_analyzer-1.48.0.dist-info/entry_points.txt +2 -0
  203. triton_model_analyzer-1.48.0.dist-info/licenses/LICENSE +67 -0
  204. triton_model_analyzer-1.48.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,65 @@
1
+ # Copyright (c) 2022, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
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
+ from model_analyzer.monitor.dcgm.common.dcgm_client_main import main
15
+ from model_analyzer.monitor.dcgm.DcgmJsonReader import DcgmJsonReader
16
+ from socket import socket, AF_INET, SOCK_DGRAM
17
+
18
+ # Displayed to the user
19
+ TELEGRAF_NAME = 'Telegraf'
20
+ DEFAULT_TELEGRAF_PORT = 8094
21
+
22
+ # Telegraf Configuration
23
+ # ======================
24
+ #
25
+ # In order for Telegraf to understand the format of the data sent by this
26
+ # module, it needs to be configured with the input plugin below
27
+ #
28
+ # If you modify the list of published fields, you will need to add non-numeric
29
+ # ones as tag_keys for Telegraf to store them
30
+ #
31
+ # [[inputs.socket_listener]]
32
+ # name_override = "dcgm"
33
+ # service_address = "udp://:8094"
34
+ # data_format = "json"
35
+ # tag_keys = [
36
+ # "compute_pids",
37
+ # "driver_version",
38
+ # "gpu_uuid",
39
+ # "nvml_version",
40
+ # "process_name",
41
+ # "xid_errors"
42
+ # ]
43
+
44
+
45
+ class DcgmTelegraf(DcgmJsonReader):
46
+ ###########################################################################
47
+ def __init__(self, publish_hostname, publish_port, **kwargs):
48
+ self.m_sock = socket(AF_INET, SOCK_DGRAM)
49
+ self.m_dest = (publish_hostname, publish_port)
50
+ super(DcgmTelegraf, self).__init__(**kwargs)
51
+
52
+ ###########################################################################
53
+ def SendToTelegraf(self, payload):
54
+ self.m_sock.sendto(payload, self.m_dest)
55
+
56
+ ###########################################################################
57
+ def CustomJsonHandler(self, outJson):
58
+ self.SendToTelegraf(outJson)
59
+
60
+
61
+ if __name__ == '__main__': # pragma: no cover
62
+ main(DcgmTelegraf,
63
+ TELEGRAF_NAME,
64
+ DEFAULT_TELEGRAF_PORT,
65
+ add_target_host=True)
@@ -0,0 +1,151 @@
1
+ #!/usr/bin/env python3
2
+
3
+ # Copyright 2020-2023, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+
17
+ DCGM_INT32_BLANK = 0x7FFFFFF0
18
+ DCGM_INT64_BLANK = 0x7FFFFFFFFFFFFFF0
19
+
20
+ # Base value for double blank. 2 ** 47. FP 64 has 52 bits of mantissa,
21
+ # so 47 bits can still increment by 1 and represent each value from 0-15
22
+ DCGM_FP64_BLANK = 140737488355328.0
23
+
24
+ DCGM_STR_BLANK = "<<<NULL>>>"
25
+
26
+ # Represents an error where data was not found
27
+ DCGM_INT32_NOT_FOUND = DCGM_INT32_BLANK + 1
28
+ DCGM_INT64_NOT_FOUND = DCGM_INT64_BLANK + 1
29
+ DCGM_FP64_NOT_FOUND = DCGM_FP64_BLANK + 1.0
30
+ DCGM_STR_NOT_FOUND = "<<<NOT_FOUND>>>"
31
+
32
+ # Represents an error where fetching the value is not supported
33
+ DCGM_INT32_NOT_SUPPORTED = DCGM_INT32_BLANK + 2
34
+ DCGM_INT64_NOT_SUPPORTED = DCGM_INT64_BLANK + 2
35
+ DCGM_FP64_NOT_SUPPORTED = DCGM_FP64_BLANK + 2.0
36
+ DCGM_STR_NOT_SUPPORTED = "<<<NOT_SUPPORTED>>>"
37
+
38
+ # Represents and error where fetching the value is not allowed with our current
39
+ # credentials
40
+ DCGM_INT32_NOT_PERMISSIONED = DCGM_INT32_BLANK + 3
41
+ DCGM_INT64_NOT_PERMISSIONED = DCGM_INT64_BLANK + 3
42
+ DCGM_FP64_NOT_PERMISSIONED = DCGM_FP64_BLANK + 3.0
43
+ DCGM_STR_NOT_PERMISSIONED = "<<<NOT_PERM>>>"
44
+
45
+
46
+ ###############################################################################
47
+ # Functions to check if a value is blank or not
48
+ def DCGM_INT32_IS_BLANK(val):
49
+ if val >= DCGM_INT32_BLANK:
50
+ return True
51
+ else:
52
+ return False
53
+
54
+
55
+ def DCGM_INT64_IS_BLANK(val):
56
+ if val >= DCGM_INT64_BLANK:
57
+ return True
58
+ else:
59
+ return False
60
+
61
+
62
+ def DCGM_FP64_IS_BLANK(val):
63
+ if val >= DCGM_FP64_BLANK:
64
+ return True
65
+ else:
66
+ return False
67
+
68
+
69
+ # Looks for <<< at first position and >>> inside string
70
+ def DCGM_STR_IS_BLANK(val):
71
+ if 0 != val.find("<<<"):
72
+ return False
73
+ elif 0 > val.find(">>>"):
74
+ return False
75
+ return True
76
+
77
+
78
+ class DcgmValue:
79
+ def __init__(self, value):
80
+ # Contains either an integer (int64), string, or double of the actual
81
+ # value
82
+
83
+ self.value = value
84
+
85
+ def SetFromInt32(self, i32Value):
86
+ """
87
+ Handle the special case where our source data was an int32 but is
88
+ currently stored in a python int (int64), dealing with blanks
89
+ """
90
+
91
+ value = int(i32Value)
92
+
93
+ if not DCGM_INT32_IS_BLANK(i32Value):
94
+ self.value = value
95
+ return
96
+
97
+ if value == DCGM_INT32_NOT_FOUND:
98
+ self.value = DCGM_INT64_NOT_FOUND
99
+ elif value == DCGM_INT32_NOT_SUPPORTED:
100
+ self.value = DCGM_INT64_NOT_SUPPORTED
101
+ elif value == DCGM_INT32_NOT_PERMISSIONED:
102
+ self.value = DCGM_INT64_NOT_PERMISSIONED
103
+ else:
104
+ self.value = DCGM_INT64_BLANK
105
+
106
+ def IsBlank(self):
107
+ """
108
+ Returns True if the currently-stored value is a blank value. False if
109
+ not
110
+ """
111
+
112
+ if self.value is None:
113
+ return True
114
+ elif type(self.value) == int or type(self.value) == long:
115
+ return DCGM_INT64_IS_BLANK(self.value)
116
+ elif type(self.value) == float:
117
+ return DCGM_FP64_IS_BLANK(self.value)
118
+ elif type(self.value) == str:
119
+ return DCGM_STR_IS_BLANK(self.value)
120
+ else:
121
+ raise Exception("Unknown type: %s") % str(type(self.value))
122
+
123
+ def __str__(self):
124
+ return str(self.value)
125
+
126
+
127
+ def self_test():
128
+ v = DcgmValue(1.0)
129
+ assert not v.IsBlank()
130
+ assert v.value == 1.0
131
+
132
+ v = DcgmValue(100)
133
+ assert not v.IsBlank()
134
+ assert v.value == 100
135
+
136
+ v = DcgmValue(DCGM_INT64_NOT_FOUND)
137
+ assert v.IsBlank()
138
+
139
+ v = DcgmValue(DCGM_FP64_NOT_FOUND)
140
+ assert v.IsBlank()
141
+
142
+ v.SetFromInt32(DCGM_INT32_NOT_SUPPORTED)
143
+ assert v.IsBlank()
144
+ assert v.value == DCGM_INT64_NOT_SUPPORTED
145
+
146
+ print("Tests passed")
147
+ return
148
+
149
+
150
+ if __name__ == "__main__":
151
+ self_test()
@@ -0,0 +1,155 @@
1
+ # Copyright (c) 2022, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
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
+ # Base value for integer blank. can be used as an unspecified blank
16
+ DCGM_INT32_BLANK = 0x7ffffff0
17
+ DCGM_INT64_BLANK = 0x7ffffffffffffff0
18
+
19
+ # Base value for double blank. 2 ** 47. FP 64 has 52 bits of mantissa,
20
+ #so 47 bits can still increment by 1 and represent each value from 0-15
21
+ DCGM_FP64_BLANK = 140737488355328.0
22
+
23
+ DCGM_STR_BLANK = "<<<NULL>>>"
24
+
25
+ # Represents an error where data was not found
26
+ DCGM_INT32_NOT_FOUND = (DCGM_INT32_BLANK + 1)
27
+ DCGM_INT64_NOT_FOUND = (DCGM_INT64_BLANK + 1)
28
+ DCGM_FP64_NOT_FOUND = (DCGM_FP64_BLANK + 1.0)
29
+ DCGM_STR_NOT_FOUND = "<<<NOT_FOUND>>>"
30
+
31
+ # Represents an error where fetching the value is not supported
32
+ DCGM_INT32_NOT_SUPPORTED = (DCGM_INT32_BLANK + 2)
33
+ DCGM_INT64_NOT_SUPPORTED = (DCGM_INT64_BLANK + 2)
34
+ DCGM_FP64_NOT_SUPPORTED = (DCGM_FP64_BLANK + 2.0)
35
+ DCGM_STR_NOT_SUPPORTED = "<<<NOT_SUPPORTED>>>"
36
+
37
+ # Represents and error where fetching the value is not allowed with our current credentials
38
+ DCGM_INT32_NOT_PERMISSIONED = (DCGM_INT32_BLANK + 3)
39
+ DCGM_INT64_NOT_PERMISSIONED = (DCGM_INT64_BLANK + 3)
40
+ DCGM_FP64_NOT_PERMISSIONED = (DCGM_FP64_BLANK + 3.0)
41
+ DCGM_STR_NOT_PERMISSIONED = "<<<NOT_PERM>>>"
42
+
43
+
44
+ ###############################################################################
45
+ # Functions to check if a value is blank or not
46
+ def DCGM_INT32_IS_BLANK(val):
47
+ if val >= DCGM_INT32_BLANK:
48
+ return True
49
+ else:
50
+ return False
51
+
52
+
53
+ def DCGM_INT64_IS_BLANK(val):
54
+ if val >= DCGM_INT64_BLANK:
55
+ return True
56
+ else:
57
+ return False
58
+
59
+
60
+ def DCGM_FP64_IS_BLANK(val):
61
+ if val >= DCGM_FP64_BLANK:
62
+ return True
63
+ else:
64
+ return False
65
+
66
+
67
+ #Looks for <<< at first position and >>> inside string
68
+ def DCGM_STR_IS_BLANK(val):
69
+ if 0 != val.find("<<<"):
70
+ return False
71
+ elif 0 > val.find(">>>"):
72
+ return False
73
+ return True
74
+
75
+
76
+ ###############################################################################
77
+ class DcgmValue:
78
+
79
+ def __init__(self, value):
80
+ self.value = value #Contains either an integer (int64), string, or double of the actual value
81
+
82
+ ###########################################################################
83
+ def SetFromInt32(self, i32Value):
84
+ '''
85
+ Handle the special case where our source data was an int32 but is currently
86
+ stored in a python int (int64), dealing with blanks
87
+ '''
88
+ value = int(i32Value)
89
+
90
+ if not DCGM_INT32_IS_BLANK(i32Value):
91
+ self.value = value
92
+ return
93
+
94
+ if value == DCGM_INT32_NOT_FOUND:
95
+ self.value = DCGM_INT64_NOT_FOUND
96
+ elif value == DCGM_INT32_NOT_SUPPORTED:
97
+ self.value = DCGM_INT64_NOT_SUPPORTED
98
+ elif value == DCGM_INT32_NOT_PERMISSIONED:
99
+ self.value = DCGM_INT64_NOT_PERMISSIONED
100
+ else:
101
+ self.value = DCGM_INT64_BLANK
102
+
103
+ ###########################################################################
104
+ def IsBlank(self):
105
+ '''
106
+ Returns True if the currently-stored value is a blank value. False if not
107
+ '''
108
+ if self.value is None:
109
+ return True
110
+ elif type(self.value) == int or type(self.value) == int:
111
+ return DCGM_INT64_IS_BLANK(self.value)
112
+ elif type(self.value) == float:
113
+ return DCGM_FP64_IS_BLANK(self.value)
114
+ elif type(self.value) == str:
115
+ return DCGM_STR_IS_BLANK(self.value)
116
+ else:
117
+ raise Exception("Unknown type: %s") % str(type(self.value))
118
+
119
+ ###########################################################################
120
+ def __str__(self):
121
+ return str(self.value)
122
+
123
+ ###########################################################################
124
+
125
+
126
+ ###############################################################################
127
+ def self_test():
128
+
129
+ v = DcgmValue(1.0)
130
+ assert (not v.IsBlank())
131
+ assert (v.value == 1.0)
132
+
133
+ v = DcgmValue(100)
134
+ assert (not v.IsBlank())
135
+ assert (v.value == 100)
136
+
137
+ v = DcgmValue(DCGM_INT64_NOT_FOUND)
138
+ assert (v.IsBlank())
139
+
140
+ v = DcgmValue(DCGM_FP64_NOT_FOUND)
141
+ assert (v.IsBlank())
142
+
143
+ v.SetFromInt32(DCGM_INT32_NOT_SUPPORTED)
144
+ assert (v.IsBlank())
145
+ assert (v.value == DCGM_INT64_NOT_SUPPORTED)
146
+
147
+ print("Tests passed")
148
+ return
149
+
150
+
151
+ ###############################################################################
152
+ if __name__ == "__main__":
153
+ self_test()
154
+
155
+ ###############################################################################