From 7e963961755557981ee325a2c917d53da2360c4d Mon Sep 17 00:00:00 2001 From: wizardforcel <562826179@qq.com> Date: Mon, 18 Jan 2021 17:47:57 +0800 Subject: [PATCH] 2021-01-18 17:47:56 --- new/pt-dl-handson/8.md | 6 +++--- new/pt-tut-17/49.md | 2 +- new/pt-tut-17/63.md | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/new/pt-dl-handson/8.md b/new/pt-dl-handson/8.md index 107b32f4..3950f5ce 100644 --- a/new/pt-dl-handson/8.md +++ b/new/pt-dl-handson/8.md @@ -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 功能,但具有支持数据相关张量操作的所有必需功能。 diff --git a/new/pt-tut-17/49.md b/new/pt-tut-17/49.md index 09adbf12..7374016b 100644 --- a/new/pt-tut-17/49.md +++ b/new/pt-tut-17/49.md @@ -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++ 计算高阶梯度 diff --git a/new/pt-tut-17/63.md b/new/pt-tut-17/63.md index 50ba0c78..41ad1f81 100644 --- a/new/pt-tut-17/63.md +++ b/new/pt-tut-17/63.md @@ -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.""" -- GitLab