Spaces:
Running
Running
from __future__ import annotations | |
import os | |
import tempfile | |
import textwrap | |
from functools import lru_cache | |
if os.environ.get("TORCHINDUCTOR_WRITE_MISSING_OPS") == "1": | |
def _record_missing_op(target): | |
with open(f"{tempfile.gettempdir()}/missing_ops.txt", "a") as fd: | |
fd.write(str(target) + "\n") | |
else: | |
def _record_missing_op(target): # type: ignore[misc] | |
pass | |
class OperatorIssue(RuntimeError): | |
def operator_str(target, args, kwargs): | |
lines = [f"target: {target}"] + [ | |
f"args[{i}]: {arg}" for i, arg in enumerate(args) | |
] | |
if kwargs: | |
lines.append(f"kwargs: {kwargs}") | |
return textwrap.indent("\n".join(lines), " ") | |
class MissingOperatorWithoutDecomp(OperatorIssue): | |
def __init__(self, target, args, kwargs): | |
_record_missing_op(target) | |
super().__init__(f"missing lowering\n{self.operator_str(target, args, kwargs)}") | |
class MissingOperatorWithDecomp(OperatorIssue): | |
def __init__(self, target, args, kwargs): | |
_record_missing_op(target) | |
super().__init__( | |
f"missing decomposition\n{self.operator_str(target, args, kwargs)}" | |
+ textwrap.dedent( | |
f""" | |
There is a decomposition available for {target} in | |
torch._decomp.get_decompositions(). Please add this operator to the | |
`decompositions` list in torch._inductor.decompositions | |
""" | |
) | |
) | |
class LoweringException(OperatorIssue): | |
def __init__(self, exc: Exception, target, args, kwargs): | |
super().__init__( | |
f"{type(exc).__name__}: {exc}\n{self.operator_str(target, args, kwargs)}" | |
) | |
class InvalidCxxCompiler(RuntimeError): | |
def __init__(self): | |
from . import config | |
super().__init__( | |
f"No working C++ compiler found in {config.__name__}.cpp.cxx: {config.cpp.cxx}" | |
) | |
class CppWrapperCodeGenError(RuntimeError): | |
def __init__(self, msg: str): | |
super().__init__(f"C++ wrapper codegen error: {msg}") | |
class CppCompileError(RuntimeError): | |
def __init__(self, cmd: list[str], output: str): | |
if isinstance(output, bytes): | |
output = output.decode("utf-8") | |
super().__init__( | |
textwrap.dedent( | |
""" | |
C++ compile error | |
Command: | |
{cmd} | |
Output: | |
{output} | |
""" | |
) | |
.strip() | |
.format(cmd=" ".join(cmd), output=output) | |
) | |
class CUDACompileError(CppCompileError): | |
pass | |