| 203 | self._logged_decode_events += 1 |
| 204 | |
| 205 | def _log_timing(self) -> None: |
| 206 | if self._num_submitted == 0: |
| 207 | return |
| 208 | if not self.enabled: |
| 209 | logger.info( |
| 210 | "[AsyncVAEChunkDecoder] sync VAE decode: chunks={}, total={:.2f} ms, avg={:.2f} ms", |
| 211 | self._num_submitted, |
| 212 | self._sync_decode_ms, |
| 213 | self._sync_decode_ms / max(self._num_submitted, 1), |
| 214 | ) |
| 215 | return |
| 216 | |
| 217 | decode_ms = 0.0 |
| 218 | for start, end in self._decode_events: |
| 219 | decode_ms += start.elapsed_time(end) |
| 220 | exposed_ms = self._submit_wait_ms + self._finish_wait_ms |
| 221 | overlapped_ms = max(decode_ms - exposed_ms, 0.0) |
| 222 | overlap_ratio = overlapped_ms / decode_ms if decode_ms > 0 else 0.0 |
| 223 | logger.info( |
| 224 | "[AsyncVAEChunkDecoder] async VAE decode: chunks={}, gpu_decode={:.2f} ms, submit_wait={:.2f} ms, finish_wait={:.2f} ms, exposed={:.2f} ms, overlapped={:.2f} ms ({:.1%})", |
| 225 | self._num_submitted, |
| 226 | decode_ms, |
| 227 | self._submit_wait_ms, |
| 228 | self._finish_wait_ms, |
| 229 | exposed_ms, |
| 230 | overlapped_ms, |
| 231 | overlap_ratio, |
| 232 | ) |