mirror of
https://github.com/pytorch/pytorch.git
synced 2025-10-20 21:14:14 +08:00
torch.compile: populate compiler_config (#165581)
Summary: This starts writing the compiler_config metadata into logger Test Plan: Modified existing test case to make sure this is not null. (Also eyeballed what we're logging tomake sure it's reasonable Reviewed By: masnesral Differential Revision: D84014636 Pull Request resolved: https://github.com/pytorch/pytorch/pull/165581 Approved by: https://github.com/masnesral
This commit is contained in:
committed by
PyTorch MergeBot
parent
9a71d96256
commit
ca5b7f8ded
@ -8,6 +8,7 @@ from unittest import mock
|
||||
import torch
|
||||
import torch._dynamo.config as dynamo_config
|
||||
import torch._inductor.config as inductor_config
|
||||
import torch.compiler.config as compiler_config
|
||||
from torch._dynamo import utils
|
||||
from torch._inductor.test_case import TestCase
|
||||
|
||||
@ -497,6 +498,7 @@ class TestDynamoTimed(TestCase):
|
||||
e.co_filename = None
|
||||
e.co_firstlineno = None
|
||||
e.inductor_config = None
|
||||
e.compiler_config = None
|
||||
e.cuda_version = None
|
||||
e.triton_version = None
|
||||
e.python_version = None
|
||||
@ -530,6 +532,7 @@ class TestDynamoTimed(TestCase):
|
||||
'code_gen_time_s': 0.0,
|
||||
'compile_id': '1/0',
|
||||
'compile_time_autotune_time_us': None,
|
||||
'compiler_config': None,
|
||||
'compliant_custom_ops': set(),
|
||||
'config_inline_inbuilt_nn_modules': False,
|
||||
'config_suppress_errors': False,
|
||||
@ -616,6 +619,7 @@ class TestDynamoTimed(TestCase):
|
||||
'code_gen_time_s': 0.0,
|
||||
'compile_id': '1/0',
|
||||
'compile_time_autotune_time_us': None,
|
||||
'compiler_config': None,
|
||||
'compliant_custom_ops': set(),
|
||||
'config_inline_inbuilt_nn_modules': False,
|
||||
'config_suppress_errors': False,
|
||||
@ -714,6 +718,7 @@ class TestDynamoTimed(TestCase):
|
||||
'code_gen_time_s': 0.0,
|
||||
'compile_id': '1/0',
|
||||
'compile_time_autotune_time_us': None,
|
||||
'compiler_config': None,
|
||||
'compliant_custom_ops': None,
|
||||
'config_inline_inbuilt_nn_modules': False,
|
||||
'config_suppress_errors': False,
|
||||
@ -800,6 +805,7 @@ class TestDynamoTimed(TestCase):
|
||||
'code_gen_time_s': 0.0,
|
||||
'compile_id': '1/0',
|
||||
'compile_time_autotune_time_us': None,
|
||||
'compiler_config': None,
|
||||
'compliant_custom_ops': None,
|
||||
'config_inline_inbuilt_nn_modules': False,
|
||||
'config_suppress_errors': False,
|
||||
@ -875,6 +881,25 @@ class TestDynamoTimed(TestCase):
|
||||
'triton_version': None}""", # noqa: B950
|
||||
)
|
||||
|
||||
@dynamo_config.patch(
|
||||
{
|
||||
"log_compilation_metrics": True,
|
||||
}
|
||||
)
|
||||
@compiler_config.patch({"job_id": "test_job_id"})
|
||||
def test_compiler_config(self):
|
||||
def test1(x):
|
||||
return x * x
|
||||
|
||||
compilation_events = []
|
||||
with mock.patch("torch._dynamo.utils.log_compilation_event") as log_event:
|
||||
torch.compile(test1)(torch.randn(1))
|
||||
compilation_events = [arg[0][0] for arg in log_event.call_args_list]
|
||||
self.assertIn(
|
||||
'"job_id": "test_job_id"',
|
||||
compilation_events[0].compiler_config,
|
||||
)
|
||||
|
||||
@dynamo_config.patch(
|
||||
{
|
||||
"log_compilation_metrics": True,
|
||||
|
@ -1315,6 +1315,7 @@ class CompilationMetrics:
|
||||
config_inline_inbuilt_nn_modules: Optional[bool] = None
|
||||
specialize_float: Optional[bool] = None
|
||||
dynamo_config: Optional[str] = None
|
||||
compiler_config: Optional[str] = None
|
||||
is_forward: Optional[bool] = None
|
||||
num_triton_bundles: Optional[int] = None
|
||||
remote_fx_graph_cache_get_time_ms: Optional[int] = None
|
||||
@ -1555,6 +1556,30 @@ def _get_dynamo_config_for_logging() -> Optional[str]:
|
||||
return json.dumps(config_dict, sort_keys=True)
|
||||
|
||||
|
||||
def _compiler_config_for_logging() -> Optional[str]:
|
||||
def clean_for_json(d: dict[str, Any]) -> dict[str, Any]:
|
||||
blocklist = {
|
||||
"TYPE_CHECKING",
|
||||
}
|
||||
|
||||
return {
|
||||
key: sorted(value) if isinstance(value, set) else value
|
||||
for key, value in d.items()
|
||||
if key not in blocklist
|
||||
}
|
||||
|
||||
if not torch.compiler.config:
|
||||
return None
|
||||
|
||||
try:
|
||||
compiler_config_copy = torch.compiler.config.get_config_copy() # type: ignore[attr-defined]
|
||||
except (TypeError, AttributeError):
|
||||
return "Compiler Config cannot be pickled"
|
||||
|
||||
config_dict = clean_for_json(compiler_config_copy)
|
||||
return json.dumps(config_dict, sort_keys=True)
|
||||
|
||||
|
||||
def _scrubbed_inductor_config_for_logging() -> Optional[str]:
|
||||
"""
|
||||
Method to parse and scrub uninteresting configs from inductor config
|
||||
@ -1642,6 +1667,7 @@ def record_compilation_metrics(
|
||||
"config_suppress_errors": config.suppress_errors,
|
||||
"config_inline_inbuilt_nn_modules": config.inline_inbuilt_nn_modules,
|
||||
"inductor_config": _scrubbed_inductor_config_for_logging(),
|
||||
"compiler_config": _compiler_config_for_logging(),
|
||||
"cuda_version": torch.version.cuda,
|
||||
"triton_version": triton.__version__ if has_triton() else "",
|
||||
"remote_cache_version": remote_cache_version,
|
||||
|
Reference in New Issue
Block a user