Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

zh-CN: build_rpi.md #744

Merged
merged 41 commits into from Jul 8, 2019
Merged
Show file tree
Hide file tree
Changes from 9 commits
Commits
Show all changes
41 commits
Select commit Hold shift + click to select a range
2606411
Create build_rpi.md
kjlintong Jul 2, 2019
3c597bf
Update build_rpi.md
kjlintong Jul 2, 2019
8b93ee6
Update build_rpi.md
kjlintong Jul 4, 2019
53f4270
Update site/zh-cn/lite/g3doc/guide/build_rpi.md
kjlintong Jul 4, 2019
20deca0
Update build_rpi.md
kjlintong Jul 4, 2019
de569d2
Update site/zh-cn/lite/g3doc/guide/build_rpi.md
kjlintong Jul 4, 2019
1d9c553
Create ops_version.md
kjlintong Jul 4, 2019
d605c71
Update ops_version.md
kjlintong Jul 5, 2019
168941a
Update ops_version.md
kjlintong Jul 5, 2019
5c95d27
Update site/zh-cn/lite/g3doc/guide/ops_version.md
kjlintong Jul 8, 2019
6c95900
Update site/zh-cn/lite/g3doc/guide/ops_version.md
kjlintong Jul 8, 2019
6846749
Update site/zh-cn/lite/g3doc/guide/ops_version.md
kjlintong Jul 8, 2019
61be017
Update site/zh-cn/lite/g3doc/guide/ops_version.md
kjlintong Jul 8, 2019
db7c141
Update site/zh-cn/lite/g3doc/guide/ops_version.md
kjlintong Jul 8, 2019
ba662d9
Update site/zh-cn/lite/g3doc/guide/ops_version.md
kjlintong Jul 8, 2019
1e747ec
Update site/zh-cn/lite/g3doc/guide/ops_version.md
kjlintong Jul 8, 2019
b16e766
Update site/zh-cn/lite/g3doc/guide/ops_version.md
kjlintong Jul 8, 2019
37aa0d2
Update site/zh-cn/lite/g3doc/guide/ops_version.md
kjlintong Jul 8, 2019
1210b46
Update site/zh-cn/lite/g3doc/guide/ops_version.md
kjlintong Jul 8, 2019
22a1700
Update site/zh-cn/lite/g3doc/guide/ops_version.md
kjlintong Jul 8, 2019
23d0b96
Update site/zh-cn/lite/g3doc/guide/ops_version.md
kjlintong Jul 8, 2019
d346126
Update site/zh-cn/lite/g3doc/guide/ops_version.md
kjlintong Jul 8, 2019
7c5b1e2
Update site/zh-cn/lite/g3doc/guide/ops_version.md
kjlintong Jul 8, 2019
dcc5a16
Update site/zh-cn/lite/g3doc/guide/ops_version.md
kjlintong Jul 8, 2019
456a8d2
Update site/zh-cn/lite/g3doc/guide/ops_version.md
kjlintong Jul 8, 2019
8468d64
Update site/zh-cn/lite/g3doc/guide/ops_version.md
kjlintong Jul 8, 2019
ac95e61
Update site/zh-cn/lite/g3doc/guide/ops_version.md
kjlintong Jul 8, 2019
2d8ca88
Update site/zh-cn/lite/g3doc/guide/ops_version.md
kjlintong Jul 8, 2019
c313dc5
Update site/zh-cn/lite/g3doc/guide/ops_version.md
kjlintong Jul 8, 2019
ec9e3eb
Update site/zh-cn/lite/g3doc/guide/ops_version.md
kjlintong Jul 8, 2019
87fa52c
Update site/zh-cn/lite/g3doc/guide/ops_version.md
kjlintong Jul 8, 2019
510fd10
Update site/zh-cn/lite/g3doc/guide/ops_version.md
kjlintong Jul 8, 2019
420f859
Update site/zh-cn/lite/g3doc/guide/ops_version.md
kjlintong Jul 8, 2019
c1811d0
Update site/zh-cn/lite/g3doc/guide/ops_version.md
kjlintong Jul 8, 2019
b046e98
Update site/zh-cn/lite/g3doc/guide/ops_version.md
kjlintong Jul 8, 2019
47d1158
Update site/zh-cn/lite/g3doc/guide/ops_version.md
kjlintong Jul 8, 2019
f09bbf0
Update site/zh-cn/lite/g3doc/guide/ops_version.md
kjlintong Jul 8, 2019
3eafad4
Apply suggestions from code review
kjlintong Jul 8, 2019
67c3502
Apply suggestions from code review
kjlintong Jul 8, 2019
c7bf07f
Apply suggestions from code review
kjlintong Jul 8, 2019
57f5490
Fix path
lamberta Jul 8, 2019
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
40 changes: 40 additions & 0 deletions site/zh-cn/lite/g3doc/guide/build_rpi.md
@@ -0,0 +1,40 @@
# 在树莓派上构建 TensorFlow Lite
## 交叉编译
### 安装工具链
此功能已在64位的 ubuntu 16.04.3 和 Tensorflow devel docker image [tensorflow/tensorflow:nightly-devel](https://hub.docker.com/r/tensorflow/tensorflow/tags/) 上测试。
要使用 TensorFlow Lite 交叉编译功能,应先安装工具链和相关的库。
```bash
sudo apt-get update
sudo apt-get install crossbuild-essential-armhf
```
如果您使用 Docker,您可能无法使用 `sudo`。
### 构建
克隆此Tensorflow库,在库的根目录下运行此脚本以下载所有依赖项:
> tensorflow库在 /tensorflow 下。如果您使用的是 docker 镜像 tensorflow/tensorflow:nightly-develimage,则会使用Tensorflow存储库,尝试使用以下命令即可。
```bash
./tensorflow/lite/tools/make/download_dependencies.sh
```
请注意,您只需要执行一次此操作。
然后您便能够编译:
```bash
./tensorflow/lite/tools/make/build_rpi_lib.sh
```
这将编译一个静态库,它位于:
tensorflow/lite/tools/make/gen/rpi_armv7l/lib/libtensorflow-lite.a.
## 本地编译
这已经在Raspberry Pi 3b,Raspbian GNU / Linux 9.1(stretch),gcc版本6.3.0 20170516(Raspbian 6.3.0-18 + rpi1)上进行了测试。
登录Raspberry Pi,安装工具链。
```bash
sudo apt-get install build-essential
```
首先,克隆TensorFlow库。在库的根目录运行:
```bash
./tensorflow/lite/tools/make/download_dependencies.sh
```
请注意,您只需要执行一次此操作。
然后您便能够编译:
```bash
./tensorflow/lite/tools/make/build_rpi_lib.sh
```
这将编译一个静态库,它位于:
tensorflow/lite/tools/make/gen/lib/rpi_armv7/libtensorflow-lite.a 。
133 changes: 133 additions & 0 deletions site/zh-cn/lite/g3doc/guide/ops_version.md
@@ -0,0 +1,133 @@
# Tensorflow Lite 管理员版本
kjlintong marked this conversation as resolved.
Show resolved Hide resolved
本文档描述了 TensorFlow Lite 的管理员版本架构。管理员版本允许开发人员能够将新功能和参数添加到现有版本中。此外,它保证以下内容:
kjlintong marked this conversation as resolved.
Show resolved Hide resolved
> 后向兼容性:新版本的 TensorFlow Lite 可以处理旧版本的模型文件。
kjlintong marked this conversation as resolved.
Show resolved Hide resolved
> 前向兼容性:只要没有使用新功能,旧版本的 TensorFlow Lite 可以处理由新版 TOCO 生成的新版本的模型文件。
kjlintong marked this conversation as resolved.
Show resolved Hide resolved
> 前向兼容性检测:如果旧的 TensorFlow Lite 读取包含不支持的新版本的模型,则应报告错误。
kjlintong marked this conversation as resolved.
Show resolved Hide resolved
## 示例:在一个卷积中使用卷积核膨胀
kjlintong marked this conversation as resolved.
Show resolved Hide resolved
本文档的其余部分通过展示如何在卷积操作中添加膨胀系数来解释 TFLite 中的操作员版本。
kjlintong marked this conversation as resolved.
Show resolved Hide resolved
了解本文档不需要了解卷积核膨胀的知识。注意:
kjlintong marked this conversation as resolved.
Show resolved Hide resolved
> 将添加2个新的整数参数:'dilation_width_factor' 和 'dilation_height_factor'。
kjlintong marked this conversation as resolved.
Show resolved Hide resolved
> 不支持膨胀的旧卷积核相当于将扩张因子膨胀系数设置为1。
kjlintong marked this conversation as resolved.
Show resolved Hide resolved
## 更改 FlatBuffer 架构
kjlintong marked this conversation as resolved.
Show resolved Hide resolved
要将新参数添加到 op 中,请更改选项表 lite/schema/schema.fbs。
kjlintong marked this conversation as resolved.
Show resolved Hide resolved
例如,卷积选项表如下所示:
kjlintong marked this conversation as resolved.
Show resolved Hide resolved
```
table Conv2DOptions {
padding:Padding;
stride_w:int;
stride_h:int;
fused_activation_function:ActivationFunctionType;
}
```
添加新参数时:
kjlintong marked this conversation as resolved.
Show resolved Hide resolved
> 添加注释,指明哪个版本支持这些参数。
kjlintong marked this conversation as resolved.
Show resolved Hide resolved
> 新版本的 Tensorflow Lite 获取新添加的参数的默认值时,它应该与旧版本完全相同。
kjlintong marked this conversation as resolved.
Show resolved Hide resolved
添加新参数后,参数表如下所示:
kjlintong marked this conversation as resolved.
Show resolved Hide resolved
```
table Conv2DOptions {
// Parameters supported by version 1:
kjlintong marked this conversation as resolved.
Show resolved Hide resolved
padding:Padding;
stride_w:int;
stride_h:int;
fused_activation_function:ActivationFunctionType;

// Parameters supported by version 2:
kjlintong marked this conversation as resolved.
Show resolved Hide resolved
dilation_width_factor:int = 1;
dilation_height_factor:int = 1;
}
```
## 更改 C 结构和内核实现
kjlintong marked this conversation as resolved.
Show resolved Hide resolved
在 TensorFlow Lite 中,内核实现与 FlatBuffer 定义分离。内核从 lite/builtin_op_data.h 中定义的 C 结构文件中读取参数 。
kjlintong marked this conversation as resolved.
Show resolved Hide resolved
原始卷积参数如下:
kjlintong marked this conversation as resolved.
Show resolved Hide resolved
```
typedef struct {
TfLitePadding padding;
int stride_width;
int stride_height;
TfLiteFusedActivation activation;
} TfLiteConvParams;
```
与 FlatBuffer 架构一样,添加注释,指明从哪个版本开始支持这些参数。结果如下:
kjlintong marked this conversation as resolved.
Show resolved Hide resolved
```
typedef struct {
// Parameters supported by version 1: TfLitePadding padding; int
kjlintong marked this conversation as resolved.
Show resolved Hide resolved
stride_width;
kjlintong marked this conversation as resolved.
Show resolved Hide resolved
int stride_height;
TfLiteFusedActivation activation;

// Parameters supported by version 2:
kjlintong marked this conversation as resolved.
Show resolved Hide resolved
int dilation_width_factor;
int dilation_height_factor;
} TfLiteConvParams;
```
请同时更改内核实现以从 C 结构中读取新添加的参数。具体细节省略。
kjlintong marked this conversation as resolved.
Show resolved Hide resolved
## 更改 FlatBuffer 阅读代码
kjlintong marked this conversation as resolved.
Show resolved Hide resolved
读取 FlatBuffer 和生成 C 结构的逻辑是 lite/model.cc。
kjlintong marked this conversation as resolved.
Show resolved Hide resolved
更新该文件以处理新参数,如下所示:
kjlintong marked this conversation as resolved.
Show resolved Hide resolved
```
case BuiltinOperator_CONV_2D: {
TfLiteConvParams* params = MallocPOD<TfLiteConvParams>();
if (auto* conv_params = op->builtin_options_as_Conv2DOptions()) {
params->padding = parse_padding(conv_params->padding());
params->stride_width = conv_params->stride_w();
params->stride_height = conv_params->stride_h();
params->activation =
parse_activation(conv_params->fused_activation_function());
params->dilation_width_factor = conv_params->dilation_width_factor();
params->dilation_height_factor = conv_params->dilation_height_factor();
}
*builtin_data = reinterpret_cast<void*>(params);
break;
}
```
这里不需要检查操作版本。当新版本的阅读代码读取缺少膨胀系数的旧模型文件时,它将使用 1 作为默认值,并且新内核将与旧内核一致地工作。
kjlintong marked this conversation as resolved.
Show resolved Hide resolved
## 改变内核注册
kjlintong marked this conversation as resolved.
Show resolved Hide resolved
MutableOpResolver(定义于 lite/op_resolver.h)提供了一些注册 op 内核的函数。默认情况下,最小和最大版本号为1:
kjlintong marked this conversation as resolved.
Show resolved Hide resolved
```
void AddBuiltin(tflite::BuiltinOperator op, TfLiteRegistration* registration,
int min_version = 1, int max_version = 1);
void AddCustom(const char* name, TfLiteRegistration* registration,
int min_version = 1, int max_version = 1);
```
内置操作已注册于 lite/kernels/register.cc 。在这个例子中,我们要实现一个新的 op 内核,可以处理 Conv2D 的版本 1 和 2,所以我们需要改变这一行:
kjlintong marked this conversation as resolved.
Show resolved Hide resolved
```
AddBuiltin(BuiltinOperator_CONV_2D, Register_CONV_2D());
```
至:
kjlintong marked this conversation as resolved.
Show resolved Hide resolved
```
AddBuiltin(BuiltinOperator_CONV_2D, Register_CONV_2D(), 1, 2);
```
## 改变 TOCO TFLite 输出
kjlintong marked this conversation as resolved.
Show resolved Hide resolved
最后一步是让 TOCO 填充执行操作所需的最低版本。在这个例子中,它意味着:
kjlintong marked this conversation as resolved.
Show resolved Hide resolved
> 当膨胀系数均为1时,填充版本 = 1。
kjlintong marked this conversation as resolved.
Show resolved Hide resolved
> 否则填充版本 = 2。
kjlintong marked this conversation as resolved.
Show resolved Hide resolved
为此,您需要覆盖 GetVersion 运算符类的函数,位于
kjlintong marked this conversation as resolved.
Show resolved Hide resolved
lite/toco/tflite/operator.cc。
kjlintong marked this conversation as resolved.
Show resolved Hide resolved
对于只有一个版本的操作,该 GetVersion 函数定义为:
kjlintong marked this conversation as resolved.
Show resolved Hide resolved
```
int GetVersion(const Operator& op) const override { return 1; }
```
支持多个版本时,请检查参数并确定 op 的版本,如以下示例所示:
kjlintong marked this conversation as resolved.
Show resolved Hide resolved
```
int GetVersion(const Operator& op) const override {
const auto& conv_op = static_cast<const ConvOperator&>(op);
if (conv_op.dilation_width_factor != 1 ||
conv_op.dilation_height_factor != 1) {
return 2;
}
return 1;
}
```
## 委托实施
kjlintong marked this conversation as resolved.
Show resolved Hide resolved
TensorFlow Lite 提供了一个委托 API,可以将操作委派给硬件后端。在 Delegate 的 Prepare 函数中,检查该版本是否支持委派代码中的每个节点。
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
TensorFlow Lite 提供了一个委托 API,可以将操作委派给硬件后端。在 Delegate 的 Prepare 函数中,检查该版本是否支持委派代码中的每个节点
TensorFlow Lite提供了一个委托API,可以将操作委派给硬件后端。 在Delegate的`Prepare`函数中,检查版本是否被每一个委派代码中的节点所支持

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这里中文英文间不需要空格吗🤔

```
const int kMinVersion = 1;
TfLiteNode* node;
TfLiteRegistration;
context->GetNodeAndRegistration(context, node_index, &node, &registration);

if (registration->version > kMinVersion) {
// Reject the node if the version isn't supported.
kjlintong marked this conversation as resolved.
Show resolved Hide resolved
}
```
即使委派仅支持在版本 1 操作,这也是必需的,这使委派可以在获得更高版本操作时检测到不兼容性。
kjlintong marked this conversation as resolved.
Show resolved Hide resolved