195 c10::cuda::current_device()
197 c10::hip::current_device()
203 std::ostringstream os;
205#if defined(CUDA_VERSION) || defined(HIP_VERSION)
207 auto _format_size = [](int64_t bytes) -> std::string {
211 constexpr std::array<std::string_view, 6> prefixes{
212 "B",
"KiB",
"MiB",
"GiB",
"TiB",
"PiB"};
213 int64_t n = std::floor(std::max(0.0, std::log2(
static_cast<double>(bytes) /
214 static_cast<double>(768))) /
215 static_cast<double>(10));
217 return std::to_string((int64_t)(bytes / std::pow(1024, n))) +
" " +
218 std::string(prefixes[n]);
221#if TORCH_VERSION_MAJOR > 2 || \
222 (TORCH_VERSION_MAJOR == 2 && TORCH_VERSION_MINOR > 4)
223 using namespace c10::CachingDeviceAllocator;
227 using namespace c10::cuda::CUDACachingAllocator;
229 using namespace c10::hip::HIPCachingAllocator;
232 DeviceStats deviceStats = getDeviceStats(device);
234 os <<
"|====================================================================="
237 <<
"| LibTorch CUDA memory summary, device ID "
239 <<
"| LibTorch ROCm memory summary, device ID "
241 << std::setw(18) << std::left << static_cast<int>(device) <<
"|\n"
242 <<
"|---------------------------------------------------------------------"
249 << std::setw(13) << std::left << deviceStats.num_ooms
251 <<
"| cudaMalloc retries: "
253 <<
"| hipMalloc retries: "
255 << std::setw(10) << std::left << deviceStats.num_alloc_retries <<
"|\n"
256 <<
"|====================================================================="
258 <<
"| Metric | Cur Usage | Peak Usage | Tot Alloc | Tot "
260 <<
"|---------------------------------------------------------------------"
262 <<
"| Allocated memory | " << std::setw(10) << std::right
265 .allocated_bytes[
static_cast<std::size_t
>(StatType::AGGREGATE)]
267 <<
" | " << std::setw(10) << std::right
270 .allocated_bytes[
static_cast<std::size_t
>(StatType::AGGREGATE)]
272 <<
" | " << std::setw(10) << std::right
275 .allocated_bytes[
static_cast<std::size_t
>(StatType::AGGREGATE)]
277 <<
" | " << std::setw(10) << std::right
280 .allocated_bytes[
static_cast<std::size_t
>(StatType::AGGREGATE)]
283 <<
"| from large pool | " << std::setw(10) << std::right
286 .allocated_bytes[
static_cast<std::size_t
>(StatType::LARGE_POOL)]
288 <<
" | " << std::setw(10) << std::right
291 .allocated_bytes[
static_cast<std::size_t
>(StatType::LARGE_POOL)]
293 <<
" | " << std::setw(10) << std::right
296 .allocated_bytes[
static_cast<std::size_t
>(StatType::LARGE_POOL)]
298 <<
" | " << std::setw(10) << std::right
301 .allocated_bytes[
static_cast<std::size_t
>(StatType::LARGE_POOL)]
304 <<
"| from small pool | " << std::setw(10) << std::right
307 .allocated_bytes[
static_cast<std::size_t
>(StatType::SMALL_POOL)]
309 <<
" | " << std::setw(10) << std::right
312 .allocated_bytes[
static_cast<std::size_t
>(StatType::SMALL_POOL)]
314 <<
" | " << std::setw(10) << std::right
317 .allocated_bytes[
static_cast<std::size_t
>(StatType::SMALL_POOL)]
319 <<
" | " << std::setw(10) << std::right
322 .allocated_bytes[
static_cast<std::size_t
>(StatType::SMALL_POOL)]
325 <<
"|---------------------------------------------------------------------"
327 <<
"| Active memory | " << std::setw(10) << std::right
330 .active_bytes[
static_cast<std::size_t
>(StatType::AGGREGATE)]
332 <<
" | " << std::setw(10) << std::right
335 .active_bytes[
static_cast<std::size_t
>(StatType::AGGREGATE)]
337 <<
" | " << std::setw(10) << std::right
340 .active_bytes[
static_cast<std::size_t
>(StatType::AGGREGATE)]
342 <<
" | " << std::setw(10) << std::right
345 .active_bytes[
static_cast<std::size_t
>(StatType::AGGREGATE)]
348 <<
"| from large pool | " << std::setw(10) << std::right
351 .active_bytes[
static_cast<std::size_t
>(StatType::LARGE_POOL)]
353 <<
" | " << std::setw(10) << std::right
356 .active_bytes[
static_cast<std::size_t
>(StatType::LARGE_POOL)]
358 <<
" | " << std::setw(10) << std::right
361 .active_bytes[
static_cast<std::size_t
>(StatType::LARGE_POOL)]
363 <<
" | " << std::setw(10) << std::right
366 .active_bytes[
static_cast<std::size_t
>(StatType::LARGE_POOL)]
369 <<
"| from small pool | " << std::setw(10) << std::right
372 .active_bytes[
static_cast<std::size_t
>(StatType::SMALL_POOL)]
374 <<
" | " << std::setw(10) << std::right
377 .active_bytes[
static_cast<std::size_t
>(StatType::SMALL_POOL)]
379 <<
" | " << std::setw(10) << std::right
382 .active_bytes[
static_cast<std::size_t
>(StatType::SMALL_POOL)]
384 <<
" | " << std::setw(10) << std::right
387 .active_bytes[
static_cast<std::size_t
>(StatType::SMALL_POOL)]
390 <<
"|---------------------------------------------------------------------"
392 <<
"| Requested memory | " << std::setw(10) << std::right
395 .requested_bytes[
static_cast<std::size_t
>(StatType::AGGREGATE)]
397 <<
" | " << std::setw(10) << std::right
400 .requested_bytes[
static_cast<std::size_t
>(StatType::AGGREGATE)]
402 <<
" | " << std::setw(10) << std::right
405 .requested_bytes[
static_cast<std::size_t
>(StatType::AGGREGATE)]
407 <<
" | " << std::setw(10) << std::right
410 .requested_bytes[
static_cast<std::size_t
>(StatType::AGGREGATE)]
413 <<
"| from large pool | " << std::setw(10) << std::right
416 .requested_bytes[
static_cast<std::size_t
>(StatType::LARGE_POOL)]
418 <<
" | " << std::setw(10) << std::right
421 .requested_bytes[
static_cast<std::size_t
>(StatType::LARGE_POOL)]
423 <<
" | " << std::setw(10) << std::right
426 .requested_bytes[
static_cast<std::size_t
>(StatType::LARGE_POOL)]
428 <<
" | " << std::setw(10) << std::right
431 .requested_bytes[
static_cast<std::size_t
>(StatType::LARGE_POOL)]
434 <<
"| from small pool | " << std::setw(10) << std::right
437 .requested_bytes[
static_cast<std::size_t
>(StatType::SMALL_POOL)]
439 <<
" | " << std::setw(10) << std::right
442 .requested_bytes[
static_cast<std::size_t
>(StatType::SMALL_POOL)]
444 <<
" | " << std::setw(10) << std::right
447 .requested_bytes[
static_cast<std::size_t
>(StatType::SMALL_POOL)]
449 <<
" | " << std::setw(10) << std::right
452 .requested_bytes[
static_cast<std::size_t
>(StatType::SMALL_POOL)]
455 <<
"|---------------------------------------------------------------------"
457 <<
"| GPU reserved memory | " << std::setw(10) << std::right
460 .reserved_bytes[
static_cast<std::size_t
>(StatType::AGGREGATE)]
462 <<
" | " << std::setw(10) << std::right
465 .reserved_bytes[
static_cast<std::size_t
>(StatType::AGGREGATE)]
467 <<
" | " << std::setw(10) << std::right
470 .reserved_bytes[
static_cast<std::size_t
>(StatType::AGGREGATE)]
472 <<
" | " << std::setw(10) << std::right
475 .reserved_bytes[
static_cast<std::size_t
>(StatType::AGGREGATE)]
478 <<
"| from large pool | " << std::setw(10) << std::right
481 .reserved_bytes[
static_cast<std::size_t
>(StatType::LARGE_POOL)]
483 <<
" | " << std::setw(10) << std::right
486 .reserved_bytes[
static_cast<std::size_t
>(StatType::LARGE_POOL)]
488 <<
" | " << std::setw(10) << std::right
491 .reserved_bytes[
static_cast<std::size_t
>(StatType::LARGE_POOL)]
493 <<
" | " << std::setw(10) << std::right
496 .reserved_bytes[
static_cast<std::size_t
>(StatType::LARGE_POOL)]
499 <<
"| from small pool | " << std::setw(10) << std::right
502 .reserved_bytes[
static_cast<std::size_t
>(StatType::SMALL_POOL)]
504 <<
" | " << std::setw(10) << std::right
507 .reserved_bytes[
static_cast<std::size_t
>(StatType::SMALL_POOL)]
509 <<
" | " << std::setw(10) << std::right
512 .reserved_bytes[
static_cast<std::size_t
>(StatType::SMALL_POOL)]
514 <<
" | " << std::setw(10) << std::right
517 .reserved_bytes[
static_cast<std::size_t
>(StatType::SMALL_POOL)]
520 <<
"|---------------------------------------------------------------------"
522 <<
"| Non-releasable memory | " << std::setw(10) << std::right
523 << _format_size(deviceStats
524 .inactive_split_bytes[
static_cast<std::size_t
>(
525 StatType::AGGREGATE)]
527 <<
" | " << std::setw(10) << std::right
528 << _format_size(deviceStats
529 .inactive_split_bytes[
static_cast<std::size_t
>(
530 StatType::AGGREGATE)]
532 <<
" | " << std::setw(10) << std::right
533 << _format_size(deviceStats
534 .inactive_split_bytes[
static_cast<std::size_t
>(
535 StatType::AGGREGATE)]
537 <<
" | " << std::setw(10) << std::right
538 << _format_size(deviceStats
539 .inactive_split_bytes[
static_cast<std::size_t
>(
540 StatType::AGGREGATE)]
543 <<
"| from large pool | " << std::setw(10) << std::right
544 << _format_size(deviceStats
545 .inactive_split_bytes[
static_cast<std::size_t
>(
546 StatType::LARGE_POOL)]
548 <<
" | " << std::setw(10) << std::right
549 << _format_size(deviceStats
550 .inactive_split_bytes[
static_cast<std::size_t
>(
551 StatType::LARGE_POOL)]
553 <<
" | " << std::setw(10) << std::right
554 << _format_size(deviceStats
555 .inactive_split_bytes[
static_cast<std::size_t
>(
556 StatType::LARGE_POOL)]
558 <<
" | " << std::setw(10) << std::right
559 << _format_size(deviceStats
560 .inactive_split_bytes[
static_cast<std::size_t
>(
561 StatType::LARGE_POOL)]
564 <<
"| from small pool | " << std::setw(10) << std::right
565 << _format_size(deviceStats
566 .inactive_split_bytes[
static_cast<std::size_t
>(
567 StatType::SMALL_POOL)]
569 <<
" | " << std::setw(10) << std::right
570 << _format_size(deviceStats
571 .inactive_split_bytes[
static_cast<std::size_t
>(
572 StatType::SMALL_POOL)]
574 <<
" | " << std::setw(10) << std::right
575 << _format_size(deviceStats
576 .inactive_split_bytes[
static_cast<std::size_t
>(
577 StatType::SMALL_POOL)]
579 <<
" | " << std::setw(10) << std::right
580 << _format_size(deviceStats
581 .inactive_split_bytes[
static_cast<std::size_t
>(
582 StatType::SMALL_POOL)]
585 <<
"|---------------------------------------------------------------------"
587 <<
"| Allocations | " << std::setw(10) << std::right
588 << deviceStats.allocation[
static_cast<std::size_t
>(StatType::AGGREGATE)]
590 <<
" | " << std::setw(10) << std::right
591 << deviceStats.allocation[
static_cast<std::size_t
>(StatType::AGGREGATE)]
593 <<
" | " << std::setw(10) << std::right
594 << deviceStats.allocation[
static_cast<std::size_t
>(StatType::AGGREGATE)]
596 <<
" | " << std::setw(10) << std::right
597 << deviceStats.allocation[
static_cast<std::size_t
>(StatType::AGGREGATE)]
600 <<
"|---------------------------------------------------------------------"
602 <<
"| from large pool | " << std::setw(10) << std::right
603 << deviceStats.allocation[
static_cast<std::size_t
>(StatType::LARGE_POOL)]
605 <<
" | " << std::setw(10) << std::right
606 << deviceStats.allocation[
static_cast<std::size_t
>(StatType::LARGE_POOL)]
608 <<
" | " << std::setw(10) << std::right
609 << deviceStats.allocation[
static_cast<std::size_t
>(StatType::LARGE_POOL)]
611 <<
" | " << std::setw(10) << std::right
612 << deviceStats.allocation[
static_cast<std::size_t
>(StatType::LARGE_POOL)]
615 <<
"|---------------------------------------------------------------------"
617 <<
"| from small pool | " << std::setw(10) << std::right
618 << deviceStats.allocation[
static_cast<std::size_t
>(StatType::SMALL_POOL)]
620 <<
" | " << std::setw(10) << std::right
621 << deviceStats.allocation[
static_cast<std::size_t
>(StatType::SMALL_POOL)]
623 <<
" | " << std::setw(10) << std::right
624 << deviceStats.allocation[
static_cast<std::size_t
>(StatType::SMALL_POOL)]
626 <<
" | " << std::setw(10) << std::right
627 << deviceStats.allocation[
static_cast<std::size_t
>(StatType::SMALL_POOL)]
630 <<
"|---------------------------------------------------------------------"
632 <<
"| Active allocs | " << std::setw(10) << std::right
633 << deviceStats.active[
static_cast<std::size_t
>(StatType::AGGREGATE)]
635 <<
" | " << std::setw(10) << std::right
636 << deviceStats.active[
static_cast<std::size_t
>(StatType::AGGREGATE)].peak
637 <<
" | " << std::setw(10) << std::right
638 << deviceStats.active[
static_cast<std::size_t
>(StatType::AGGREGATE)]
640 <<
" | " << std::setw(10) << std::right
641 << deviceStats.active[
static_cast<std::size_t
>(StatType::AGGREGATE)].freed
643 <<
"|---------------------------------------------------------------------"
645 <<
"| from large pool | " << std::setw(10) << std::right
646 << deviceStats.active[
static_cast<std::size_t
>(StatType::LARGE_POOL)]
648 <<
" | " << std::setw(10) << std::right
649 << deviceStats.active[
static_cast<std::size_t
>(StatType::LARGE_POOL)].peak
650 <<
" | " << std::setw(10) << std::right
651 << deviceStats.active[
static_cast<std::size_t
>(StatType::LARGE_POOL)]
653 <<
" | " << std::setw(10) << std::right
654 << deviceStats.active[
static_cast<std::size_t
>(StatType::LARGE_POOL)].freed
656 <<
"|---------------------------------------------------------------------"
658 <<
"| from small pool | " << std::setw(10) << std::right
659 << deviceStats.active[
static_cast<std::size_t
>(StatType::SMALL_POOL)]
661 <<
" | " << std::setw(10) << std::right
662 << deviceStats.active[
static_cast<std::size_t
>(StatType::SMALL_POOL)].peak
663 <<
" | " << std::setw(10) << std::right
664 << deviceStats.active[
static_cast<std::size_t
>(StatType::SMALL_POOL)]
666 <<
" | " << std::setw(10) << std::right
667 << deviceStats.active[
static_cast<std::size_t
>(StatType::SMALL_POOL)].freed
669 <<
"|---------------------------------------------------------------------"
671 <<
"| GPU reserved segments | " << std::setw(10) << std::right
672 << deviceStats.segment[
static_cast<std::size_t
>(StatType::AGGREGATE)]
674 <<
" | " << std::setw(10) << std::right
675 << deviceStats.segment[
static_cast<std::size_t
>(StatType::AGGREGATE)].peak
676 <<
" | " << std::setw(10) << std::right
677 << deviceStats.segment[
static_cast<std::size_t
>(StatType::AGGREGATE)]
679 <<
" | " << std::setw(10) << std::right
680 << deviceStats.segment[
static_cast<std::size_t
>(StatType::AGGREGATE)].freed
682 <<
"|---------------------------------------------------------------------"
684 <<
"| from large pool | " << std::setw(10) << std::right
685 << deviceStats.segment[
static_cast<std::size_t
>(StatType::LARGE_POOL)]
687 <<
" | " << std::setw(10) << std::right
688 << deviceStats.segment[
static_cast<std::size_t
>(StatType::LARGE_POOL)].peak
689 <<
" | " << std::setw(10) << std::right
690 << deviceStats.segment[
static_cast<std::size_t
>(StatType::LARGE_POOL)]
692 <<
" | " << std::setw(10) << std::right
693 << deviceStats.segment[
static_cast<std::size_t
>(StatType::LARGE_POOL)]
696 <<
"|---------------------------------------------------------------------"
698 <<
"| from small pool | " << std::setw(10) << std::right
699 << deviceStats.segment[
static_cast<std::size_t
>(StatType::SMALL_POOL)]
701 <<
" | " << std::setw(10) << std::right
702 << deviceStats.segment[
static_cast<std::size_t
>(StatType::SMALL_POOL)].peak
703 <<
" | " << std::setw(10) << std::right
704 << deviceStats.segment[
static_cast<std::size_t
>(StatType::SMALL_POOL)]
706 <<
" | " << std::setw(10) << std::right
707 << deviceStats.segment[
static_cast<std::size_t
>(StatType::SMALL_POOL)]
710 <<
"|---------------------------------------------------------------------"
712 <<
"| Non-releasable allocs | " << std::setw(10) << std::right
714 .inactive_split[
static_cast<std::size_t
>(StatType::AGGREGATE)]
716 <<
" | " << std::setw(10) << std::right
718 .inactive_split[
static_cast<std::size_t
>(StatType::AGGREGATE)]
720 <<
" | " << std::setw(10) << std::right
722 .inactive_split[
static_cast<std::size_t
>(StatType::AGGREGATE)]
724 <<
" | " << std::setw(10) << std::right
726 .inactive_split[
static_cast<std::size_t
>(StatType::AGGREGATE)]
729 <<
"|---------------------------------------------------------------------"
731 <<
"| from large pool | " << std::setw(10) << std::right
733 .inactive_split[
static_cast<std::size_t
>(StatType::LARGE_POOL)]
735 <<
" | " << std::setw(10) << std::right
737 .inactive_split[
static_cast<std::size_t
>(StatType::LARGE_POOL)]
739 <<
" | " << std::setw(10) << std::right
741 .inactive_split[
static_cast<std::size_t
>(StatType::LARGE_POOL)]
743 <<
" | " << std::setw(10) << std::right
745 .inactive_split[
static_cast<std::size_t
>(StatType::LARGE_POOL)]
748 <<
"|---------------------------------------------------------------------"
750 <<
"| from small pool | " << std::setw(10) << std::right
752 .inactive_split[
static_cast<std::size_t
>(StatType::SMALL_POOL)]
754 <<
" | " << std::setw(10) << std::right
756 .inactive_split[
static_cast<std::size_t
>(StatType::SMALL_POOL)]
758 <<
" | " << std::setw(10) << std::right
760 .inactive_split[
static_cast<std::size_t
>(StatType::SMALL_POOL)]
762 <<
" | " << std::setw(10) << std::right
764 .inactive_split[
static_cast<std::size_t
>(StatType::SMALL_POOL)]
767 <<
"|---------------------------------------------------------------------"
769 <<
"| Oversize allocations | " << std::setw(10) << std::right
770 << deviceStats.oversize_allocations.current <<
" | " << std::setw(10)
771 << std::right << deviceStats.oversize_allocations.peak <<
" | "
772 << std::setw(10) << std::right
773 << deviceStats.oversize_allocations.allocated <<
" | " << std::setw(10)
774 << std::right << deviceStats.oversize_allocations.freed <<
" |\n"
775 <<
"|---------------------------------------------------------------------"
777 <<
"| Oversize GPU segments | " << std::setw(10) << std::right
778 << deviceStats.oversize_segments.current <<
" | " << std::setw(10)
779 << std::right << deviceStats.oversize_segments.peak <<
" | "
780 << std::setw(10) << std::right << deviceStats.oversize_segments.allocated
781 <<
" | " << std::setw(10) << std::right
782 << deviceStats.oversize_segments.freed <<
" |\n"
783 <<
"|====================================================================="
786 os <<
"Memory summary is only available for CUDA/HIP devices";