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.
- model_analyzer/__init__.py +15 -0
- model_analyzer/analyzer.py +448 -0
- model_analyzer/cli/__init__.py +15 -0
- model_analyzer/cli/cli.py +193 -0
- model_analyzer/config/__init__.py +15 -0
- model_analyzer/config/generate/__init__.py +15 -0
- model_analyzer/config/generate/automatic_model_config_generator.py +164 -0
- model_analyzer/config/generate/base_model_config_generator.py +352 -0
- model_analyzer/config/generate/brute_plus_binary_parameter_search_run_config_generator.py +164 -0
- model_analyzer/config/generate/brute_run_config_generator.py +154 -0
- model_analyzer/config/generate/concurrency_sweeper.py +75 -0
- model_analyzer/config/generate/config_generator_interface.py +52 -0
- model_analyzer/config/generate/coordinate.py +143 -0
- model_analyzer/config/generate/coordinate_data.py +86 -0
- model_analyzer/config/generate/generator_utils.py +116 -0
- model_analyzer/config/generate/manual_model_config_generator.py +187 -0
- model_analyzer/config/generate/model_config_generator_factory.py +92 -0
- model_analyzer/config/generate/model_profile_spec.py +74 -0
- model_analyzer/config/generate/model_run_config_generator.py +154 -0
- model_analyzer/config/generate/model_variant_name_manager.py +150 -0
- model_analyzer/config/generate/neighborhood.py +536 -0
- model_analyzer/config/generate/optuna_plus_concurrency_sweep_run_config_generator.py +141 -0
- model_analyzer/config/generate/optuna_run_config_generator.py +838 -0
- model_analyzer/config/generate/perf_analyzer_config_generator.py +312 -0
- model_analyzer/config/generate/quick_plus_concurrency_sweep_run_config_generator.py +130 -0
- model_analyzer/config/generate/quick_run_config_generator.py +753 -0
- model_analyzer/config/generate/run_config_generator_factory.py +329 -0
- model_analyzer/config/generate/search_config.py +112 -0
- model_analyzer/config/generate/search_dimension.py +73 -0
- model_analyzer/config/generate/search_dimensions.py +85 -0
- model_analyzer/config/generate/search_parameter.py +49 -0
- model_analyzer/config/generate/search_parameters.py +388 -0
- model_analyzer/config/input/__init__.py +15 -0
- model_analyzer/config/input/config_command.py +483 -0
- model_analyzer/config/input/config_command_profile.py +1747 -0
- model_analyzer/config/input/config_command_report.py +267 -0
- model_analyzer/config/input/config_defaults.py +236 -0
- model_analyzer/config/input/config_enum.py +83 -0
- model_analyzer/config/input/config_field.py +216 -0
- model_analyzer/config/input/config_list_generic.py +112 -0
- model_analyzer/config/input/config_list_numeric.py +151 -0
- model_analyzer/config/input/config_list_string.py +111 -0
- model_analyzer/config/input/config_none.py +71 -0
- model_analyzer/config/input/config_object.py +129 -0
- model_analyzer/config/input/config_primitive.py +81 -0
- model_analyzer/config/input/config_status.py +75 -0
- model_analyzer/config/input/config_sweep.py +83 -0
- model_analyzer/config/input/config_union.py +113 -0
- model_analyzer/config/input/config_utils.py +128 -0
- model_analyzer/config/input/config_value.py +243 -0
- model_analyzer/config/input/objects/__init__.py +15 -0
- model_analyzer/config/input/objects/config_model_profile_spec.py +325 -0
- model_analyzer/config/input/objects/config_model_report_spec.py +173 -0
- model_analyzer/config/input/objects/config_plot.py +198 -0
- model_analyzer/config/input/objects/config_protobuf_utils.py +101 -0
- model_analyzer/config/input/yaml_config_validator.py +82 -0
- model_analyzer/config/run/__init__.py +15 -0
- model_analyzer/config/run/model_run_config.py +313 -0
- model_analyzer/config/run/run_config.py +168 -0
- model_analyzer/constants.py +76 -0
- model_analyzer/device/__init__.py +15 -0
- model_analyzer/device/device.py +24 -0
- model_analyzer/device/gpu_device.py +87 -0
- model_analyzer/device/gpu_device_factory.py +248 -0
- model_analyzer/entrypoint.py +307 -0
- model_analyzer/log_formatter.py +65 -0
- model_analyzer/model_analyzer_exceptions.py +24 -0
- model_analyzer/model_manager.py +255 -0
- model_analyzer/monitor/__init__.py +15 -0
- model_analyzer/monitor/cpu_monitor.py +69 -0
- model_analyzer/monitor/dcgm/DcgmDiag.py +191 -0
- model_analyzer/monitor/dcgm/DcgmFieldGroup.py +83 -0
- model_analyzer/monitor/dcgm/DcgmGroup.py +815 -0
- model_analyzer/monitor/dcgm/DcgmHandle.py +141 -0
- model_analyzer/monitor/dcgm/DcgmJsonReader.py +69 -0
- model_analyzer/monitor/dcgm/DcgmReader.py +623 -0
- model_analyzer/monitor/dcgm/DcgmStatus.py +57 -0
- model_analyzer/monitor/dcgm/DcgmSystem.py +412 -0
- model_analyzer/monitor/dcgm/__init__.py +15 -0
- model_analyzer/monitor/dcgm/common/__init__.py +13 -0
- model_analyzer/monitor/dcgm/common/dcgm_client_cli_parser.py +194 -0
- model_analyzer/monitor/dcgm/common/dcgm_client_main.py +86 -0
- model_analyzer/monitor/dcgm/dcgm_agent.py +887 -0
- model_analyzer/monitor/dcgm/dcgm_collectd_plugin.py +369 -0
- model_analyzer/monitor/dcgm/dcgm_errors.py +395 -0
- model_analyzer/monitor/dcgm/dcgm_field_helpers.py +546 -0
- model_analyzer/monitor/dcgm/dcgm_fields.py +815 -0
- model_analyzer/monitor/dcgm/dcgm_fields_collectd.py +671 -0
- model_analyzer/monitor/dcgm/dcgm_fields_internal.py +29 -0
- model_analyzer/monitor/dcgm/dcgm_fluentd.py +45 -0
- model_analyzer/monitor/dcgm/dcgm_monitor.py +138 -0
- model_analyzer/monitor/dcgm/dcgm_prometheus.py +326 -0
- model_analyzer/monitor/dcgm/dcgm_structs.py +2357 -0
- model_analyzer/monitor/dcgm/dcgm_telegraf.py +65 -0
- model_analyzer/monitor/dcgm/dcgm_value.py +151 -0
- model_analyzer/monitor/dcgm/dcgmvalue.py +155 -0
- model_analyzer/monitor/dcgm/denylist_recommendations.py +573 -0
- model_analyzer/monitor/dcgm/pydcgm.py +47 -0
- model_analyzer/monitor/monitor.py +143 -0
- model_analyzer/monitor/remote_monitor.py +137 -0
- model_analyzer/output/__init__.py +15 -0
- model_analyzer/output/file_writer.py +63 -0
- model_analyzer/output/output_writer.py +42 -0
- model_analyzer/perf_analyzer/__init__.py +15 -0
- model_analyzer/perf_analyzer/genai_perf_config.py +206 -0
- model_analyzer/perf_analyzer/perf_analyzer.py +882 -0
- model_analyzer/perf_analyzer/perf_config.py +479 -0
- model_analyzer/plots/__init__.py +15 -0
- model_analyzer/plots/detailed_plot.py +266 -0
- model_analyzer/plots/plot_manager.py +224 -0
- model_analyzer/plots/simple_plot.py +213 -0
- model_analyzer/record/__init__.py +15 -0
- model_analyzer/record/gpu_record.py +68 -0
- model_analyzer/record/metrics_manager.py +887 -0
- model_analyzer/record/record.py +280 -0
- model_analyzer/record/record_aggregator.py +256 -0
- model_analyzer/record/types/__init__.py +15 -0
- model_analyzer/record/types/cpu_available_ram.py +93 -0
- model_analyzer/record/types/cpu_used_ram.py +93 -0
- model_analyzer/record/types/gpu_free_memory.py +96 -0
- model_analyzer/record/types/gpu_power_usage.py +107 -0
- model_analyzer/record/types/gpu_total_memory.py +96 -0
- model_analyzer/record/types/gpu_used_memory.py +96 -0
- model_analyzer/record/types/gpu_utilization.py +108 -0
- model_analyzer/record/types/inter_token_latency_avg.py +60 -0
- model_analyzer/record/types/inter_token_latency_base.py +74 -0
- model_analyzer/record/types/inter_token_latency_max.py +60 -0
- model_analyzer/record/types/inter_token_latency_min.py +60 -0
- model_analyzer/record/types/inter_token_latency_p25.py +60 -0
- model_analyzer/record/types/inter_token_latency_p50.py +60 -0
- model_analyzer/record/types/inter_token_latency_p75.py +60 -0
- model_analyzer/record/types/inter_token_latency_p90.py +60 -0
- model_analyzer/record/types/inter_token_latency_p95.py +60 -0
- model_analyzer/record/types/inter_token_latency_p99.py +60 -0
- model_analyzer/record/types/output_token_throughput.py +105 -0
- model_analyzer/record/types/perf_client_response_wait.py +97 -0
- model_analyzer/record/types/perf_client_send_recv.py +97 -0
- model_analyzer/record/types/perf_latency.py +111 -0
- model_analyzer/record/types/perf_latency_avg.py +60 -0
- model_analyzer/record/types/perf_latency_base.py +74 -0
- model_analyzer/record/types/perf_latency_p90.py +60 -0
- model_analyzer/record/types/perf_latency_p95.py +60 -0
- model_analyzer/record/types/perf_latency_p99.py +60 -0
- model_analyzer/record/types/perf_server_compute_infer.py +97 -0
- model_analyzer/record/types/perf_server_compute_input.py +97 -0
- model_analyzer/record/types/perf_server_compute_output.py +97 -0
- model_analyzer/record/types/perf_server_queue.py +97 -0
- model_analyzer/record/types/perf_throughput.py +105 -0
- model_analyzer/record/types/time_to_first_token_avg.py +60 -0
- model_analyzer/record/types/time_to_first_token_base.py +74 -0
- model_analyzer/record/types/time_to_first_token_max.py +60 -0
- model_analyzer/record/types/time_to_first_token_min.py +60 -0
- model_analyzer/record/types/time_to_first_token_p25.py +60 -0
- model_analyzer/record/types/time_to_first_token_p50.py +60 -0
- model_analyzer/record/types/time_to_first_token_p75.py +60 -0
- model_analyzer/record/types/time_to_first_token_p90.py +60 -0
- model_analyzer/record/types/time_to_first_token_p95.py +60 -0
- model_analyzer/record/types/time_to_first_token_p99.py +60 -0
- model_analyzer/reports/__init__.py +15 -0
- model_analyzer/reports/html_report.py +195 -0
- model_analyzer/reports/pdf_report.py +50 -0
- model_analyzer/reports/report.py +86 -0
- model_analyzer/reports/report_factory.py +62 -0
- model_analyzer/reports/report_manager.py +1376 -0
- model_analyzer/reports/report_utils.py +42 -0
- model_analyzer/result/__init__.py +15 -0
- model_analyzer/result/constraint_manager.py +150 -0
- model_analyzer/result/model_config_measurement.py +354 -0
- model_analyzer/result/model_constraints.py +105 -0
- model_analyzer/result/parameter_search.py +246 -0
- model_analyzer/result/result_manager.py +430 -0
- model_analyzer/result/result_statistics.py +159 -0
- model_analyzer/result/result_table.py +217 -0
- model_analyzer/result/result_table_manager.py +646 -0
- model_analyzer/result/result_utils.py +42 -0
- model_analyzer/result/results.py +277 -0
- model_analyzer/result/run_config_measurement.py +658 -0
- model_analyzer/result/run_config_result.py +210 -0
- model_analyzer/result/run_config_result_comparator.py +110 -0
- model_analyzer/result/sorted_results.py +151 -0
- model_analyzer/state/__init__.py +15 -0
- model_analyzer/state/analyzer_state.py +76 -0
- model_analyzer/state/analyzer_state_manager.py +215 -0
- model_analyzer/triton/__init__.py +15 -0
- model_analyzer/triton/client/__init__.py +15 -0
- model_analyzer/triton/client/client.py +234 -0
- model_analyzer/triton/client/client_factory.py +57 -0
- model_analyzer/triton/client/grpc_client.py +104 -0
- model_analyzer/triton/client/http_client.py +107 -0
- model_analyzer/triton/model/__init__.py +15 -0
- model_analyzer/triton/model/model_config.py +556 -0
- model_analyzer/triton/model/model_config_variant.py +29 -0
- model_analyzer/triton/server/__init__.py +15 -0
- model_analyzer/triton/server/server.py +76 -0
- model_analyzer/triton/server/server_config.py +269 -0
- model_analyzer/triton/server/server_docker.py +229 -0
- model_analyzer/triton/server/server_factory.py +306 -0
- model_analyzer/triton/server/server_local.py +158 -0
- triton_model_analyzer-1.48.0.dist-info/METADATA +52 -0
- triton_model_analyzer-1.48.0.dist-info/RECORD +204 -0
- triton_model_analyzer-1.48.0.dist-info/WHEEL +5 -0
- triton_model_analyzer-1.48.0.dist-info/entry_points.txt +2 -0
- triton_model_analyzer-1.48.0.dist-info/licenses/LICENSE +67 -0
- 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
|
+
###############################################################################
|