ttnn-visualizer 0.44.1__py3-none-any.whl → 0.46.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.
- ttnn_visualizer/csv_queries.py +1 -54
- ttnn_visualizer/decorators.py +3 -3
- ttnn_visualizer/exceptions.py +7 -1
- ttnn_visualizer/models.py +1 -0
- ttnn_visualizer/remote_sqlite_setup.py +6 -82
- ttnn_visualizer/sftp_operations.py +34 -106
- ttnn_visualizer/ssh_client.py +352 -0
- ttnn_visualizer/static/assets/allPaths-esBqnTg5.js +1 -0
- ttnn_visualizer/static/assets/allPathsLoader-KPOKJ-lr.js +2 -0
- ttnn_visualizer/static/assets/index-03c8d4Gh.js +1 -0
- ttnn_visualizer/static/assets/{index-B2fHW2_O.js → index-BANm1CMY.js} +383 -383
- ttnn_visualizer/static/assets/index-BuHal8Ii.css +7 -0
- ttnn_visualizer/static/assets/index-PKNBViIU.js +1 -0
- ttnn_visualizer/static/assets/splitPathsBySizeLoader-DYuDhweD.js +1 -0
- ttnn_visualizer/static/index.html +2 -2
- ttnn_visualizer/views.py +80 -181
- {ttnn_visualizer-0.44.1.dist-info → ttnn_visualizer-0.46.0.dist-info}/METADATA +7 -3
- ttnn_visualizer-0.46.0.dist-info/RECORD +43 -0
- {ttnn_visualizer-0.44.1.dist-info → ttnn_visualizer-0.46.0.dist-info}/licenses/LICENSE +6 -0
- ttnn_visualizer/static/assets/allPaths-CFKU23gh.js +0 -1
- ttnn_visualizer/static/assets/allPathsLoader-CpaihUCo.js +0 -2
- ttnn_visualizer/static/assets/index-B-fsa5Ru.js +0 -1
- ttnn_visualizer/static/assets/index-BueCaPcI.css +0 -7
- ttnn_visualizer/static/assets/index-DLOviMB1.js +0 -1
- ttnn_visualizer/static/assets/splitPathsBySizeLoader-BEb-7YZm.js +0 -1
- ttnn_visualizer-0.44.1.dist-info/RECORD +0 -42
- {ttnn_visualizer-0.44.1.dist-info → ttnn_visualizer-0.46.0.dist-info}/WHEEL +0 -0
- {ttnn_visualizer-0.44.1.dist-info → ttnn_visualizer-0.46.0.dist-info}/entry_points.txt +0 -0
- {ttnn_visualizer-0.44.1.dist-info → ttnn_visualizer-0.46.0.dist-info}/licenses/LICENSE_understanding.txt +0 -0
- {ttnn_visualizer-0.44.1.dist-info → ttnn_visualizer-0.46.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1 @@
|
|
1
|
+
import{p as r,I as s,_ as a}from"./index-BANm1CMY.js";const n=async(o,_)=>{const i=r(o);let t;return _===s.STANDARD?t=await a(()=>import("./index-03c8d4Gh.js").then(e=>e.I),[]):t=await a(()=>import("./index-PKNBViIU.js").then(e=>e.I),[]),t[i]};export{n as splitPathsBySizeLoader};
|
@@ -34,8 +34,8 @@
|
|
34
34
|
/* SERVER_CONFIG */
|
35
35
|
</script>
|
36
36
|
|
37
|
-
<script type="module" crossorigin src="/static/assets/index-
|
38
|
-
<link rel="stylesheet" crossorigin href="/static/assets/index-
|
37
|
+
<script type="module" crossorigin src="/static/assets/index-BANm1CMY.js"></script>
|
38
|
+
<link rel="stylesheet" crossorigin href="/static/assets/index-BuHal8Ii.css">
|
39
39
|
</head>
|
40
40
|
<body>
|
41
41
|
|
ttnn_visualizer/views.py
CHANGED
@@ -7,7 +7,6 @@ import json
|
|
7
7
|
import logging
|
8
8
|
import re
|
9
9
|
import shutil
|
10
|
-
import subprocess
|
11
10
|
import time
|
12
11
|
from http import HTTPStatus
|
13
12
|
from pathlib import Path
|
@@ -67,6 +66,7 @@ from ttnn_visualizer.sftp_operations import (
|
|
67
66
|
sync_remote_performance_folders,
|
68
67
|
sync_remote_profiler_folders,
|
69
68
|
)
|
69
|
+
from ttnn_visualizer.ssh_client import SSHClient
|
70
70
|
from ttnn_visualizer.utils import (
|
71
71
|
get_cluster_descriptor_path,
|
72
72
|
read_last_synced_file,
|
@@ -74,123 +74,10 @@ from ttnn_visualizer.utils import (
|
|
74
74
|
)
|
75
75
|
|
76
76
|
|
77
|
-
def handle_ssh_subprocess_error(e: subprocess.CalledProcessError, remote_connection):
|
78
|
-
"""
|
79
|
-
Convert subprocess SSH errors to appropriate SSH exceptions.
|
80
|
-
|
81
|
-
:param e: The subprocess.CalledProcessError
|
82
|
-
:param remote_connection: The RemoteConnection object for context
|
83
|
-
:raises: SSHException, AuthenticationException, or NoValidConnectionsError
|
84
|
-
"""
|
85
|
-
stderr = e.stderr.lower() if e.stderr else ""
|
86
|
-
|
87
|
-
# Check for authentication failures
|
88
|
-
if any(
|
89
|
-
auth_err in stderr
|
90
|
-
for auth_err in [
|
91
|
-
"permission denied",
|
92
|
-
"authentication failed",
|
93
|
-
"publickey",
|
94
|
-
"password",
|
95
|
-
"host key verification failed",
|
96
|
-
]
|
97
|
-
):
|
98
|
-
raise AuthenticationException(
|
99
|
-
f"SSH authentication failed: {remote_connection.username}@{remote_connection.host}: Permission denied (publickey,password)"
|
100
|
-
)
|
101
|
-
|
102
|
-
# Check for connection failures
|
103
|
-
elif any(
|
104
|
-
conn_err in stderr
|
105
|
-
for conn_err in [
|
106
|
-
"connection refused",
|
107
|
-
"network is unreachable",
|
108
|
-
"no route to host",
|
109
|
-
"name or service not known",
|
110
|
-
"connection timed out",
|
111
|
-
]
|
112
|
-
):
|
113
|
-
raise NoValidConnectionsError(f"SSH connection failed: {e.stderr}")
|
114
|
-
|
115
|
-
# Check for general SSH protocol errors
|
116
|
-
elif "ssh:" in stderr or "protocol" in stderr:
|
117
|
-
raise SSHException(f"SSH protocol error: {e.stderr}")
|
118
|
-
|
119
|
-
# Default to generic SSH exception
|
120
|
-
else:
|
121
|
-
raise SSHException(f"SSH command failed: {e.stderr}")
|
122
|
-
|
123
|
-
|
124
77
|
def test_ssh_connection(connection) -> bool:
|
125
78
|
"""Test SSH connection by running a simple command."""
|
126
|
-
|
127
|
-
|
128
|
-
# Handle non-standard SSH port
|
129
|
-
if connection.port != 22:
|
130
|
-
ssh_cmd.extend(["-p", str(connection.port)])
|
131
|
-
|
132
|
-
ssh_cmd.extend(
|
133
|
-
[f"{connection.username}@{connection.host}", "echo 'SSH connection test'"]
|
134
|
-
)
|
135
|
-
|
136
|
-
try:
|
137
|
-
result = subprocess.run(
|
138
|
-
ssh_cmd, capture_output=True, text=True, check=True, timeout=10
|
139
|
-
)
|
140
|
-
return True
|
141
|
-
except subprocess.CalledProcessError as e:
|
142
|
-
if e.returncode == 255: # SSH protocol errors
|
143
|
-
try:
|
144
|
-
handle_ssh_subprocess_error(e, connection)
|
145
|
-
except AuthenticationException:
|
146
|
-
# Convert to AuthenticationFailedException for proper HTTP 422 response
|
147
|
-
user_message = (
|
148
|
-
"SSH authentication failed. This application requires SSH key-based authentication. "
|
149
|
-
"Please ensure your SSH public key is added to the authorized_keys file on the remote server. "
|
150
|
-
"Password authentication is not supported."
|
151
|
-
)
|
152
|
-
logger.info(
|
153
|
-
f"SSH authentication failed for {connection.username}@{connection.host}: {user_message}"
|
154
|
-
)
|
155
|
-
raise AuthenticationFailedException(message=user_message)
|
156
|
-
except NoValidConnectionsError as ssh_err:
|
157
|
-
user_message = (
|
158
|
-
f"Unable to establish SSH connection to {connection.host}. "
|
159
|
-
"Please check the hostname, port, and network connectivity. "
|
160
|
-
"Ensure SSH key-based authentication is properly configured."
|
161
|
-
)
|
162
|
-
logger.warning(
|
163
|
-
f"SSH connection failed for {connection.username}@{connection.host}: {user_message}"
|
164
|
-
)
|
165
|
-
raise RemoteConnectionException(
|
166
|
-
message=user_message, status=ConnectionTestStates.FAILED
|
167
|
-
)
|
168
|
-
except SSHException as ssh_err:
|
169
|
-
user_message = f"SSH connection error to {connection.host}: {str(ssh_err)}. Ensure SSH key-based authentication is properly configured."
|
170
|
-
logger.warning(
|
171
|
-
f"SSH error for {connection.username}@{connection.host}: {user_message}"
|
172
|
-
)
|
173
|
-
raise RemoteConnectionException(
|
174
|
-
message=user_message, status=ConnectionTestStates.FAILED
|
175
|
-
)
|
176
|
-
else:
|
177
|
-
error_message = f"SSH connection test failed: {e.stderr}"
|
178
|
-
logger.error(
|
179
|
-
f"SSH test failed for {connection.username}@{connection.host}: {error_message}"
|
180
|
-
)
|
181
|
-
raise RemoteConnectionException(
|
182
|
-
message=error_message, status=ConnectionTestStates.FAILED
|
183
|
-
)
|
184
|
-
return False
|
185
|
-
except subprocess.TimeoutExpired:
|
186
|
-
timeout_message = "SSH connection test timed out"
|
187
|
-
logger.warning(
|
188
|
-
f"SSH timeout for {connection.username}@{connection.host}: {timeout_message}"
|
189
|
-
)
|
190
|
-
raise RemoteConnectionException(
|
191
|
-
message=timeout_message, status=ConnectionTestStates.FAILED
|
192
|
-
)
|
193
|
-
return False
|
79
|
+
ssh_client = SSHClient(connection)
|
80
|
+
return ssh_client.test_connection()
|
194
81
|
|
195
82
|
|
196
83
|
logger = logging.getLogger(__name__)
|
@@ -643,9 +530,11 @@ def get_performance_data_list(instance: Instance):
|
|
643
530
|
/ connection.host
|
644
531
|
/ current_app.config["PERFORMANCE_DIRECTORY_NAME"]
|
645
532
|
)
|
646
|
-
directory_names =
|
647
|
-
directory.name for directory in path.iterdir() if directory.is_dir()
|
648
|
-
|
533
|
+
directory_names = (
|
534
|
+
[directory.name for directory in path.iterdir() if directory.is_dir()]
|
535
|
+
if path.exists()
|
536
|
+
else []
|
537
|
+
)
|
649
538
|
|
650
539
|
valid_dirs = []
|
651
540
|
|
@@ -670,7 +559,12 @@ def get_performance_data_list(instance: Instance):
|
|
670
559
|
if not any(file.name.startswith("ops_perf_results") for file in files):
|
671
560
|
continue
|
672
561
|
|
673
|
-
valid_dirs.append(
|
562
|
+
valid_dirs.append(
|
563
|
+
{
|
564
|
+
"path": dir_path.name,
|
565
|
+
"reportName": dir_path.name,
|
566
|
+
}
|
567
|
+
)
|
674
568
|
|
675
569
|
return jsonify(valid_dirs)
|
676
570
|
|
@@ -761,7 +655,10 @@ def get_performance_results_data_raw(instance: Instance):
|
|
761
655
|
@with_instance
|
762
656
|
def get_performance_results_report(instance: Instance):
|
763
657
|
if not instance.performance_path:
|
764
|
-
return Response(
|
658
|
+
return Response(
|
659
|
+
status=HTTPStatus.BAD_REQUEST,
|
660
|
+
response="No performance data found for instance.",
|
661
|
+
)
|
765
662
|
|
766
663
|
name = request.args.get("name", None)
|
767
664
|
|
@@ -1101,8 +998,8 @@ def test_remote_folder():
|
|
1101
998
|
connection = RemoteConnection.model_validate(connection_data)
|
1102
999
|
statuses = []
|
1103
1000
|
|
1104
|
-
def add_status(status, message):
|
1105
|
-
statuses.append(StatusMessage(status=status, message=message))
|
1001
|
+
def add_status(status, message, detail=None):
|
1002
|
+
statuses.append(StatusMessage(status=status, message=message, detail=detail))
|
1106
1003
|
|
1107
1004
|
def has_failures():
|
1108
1005
|
return any(
|
@@ -1115,21 +1012,29 @@ def test_remote_folder():
|
|
1115
1012
|
add_status(ConnectionTestStates.OK.value, "SSH connection established")
|
1116
1013
|
except AuthenticationFailedException as e:
|
1117
1014
|
# Return 422 for authentication failures
|
1118
|
-
add_status(
|
1015
|
+
add_status(
|
1016
|
+
ConnectionTestStates.FAILED.value, e.message, getattr(e, "detail", None)
|
1017
|
+
)
|
1119
1018
|
return [status.model_dump() for status in statuses], e.http_status
|
1120
1019
|
except RemoteConnectionException as e:
|
1121
|
-
add_status(
|
1020
|
+
add_status(
|
1021
|
+
ConnectionTestStates.FAILED.value, e.message, getattr(e, "detail", None)
|
1022
|
+
)
|
1122
1023
|
|
1123
1024
|
# Test Directory Configuration
|
1124
|
-
if not has_failures():
|
1025
|
+
if not has_failures() and connection.profilerPath:
|
1125
1026
|
try:
|
1126
1027
|
check_remote_path_exists(connection, "profilerPath")
|
1127
1028
|
add_status(ConnectionTestStates.OK.value, "Memory folder path exists")
|
1128
1029
|
except AuthenticationFailedException as e:
|
1129
|
-
add_status(
|
1030
|
+
add_status(
|
1031
|
+
ConnectionTestStates.FAILED.value, e.message, getattr(e, "detail", None)
|
1032
|
+
)
|
1130
1033
|
return [status.model_dump() for status in statuses], e.http_status
|
1131
1034
|
except RemoteConnectionException as e:
|
1132
|
-
add_status(
|
1035
|
+
add_status(
|
1036
|
+
ConnectionTestStates.FAILED.value, e.message, getattr(e, "detail", None)
|
1037
|
+
)
|
1133
1038
|
|
1134
1039
|
# Test Directory Configuration (perf)
|
1135
1040
|
if not has_failures() and connection.performancePath:
|
@@ -1137,20 +1042,28 @@ def test_remote_folder():
|
|
1137
1042
|
check_remote_path_exists(connection, "performancePath")
|
1138
1043
|
add_status(ConnectionTestStates.OK.value, "Performance folder path exists")
|
1139
1044
|
except AuthenticationFailedException as e:
|
1140
|
-
add_status(
|
1045
|
+
add_status(
|
1046
|
+
ConnectionTestStates.FAILED.value, e.message, getattr(e, "detail", None)
|
1047
|
+
)
|
1141
1048
|
return [status.model_dump() for status in statuses], e.http_status
|
1142
1049
|
except RemoteConnectionException as e:
|
1143
|
-
add_status(
|
1050
|
+
add_status(
|
1051
|
+
ConnectionTestStates.FAILED.value, e.message, getattr(e, "detail", None)
|
1052
|
+
)
|
1144
1053
|
|
1145
1054
|
# Check for Project Configurations
|
1146
1055
|
if not has_failures():
|
1147
1056
|
try:
|
1148
1057
|
check_remote_path_for_reports(connection)
|
1149
1058
|
except AuthenticationFailedException as e:
|
1150
|
-
add_status(
|
1059
|
+
add_status(
|
1060
|
+
ConnectionTestStates.FAILED.value, e.message, getattr(e, "detail", None)
|
1061
|
+
)
|
1151
1062
|
return [status.model_dump() for status in statuses], e.http_status
|
1152
1063
|
except RemoteConnectionException as e:
|
1153
|
-
add_status(
|
1064
|
+
add_status(
|
1065
|
+
ConnectionTestStates.FAILED.value, e.message, getattr(e, "detail", None)
|
1066
|
+
)
|
1154
1067
|
|
1155
1068
|
return [status.model_dump() for status in statuses]
|
1156
1069
|
|
@@ -1159,7 +1072,8 @@ def test_remote_folder():
|
|
1159
1072
|
def read_remote_folder():
|
1160
1073
|
connection = RemoteConnection.model_validate(request.json, strict=False)
|
1161
1074
|
try:
|
1162
|
-
|
1075
|
+
# Only profilerPath is relevant here as we're reading the stack trace file
|
1076
|
+
content = read_remote_file(connection, remote_path=connection.profilerPath)
|
1163
1077
|
except RemoteConnectionException as e:
|
1164
1078
|
return Response(status=e.http_status, response=e.message)
|
1165
1079
|
return Response(status=200, response=content)
|
@@ -1174,33 +1088,37 @@ def sync_remote_folder():
|
|
1174
1088
|
if not request_body or not isinstance(request_body, dict):
|
1175
1089
|
return jsonify({"error": "Invalid or missing JSON data"}), 400
|
1176
1090
|
|
1177
|
-
|
1178
|
-
|
1091
|
+
profiler = request_body.get("profiler")
|
1092
|
+
performance = request_body.get("performance", None)
|
1179
1093
|
instance_id = request.args.get("instanceId", None)
|
1180
1094
|
connection = RemoteConnection.model_validate(
|
1181
1095
|
request_body.get("connection"), strict=False
|
1182
1096
|
)
|
1183
1097
|
|
1184
|
-
if
|
1185
|
-
|
1098
|
+
if performance:
|
1099
|
+
performance_folder = RemoteReportFolder.model_validate(
|
1100
|
+
performance, strict=False
|
1101
|
+
)
|
1186
1102
|
try:
|
1187
1103
|
sync_remote_performance_folders(
|
1188
1104
|
connection,
|
1189
1105
|
remote_dir,
|
1190
|
-
|
1106
|
+
performance=performance_folder,
|
1191
1107
|
exclude_patterns=[r"/tensors(/|$)"],
|
1192
1108
|
sid=instance_id,
|
1193
1109
|
)
|
1194
1110
|
|
1195
|
-
|
1111
|
+
performance_folder.lastSynced = int(time.time())
|
1196
1112
|
|
1197
|
-
return
|
1113
|
+
return performance_folder.model_dump()
|
1198
1114
|
|
1199
1115
|
except RemoteConnectionException as e:
|
1200
1116
|
return Response(status=e.http_status, response=e.message)
|
1201
1117
|
|
1202
1118
|
try:
|
1203
|
-
remote_profiler_folder = RemoteReportFolder.model_validate(
|
1119
|
+
remote_profiler_folder = RemoteReportFolder.model_validate(
|
1120
|
+
profiler, strict=False
|
1121
|
+
)
|
1204
1122
|
|
1205
1123
|
sync_remote_profiler_folders(
|
1206
1124
|
connection,
|
@@ -1247,55 +1165,36 @@ def detect_sqlite_path():
|
|
1247
1165
|
def use_remote_folder():
|
1248
1166
|
data = request.get_json(force=True)
|
1249
1167
|
connection = data.get("connection", None)
|
1250
|
-
|
1251
|
-
|
1168
|
+
profiler = data.get("profiler", None)
|
1169
|
+
performance = data.get("performance", None)
|
1252
1170
|
|
1253
|
-
if not connection or not
|
1171
|
+
if not connection or not (profiler or performance):
|
1254
1172
|
return Response(status=HTTPStatus.BAD_REQUEST)
|
1255
1173
|
|
1256
1174
|
connection = RemoteConnection.model_validate(connection, strict=False)
|
1257
|
-
folder = RemoteReportFolder.model_validate(folder, strict=False)
|
1258
|
-
performance_name = None
|
1259
|
-
remote_performance_folder = None
|
1260
1175
|
|
1261
|
-
|
1262
|
-
|
1263
|
-
|
1264
|
-
|
1265
|
-
performance_name = remote_performance_folder.reportName
|
1266
|
-
|
1267
|
-
data_directory = current_app.config["REMOTE_DATA_DIRECTORY"]
|
1268
|
-
profiler_name = folder.remotePath.split("/")[-1]
|
1269
|
-
folder_name = folder.remotePath.split("/")[-1]
|
1270
|
-
|
1271
|
-
connection_directory = Path(
|
1272
|
-
data_directory,
|
1273
|
-
connection.host,
|
1274
|
-
current_app.config["PROFILER_DIRECTORY_NAME"],
|
1275
|
-
folder_name,
|
1276
|
-
)
|
1176
|
+
kwargs = {
|
1177
|
+
"instance_id": request.args.get("instanceId"),
|
1178
|
+
"remote_connection": connection,
|
1179
|
+
}
|
1277
1180
|
|
1278
|
-
if
|
1279
|
-
|
1280
|
-
|
1281
|
-
|
1181
|
+
if profiler:
|
1182
|
+
remote_profiler_folder = RemoteReportFolder.model_validate(
|
1183
|
+
profiler,
|
1184
|
+
strict=False,
|
1282
1185
|
)
|
1186
|
+
kwargs["remote_profiler_folder"] = remote_profiler_folder
|
1187
|
+
kwargs["profiler_name"] = remote_profiler_folder.remotePath.split("/")[-1]
|
1283
1188
|
|
1284
|
-
|
1285
|
-
|
1286
|
-
|
1287
|
-
|
1288
|
-
|
1289
|
-
|
1189
|
+
if performance:
|
1190
|
+
remote_performance_folder = RemoteReportFolder.model_validate(
|
1191
|
+
performance,
|
1192
|
+
strict=False,
|
1193
|
+
)
|
1194
|
+
kwargs["remote_performance_folder"] = remote_performance_folder
|
1195
|
+
kwargs["performance_name"] = remote_performance_folder.reportName
|
1290
1196
|
|
1291
|
-
update_instance(
|
1292
|
-
instance_id=instance_id,
|
1293
|
-
profiler_name=profiler_name,
|
1294
|
-
performance_name=performance_name,
|
1295
|
-
remote_connection=connection,
|
1296
|
-
remote_profiler_folder=folder,
|
1297
|
-
remote_performance_folder=remote_performance_folder,
|
1298
|
-
)
|
1197
|
+
update_instance(**kwargs)
|
1299
1198
|
|
1300
1199
|
return Response(status=HTTPStatus.OK)
|
1301
1200
|
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: ttnn_visualizer
|
3
|
-
Version: 0.
|
3
|
+
Version: 0.46.0
|
4
4
|
Summary: TT-NN Visualizer
|
5
5
|
Classifier: Programming Language :: Python :: 3
|
6
6
|
Classifier: License :: OSI Approved :: MIT License
|
@@ -18,8 +18,8 @@ Requires-Dist: Flask==3.1.1
|
|
18
18
|
Requires-Dist: gevent==24.10.2
|
19
19
|
Requires-Dist: gunicorn~=23.0.0
|
20
20
|
Requires-Dist: pandas==2.2.3
|
21
|
-
Requires-Dist: pydantic_core==2.
|
22
|
-
Requires-Dist: pydantic==2.
|
21
|
+
Requires-Dist: pydantic_core==2.27.1
|
22
|
+
Requires-Dist: pydantic==2.10.3
|
23
23
|
Requires-Dist: python-dotenv==1.0.1
|
24
24
|
Requires-Dist: PyYAML==6.0.2
|
25
25
|
Requires-Dist: tt-perf-report==1.0.7
|
@@ -29,6 +29,7 @@ Provides-Extra: dev
|
|
29
29
|
Requires-Dist: black==25.1.0; extra == "dev"
|
30
30
|
Requires-Dist: isort==6.0.1; extra == "dev"
|
31
31
|
Requires-Dist: mypy; extra == "dev"
|
32
|
+
Requires-Dist: playwright==1.48.0; extra == "dev"
|
32
33
|
Requires-Dist: pytest==8.4.1; extra == "dev"
|
33
34
|
Dynamic: license-file
|
34
35
|
|
@@ -137,6 +138,9 @@ Unzip the files into their own directories and select them with the local folder
|
|
137
138
|
**Llama mlp**
|
138
139
|
[memory + performance report](https://github.com/user-attachments/files/18770763/llama_attn_32l_10iter_30jan.zip)
|
139
140
|
|
141
|
+
**N300 llama**
|
142
|
+
[memory + performance report with NPE data + cluster description](https://github.com/user-attachments/files/21496609/n300.zip)
|
143
|
+
|
140
144
|
### NPE report
|
141
145
|
|
142
146
|
**T3K synthetic**
|
@@ -0,0 +1,43 @@
|
|
1
|
+
ttnn_visualizer/__init__.py,sha256=FCQeTWnXsf-Wx-fay53-lQsm0y5-GcPMUmzhE5upDx0,93
|
2
|
+
ttnn_visualizer/app.py,sha256=q5Tb_69HawKdiw2uKe6_cOmYfvU5as40DoREvLfb_38,7281
|
3
|
+
ttnn_visualizer/csv_queries.py,sha256=lSqjDiZiCVhTkxgkixRJjxvvHLPzzm6Lx8jZ8x4BoIA,15086
|
4
|
+
ttnn_visualizer/decorators.py,sha256=8k73rTiGPSpPP5CHxzLxTQPxoQTAlhMQNcEbplQL3Ek,5805
|
5
|
+
ttnn_visualizer/enums.py,sha256=SEIqp1tlc_zw2vQ8nHH9YTaV0m3Cb8fjn_goqz5wurE,203
|
6
|
+
ttnn_visualizer/exceptions.py,sha256=XwTIykJpdvZV8nqrd9JZdHIYL0EBFBhTbE9H09VZluA,2273
|
7
|
+
ttnn_visualizer/extensions.py,sha256=6OIRJ8-_ccfjOaXSruRXiS29jEbxp4Pyk-0JlD8IHBQ,379
|
8
|
+
ttnn_visualizer/file_uploads.py,sha256=05FzYjZZy1RHuGgFeJiAjtrpzYd6KcrZzpvIjBCUZss,5011
|
9
|
+
ttnn_visualizer/instances.py,sha256=XctQgQXdlwtuXWFXFletRoX1m1lGUZdiW3TwIIjY0uw,11564
|
10
|
+
ttnn_visualizer/models.py,sha256=oxZVvWjtBDP0X6GqoYaH4wDa5PqJF_vG_I3Q_YWHMmo,7814
|
11
|
+
ttnn_visualizer/queries.py,sha256=3Nv0jXIDNVH-qKx9xc9zSINy4FdmDidu-1I6f-VYV48,9603
|
12
|
+
ttnn_visualizer/remote_sqlite_setup.py,sha256=VdJk5LfkaJo1XPC-yxy909I0AOgJF1GUjryj0Oe0O14,3498
|
13
|
+
ttnn_visualizer/serializers.py,sha256=LmjHIrFg8BLx1JKVFh9Nd_TcA7nyy1MwY2BOGnX1MKw,8029
|
14
|
+
ttnn_visualizer/settings.py,sha256=k2EEjbQNR8khbl5IrOetBPhbqgLlqXvuhm0E2z9ImCM,4607
|
15
|
+
ttnn_visualizer/sftp_operations.py,sha256=9HwbPJPSO1UUQ98d5zeWAkEwR0zFPryUakcI68GqkVw,30181
|
16
|
+
ttnn_visualizer/sockets.py,sha256=W5pK0QmlsU58EH_Qnra6HlcswLS7vsw5C_pk4avVYvs,3706
|
17
|
+
ttnn_visualizer/ssh_client.py,sha256=-GS2_1tdlUqVoLfRS02i3_o1fQaM39UQN-jtAnPBmzQ,13511
|
18
|
+
ttnn_visualizer/utils.py,sha256=MYCpvP9z8yoIVwI2Sa3iUahajZMLDxRmtRWrrUyB4_8,6223
|
19
|
+
ttnn_visualizer/views.py,sha256=b1ayDuH7zTVr5Pi5KGkpLZMnUvX2pDjljFWDkumcCq0,43224
|
20
|
+
ttnn_visualizer/static/index.html,sha256=RDJv0bYnRGaMh0KzFqsdaZd8OmO05JRyI-z2L1KSchE,1135
|
21
|
+
ttnn_visualizer/static/assets/allPaths-esBqnTg5.js,sha256=pdwKU_Qg1xSwaKMha-qO5SOzutgGME6EvbxnWSe3PgI,255
|
22
|
+
ttnn_visualizer/static/assets/allPathsLoader-KPOKJ-lr.js,sha256=f2t5H20m8LuOmh5qygz1a-sSLhHuLWXiGxTF9FargnM,477
|
23
|
+
ttnn_visualizer/static/assets/index-03c8d4Gh.js,sha256=k0jIi5q-lzXcPCqAD7K091vBMOkJHmx_fYcYKh-fOnM,285602
|
24
|
+
ttnn_visualizer/static/assets/index-BANm1CMY.js,sha256=uXWWiSs-Cs1MWW_pldHWmFOigc5b6WNH6lR_HC0pUGA,7880800
|
25
|
+
ttnn_visualizer/static/assets/index-BuHal8Ii.css,sha256=YCXZxX68jwt682YZ5gMTPzmXN9r2NjHfItOsrCQqRXk,622571
|
26
|
+
ttnn_visualizer/static/assets/index-PKNBViIU.js,sha256=dUuCyAPr_QvvTY0Xula4q4rgOm1J7xgdbppL67off4k,294225
|
27
|
+
ttnn_visualizer/static/assets/site-BTBrvHC5.webmanifest,sha256=Uy_XmnGuYFVf-OZuma2NvgEPdrCrevb3HZvaxSIHoA0,456
|
28
|
+
ttnn_visualizer/static/assets/splitPathsBySizeLoader-DYuDhweD.js,sha256=MWFWsPb9LjIyB4wpVSbMlOp3pN0673afNlKBfTZg-Dg,281
|
29
|
+
ttnn_visualizer/static/favicon/android-chrome-192x192.png,sha256=BZWA09Zxaa3fXbaeS6nhWo2e-DUSjm9ElzNQ_xTB5XU,6220
|
30
|
+
ttnn_visualizer/static/favicon/android-chrome-512x512.png,sha256=HBiJSZyguB3o8fMJuqIGcpeBy_9JOdImme3wD02UYCw,62626
|
31
|
+
ttnn_visualizer/static/favicon/favicon-32x32.png,sha256=Zw201qUsczQv1UvoQvJf5smQ2ss10xaTeWxmQNYCGtY,480
|
32
|
+
ttnn_visualizer/static/favicon/favicon.svg,sha256=wDPY3VrekJ_DE1TnJ2vUy602K3S4Xe9TgrdZ7jXK9c8,633
|
33
|
+
ttnn_visualizer/static/sample-data/cluster-desc.yaml,sha256=LMxOmsRUXtVVU5ogzYkXUozB3dg2IzqIRJQpV_O5qMU,29618
|
34
|
+
ttnn_visualizer/tests/__init__.py,sha256=FCQeTWnXsf-Wx-fay53-lQsm0y5-GcPMUmzhE5upDx0,93
|
35
|
+
ttnn_visualizer/tests/test_queries.py,sha256=HqaDXwudZpXiigJdHkdJP8oiUc-PtHASbpLnQQpbD7A,13792
|
36
|
+
ttnn_visualizer/tests/test_serializers.py,sha256=AF6m6tvewnZ_OSQMgMTUhsOI26GdJHPajvnRGIa9P4U,18492
|
37
|
+
ttnn_visualizer-0.46.0.dist-info/licenses/LICENSE,sha256=WBbTfgMRePWa_1qrAP1iLhxywPnoSIbTAipSk1eeN6U,15301
|
38
|
+
ttnn_visualizer-0.46.0.dist-info/licenses/LICENSE_understanding.txt,sha256=pymi-yb_RvYM9p2ZA4iSNsImcvhDBBxlGuJCY9dTq7M,233
|
39
|
+
ttnn_visualizer-0.46.0.dist-info/METADATA,sha256=T7YviW1Jmjd5ymxtEbIdAhDCEV_9feKk61HHFYBOzKc,7751
|
40
|
+
ttnn_visualizer-0.46.0.dist-info/WHEEL,sha256=lTU6B6eIfYoiQJTZNc-fyaR6BpL6ehTzU3xGYxn2n8k,91
|
41
|
+
ttnn_visualizer-0.46.0.dist-info/entry_points.txt,sha256=QpuUpkmQ_mEHJTMqOBdU0MH2Z4WF_9iFsGACeyyAO1E,61
|
42
|
+
ttnn_visualizer-0.46.0.dist-info/top_level.txt,sha256=M1EGkvDOuIfbhDbcUdz2-TSdmCtDoQ2Uyag9k5JLDSY,16
|
43
|
+
ttnn_visualizer-0.46.0.dist-info/RECORD,,
|
@@ -82,13 +82,18 @@ The following separate and independent dependencies are utilized by this project
|
|
82
82
|
- @blueprintjs/icons – Apache-2.0 – https://github.com/palantir/blueprint/blob/develop/packages/icons/LICENSE
|
83
83
|
- @blueprintjs/select – Apache-2.0 – https://github.com/palantir/blueprint/blob/develop/packages/select/LICENSE
|
84
84
|
- @blueprintjs/table – Apache-2.0 – https://github.com/palantir/blueprint/blob/develop/packages/table/LICENSE
|
85
|
+
- @eslint/eslintrc – MIT – https://github.com/eslint/eslintrc/blob/main/LICENSE
|
86
|
+
- @eslint/js – MIT – https://github.com/eslint/eslint/blob/main/LICENSE
|
87
|
+
- @eslint/rewrite – Apache-2.0 – https://github.com/eslint/rewrite/blob/main/LICENSE
|
85
88
|
- @tanstack/react-virtual – MIT – https://github.com/TanStack/virtual/blob/main/LICENSE
|
86
89
|
- @types/tinycolor2 – MIT – https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/types/tinycolor2/LICENSE
|
87
90
|
- axios – MIT – https://github.com/axios/axios/blob/v1.x/LICENSE
|
88
91
|
- css-select – BSD‑2-Clause – https://github.com/fb55/css-select/blob/master/LICENSE
|
89
92
|
- dom-serializer – MIT – https://github.com/cheeriojs/dom-serializer/blob/master/LICENSE
|
93
|
+
- globals – MIT – https://github.com/sindresorhus/globals/blob/main/license
|
90
94
|
- immutable – MIT – https://github.com/immutable-js/immutable-js/blob/master/LICENSE
|
91
95
|
- jotai – MIT – https://github.com/pmndrs/jotai/blob/main/LICENSE
|
96
|
+
- jsdom - MIT - https://github.com/jsdom/jsdom/blob/main/LICENSE.txt
|
92
97
|
- mini-svg-data-uri – MIT – https://github.com/tigt/mini-svg-data-uri/blob/master/LICENSE
|
93
98
|
- normalize.css – MIT – https://github.com/necolas/normalize.css/blob/master/LICENSE.md
|
94
99
|
- papaparse – MIT – https://github.com/mholt/PapaParse/blob/master/LICENSE
|
@@ -122,5 +127,6 @@ The following separate and independent dependencies are utilized by this project
|
|
122
127
|
- build – MIT https://opensource.org/license/mit
|
123
128
|
- tt-perf-report – MIT https://opensource.org/license/mit
|
124
129
|
- zstd (python-zstandard) – BSD‑3‑Clause – https://github.com/indygreg/python-zstandard/blob/main/LICENSE
|
130
|
+
- playwright – Apache-2.0 – https://github.com/microsoft/playwright-python/blob/main/LICENSE
|
125
131
|
|
126
132
|
- Upload Release Assets - GitHub Action - MIT - https://github.com/AButler/upload-release-assets/blob/master/LICENSE
|
@@ -1 +0,0 @@
|
|
1
|
-
import{I as n}from"./index-DLOviMB1.js";import{I as e}from"./index-B-fsa5Ru.js";import{p as r,I as s}from"./index-B2fHW2_O.js";function I(o,t){var a=r(o);return t===s.STANDARD?n[a]:e[a]}function p(o){return r(o)}export{n as IconSvgPaths16,e as IconSvgPaths20,I as getIconPaths,p as iconNameToPathsRecordKey};
|
@@ -1,2 +0,0 @@
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/allPaths-CFKU23gh.js","assets/index-DLOviMB1.js","assets/index-B-fsa5Ru.js","assets/index-B2fHW2_O.js","assets/index-BueCaPcI.css"])))=>i.map(i=>d[i]);
|
2
|
-
import{_ as o,a as n,b as i}from"./index-B2fHW2_O.js";var _=function(e,a){return o(void 0,void 0,void 0,function(){var t;return n(this,function(r){switch(r.label){case 0:return[4,i(()=>import("./allPaths-CFKU23gh.js"),__vite__mapDeps([0,1,2,3,4]))];case 1:return t=r.sent().getIconPaths,[2,t(e,a)]}})})};export{_ as allPathsLoader};
|