pytorch/torch/_library
angelayi 2b4ef6b4d6 [opaque_obj_v2] PyObject custom op schema type (#165004)
This is a cleaner implementation of opaque objects (https://github.com/pytorch/pytorch/pull/162660). Instead now we just need to do:

Call `register_opaque_type` to register the type as being "opaque" and allowed by custom ops. You also need to pass a unique name that maps to the type.
```python
class OpaqueQueue:
    def __init__(self, queue: list[torch.Tensor], init_tensor_: torch.Tensor) -> None:
        super().__init__()
        self.queue = queue
        self.init_tensor_ = init_tensor_

    def push(self, tensor: torch.Tensor) -> None:
        self.queue.append(tensor)

    def pop(self) -> torch.Tensor:
        if len(self.queue) > 0:
            return self.queue.pop(0)
        return self.init_tensor_

    def size(self) -> int:
        return len(self.queue)

register_opaque_type(OpaqueQueue, "_TestOpaqueObject_OpaqueQueue")
```

When creating the custom op, the schema will then use the unique name:
```python
self.lib = torch.library.Library("_TestOpaqueObject", "FRAGMENT")

torch.library.define(
    "_TestOpaqueObject::queue_push",
    "(_TestOpaqueObject_OpaqueQueue a, Tensor b) -> ()",
    tags=torch.Tag.pt2_compliant_tag,
    lib=self.lib,
)

@torch.library.impl(
    "_TestOpaqueObject::queue_push", "CompositeExplicitAutograd", lib=self.lib
)
def push_impl(queue: OpaqueQueue, b: torch.Tensor) -> None:
    assert isinstance(queue, OpaqueQueue)
    queue.push(b)
```

Using the custom op:
```python
queue = OpaqueQueue([], torch.zeros(3))
torch.ops._TestOpaqueObject.queue_push(queue, torch.ones(3))
self.assertTrue(queue.size(), 1)
```

Pull Request resolved: https://github.com/pytorch/pytorch/pull/165004
Approved by: https://github.com/albanD
2025-10-14 20:21:04 +00:00
..
__init__.py fix typo in doc and import for torch._library.triton (#144882) 2025-01-17 17:32:12 +00:00
autograd.py [5/N] Apply ruff UP035 rule (#164423) 2025-10-02 07:31:11 +00:00
custom_ops.py Add view support for library custom Function (#164520) 2025-10-09 16:17:48 +00:00
fake_class_registry.py [opaque_obj] Add make_fx tracing support (#163278) 2025-10-08 09:09:16 +00:00
fake_impl.py [5/N] Apply ruff UP035 rule (#164423) 2025-10-02 07:31:11 +00:00
fake_profile.py Pyrefly suppressions 7/n (#164913) 2025-10-08 07:27:17 +00:00
infer_schema.py [opaque_obj_v2] PyObject custom op schema type (#165004) 2025-10-14 20:21:04 +00:00
opaque_object.py [opaque_obj_v2] PyObject custom op schema type (#165004) 2025-10-14 20:21:04 +00:00
simple_registry.py [5/N] Apply ruff UP035 rule (#164423) 2025-10-02 07:31:11 +00:00
triton.py [5/N] Apply ruff UP035 rule (#164423) 2025-10-02 07:31:11 +00:00
utils.py Add view support for library custom Function (#164520) 2025-10-09 16:17:48 +00:00