doc22_065.md 6.2 KB
Newer Older
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
1 2
# torch.overrides

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
3
> 原文:[`pytorch.org/docs/stable/torch.overrides.html`](https://pytorch.org/docs/stable/torch.overrides.html)
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
4

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
5
此模块公开了各种辅助函数,用于`__torch_function__`协议。有关`__torch_function__`协议的更多详细信息,请参见扩展 torch Python API。
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
6 7 8 9 10 11 12 13 14 15 16

## 函数

```py
torch.overrides.get_ignored_functions()
```

返回不能通过`__torch_function__`覆盖的公共函数。

返回

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
17
一个元组,其中包含在 torch API 中公开但不能使用`__torch_function__`覆盖的函数。主要是因为这些函数的参数都不是张量或类似张量。
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35

返回类型

Set[Callable]

示例

```py
>>> torch.Tensor.as_subclass in torch.overrides.get_ignored_functions()
True
>>> torch.add in torch.overrides.get_ignored_functions()
False 
```

```py
torch.overrides.get_overridable_functions()
```

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
36
列出可以通过 __torch_function__ 覆盖的函数
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
37 38 39 40 41 42 43 44 45 46 47 48 49

返回

一个将包含可重写函数的命名空间映射到该命名空间中可重写的函数的字典。

返回类型

Dict[Any, List[Callable]]

```py
torch.overrides.resolve_name(f)
```

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
50
获取传递给 __torch_function__ 的函数的人类可读字符串名称
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
51 52 53 54 55 56 57

参数

**f** (*Callable*) - 要解析名称的函数。

返回

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
58
函数的名称;如果对其进行 eval,则应返回输入函数。
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
59 60 61

返回类型

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
62
[str](https://docs.python.org/3/library/stdtypes.html#str "(在 Python v3.12 中)")
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
63 64 65 66 67 68 69 70 71

```py
torch.overrides.get_testing_overrides()
```

返回一个包含所有可重写函数的虚拟覆盖的字典

返回

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
72
一个字典,将 PyTorch API 中可重写函数映射到具有与真实函数相同签名的 lambda 函数,这些 lambda 函数无条件返回-1。这些 lambda 函数对于测试为定义`__torch_function__`的类型的 API 覆盖率很有用。
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92

返回类型

Dict[Callable, Callable]

示例

```py
>>> import inspect
>>> my_add = torch.overrides.get_testing_overrides()[torch.add]
>>> inspect.signature(my_add)
<Signature (input, other, out=None)> 
```

```py
torch.overrides.handle_torch_function(public_api, relevant_args, *args, **kwargs)
```

实现带有`__torch_function__`覆盖的函数。

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
93
请参阅 torch::autograd::handle_torch_function,了解 C++实现中此函数的等效部分。
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
94 95 96

参数

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
97
+   **public_api** (*function*) - 最初在公共 torch API 中调用的函数,如`public_api(*args, **kwargs)`,现在正在检查其参数。
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
98

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
99
+   **relevant_args** (*iterable*) - 要检查 __torch_function__ 方法的参数的可迭代对象。
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
100

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
101
+   **args** ([*tuple*](https://docs.python.org/3/library/stdtypes.html#tuple "(在 Python v3.12 中)")) - 最初传递给`public_api`的任意位置参数。
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
102

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
103
+   **kwargs** ([*tuple*](https://docs.python.org/3/library/stdtypes.html#tuple "(在 Python v3.12 中)")) - 最初传递给`public_api`的任意关键字参数。
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
104 105 106 107 108 109 110

返回

调用`implementation`或适当的`__torch_function__`方法的结果。

返回类型

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
111
[object](https://docs.python.org/3/library/functions.html#object "(在 Python v3.12 中)")
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
112

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
113
:如果找不到实现,则引发 TypeError。:
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
114 115 116 117 118 119 120 121 122 123 124 125 126 127

示例

```py
>>> def func(a):
...     if has_torch_function_unary(a):
...         return handle_torch_function(func, (a,), a)
...     return a + 0 
```

```py
torch.overrides.has_torch_function()
```

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
128
检查可迭代对象中元素的 __torch_function__ 实现,或者是否启用了 __torch_function__ 模式。将确切的`Tensor``Parameter`视为不可分派。使用此功能来保护对`handle_torch_function()`的调用;不要用它来测试某物是否类似于 Tensor,而是使用`is_tensor_like()`。:param relevant_args: 要检查 __torch_function__ 方法的可迭代对象或参数。:type relevant_args: iterable
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
129 130 131

返回

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
132
如果 relevant_args 的任何元素具有 __torch_function__ 实现,则返回 True,否则返回 False。
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
133 134 135

返回类型

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
136
[bool](https://docs.python.org/3/library/functions.html#bool "(在 Python v3.12 中)")
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
137 138 139 140 141

另请参见

`torch.is_tensor_like`

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
142
检查某物是否类似于 Tensor,包括确切的`Tensor`
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
143 144 145 146 147

```py
torch.overrides.is_tensor_like(inp)
```

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
148
如果传入的输入是类似于 Tensor 的,则返回`True`
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
149 150 151 152 153

当前,只要输入类型的`__torch_function__`属性存在,就会发生这种情况。

示例

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
154
张量的子类通常是类似于 Tensor 的。
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
155 156 157 158 159 160 161

```py
>>> class SubTensor(torch.Tensor): ...
>>> is_tensor_like(SubTensor([0]))
True 
```

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
162
内置或用户类型通常不类似于 Tensor。
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
163 164 165 166 167 168 169 170 171 172 173

```py
>>> is_tensor_like(6)
False
>>> is_tensor_like(None)
False
>>> class NotATensor: ...
>>> is_tensor_like(NotATensor())
False 
```

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
174
但是,通过实现 __torch_function__,它们可以变得类似于 Tensor。
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
175 176 177 178 179 180 181 182 183 184 185 186 187 188

```py
>>> class TensorLike:
...     @classmethod
...     def __torch_function__(cls, func, types, args, kwargs):
...         return -1
>>> is_tensor_like(TensorLike())
True 
```

```py
torch.overrides.is_tensor_method_or_property(func)
```

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
189
如果传入的函数是`torch.Tensor`的方法或属性的处理程序,则返回 True,如传入`__torch_function__`
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
190 191 192 193 194 195 196

注意

对于属性,必须传递它们的`__get__`方法。

这可能是必要的,特别是出于以下原因:

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
197
1.  方法/属性有时不包含 __module__ 槽。
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
198 199 200 201 202 203 204 205 206 207 208 209 210 211

1.  它们要求第一个传入的参数是`torch.Tensor`的实例。

示例

```py
>>> is_tensor_method_or_property(torch.Tensor.add)
True
>>> is_tensor_method_or_property(torch.add)
False 
```

返回类型

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
212
[bool](https://docs.python.org/3/library/functions.html#bool "(在 Python v3.12 中)")
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
213 214 215 216 217 218 219 220 221 222 223 224 225

```py
torch.overrides.wrap_torch_function(dispatcher)
```

使用与`__torch_function__`相关的功能包装给定的函数。

参数

**dispatcher***Callable*)- 一个可调用对象,返回传递给函数的类似张量的可迭代对象。

注意

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
226
这个装饰器可能会降低代码的性能。通常,将代码表达为一系列支持 __torch_function__ 的函数就足够了。如果您发现自己处于罕见的情况,即如果您正在包装一个低级库,并且还需要它适用于类似张量,那么这个函数是可用的。
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
227 228 229 230 231 232 233 234 235 236

示例

```py
>>> def dispatcher(a): # Must have the same signature as func
...     return (a,)
>>> @torch.overrides.wrap_torch_function(dispatcher)
>>> def func(a): # This will make func dispatchable by __torch_function__
...     return a + 0 
```