Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 14 additions & 17 deletions recipes_source/torch_logs.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,7 @@
==========================================================================================
**Author:** `Michael Lazos <https://github.com/mlazos>`_
"""

import logging

######################################################################
#
# This tutorial introduces the ``TORCH_LOGS`` environment variable, as well as the Python API, and
Expand All @@ -16,8 +14,6 @@
# This tutorial requires PyTorch 2.2.0 or later.
#
#


######################################################################
# Setup
# ~~~~~~~~~~~~~~~~~~~~~
Expand All @@ -29,55 +25,56 @@
# There is also an environment variable ``TORCH_LOGS``, which can be used to
# change logging settings at the command line. The equivalent environment
# variable setting is shown for each example.

import torch

# exit cleanly if we are on a device that doesn't support torch.compile
######################################################################
# Device Compatibility Check
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~
# The following code checks if the device supports torch.compile, which requires
# CUDA compute capability 7.0 or higher.
#
# .. important::
#
# If your device does not meet this requirement, this tutorial will only print
# a skip message and exit. You will NOT see any of the logging output examples
# (Dynamo Tracing, Traced Graph, Fusion Decisions, Output Code) demonstrated
# below. To see the actual logging output, you need a CUDA-capable GPU with
# compute capability 7.0 or higher (e.g., V100, T4, or newer).
#
if torch.cuda.get_device_capability() < (7, 0):
print("Skipping because torch.compile is not supported on this device.")
else:
@torch.compile()
def fn(x, y):
z = x + y
return z + 2


inputs = (torch.ones(2, 2, device="cuda"), torch.zeros(2, 2, device="cuda"))


# print separator and reset dynamo
# between each example
def separator(name):
print(f"==================={name}=========================")
torch._dynamo.reset()


separator("Dynamo Tracing")
# View dynamo tracing
# TORCH_LOGS="+dynamo"
torch._logging.set_logs(dynamo=logging.DEBUG)
fn(*inputs)

separator("Traced Graph")
# View traced graph
# TORCH_LOGS="graph"
torch._logging.set_logs(graph=True)
fn(*inputs)

separator("Fusion Decisions")
# View fusion decisions
# TORCH_LOGS="fusion"
torch._logging.set_logs(fusion=True)
fn(*inputs)

separator("Output Code")
# View output code generated by inductor
# TORCH_LOGS="output_code"
torch._logging.set_logs(output_code=True)
fn(*inputs)

separator("")

######################################################################
# Conclusion
# ~~~~~~~~~~
Expand Down