15127c0d43
* OMNITRACE_ROCM_SMI_METRICS - configuration variable OMNITRACE_ROCM_SMI_METRICS for specifying which rocm-smi metrics to collect - auto-disable metric collection when rsmi_dev_X_get returns RSMI_STATUS_NOT_SUPPORTED * Bump version to 1.11.1 * Python formatting * Update python/libpyomnitrace.cpp - fix usage of substr (ignored return value) * Update python/gui/source/gui.py - Fix E721 - do not compare types, for exact checks use `is` / `is not`, for instance checks use `isinstance()`
207 строки
5.8 KiB
Python
207 строки
5.8 KiB
Python
#!/usr/bin/env python3
|
|
# MIT License
|
|
#
|
|
# Copyright (c) 2023 Advanced Micro Devices, Inc. All Rights Reserved.
|
|
#
|
|
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
# of this software and associated documentation files (the "Software"), to deal
|
|
# in the Software without restriction, including without limitation the rights
|
|
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
# copies of the Software, and to permit persons to whom the Software is
|
|
# furnished to do so, subject to the following conditions:
|
|
#
|
|
# The above copyright notice and this permission notice shall be included in all
|
|
# copies or substantial portions of the Software.
|
|
#
|
|
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
# SOFTWARE.
|
|
|
|
import os
|
|
|
|
import dash_daq as daq
|
|
import dash_bootstrap_components as dbc
|
|
|
|
from dash import html, dcc
|
|
|
|
|
|
def file_path():
|
|
return html.Div(
|
|
className="workload",
|
|
children=[
|
|
dcc.Input(
|
|
id="file-path",
|
|
placeholder="Insert Workload directory",
|
|
type="text",
|
|
debounce=True,
|
|
)
|
|
],
|
|
)
|
|
|
|
|
|
def function_filter(_id, _placeholder):
|
|
return html.Div(
|
|
className="regex",
|
|
children=[
|
|
dcc.Input(
|
|
id=_id,
|
|
placeholder=_placeholder,
|
|
type="text",
|
|
debounce=True,
|
|
)
|
|
],
|
|
)
|
|
|
|
|
|
def upload_file():
|
|
return html.Div(
|
|
className="upload",
|
|
children=[
|
|
# drag and drop
|
|
dcc.Upload(
|
|
id="upload-drag",
|
|
children=[html.A("Drag and Drop or Select a File")],
|
|
)
|
|
],
|
|
)
|
|
|
|
|
|
def minPoints(name, values):
|
|
return html.Div(
|
|
className="filter",
|
|
id="min-points",
|
|
children=[
|
|
# html.Div(
|
|
# children=[
|
|
html.A(children=["Min Points:"]),
|
|
daq.Slider(
|
|
min=0,
|
|
max=values,
|
|
step=1,
|
|
value=1,
|
|
id="points-filt",
|
|
handleLabel={"showCurrentValue": True, "label": " "},
|
|
size=120,
|
|
),
|
|
# ],
|
|
# ),
|
|
],
|
|
)
|
|
|
|
|
|
def span(name):
|
|
total_length = 30
|
|
base = os.path.basename(name)
|
|
dir_len = total_length - len(base)
|
|
if len(name) > total_length:
|
|
return {
|
|
"label": html.Span(name[0:dir_len] + "..." + base, title=name),
|
|
"value": name,
|
|
}
|
|
else:
|
|
return {"label": html.Span(name, title=name), "value": name}
|
|
|
|
|
|
def sortBy(name, values, default, multi_):
|
|
values = list(map(span, values))
|
|
return html.Div(
|
|
className="filter",
|
|
children=[
|
|
html.A(children=[name + ":"]),
|
|
dcc.Dropdown(
|
|
values,
|
|
id=name + "-filt",
|
|
multi=multi_,
|
|
value=default,
|
|
clearable=False,
|
|
),
|
|
],
|
|
)
|
|
|
|
|
|
def refresh():
|
|
return html.Div(
|
|
className="nav-right",
|
|
children=[
|
|
html.Button(
|
|
className="refresh",
|
|
children=["Refresh Data"],
|
|
id="refresh",
|
|
)
|
|
],
|
|
)
|
|
|
|
|
|
def get_header(dropDownMenuItems, input_filters):
|
|
children_ = [
|
|
html.Nav(
|
|
id="nav-wrap",
|
|
children=[
|
|
html.Ul(
|
|
id="nav",
|
|
children=[
|
|
html.Div(
|
|
className="nav-left",
|
|
children=[
|
|
dbc.DropdownMenu(
|
|
dropDownMenuItems, label="Menu", menu_variant="dark"
|
|
)
|
|
],
|
|
)
|
|
],
|
|
)
|
|
],
|
|
)
|
|
]
|
|
filter_children = []
|
|
for filter in input_filters:
|
|
header_nav = children_[0].children[0].children
|
|
|
|
if filter["type"] == "int":
|
|
filter_children.append(minPoints(filter["Name"], filter["values"]))
|
|
elif filter["type"] == "Name":
|
|
filter_children.append(
|
|
sortBy(
|
|
filter["Name"],
|
|
filter["values"],
|
|
filter["default"],
|
|
filter["multi"],
|
|
# {},
|
|
)
|
|
)
|
|
else:
|
|
print("type not supported")
|
|
# sys.exit(1)
|
|
|
|
header_nav = children_[0].children[0].children
|
|
filter_children.append(function_filter("experiment_regex", "Experiment regex"))
|
|
filter_children.append(function_filter("progpt_regex", "Progress Point regex"))
|
|
filter_children.append(file_path())
|
|
filter_children.append(upload_file())
|
|
# filter_children.append(refresh())
|
|
ul = html.Div(
|
|
id="nav-center",
|
|
className="nav-center",
|
|
children=filter_children,
|
|
# [
|
|
# html.Li(className="filter", children=filter_children),
|
|
# refresh(),
|
|
# html.Li(
|
|
# className="regex",
|
|
# children=[
|
|
# function_filter("experiment_regex", "Funtion/line regex"),
|
|
# function_filter("progpt_regex", "Experiment regex"),
|
|
# file_path(),
|
|
# upload_file(),
|
|
# ],
|
|
# ),
|
|
# ],
|
|
)
|
|
header_nav.append(ul)
|
|
header_nav.append(refresh())
|
|
return html.Header(id="home", children=children_)
|