Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
S
Stable Diffusion Webui
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Locked Files
Issues
0
Issues
0
List
Boards
Labels
Service Desk
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Security & Compliance
Security & Compliance
Dependency List
License Compliance
Packages
Packages
List
Container Registry
Analytics
Analytics
CI / CD
Code Review
Insights
Issues
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
novelai-storage
Stable Diffusion Webui
Commits
ecd5fa9c
Commit
ecd5fa9c
authored
Mar 06, 2024
by
AUTOMATIC1111
Committed by
GitHub
Mar 06, 2024
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #15131 from catboxanon/feat/extra-network-metadata
Re-use profiler visualization for extra networks
parents
14215beb
ecffe851
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
180 additions
and
93 deletions
+180
-93
.eslintrc.js
.eslintrc.js
+2
-0
javascript/extraNetworks.js
javascript/extraNetworks.js
+64
-0
javascript/profilerVisualization.js
javascript/profilerVisualization.js
+114
-93
No files found.
.eslintrc.js
View file @
ecd5fa9c
...
@@ -78,6 +78,8 @@ module.exports = {
...
@@ -78,6 +78,8 @@ module.exports = {
//extraNetworks.js
//extraNetworks.js
requestGet
:
"
readonly
"
,
requestGet
:
"
readonly
"
,
popup
:
"
readonly
"
,
popup
:
"
readonly
"
,
// profilerVisualization.js
createVisualizationTable
:
"
readonly
"
,
// from python
// from python
localization
:
"
readonly
"
,
localization
:
"
readonly
"
,
// progrssbar.js
// progrssbar.js
...
...
javascript/extraNetworks.js
View file @
ecd5fa9c
...
@@ -528,12 +528,76 @@ function popupId(id) {
...
@@ -528,12 +528,76 @@ function popupId(id) {
popup
(
storedPopupIds
[
id
]);
popup
(
storedPopupIds
[
id
]);
}
}
function
extraNetworksFlattenMetadata
(
obj
)
{
const
result
=
{};
// Convert any stringified JSON objects to actual objects
for
(
const
key
of
Object
.
keys
(
obj
))
{
if
(
typeof
obj
[
key
]
===
'
string
'
)
{
try
{
const
parsed
=
JSON
.
parse
(
obj
[
key
]);
if
(
parsed
&&
typeof
parsed
===
'
object
'
)
{
obj
[
key
]
=
parsed
;
}
}
catch
(
error
)
{
continue
;
}
}
}
// Flatten the object
for
(
const
key
of
Object
.
keys
(
obj
))
{
if
(
typeof
obj
[
key
]
===
'
object
'
&&
obj
[
key
]
!==
null
)
{
const
nested
=
extraNetworksFlattenMetadata
(
obj
[
key
]);
for
(
const
nestedKey
of
Object
.
keys
(
nested
))
{
result
[
`
${
key
}
/
${
nestedKey
}
`
]
=
nested
[
nestedKey
];
}
}
else
{
result
[
key
]
=
obj
[
key
];
}
}
// Special case for handling modelspec keys
for
(
const
key
of
Object
.
keys
(
result
))
{
if
(
key
.
startsWith
(
"
modelspec.
"
))
{
result
[
key
.
replaceAll
(
"
.
"
,
"
/
"
)]
=
result
[
key
];
delete
result
[
key
];
}
}
// Add empty keys to designate hierarchy
for
(
const
key
of
Object
.
keys
(
result
))
{
const
parts
=
key
.
split
(
"
/
"
);
for
(
let
i
=
1
;
i
<
parts
.
length
;
i
++
)
{
const
parent
=
parts
.
slice
(
0
,
i
).
join
(
"
/
"
);
if
(
!
result
[
parent
])
{
result
[
parent
]
=
""
;
}
}
}
return
result
;
}
function
extraNetworksShowMetadata
(
text
)
{
function
extraNetworksShowMetadata
(
text
)
{
try
{
let
parsed
=
JSON
.
parse
(
text
);
if
(
parsed
&&
typeof
parsed
===
'
object
'
)
{
parsed
=
extraNetworksFlattenMetadata
(
parsed
);
const
table
=
createVisualizationTable
(
parsed
,
0
);
popup
(
table
);
return
;
}
}
catch
(
error
)
{
console
.
eror
(
error
);
}
var
elem
=
document
.
createElement
(
'
pre
'
);
var
elem
=
document
.
createElement
(
'
pre
'
);
elem
.
classList
.
add
(
'
popup-metadata
'
);
elem
.
classList
.
add
(
'
popup-metadata
'
);
elem
.
textContent
=
text
;
elem
.
textContent
=
text
;
popup
(
elem
);
popup
(
elem
);
return
;
}
}
function
requestGet
(
url
,
data
,
handler
,
errorHandler
)
{
function
requestGet
(
url
,
data
,
handler
,
errorHandler
)
{
...
...
javascript/profilerVisualization.js
View file @
ecd5fa9c
...
@@ -33,120 +33,141 @@ function createRow(table, cellName, items) {
...
@@ -33,120 +33,141 @@ function createRow(table, cellName, items) {
return
res
;
return
res
;
}
}
function
showProfile
(
path
,
cutoff
=
0.05
)
{
function
createVisualizationTable
(
data
,
cutoff
=
0
,
sort
=
""
)
{
requestGet
(
path
,
{},
function
(
data
)
{
var
table
=
document
.
createElement
(
'
table
'
);
var
table
=
document
.
createElement
(
'
table
'
)
;
table
.
className
=
'
popup-table
'
;
table
.
className
=
'
popup-table
'
;
var
keys
=
Object
.
keys
(
data
);
data
.
records
[
'
total
'
]
=
data
.
total
;
if
(
sort
===
"
number
"
)
{
var
keys
=
Object
.
keys
(
data
.
records
)
.
sort
(
function
(
a
,
b
)
{
keys
=
keys
.
sort
(
function
(
a
,
b
)
{
return
data
.
records
[
b
]
-
data
.
records
[
a
];
return
data
[
b
]
-
data
[
a
];
});
});
var
items
=
keys
.
map
(
function
(
x
)
{
}
else
{
return
{
key
:
x
,
parts
:
x
.
split
(
'
/
'
),
time
:
data
.
records
[
x
]};
keys
=
keys
.
sort
();
}
var
items
=
keys
.
map
(
function
(
x
)
{
return
{
key
:
x
,
parts
:
x
.
split
(
'
/
'
),
value
:
data
[
x
]};
});
var
maxLength
=
items
.
reduce
(
function
(
a
,
b
)
{
return
Math
.
max
(
a
,
b
.
parts
.
length
);
},
0
);
var
cols
=
createRow
(
table
,
'
th
'
,
[
cutoff
===
0
?
'
key
'
:
'
record
'
,
cutoff
===
0
?
'
value
'
:
'
seconds
'
]
);
cols
[
0
].
colSpan
=
maxLength
;
function
arraysEqual
(
a
,
b
)
{
return
!
(
a
<
b
||
b
<
a
);
}
var
addLevel
=
function
(
level
,
parent
,
hide
)
{
var
matching
=
items
.
filter
(
function
(
x
)
{
return
x
.
parts
[
level
]
&&
!
x
.
parts
[
level
+
1
]
&&
arraysEqual
(
x
.
parts
.
slice
(
0
,
level
),
parent
);
});
});
var
maxLength
=
items
.
reduce
(
function
(
a
,
b
)
{
if
(
sort
===
"
number
"
)
{
return
Math
.
max
(
a
,
b
.
parts
.
length
);
matching
=
matching
.
sort
(
function
(
a
,
b
)
{
},
0
);
return
b
.
value
-
a
.
value
;
});
var
cols
=
createRow
(
table
,
'
th
'
,
[
'
record
'
,
'
seconds
'
]);
}
else
{
cols
[
0
].
colSpan
=
maxLength
;
matching
=
matching
.
sort
();
function
arraysEqual
(
a
,
b
)
{
return
!
(
a
<
b
||
b
<
a
);
}
}
var
othersTime
=
0
;
var
othersList
=
[];
var
othersRows
=
[];
var
childrenRows
=
[];
matching
.
forEach
(
function
(
x
)
{
var
visible
=
(
cutoff
===
0
&&
!
hide
)
||
(
x
.
value
>=
cutoff
&&
!
hide
);
var
cells
=
[];
for
(
var
i
=
0
;
i
<
maxLength
;
i
++
)
{
cells
.
push
(
x
.
parts
[
i
]);
}
cells
.
push
(
cutoff
===
0
?
x
.
value
:
x
.
value
.
toFixed
(
3
));
var
cols
=
createRow
(
table
,
'
td
'
,
cells
);
for
(
i
=
0
;
i
<
level
;
i
++
)
{
cols
[
i
].
className
=
'
muted
'
;
}
var
addLevel
=
function
(
level
,
parent
,
hide
)
{
var
tr
=
cols
[
0
].
parentNode
;
var
matching
=
items
.
filter
(
function
(
x
)
{
if
(
!
visible
)
{
return
x
.
parts
[
level
]
&&
!
x
.
parts
[
level
+
1
]
&&
arraysEqual
(
x
.
parts
.
slice
(
0
,
level
),
parent
);
tr
.
classList
.
add
(
"
hidden
"
);
});
}
var
sorted
=
matching
.
sort
(
function
(
a
,
b
)
{
return
b
.
time
-
a
.
time
;
});
var
othersTime
=
0
;
var
othersList
=
[];
var
othersRows
=
[];
var
childrenRows
=
[];
sorted
.
forEach
(
function
(
x
)
{
var
visible
=
x
.
time
>=
cutoff
&&
!
hide
;
var
cells
=
[];
for
(
var
i
=
0
;
i
<
maxLength
;
i
++
)
{
cells
.
push
(
x
.
parts
[
i
]);
}
cells
.
push
(
x
.
time
.
toFixed
(
3
));
var
cols
=
createRow
(
table
,
'
td
'
,
cells
);
for
(
i
=
0
;
i
<
level
;
i
++
)
{
cols
[
i
].
className
=
'
muted
'
;
}
var
tr
=
cols
[
0
].
parentNode
;
if
(
!
visible
)
{
tr
.
classList
.
add
(
"
hidden
"
);
}
if
(
x
.
time
>=
cutoff
)
{
childrenRows
.
push
(
tr
);
}
else
{
othersTime
+=
x
.
time
;
othersList
.
push
(
x
.
parts
[
level
]);
othersRows
.
push
(
tr
);
}
var
children
=
addLevel
(
level
+
1
,
parent
.
concat
([
x
.
parts
[
level
]]),
true
);
if
(
children
.
length
>
0
)
{
var
cell
=
cols
[
level
];
var
onclick
=
function
()
{
cell
.
classList
.
remove
(
"
link
"
);
cell
.
removeEventListener
(
"
click
"
,
onclick
);
children
.
forEach
(
function
(
x
)
{
x
.
classList
.
remove
(
"
hidden
"
);
});
};
cell
.
classList
.
add
(
"
link
"
);
cell
.
addEventListener
(
"
click
"
,
onclick
);
}
});
if
(
othersTime
>
0
)
{
if
(
cutoff
===
0
||
x
.
value
>=
cutoff
)
{
var
cells
=
[];
childrenRows
.
push
(
tr
);
for
(
var
i
=
0
;
i
<
maxLength
;
i
++
)
{
}
else
{
cells
.
push
(
parent
[
i
]);
othersTime
+=
x
.
value
;
}
othersList
.
push
(
x
.
parts
[
level
]);
cells
.
push
(
othersTime
.
toFixed
(
3
));
othersRows
.
push
(
tr
);
cells
[
level
]
=
'
others
'
;
}
var
cols
=
createRow
(
table
,
'
td
'
,
cells
);
for
(
i
=
0
;
i
<
level
;
i
++
)
{
cols
[
i
].
className
=
'
muted
'
;
}
var
children
=
addLevel
(
level
+
1
,
parent
.
concat
([
x
.
parts
[
level
]]),
true
);
if
(
children
.
length
>
0
)
{
var
cell
=
cols
[
level
];
var
cell
=
cols
[
level
];
var
tr
=
cell
.
parentNode
;
var
onclick
=
function
()
{
var
onclick
=
function
()
{
tr
.
classList
.
add
(
"
hidden
"
);
cell
.
classList
.
remove
(
"
link
"
);
cell
.
classList
.
remove
(
"
link
"
);
cell
.
removeEventListener
(
"
click
"
,
onclick
);
cell
.
removeEventListener
(
"
click
"
,
onclick
);
othersRows
.
forEach
(
function
(
x
)
{
children
.
forEach
(
function
(
x
)
{
x
.
classList
.
remove
(
"
hidden
"
);
x
.
classList
.
remove
(
"
hidden
"
);
});
});
};
};
cell
.
title
=
othersList
.
join
(
"
,
"
);
cell
.
classList
.
add
(
"
link
"
);
cell
.
classList
.
add
(
"
link
"
);
cell
.
addEventListener
(
"
click
"
,
onclick
);
cell
.
addEventListener
(
"
click
"
,
onclick
);
}
});
if
(
hide
)
{
if
(
othersTime
>
0
)
{
tr
.
classList
.
add
(
"
hidden
"
);
var
cells
=
[];
}
for
(
var
i
=
0
;
i
<
maxLength
;
i
++
)
{
cells
.
push
(
parent
[
i
]);
}
cells
.
push
(
othersTime
.
toFixed
(
3
));
cells
[
level
]
=
'
others
'
;
var
cols
=
createRow
(
table
,
'
td
'
,
cells
);
for
(
i
=
0
;
i
<
level
;
i
++
)
{
cols
[
i
].
className
=
'
muted
'
;
}
childrenRows
.
push
(
tr
);
var
cell
=
cols
[
level
];
var
tr
=
cell
.
parentNode
;
var
onclick
=
function
()
{
tr
.
classList
.
add
(
"
hidden
"
);
cell
.
classList
.
remove
(
"
link
"
);
cell
.
removeEventListener
(
"
click
"
,
onclick
);
othersRows
.
forEach
(
function
(
x
)
{
x
.
classList
.
remove
(
"
hidden
"
);
});
};
cell
.
title
=
othersList
.
join
(
"
,
"
);
cell
.
classList
.
add
(
"
link
"
);
cell
.
addEventListener
(
"
click
"
,
onclick
);
if
(
hide
)
{
tr
.
classList
.
add
(
"
hidden
"
);
}
}
return
childrenRows
;
childrenRows
.
push
(
tr
);
};
}
return
childrenRows
;
};
addLevel
(
0
,
[]);
addLevel
(
0
,
[]);
return
table
;
}
function
showProfile
(
path
,
cutoff
=
0.05
)
{
requestGet
(
path
,
{},
function
(
data
)
{
data
.
records
[
'
total
'
]
=
data
.
total
;
const
table
=
createVisualizationTable
(
data
.
records
,
cutoff
,
"
number
"
);
popup
(
table
);
popup
(
table
);
});
});
}
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment