提交 7e963961 编写于 作者: W wizardforcel

2021-01-18 17:47:56

上级 0be53cd3
......@@ -328,7 +328,7 @@ MMS 的一项强制性要求是其中包含服务类的服务文件。 MMS 执
![MXNet model archiver](img/B09475_08_04.jpg)
图 8.4:fizbuz_package 的目录结构
图 8.4:`fizbuz_package`的目录结构
```py
class MXNetModelService(object):
......@@ -566,7 +566,7 @@ class WebsiteUser(HttpLocust):
现在的问题是:这不是我们对 ONNX 所做的吗? 也就是说,从 PyTorch 模型创建另一个 IR? 是的,过程相似,但区别在于 ONNX 使用跟踪创建了优化的 IR; 也就是说,它通过模型传递虚拟输入,并在执行模型时记录 PyTorch 操作,然后将这些操作转换为中间 IR。
这种方法有一个问题:如果模型是数据相关的,例如 RNN 中的循环,或者`if` / `else`条件是基于输入的,那么跟踪就不能真正做到这一点。 跟踪将仅发现在特定执行周期中发生的情况,而忽略其他情况。 例如,如果我们的虚拟输入是 10 个单词的句子,而我们的模型是基于循环的 RNN,则跟踪的图形将对 RNN 单元的 10 次执行进行硬编码,如果句子的长度大于 10,则它将中断 单词或单词较少的简短句子。 考虑到这一点引入了 TorchScript。
这种方法有一个问题:如果模型是数据相关的,例如 RNN 中的循环,或者`if`/`else`条件是基于输入的,那么跟踪就不能真正做到这一点。 跟踪将仅发现在特定执行周期中发生的情况,而忽略其他情况。 例如,如果我们的虚拟输入是 10 个单词的句子,而我们的模型是基于循环的 RNN,则跟踪的图形将对 RNN 单元的 10 次执行进行硬编码,如果句子的长度大于 10,则它将中断 单词或单词较少的简短句子。 考虑到这一点引入了 TorchScript。
TorchScript 支持此类 Python 控制流的一个子集,唯一要做的就是将现有程序转换为所有控制流都是 TorchScript 支持的控制流的阶段。 LibTorch 可以读取 TorchScript 创建的中间阶段。 在此会话中,我们将创建 TorchScript 输出并编写一个 C++ 模块以使用 LibTorch 加载它。
......@@ -582,7 +582,7 @@ PyTorch 允许您通过两种方法制作 TorchScript IR。 最简单的是通
然后,可以将跟踪的函数(PyTorch 操作)转换为优化的 IR,也称为静态单分配 IR。 像 ONNX 图一样,该图中的指令也具有 TENsor 库(ATen,PyTorch 的后端)可以理解的原始运算符。
这确实很容易,但是要付出代价。 基于跟踪的推理具有 ONNX 的基本问题:它无法处理依赖于数据的模型结构更改,即`if` / `else`条件检查或循环(序列数据)。 为了处理这种情况,PyTorch 引入了脚本模式。
这确实很容易,但是要付出代价。 基于跟踪的推理具有 ONNX 的基本问题:它无法处理依赖于数据的模型结构更改,即`if`/`else`条件检查或循环(序列数据)。 为了处理这种情况,PyTorch 引入了脚本模式。
可以通过使用`torch.jit.script`装饰器(用于常规功能)和`torch.jit.script_method`(用于 PyTorch 模型上的方法)来启用脚本模式。 通过此装饰器,函数/方法中的内容将直接转换为 TorchScript。 在对模型类使用`torch.jit.script_method`时要记住的另一件重要事情是关于父类。 通常,我们从`torch.nn.Module`继承,但是为了制作 TorchScript,我们从`torch.jit.ScriptModule`继承。 这有助于 PyTorch 避免使用无法转换为 TorchScript 的纯 Python 方法。 目前,TorchScript 不支持所有 Python 功能,但具有支持数据相关张量操作的所有必需功能。
......
......@@ -220,7 +220,7 @@ true
```
有关 C++ 张量自动梯度 API 的更多信息,例如`grad` / `requires_grad` / `is_leaf` / `backward` / `detach` / `detach_` / `register_hook` / `retain_grad`,请参见[相应的 C++ API 文档](https://pytorch.org/cppdocs/api/classat_1_1_tensor.html)
有关 C++ 张量自动梯度 API 的更多信息,例如`grad`/`requires_grad`/`is_leaf`/`backward`/`detach`/`detach_`/`register_hook`/`retain_grad`,请参见[相应的 C++ API 文档](https://pytorch.org/cppdocs/api/classat_1_1_tensor.html)
## 用 C++ 计算高阶梯度
......
......@@ -78,7 +78,7 @@ def run(rank, size):
在上面的示例中,两个进程都从零张量开始,然后进程 0 递增张量并将其发送到进程 1,以便它们都以 1.0 结尾。 请注意,进程 1 需要分配内存以存储它将接收的数据。
另请注意,`send` / `recv`**阻塞**:两个过程都停止,直到通信完成。 另一方面,即时消息是**非阻塞**; 脚本继续执行,方法返回`Work`对象,我们可以选择`wait()`作为对象。
另请注意,`send`/`recv`**阻塞**:两个过程都停止,直到通信完成。 另一方面,即时消息是**非阻塞**; 脚本继续执行,方法返回`Work`对象,我们可以选择`wait()`作为对象。
```py
"""Non-blocking point-to-point communication."""
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册