pytorch / pytorch/pytorch

[torch.compile] BatchNorm1d(momentum=None) training fails under fullgraph=True

Open
#194,504 4 comments 0 reactions 0 assignees View on GitHub
bot-triaged module: dynamic shapes module: norms and normalization oncall: pt2 triaged
Dominant language
Python
Stars
103k
Forks
29.6k
PR merge metrics
PR metrics pending

Description

### 🐛 Describe the bug

The cumulative-moving-average training path of `nn.BatchNorm1d`, selected with `momentum=None`, cannot be captured by `torch.compile(fullgraph=True)`. The failure occurs while converting `num_batches_tracked` to a Python scalar.

This is a fullgraph compile-support issue, not a result mismatch. The default `fullgraph=False` mode runs successfully but emits a graph break at the scalar conversion. The failure occurs with both `aot_eager` and Inductor. It reproduced in 3/3 isolated processes. The same behavior was also reproduced 3/3 on the tested nightly `2.15.0.dev20260821+cu130` (git `cef373b344057d8ed91bcf05d7921b2ca1d0d13c`).

## Reproduction

```python
import torch
from torch import nn

torch.manual_seed(0)
module = nn.BatchNorm1d(4, momentum=None).train()
input = torch.randn(3, 4)

print("eager shape:", module(input).shape)

module = nn.BatchNorm1d(4, momentum=None).train()
compiled = torch.compile(module, backend="inductor", fullgraph=True)
print("compiled shape:", compiled(input).shape)
```

## Actual behavior

Running the script produces:

```text
eager shape: torch.Size([3, 4])
Traceback (most recent call last):
File "/home/tommy_ge/miniconda3/lib/python3.13/site-packages/torch/_dynamo/utils.py", line 4019, in run_node
return node.target(*args, **kwargs) # type: ignore[operator]
~~~~~~~~~~~^^^^^^^^^^^^^^^^^
File "/home/tommy_ge/miniconda3/lib/python3.13/site-packages/torch/nn/functional.py", line 2850, in batch_norm
return torch.batch_norm(
~~~~~~~~~~~~~~~~^
input,
^^^^^^
...<7 lines>...
torch.backends.cudnn.enabled,
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
)
^
File "/home/tommy_ge/miniconda3/lib/python3.13/site-packages/torch/fx/experimental/sym_node.py", line 566, in guard_float
r = self.evaluate()
File "/home/tommy_ge/miniconda3/lib/python3.13/site-packages/torch/fx/experimental/sym_node.py", line 550, in evaluate
return self.shape_env.evaluate_sym_node(self, size_oblivious)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^
File "/home/tommy_ge/miniconda3/lib/python3.13/site-packages/torch/fx/experimental/symbolic_shapes.py", line 7860, in evaluate_sym_node
return self.evaluate_expr(
~~~~~~~~~~~~~~~~~~^
sym_node.expr,
^^^^^^^^^^^^^^
...<3 lines>...
fallback_value=fallback_value,
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
)
^
File "/home/tommy_ge/miniconda3/lib/python3.13/site-packages/torch/fx/experimental/symbolic_shapes.py", line 7956, in evaluate_expr
return self._inner_evaluate_expr(
~~~~~~~~~~~~~~~~~~~~~~~~~^
orig_expr,
^^^^^^^^^^
...<5 lines>...
fallback_value,
^^^^^^^^^^^^^^^
)
^
File "/home/tommy_ge/miniconda3/lib/python3.13/site-packages/torch/fx/experimental/recording.py", line 297, in wrapper
return retlog(fn(*args, **kwargs))
~~^^^^^^^^^^^^^^^^^
File "/home/tommy_ge/miniconda3/lib/python3.13/site-packages/torch/fx/experimental/symbolic_shapes.py", line 7979, in _inner_evaluate_expr
return self._evaluate_expr(
~~~~~~~~~~~~~~~~~~~^
orig_expr,
^^^^^^^^^^
...<4 lines>...
forcing_spec=forcing_spec,
^^^^^^^^^^^^^^^^^^^^^^^^^^
)
^
File "/home/tommy_ge/miniconda3/lib/python3.13/site-packages/torch/fx/experimental/symbolic_shapes.py", line 8212, in _evaluate_expr
raise self._make_data_dependent_error(
...<3 lines>...
)
torch.fx.experimental.symbolic_shapes.GuardOnDataDependentSymNode: Could not guard on data-dependent expression FloatTrueDiv(1.0, ToFloat(u0)) (unhinted: FloatTrueDiv(1.0, ToFloat(u0))). (Size-like symbols: none)

consider using data-dependent friendly APIs such as guard_or_false, guard_or_true and statically_known_true.
Caused by: return F.batch_norm( # nn/modules/batchnorm.py:210 in forward (nn/functional.py:2850 in batch_norm)
For more information, run with TORCH_LOGS="dynamic"
For extended logs when we create symbols, also add TORCHDYNAMO_EXTENDED_DEBUG_CREATE_SYMBOL="u0"
If you suspect the guard was triggered from C++, add TORCHDYNAMO_EXTENDED_DEBUG_CPP=1
For more debugging help, see https://docs.google.com/document/d/1HSuTTVvYH1pTew89Rtpeu84Ht3nQEFTYhAX3Ypa_xJs/edit?usp=sharing

User Stack (most recent call last):
(snipped, see stack below for prefix)
File "/home/tommy_ge/miniconda3/lib/python3.13/site-packages/torch/_dynamo/external_utils.py", line 69, in inner
return fn(*args, **kwargs)
File "/home/tommy_ge/miniconda3/lib/python3.13/site-packages/torch/nn/modules/batchnorm.py", line 210, in forward
return F.batch_norm(

For C++ stack trace, run with TORCHDYNAMO_EXTENDED_DEBUG_CPP=1

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
File "", line 12, in
print("compiled shape:", compiled(input).shape)
~~~~~~~~^^^^^^^
File "/home/tommy_ge/miniconda3/lib/python3.13/site-packages/torch/_dynamo/eval_frame.py", line 473, in __call__
return super().__call__(*args, **kwargs)
~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^
File "/home/tommy_ge/miniconda3/lib/python3.13/site-packages/torch/nn/modules/module.py", line 1778, in _wrapped_call_impl
return self._call_impl(*args, **kwargs)
~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^
File "/home/tommy_ge/miniconda3/lib/python3.13/site-packages/torch/nn/modules/module.py", line 1789, in _call_impl
return forward_call(*args, **kwargs)
File "/home/tommy_ge/miniconda3/lib/python3.13/site-packages/torch/_dynamo/eval_frame.py", line 1047, in compile_wrapper
result = fn(*args, **kwargs)
File "/home/tommy_ge/miniconda3/lib/python3.13/site-packages/torch/_dynamo/convert_frame.py", line 2474, in __call__
result = self._torchdynamo_orig_backend(
frame, cache_entry, self.hooks, frame_state, skip=1
)
File "/home/tommy_ge/miniconda3/lib/python3.13/site-packages/torch/_dynamo/convert_frame.py", line 736, in __call__
result = _compile(
frame.f_code,
...<16 lines>...
convert_frame_box=self._box,
)
File "/home/tommy_ge/miniconda3/lib/python3.13/site-packages/torch/_dynamo/convert_frame.py", line 1961, in _compile
guarded_code, tracer_output = compile_inner(code, one_graph, hooks)
~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/tommy_ge/miniconda3/lib/python3.13/site-packages/torch/_utils_internal.py", line 96, in wrapper_function
return function(*args, **kwargs)
File "/home/tommy_ge/miniconda3/lib/python3.13/site-packages/torch/_dynamo/convert_frame.py", line 1571, in compile_inner
result = _compile_inner(code, one_graph, hooks)
File "/home/tommy_ge/miniconda3/lib/python3.13/site-packages/torch/_dynamo/convert_frame.py", line 1630, in _compile_inner
dynamo_output = compile_frame(
code,
...<11 lines>...
package=package,
)
File "/home/tommy_ge/miniconda3/lib/python3.13/site-packages/torch/_dynamo/convert_frame.py", line 1478, in compile_frame
bytecode, tracer_output = transform_code_object(code, transform)
~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^
File "/home/tommy_ge/miniconda3/lib/python3.13/site-packages/torch/_dynamo/bytecode_transformation.py", line 1626, in transform_code_object
tracer_output = transformations(instructions, code_options)
File "/home/tommy_ge/miniconda3/lib/python3.13/site-packages/torch/_dynamo/convert_frame.py", line 1450, in transform
tracer_output = trace_frame(
code,
...<14 lines>...
package=package,
)
File "/home/tommy_ge/miniconda3/lib/python3.13/site-packages/torch/_dynamo/convert_frame.py", line 343, in _fn
return fn(*args, **kwargs)
File "/home/tommy_ge/miniconda3/lib/python3.13/site-packages/torch/_dynamo/convert_frame.py", line 911, in trace_frame
run_tracer()
~~~~~~~~~~^^
File "/home/tommy_ge/miniconda3/lib/python3.13/site-packages/torch/_dynamo/convert_frame.py", line 892, in run_tracer
tracer.run()
~~~~~~~~~~^^
File "/home/tommy_ge/miniconda3/lib/python3.13/site-packages/torch/_dynamo/symbolic_convert.py", line 1813, in run
while self.step():
~~~~~~~~~^^
File "/home/tommy_ge/miniconda3/lib/python3.13/site-packages/torch/_dynamo/symbolic_convert.py", line 1480, in step
self.dispatch_table[inst.opcode](self, inst)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^
File "/home/tommy_ge/miniconda3/lib/python3.13/site-packages/torch/_dynamo/symbolic_convert.py", line 1017, in wrapper
return inner_fn(self, inst)
File "/home/tommy_ge/miniconda3/lib/python3.13/site-packages/torch/_dynamo/symbolic_convert.py", line 2851, in CALL_FUNCTION_EX
self.call_function(fn, argsvars.items, kwargsvars)
~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/tommy_ge/miniconda3/lib/python3.13/site-packages/torch/_dynamo/symbolic_convert.py", line 1381, in call_function
self.push(fn.call_function(self, args, kwargs)) # type: ignore[arg-type]
~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^
File "/home/tommy_ge/miniconda3/lib/python3.13/site-packages/torch/_dynamo/variables/lazy.py", line 294, in realize_and_forward
return getattr(self.realize(), name)(*args, **kwargs)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^
File "/home/tommy_ge/miniconda3/lib/python3.13/site-packages/torch/_dynamo/variables/nn_module.py", line 1152, in call_function
return variables.UserFunctionVariable(fn, source=source).call_function(
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
tx, [self] + list(args), kwargs
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
)
^
File "/home/tommy_ge/miniconda3/lib/python3.13/site-packages/torch/_dynamo/variables/functions.py", line 810, in call_function
return super().call_function(tx, args, kwargs)
~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^
File "/home/tommy_ge/miniconda3/lib/python3.13/site-packages/torch/_dynamo/variables/functions.py", line 489, in call_function
return tx.inline_user_function_return(self, [*self.self_args(), *args], kwargs) # type: ignore[attr-defined]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/tommy_ge/miniconda3/lib/python3.13/site-packages/torch/_dynamo/symbolic_convert.py", line 1408, in inline_user_function_return
return InliningInstructionTranslator.inline_call(self, fn, args, kwargs)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/tommy_ge/miniconda3/lib/python3.13/site-packages/torch/_dynamo/symbolic_convert.py", line 5241, in inline_call
return tracer.inline_call_()
~~~~~~~~~~~~~~~~~~~^^
File "/home/tommy_ge/miniconda3/lib/python3.13/site-packages/torch/_dynamo/symbolic_convert.py", line 5462, in inline_call_
self.run()
~~~~~~~~^^
File "/home/tommy_ge/miniconda3/lib/python3.13/site-packages/torch/_dynamo/symbolic_convert.py", line 1813, in run
while self.step():
~~~~~~~~~^^
File "/home/tommy_ge/miniconda3/lib/python3.13/site-packages/torch/_dynamo/symbolic_convert.py", line 1480, in step
self.dispatch_table[inst.opcode](self, inst)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^
File "/home/tommy_ge/miniconda3/lib/python3.13/site-packages/torch/_dynamo/symbolic_convert.py", line 1017, in wrapper
return inner_fn(self, inst)
File "/home/tommy_ge/miniconda3/lib/python3.13/site-packages/torch/_dynamo/symbolic_convert.py", line 4171, in CALL
self._call(inst)
~~~~~~~~~~^^^^^^
File "/home/tommy_ge/miniconda3/lib/python3.13/site-packages/torch/_dynamo/symbolic_convert.py", line 4162, in _call
self.call_function(fn, args, kwargs)
~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^
File "/home/tommy_ge/miniconda3/lib/python3.13/site-packages/torch/_dynamo/symbolic_convert.py", line 1381, in call_function
self.push(fn.call_function(self, args, kwargs)) # type: ignore[arg-type]
~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^
File "/home/tommy_ge/miniconda3/lib/python3.13/site-packages/torch/_dynamo/variables/lazy.py", line 294, in realize_and_forward
return getattr(self.realize(), name)(*args, **kwargs)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^
File "/home/tommy_ge/miniconda3/lib/python3.13/site-packages/torch/_dynamo/variables/torch.py", line 2694, in call_function
tensor_variable = wrap_fx_proxy(
tx=tx,
...<4 lines>...
),
)
File "/home/tommy_ge/miniconda3/lib/python3.13/site-packages/torch/_dynamo/variables/builder.py", line 3090, in wrap_fx_proxy
return wrap_fx_proxy_cls(target_cls=TensorVariable, **kwargs)
File "/home/tommy_ge/miniconda3/lib/python3.13/site-packages/torch/_dynamo/variables/builder.py", line 3165, in wrap_fx_proxy_cls
out: VTTypeAlias = _wrap_fx_proxy(
~~~~~~~~~~~~~~^
target_cls, tx, proxy, example_value, subclass_type, **options
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
)
^
File "/home/tommy_ge/miniconda3/lib/python3.13/site-packages/torch/_dynamo/variables/builder.py", line 3289, in _wrap_fx_proxy
example_value = get_fake_value(proxy.node, tx, allow_non_graph_fake=True)
File "/home/tommy_ge/miniconda3/lib/python3.13/site-packages/torch/_dynamo/utils.py", line 3751, in get_fake_value
return _get_fake_value_impl(node, tx, allow_non_graph_fake)
File "/home/tommy_ge/miniconda3/lib/python3.13/site-packages/torch/_dynamo/utils.py", line 3926, in _get_fake_value_impl
raise UserError(
...<3 lines>...
) from cause
torch._dynamo.exc.UserError: Could not guard on data-dependent expression FloatTrueDiv(1.0, ToFloat(u0)) (unhinted: FloatTrueDiv(1.0, ToFloat(u0))). (Size-like symbols: none)

consider using data-dependent friendly APIs such as guard_or_false, guard_or_true and statically_known_true.
Caused by: return F.batch_norm( # nn/modules/batchnorm.py:210 in forward (nn/functional.py:2850 in batch_norm)
For more information, run with TORCH_LOGS="dynamic"
For extended logs when we create symbols, also add TORCHDYNAMO_EXTENDED_DEBUG_CREATE_SYMBOL="u0"
If you suspect the guard was triggered from C++, add TORCHDYNAMO_EXTENDED_DEBUG_CPP=1
For more debugging help, see https://docs.google.com/document/d/1HSuTTVvYH1pTew89Rtpeu84Ht3nQEFTYhAX3Ypa_xJs/edit?usp=sharing

User Stack (most recent call last):
(snipped, see stack below for prefix)
File "/home/tommy_ge/miniconda3/lib/python3.13/site-packages/torch/_dynamo/external_utils.py", line 69, in inner
return fn(*args, **kwargs)
File "/home/tommy_ge/miniconda3/lib/python3.13/site-packages/torch/nn/modules/batchnorm.py", line 210, in forward
return F.batch_norm(

For C++ stack trace, run with TORCHDYNAMO_EXTENDED_DEBUG_CPP=1
For more information about this error, see: https://pytorch.org/docs/main/generated/exportdb/index.html#constrain-as-size-example

from user code:
File "/home/tommy_ge/miniconda3/lib/python3.13/site-packages/torch/_dynamo/external_utils.py", line 69, in inner
return fn(*args, **kwargs)
File "/home/tommy_ge/miniconda3/lib/python3.13/site-packages/torch/nn/modules/batchnorm.py", line 210, in forward
return F.batch_norm(
```

## Expected behavior

The documented `momentum=None` training path should be capturable under `fullgraph=True` and return a tensor with shape `(3, 4)`.

## Duplicate search

Searched open and closed pytorch/pytorch issues for `BatchNorm1d`, `momentum=None`, `num_batches_tracked`, and `torch.compile`; no exact report was found.

### Error logs

_No response_

### Versions

```
PyTorch version: 2.12.1+cu130
Is debug build: False
CUDA used to build PyTorch: 13.0
ROCM used to build PyTorch: N/A

OS: Ubuntu 24.04.4 LTS (x86_64)
GCC version: (Ubuntu 13.3.0-6ubuntu2~24.04.1) 13.3.0
Clang version: Could not collect
CMake version: Could not collect
Libc version: glibc-2.39

Python version: 3.13.12 | packaged by Anaconda, Inc. | (main, Feb 24 2026, 16:13:31) [GCC 14.3.0] (64-bit runtime)
Python platform: Linux-6.6.87.2-microsoft-standard-WSL2-x86_64-with-glibc2.39
Is CUDA available: True
CUDA runtime version: Could not collect
CUDA_MODULE_LOADING set to:
GPU models and configuration: GPU 0: NVIDIA GeForce RTX 4090
Nvidia driver version: 591.86
cuDNN version: Could not collect
Is XPU available: False
HIP runtime version: N/A
MIOpen runtime version: N/A
Is XNNPACK available: True
Caching allocator config: N/A

CPU:
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Address sizes: 46 bits physical, 48 bits virtual
Byte Order: Little Endian
CPU(s): 28
On-line CPU(s) list: 0-27
Vendor ID: GenuineIntel
Model name: Intel(R) Core(TM) i7-14700K
CPU family: 6
Model: 183
Thread(s) per core: 2
Core(s) per socket: 14
Socket(s): 1
Stepping: 1
BogoMIPS: 6835.19
Flags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx pdpe1gb rdtscp lm constant_tsc rep_good nopl xtopology tsc_reliable nonstop_tsc cpuid tsc_known_freq pni pclmulqdq vmx ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch ssbd ibrs ibpb stibp ibrs_enhanced tpr_shadow ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves avx_vnni vnmi umip waitpkg gfni vaes vpclmulqdq rdpid movdiri movdir64b fsrm md_clear serialize flush_l1d arch_capabilities
Virtualization: VT-x
Hypervisor vendor: Microsoft
Virtualization type: full
L1d cache: 672 KiB (14 instances)
L1i cache: 448 KiB (14 instances)
L2 cache: 28 MiB (14 instances)
L3 cache: 33 MiB (1 instance)
NUMA node(s): 1
NUMA node0 CPU(s): 0-27
Vulnerability Gather data sampling: Not affected
Vulnerability Itlb multihit: Not affected
Vulnerability L1tf: Not affected
Vulnerability Mds: Not affected
Vulnerability Meltdown: Not affected
Vulnerability Mmio stale data: Not affected
Vulnerability Reg file data sampling: Vulnerable: No microcode
Vulnerability Retbleed: Mitigation; Enhanced IBRS
Vulnerability Spec rstack overflow: Not affected
Vulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl
Vulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization
Vulnerability Spectre v2: Mitigation; Enhanced / Automatic IBRS; IBPB conditional; RSB filling; PBRSB-eIBRS SW sequence; BHI BHI_DIS_S
Vulnerability Srbds: Not affected
Vulnerability Tsx async abort: Not affected

Versions of relevant libraries:
[pip3] numpy==2.4.4
[pip3] nvidia-cublas==13.1.1.3
[pip3] nvidia-cublas-cu12==12.9.2.10
[pip3] nvidia-cuda-cupti==13.0.85
[pip3] nvidia-cuda-nvrtc==13.0.88
[pip3] nvidia-cuda-nvrtc-cu12==12.9.86
[pip3] nvidia-cuda-runtime==13.0.96
[pip3] nvidia-cudnn-cu12==9.24.0.43
[pip3] nvidia-cudnn-cu13==9.20.0.48
[pip3] nvidia-cufft==12.0.0.61
[pip3] nvidia-curand==10.4.0.35
[pip3] nvidia-cusolver==12.0.4.66
[pip3] nvidia-cusparse==12.6.3.3
[pip3] nvidia-cusparselt-cu13==0.8.1
[pip3] nvidia-nccl-cu13==2.29.7
[pip3] nvidia-nvjitlink==13.0.88
[pip3] nvidia-nvtx==13.0.85
[pip3] onnxruntime==1.24.4
[pip3] torch==2.12.1
[pip3] torchvision==0.27.1
[pip3] triton==3.7.1
[conda] nvidia-cublas 13.1.1.3 pypi_0 pypi
[conda] nvidia-cuda-cupti 13.0.85 pypi_0 pypi
[conda] nvidia-cuda-nvrtc 13.0.88 pypi_0 pypi
[conda] nvidia-cuda-runtime 13.0.88 pypi_0 pypi
[conda] nvidia-cudnn-cu13 9.20.0.48 pypi_0 pypi
[conda] nvidia-cufft 12.0.0.61 pypi_0 pypi
[conda] nvidia-curand 10.4.0.35 pypi_0 pypi
[conda] nvidia-cusolver 12.0.4.66 pypi_0 pypi
[conda] nvidia-cusparse 12.6.3.3 pypi_0 pypi
[conda] nvidia-cusparselt-cu13 0.8.1 pypi_0 pypi
[conda] nvidia-nccl-cu13 2.29.7 pypi_0 pypi
[conda] nvidia-nvjitlink 13.0.88 pypi_0 pypi
[conda] nvidia-nvtx 13.0.85 pypi_0 pypi
[conda] torch 2.12.1 pypi_0 pypi
[conda] torchvision 0.27.1 pypi_0 pypi
[conda] triton 3.7.1 pypi_0 pypi
```

cc @chauhang @penguinwu @ezyang @bobrenjc93 @aditvenk @laithsakka

Contributor guide

Open the contributing guide

Research direction

Run the supplied reproducer with torch.compile(fullgraph=True), then inspect torch/nn/modules/batchnorm.py and torch/nn/functional.py at the BatchNorm forward path, followed by the symbolic conversion code in torch/fx/experimental/sym_node.py and symbolic_shapes.py. Done means momentum=None BatchNorm1d captures successfully in fullgraph mode with both aot_eager and Inductor without changing eager results.

Written by the indexing model from the issue text.

Assessment

Tech stack
python, pytorch
Domain
devtools, machine-learning
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Active
Clarity
Mostly clear
Newbie friendliness
52/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.