From a9e18304d66c7cf4b612c9cf14cc7703ee728532 Mon Sep 17 00:00:00 2001 From: yaochi Date: Wed, 27 Apr 2022 18:03:05 +0800 Subject: [PATCH 1/9] start up --- docs/eval/evaluation_of_docs_system.md | 225 ++++++++++++++++++++++ docs/eval/images/documentation-system.png | Bin 0 -> 50544 bytes 2 files changed, 225 insertions(+) create mode 100644 docs/eval/evaluation_of_docs_system.md create mode 100644 docs/eval/images/documentation-system.png diff --git a/docs/eval/evaluation_of_docs_system.md b/docs/eval/evaluation_of_docs_system.md new file mode 100644 index 00000000000..4c1a1c7a491 --- /dev/null +++ b/docs/eval/evaluation_of_docs_system.md @@ -0,0 +1,225 @@ +# 飞桨官网文档体验报告 + +## 上下文介绍 + +### 文档体系的分类 + +按照 https://documentation.divio.com/ 中的理论,任何软件产品,都应该配套以下四类文档: + +![](./images/documentation-system.png) + +本文将基于这个文档分类系统,参考比较多个深度学习框架的文档组织方式,形成最终报告。 + +### 竞品比较 + +#### TensorFlow + + - Tutorial:[Tutorial](https://www.tensorflow.org/tutorials) + - GUIDE:[Guide](https://www.tensorflow.org/guide) + - EXPLANATION:除 [ML Glossary](https://developers.google.com/machine-learning/glossary/tensorflow) 外,没有显式存在。 + - REFERENCE: [API 文档](https://www.tensorflow.org/versions) + +TensorFlow 的文档规划,比较直接地匹配了本文所介绍的分类标准。 + +#### PyTorch + + - Tutorial:https://pytorch.org/tutorials/beginner/basics/intro.html + - GUIDE:https://pytorch.org/tutorials/recipes/recipes_index.html + - EXPLANATION:没有显式存在,分散在 API 文档中。 + - REFERENCE:[API 文档](https://pytorch.org/docs/stable/index.html) + +[PyTorch 的文档](https://docs.pytorch.org) 分为 API 文档和 Tutorials 两大类。但实际 Tutorials 中可以继续分为 Learn the Basics 和 PyTorch Recipes 两大类。 + +并且,PyTorch 在自己的 API 文档首页中有 Notes。在必要时,也会在模块 API 开始做背景介绍,这些内容可以归为 “Explanation” 象限。 + +#### MindSpore + + - Tutorial:在 [教程](https://www.mindspore.cn/tutorials/zh-CN/r1.6/index.html) 前部分和 [编程指南](https://www.mindspore.cn/docs/programming_guide/zh-CN/r1.6/index.html) 的前半部分话题中 + - GUIDE:在 [教程](https://www.mindspore.cn/tutorials/zh-CN/r1.6/index.html) 后部分和 [编程指南](https://www.mindspore.cn/docs/programming_guide/zh-CN/r1.6/index.html) 的后半段话题以及 [开发者精华分享](https://bbs.huaweicloud.com/forum/forumdisplay-fid-1076-orderby-lastpost-filter-typeid-typeid-1255sub.html) 中 + - EXPLANATION:[规格和说明](https://www.mindspore.cn/docs/note/zh-CN/r1.6/index.html) 及 [FAQ](https://www.mindspore.cn/docs/faq/zh-CN/r1.6/index.html) + - REFERENCE:[API 文档](https://www.mindspore.cn/docs/api/zh-CN/r1.6/index.htmls) + +MindSpore 的有自己独立的文档分类标准和风格,所以硬套本文提及的文档分类标准,结果会显得有些复杂。以上所列的各类文档中,《开发者精华分享》是比较独特的一个栏目,他更像是 MindSpore 搭建的开源社区平台,吸收了用户贡献的各种经验,包括 Numpy 的使用,MindSpore 的安装问题如何解决等社区贡献的知识。 + + +## 文档的完备性 & 宏观组织分析 + +现有 Paddle 文档,结构如下: + +- 整体介绍 + - 基本概念 + - 升级指南 + - 版本迁移工具 +- 模型开发 + - 10 分钟快速上手飞桨 + - 数据集的定义和加载 + - 数据预处理 + - 模型组网 + - 训练与预测验证 + - 单机多卡训练 + - 自定义指标 + - 模型保存与载入 + - 模型导出 ONNX 协议 +- VisualDL 工具 + - VisualDL 工具简介 + - VisualDL 使用指南 +- 动态图转静态图 + - 使用样例 + - 转换原理 + - 支持语法 + - 案例解析 + - 报错调试 +- 推理部署 + - 服务器部署 + - 移动端/嵌入式部署 + - 模型压缩 +- 分布式训练 + - 分布式训练开始 + - 使用 FleetAPI 进行分布式训练 +- 自定义算子 + - 自定义原生算子 + - 原生算子开发注意事项 + - 自定义外部算子 + - 自定义 Python 算子 + - Kernel Primitive API + - API 介绍 + - API 示例 +- 性能调优 + - 飞桨模型量化 +- 算子映射 + - Paddle 1.8 与 Paddle 2.0 API 映射表 + - PyTorch-PaddlePaddle API 映射表 +- 硬件支持 + - 飞桨产品硬件支持表 + - 昆仑 XPU 芯片运行飞桨 + - 海光 DCU 芯片运行飞桨 + - 昇腾 NPU 芯片运行飞桨 +- 参与开发 + - 本地开发指南 + - 提交 PR 注意事项 + - FAQ +- 环境变量 FLAGS + - cudnn + - 数值计算 + - 调试 + - check nan inf 工具 + - 设备管理 + - 分布式 + - 执行器 + - 存储管理 + - 曻腾 NPU + - 其它 + +### 完备性分析 + +综合 Paddle 及其它竞品,先罗列一个较为完备的“知识点体系”。即如果是各个级别的用户,面向他们应该提供哪类信息,做一个全集式的罗列。 + +- 初级用户:初级用户定位是未有使用深度学习框架完成项目的经验,如高校低年级学生 +- 中级用户:中级用户定位是通常意义上的算法工程师,在日常的项目中需要使用深度学习框架,但还不涉及较为“高级”的特性。如独立参与比赛的高校学生,工业界的初级、中级算法工程师。 +- 高级用户:需要紧随前沿使用框架高级特性的工业届、学术界用户。如复杂的并行技术、算子融合、AMP 等高级优化技术。 + +对应的信息分类和罗列: + +- 初级: + - 基本数据(Tensor) 的概念及基本使用 + - 基本操作(算子)的概念及基本使用 + - 数据加载 + - 如何组网 + - 如何训练 + - 保存与加载模型 + - 可视化 + - 动态图、静态图的概念及基本使用 + +- 中级: + - 动态图与静态图的转换 + - 如何转为 ONNX 格式 + - 如何部署 + - CV 领域的实践指南 + - NLP 领域的实践指南 + - 推荐系统领域的实践指南 + +- 高级: + - 如何自定义算子 + - “高级”优化特性(如量化、AMP 等) + - 框架设计文档 + +从内容完备性的角度看,飞桨应该是目前各个框架中完备性做得最好的,包括了以上除“框架设计文档”之外的所有点。并且提供了一系列与产业下沉,AI 助力有关的“产业实践文档”。 + +### 组织结构分析 + +从组织结构角度分析,以我个人的感受,飞桨还有一些值得讨论,和可能改进的地方。 + +#### 整体介绍 + +首先是 [整体介绍](https://www.paddlepaddle.org.cn/documentation/docs/zh/guides/01_paddle2.0_introduction/index_cn.html) 里的目录结构和内容可以考虑调整。 + +如 [整体介绍/基本概念](https://www.paddlepaddle.org.cn/documentation/docs/zh/guides/01_paddle2.0_introduction/basic_concept/index_cn.html) 中包括了以下内容: + +- Tensor 概念及介绍 +- Paddle 中的模型与层 +- 广播介绍 +- 自动微分 +- 自动混合精度训练 +- 梯度裁剪 + +这部分应该是面对想要了解飞桨并上手使用的初级用户准备的。所以它定位应该是 “Tutorial”。但是有些地方可能讨论改进: + +- [Paddle 中的模型与层](https://www.paddlepaddle.org.cn/documentation/docs/zh/guides/01_paddle2.0_introduction/basic_concept/layer_and_model_cn.html) 一节与“升级指南” 里的 [组网方式](https://www.paddlepaddle.org.cn/documentation/docs/zh/guides/01_paddle2.0_introduction/update_cn.html#sequential) 一节有内容重叠。 +- [广播介绍](https://www.paddlepaddle.org.cn/documentation/docs/zh/guides/01_paddle2.0_introduction/basic_concept/broadcasting_cn.html) 更像是 “Explanation” 类的东西,而且内容比较少,可以考虑放置到 API 文档中,以链接的方式引用就可以了。 +- [自动微分机制介绍](https://www.paddlepaddle.org.cn/documentation/docs/zh/guides/01_paddle2.0_introduction/basic_concept/autograd_cn.html) 一节的内容与 [PyTorch 的 Tutorial](https://pytorch.org/tutorials/beginner/basics/autogradqs_tutorial.html) 相比,在介绍 “飞桨自动微分运行机制” 时感觉内容选题复杂了一点。而在“飞桨中自动微分相关所有的使用方法说明” 一节中,没有继续细分“计算梯度”,“关闭梯度”等小标题,作为 Tutorial 感觉友好度还可以加强 +- [自动混合精度训练](https://www.paddlepaddle.org.cn/documentation/docs/zh/guides/01_paddle2.0_introduction/basic_concept/amp_cn.html) 和 [梯度剪裁](https://www.paddlepaddle.org.cn/documentation/docs/zh/guides/01_paddle2.0_introduction/basic_concept/gradient_clip_cn.html) 两节内容感觉归为 Guide 更合理,放在“基本概念”中会有点学习曲线陡增的感觉。 + +其次,在 [升级指南](https://www.paddlepaddle.org.cn/documentation/docs/zh/guides/01_paddle2.0_introduction/update_cn.html) 包含了这些内容: + +- 数据处理 +- 组网方式 +- 模型训练 +- 单机多卡启动 +- 模型保存 +- 推理 + +这里面包含了很多“干货”的内容,但是我觉得放在“升级指南”中有“明珠暗投”的风险。因为一般人对“升级指南”的刻板印象,应该类似是“relase log”级别的东西,可能会不会优先点开。 + +据我体验,升级指南中的 [使用高层 API](https://www.paddlepaddle.org.cn/documentation/docs/zh/guides/01_paddle2.0_introduction/update_cn.html#id4) 和 [使用基础 API](https://www.paddlepaddle.org.cn/documentation/docs/zh/guides/01_paddle2.0_introduction/update_cn.html#id5) 包含了其它地方没有的内容,这些内容被用户错过的话,是可惜的。 + +而升级指南中的 [单机多卡启动](https://www.paddlepaddle.org.cn/documentation/docs/zh/guides/01_paddle2.0_introduction/update_cn.html#danjiduokaqidong) 和 [分布式训练](https://www.paddlepaddle.org.cn/documentation/docs/zh/guides/06_distributed_training/index_cn.html) 中的内容非常接近,感觉可以考虑合并。 + +我建议可以对整体介绍中的内容进行重新组织,主要方向有: + +- “整体介绍部分”尽量瘦身,主要以“信息索引”存在 +- 将 “Tensor 概念介绍”、“模型与层”以及上文提到的升级指南中的操作性强又基础的内容,考虑与一级目录 [模型开发](https://www.paddlepaddle.org.cn/documentation/docs/zh/guides/02_paddle2.0_develop/index_cn.html) 合并 +- 将自动混合精度、梯度剪裁以及分布式训练有关的内容,整理为专门领域的 Guide,作为独立的一级目录或二级目录存在 + + +#### 其它一级目录 + +除了上文提到的个人看法外,飞桨的一级目录,大部分都内容充实、结构合理。只是对于少数章节,我个人觉得可以再讨论改进。 + +[性能调优](https://www.paddlepaddle.org.cn/documentation/docs/zh/guides/performance_improving/index_cn.html) 作为一个一级目录存在,但其中的二级目录只有 [模型量化](https://www.paddlepaddle.org.cn/documentation/docs/zh/guides/performance_improving/quantization.html) 一文。这显得有些单薄。不过在现有的目录结构下,这种选择可能已经是最优的了。我还没有具体的改进建议。 + +但是,如果未来考虑增加新栏目的话,感觉可以把增加一个“开发者实践”类型的栏目,其内容可以参考 MindSpore 的 [开发者精华分享](https://bbs.huaweicloud.com/forum/forumdisplay-fid-1076-orderby-lastpost-filter-typeid-typeid-1255sub.html)。将一些任务导向的话题,如量化、profiling 等“杂项”放在其中。 + +其次 [环境变量](https://www.paddlepaddle.org.cn/documentation/docs/zh/guides/flags/flags_cn.html) 这种纯粹的 flags 说明,应该归类为 Reference,感觉将它直接放到 API 文档中可能会更合理。 + +## 用户角色代入分析 + +### 初级用户 + +初级用户可以通过 [整体介绍](https://www.paddlepaddle.org.cn/documentation/docs/zh/guides/index_cn.html)、[模型开发](https://www.paddlepaddle.org.cn/documentation/docs/zh/guides/02_paddle2.0_develop/index_cn.html) 上手飞桨,掌握从数据加载、预处理到模型训练、导出到 ONNX 等各项基本技能。 + +### 中级用户 + +中级用户可以通过 [VisualDL 工具](https://www.paddlepaddle.org.cn/documentation/docs/zh/guides/03_VisualDL/index_cn.html)、[动态图转静态图](https://www.paddlepaddle.org.cn/documentation/docs/zh/guides/03_VisualDL/index_cn.html)、[推理部署](https://www.paddlepaddle.org.cn/documentation/docs/zh/guides/05_inference_deployment/index_cn.html)、以及 [应用实践](https://www.paddlepaddle.org.cn/documentation/docs/zh/practices/index_cn.html)、[分布式训练](https://www.paddlepaddle.org.cn/documentation/docs/zh/guides/06_distributed_training/index_cn.html) 中的各类信息,掌握实际落地过程中各个领域的遇到的模型调试、性能调优、部署等问题。 + +### 高级用户 + +想为飞桨开源项目增加功能的用户,可以参考 [自定义算子](https://www.paddlepaddle.org.cn/documentation/docs/zh/guides/07_new_op/index_cn.html) 了解如何增加算子,以及 [参与开发](https://www.paddlepaddle.org.cn/documentation/docs/zh/guides/10_contribution/index_cn.html) 了解提交 PR 的流程。 + +不过,其它框架,一般会有文档介绍它组件中的设计理念和原理,如 Pytorch 的这篇 [autograd](https://pytorch.org/docs/stable/notes/autograd.html),OneFlow 的一些 [技术博客](https://zhuanlan.zhihu.com/p/337851255),以及 MindSpore 的 [设计文档](https://www.mindspore.cn/docs/programming_guide/zh-CN/r1.6/design/technical_white_paper.html) (这个信息量偏薄弱点)。 + +在 Paddle 的文档体系中,好像没有找到类似的内容,这对于想学习 Paddle 底层原理甚至参与开源建设的爱好者,是一种遗憾。希望可以考虑推出。 + +## 报告总结 + +飞桨文档的内容完备性已经做到了同类产品中的顶尖水平,能够满足初级、中级以及定制开发用户的需要。 +但在个别文档结构上,存在一些可以去除冗余、调整层级的改进点,值得讨论。同时也期待飞桨能整理开放出设计文档,让更多人可以了解飞桨开源代码背后的原理和巧妙。 \ No newline at end of file diff --git a/docs/eval/images/documentation-system.png b/docs/eval/images/documentation-system.png new file mode 100644 index 0000000000000000000000000000000000000000..913f7e9119818989721c78b22d07ffd78fb4b622 GIT binary patch literal 50544 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 LHo^Vo@!)>|0yKNd literal 0 HcmV?d00001 From c5a1a9b03c5662cc9cf84927f307bcc32c8c43d9 Mon Sep 17 00:00:00 2001 From: yaochi Date: Sun, 1 May 2022 01:07:32 +0800 Subject: [PATCH 2/9] update --- docs/eval/evaluation_of_docs_system.md | 269 +++++++++++++++++++++++- docs/eval/images/blanks.png | Bin 0 -> 26233 bytes docs/eval/images/code-style-01.png | Bin 0 -> 16426 bytes docs/eval/images/code-style-02.png | Bin 0 -> 22168 bytes docs/eval/images/inconsistent-title.png | Bin 0 -> 27666 bytes docs/eval/images/outdated-article.png | Bin 0 -> 31973 bytes 6 files changed, 258 insertions(+), 11 deletions(-) create mode 100644 docs/eval/images/blanks.png create mode 100644 docs/eval/images/code-style-01.png create mode 100644 docs/eval/images/code-style-02.png create mode 100644 docs/eval/images/inconsistent-title.png create mode 100644 docs/eval/images/outdated-article.png diff --git a/docs/eval/evaluation_of_docs_system.md b/docs/eval/evaluation_of_docs_system.md index 215fbbedf05..9670d572570 100644 --- a/docs/eval/evaluation_of_docs_system.md +++ b/docs/eval/evaluation_of_docs_system.md @@ -288,7 +288,112 @@ TensorFlow 的文档规划,比较直接地匹配了本文所介绍的分类标 MindSpore 的有自己独立的文档分类标准和风格,所以硬套本文提及的文档分类标准,结果会显得有些复杂。以上所列的各类文档中,《开发者精华分享》是比较独特的一个栏目,他更像是 MindSpore 搭建的开源社区平台,吸收了用户贡献的各种经验,包括 Numpy 的使用,MindSpore 的安装问题如何解决等社区贡献的知识。 +**初学入门** + +- 初学教程 + - 基本介绍 + - 快速入门 + - 张量 Tensor + - 数据处理 + - 创建网络 + - 自动微分 + - 模型训练 + - 保存与加载 + - 推理与部署 +- 进阶 + - 进阶案例:线性拟合 + - 数据处理 + - 网络构建 + - 训练与评估 + - 动态图与静态图 +**应用实践** + +- 计算机视觉 + - ResNet50 网络进行图像分类 + - 图像分类迁移学习 + - 模型对抗攻击 + - 生成式对抗网络 +- 自然语言处理 + - 使用 RNN 实现情感分类 + - LSTM+CRF 实现序列标注 + +**深度开发** + +- 数据处理 + - 自动数据增强 + - 轻量化数据处理 + - 单节点数据缓存 + - 优化数据处理 + +- 算子执行 + - 算子分类 + - 运算重载 + - 自定义算子(CPU) + - 自定义算子(GPU) + - 自定义算子(Ascend) + - 自定义算子(基于 Custom 表达) + +- 模型推理 + - 模型推理总览 + - GPU/CPU推理 + - Ascend 910 AI 处理器上推理 + - Ascend 310 AI 处理器上使用 MindIR 模型进行推理 + - Ascend 310 AI 处理器上使用 AIR 模型进行推理 + +- 调试调优 + - 查看中间文件 + - Dump 功能调试 + - 自定义调试信息 + - 调用自定义类 + - 算子增量编译 + - 算子调优工具 + - 自动数据加速 + - 固定随机性以复现脚本运行结果 + +- 分布式并行 + 分布式并行总览 + 分布式集合通信原语 + 分布式并行训练基础样例(Ascend) + 分布式并行训练基础样例(GPU) + 分布式推理 + 保存和加载模型(HyBrid Parallel模式) + 分布式并行训练Transformer模型 + 鹏程·盘古模型网络多维度混合并行解析 + 分布式故障恢复 + +- 其他特性 + - 混合精度 + - 梯度累积算法 + - 自适应梯度求和算法 + - 降维训练算法 + +- 设计 + - 设计白皮书 + - 全场景统一 + - 函数式微分编程 + - 动静态图结合 + - 异构并行训练 + - 分布式并行 + - 中间表达 MindIR + - 高性能数据处理引擎 + - 图算融合加速引擎 + - 二阶优化 + - 可视化调试调优 + - 安全可信 + - 术语 + +- 迁移指南 + - 概述 + - 准备工作 + - 网络脚本分析 + - 网络脚本开发 + - 网络调试 + - 精度调试 + - 性能调试 + - 推理执行 + - 网络迁移调试实例 + - 常见问题 ### 完备性定义 @@ -301,28 +406,27 @@ MindSpore 的有自己独立的文档分类标准和风格,所以硬套本文 对应的信息分类和罗列: - 初级: - - 基本数据(Tensor) 的概念及基本使用 - - 基本操作(算子)的概念及基本使用 + - 基本数据(Tensor)和基本算子(Op) - 数据加载 - 如何组网 - 如何训练 - 保存与加载模型 - - 可视化 - - 动态图、静态图的概念及基本使用 + - 可视化、调优技巧 + - 自动微分 - 中级: - 动态图与静态图的转换 - - 如何转为 ONNX 格式 - - 如何部署 + - 部署相关 - CV 领域的实践指南 - NLP 领域的实践指南 - 推荐系统领域的实践指南 - 强化学习领域的实践指南 - 移动端相关 + - 从其它框架至本框架的迁移 - 高级: - 如何自定义算子 - - “高级”优化特性(如量化、AMP 等) + - 分布式训练 - 框架设计文档 ## 文档的完备性 & 宏观组织分析 @@ -413,11 +517,129 @@ MindSpore 的有自己独立的文档分类标准和风格,所以硬套本文 - 人脸关键点检测 - 点云处理:实现 PointNet 点云分类 - 自然语言处理 - - 用 N-Gram 模型在 + - 用 N-Gram 模型在莎士比亚文集中训练 word embedding + - IMDB 数据集使用 BOW 网络的文本分类 + - 使用预训练的词向量完成文本分类任务 + - 使用注意力机制的 LSTM 的机器翻译 + - 使用序列到序列模型完成数字加法 +- 推荐 + - 使用协同过滤实现电影推荐 +- 强化学习 + - 强化学习——Actor Critic Method + - 强化学习——Advantage Actor-Critic(A2C) + - 强化学习——Deep Deterministic Policy Gradient (DDPG) +- 时序数据 + - 通过AutoEncoder实现时序数据异常检测 +- 动转静 + - 使用动转静完成以图搜图 + ### 完备性分析 -从内容完备性的角度看,飞桨应该是目前各个框架中完备性做得最好的,包括了以上除“框架设计文档”之外的所有点。并且提供了一系列与产业下沉,AI 助力有关的“产业实践文档”。 +根据以上对同类软件的文档做了调研罗列的基础上,对它们的知识点,以及知识点对应的文章,做了初步的统计。 + +有几点说明: + +- TensorFlow、PaddlePaddle 因为已经将部署、移动端推理独立成了产品,所以以上表格中统计数据可能不准确,或未做统计 +- PaddlePaddle 的 [教程](https://www.paddlepaddle.org.cn/tutorials/projectdetail/3465990) 一栏中也包含了大量的文章,但是未做统计(因为不在 `docs` 仓库中),不过会在下文中的“组织结构分析中”纳入考量 + +| | TensorFlow | 数量 | PyTorch | 数量 | MindSpore | 数量 | PaddlePaddle | 数量 | +| ---------------------------- | ------------------------------------------------------------ | ---- | ------------------------------------------------------------ | ---- | ------------------------------------------------------------ | ---- | ------------------------------------------------------------ | ------ | +| 基本数据(Tensor)和基本算子 | Tensors Variables Tensor slicing Ragged tensor Sparse tensor DTensor concepts | 6 | Tensors Transforms Introduction to PyTorch Tensors | 3 | 张量 Tensor | 1 | Tensor概念介绍 | 1 | +| 数据加载与预处理 | Images CSV Numpy pandas.DataFrame TFRecord and tf.Example Additional formats with tf.io Text More text loading Classifying structured data with preprocessing layers Classfication on imbalanced data Time series forecasting Decision forest models | 13 | Datasets & Dataloaders | 1 | 数据处理 数据处理(进阶) 自动数据增强 轻量化数据处理 单节点数据缓存 优化数据处理 | 6 | 数据集的定义和加载 数据预处理 | 2 | +| 如何组网 | Modules, layers, and models | 1 | Build the Neural Network Building Models with PyTorch What is torch.nn really? Learing PyTorch with Examples | 4 | 创建网络 网络构建 | 2 | 模型组网 飞桨高层 API 使用指南 层与模型 | 3 | +| 如何训练 | Training loops NumPy API Checkpoint SavedModel | 4 | Optimization Model Parameters Traning wiht PyTorch | 2 | 模型训练 训练与评估 | 2 | 训练与预测验证 自定义指标 | 2 | +| 保存与加载模型 | Save and load Save and load(Distrbuted Training) | 2 | Save and Load the Model | 1 | 保存与加载 | 1 | 模型保存与载入 模型保存及加载(应用实践) | 2 | +| 可视化、调优技巧 | Overfit and underfit Tune hyperprameters with Keras Tuner Better performance with tf.function Profile TensorFlow performance Graph optimizaition Optimize GPU Performance Mixed precision | 7 | PyTorch TensorBoard Support Model Understanding with Captum Visualizing Models, Data, and Training with TensorBoard Profiling your PyTorch Module PyTorch Profiler with TensorBoard Hyperparameter tuning with Ray Tune Optimizing Vision Transformer Model for Deployment Parametrization Tutorial Pruning Tutorial Grokking PyTorch Intel CPU performance from first principles | 11 | 查看中间文件 Dump 功能调试 自定义调试信息 调用自定义类 算子增量编译 算子调优工具 自动数据加速 固定随机性以复现脚本运行结果 | 8 | VisualDL 工具简介 VisualDL 使用指南 飞桨模型量化 | 3 | +| 自动微分 | Automatic differentiation Advanced autodiff | 2 | Automatic Differentiation with torch.autograd The Fundamentals of Autograd | 2 | 自动微分 | 1 | 自动微分 | 1 | +| 动态图与静态图 | Graphs and functions | 1 | (torchscript 其实是静态图,不过归类到部署中了) | 0 | 动态图与静态图 | 1 | 使用样例 转换原理 支持语法 案例解析 报错调试 动态图 使用动转静完成以图搜图 | 7 | +| 部署相关 | https://www.tensorflow.org/tfx/tutorials 下的21篇文章 https://www.tensorflow.org/tfx/guide 下的30+文章 | 50+ | Deploying PyTorch in Python via a REST API with Flask Introduction to TorchScript Loading a TorchScript Model in C++ (optional) Exporting a Model from PyTorch to ONNX and Running it using ONNX Runtime Real Time Inference on Raspberry Pi 4 | 6 | 推理与部署 模型推理总览 GPU/CPU推理 Ascend 910 AI 处理器上推理 Ascend 310 AI 处理器上使用 MindIR 模型进行推理 Ascend 310 AI 处理器上使用 AIR 模型进行推理 | 7 | 服务器部署 移动端/嵌入式部署 模型压缩 https://www.paddlepaddle.org.cn/lite/v2.10/guide/introduction.html 下 50+ 篇文章 | 50+ | +| CV 领域相关 | Basic image classfication Convolutional Neural Network Image classification Transfer learning and fine-tuning Transfer learning with TF Hub Data Augmentaion Image segmentation Object detection with TF Hub Neural style transfer DeepDream DCGAN Pix2Pix CycleGAN Adversarial FGSM Intro to Autoencoders Variational Autoencoder | 16 | TorchVision Object Detection Finetuning Tutorial Transfer Learning for Computer Vision Tutorial Adversarial Example Generation DCGAN Tutorial Spatial Tansformer Networks Tutorial Optimizaing Vision Transformer Model for Deployment Quantized Transfer Learning for Computer Vision Tutorial | 7 | ResNet50 网络进行图像分类 图像分类迁移学习 模型对抗攻击 生成式对抗网络 | 4 | 使用 LeNet 在 MNIST 数据集实现图像分类 使用卷积神经网络进行图像分类 基于图片相似度的图片搜索 基于U-Net卷积神经网络实现宠物图像分割 通过OCR实现验证码识别 通过Sub-Pixel实现图像超分辨率 人脸关键点检测 点云处理:实现 PointNet 点云分类 | 7 | +| NLP 领域相关 | Basic text classification Text classification with TF Hub Word embeddings Word2Vec Text classification with an RNN classify Text with BERT Solve GLUE tasks using BERT on TPU Neural machine translation with attention Image captioning | 9 | Language Modeling with nn.Transformer and TorchText NLP From Scratch: Classifying Names with a Character-Level RNN NLP From Scratch: Generating Names with a Character-Level RNN NLP From Scratch: Translation with a Sequence to Sequence Network and Attention Text classification with the torchtext library Language Translation with nn.Transformer and torchtext Dynamic Quantization on an LSTM Word Language Model Dynamic Quantization on BERT | 8 | 使用 RNN 实现情感分类 LSTM+CRF 实现序列标注 | 2 | 用 N-Gram 模型在莎士比亚文集中训练 word embedding IMDB 数据集使用 BOW 网络的文本分类 使用预训练的词向量完成文本分类任务 使用注意力机制的 LSTM 的机器翻译 使用序列到序列模型完成数字加法 | 5 | +| 语音领域相关 | | | Audio I/O Audio Resampling Audio Data Augmentation Audio Feature Extractions Audio Feature Augmentation Audio Datasets Speech Recognition with Wav2Vec2 Speech Command Classification with torchaudio Text-to-speech with torchaudio Forced Alignment with Wav2Vec2 | 10 | | 0 | | 0 | +| 推荐领域相关 | Recommenders | 1 | Introduction to TorchRec | 1 | | 0 | 使用协同过滤实现电影推荐 | 1 | +| 强化学习领域相关 | Actor-Critic method TensorFlow agents | 2 | 0 | 0 | | 0 | 强化学习——Actor Critic Method 强化学习——Advantage Actor-Critic(A2C) 强化学习——Deep Deterministic Policy Gradient (DDPG) | 3 | +| 移动端相关 | 独立的栏目 https://www.tensorflow.org/lite | 10+ | Image Segmentation DeepLabV3 on iOS Image Segmentation DeepLabV3 on Android | 2 | | 0 | Paddle Lite 中独立存在 | 未统计 | +| 框架之间的迁移相关 | | | | 0 | 概述 准备工作 网络脚本分析 网络脚本开发 网络调试 精度调试 性能调试 推理执行 网络迁移调试实例 常见问题 | 10 | Paddle 1.8 与 Paddle 2.0 API 映射表 PyTorch-PaddlePaddle API 映射表 版本迁移工具 | 3 | +| 自定义算子 | Tensors and operations Custom layers Custom traning: walkthrough Create an op Extension types | 5 | Double Backward with Custom Functions Fusing Convolution and Batch Norm using Custom Function Custom C++ and CUDA Extensions Extending TorchScript with Custom C++ Operators Extending TorchScript with Custom C++ Classes Registering a Dispatched Operator in C++ Extending dispatcher for a new backend in C++ | 7 | 算子分类 运算重载 自定义算子(CPU) 自定义算子(GPU) 自定义算子(Ascend) 自定义算子(基于 Custom 表达) | 6 | 自定义原生算子 原生算子开发注意事项 自定义外部算子 自定义 Python 算子 API 介绍 API 示例 本地开发指南 提交 PR 注意事项 FAQ | 9 | +| 分布式训练 | Distributed training with Kereas Distributed training with DTensors Using DTensors with Keras Custom training loops Multi-worker training with Keras Multi-worker training with CTL Parameter Server Training Distributed input Distributed training | 9 | PyTorch Distributed Overview Single-Machine Model Parallel Best PracticesGetting Started with Distributed Data Parallel Writing Distributed Applications with PyTorch Getting Started with Fully Sharded Data Prallel Customize Process Group Backends Using Cpp Extension Getting Started with Distributed RPC Framework Implementing a Parameter Server Using Distributed RPC Framework Distributed Pipeline Parallelsim using RPC Implementing Batch RPC Processing Using Asynchronous Executions Combining Distributed DataPrallel with Distributed RPC Framework Training Transformer models using Pipeline Parallelism Training Transformer models using Distributed Data Parallel and Pipeline Parallelism Distributed Training with Uneven Inputs Using the Join Context Manager | 16 | 分布式并行总览 分布式集合通信原语 分布式并行训练基础样例(Ascend) 分布式并行训练基础样例(GPU) 分布式推理 保存和加载模型(HyBrid Parallel模式) 分布式并行训练Transformer模型 鹏程·盘古模型网络多维度混合并行解析 分布式故障恢复 | 9 | 单机多卡训练 分布式训练开始 使用 FleetAPI 进行分布式训练 | 3 | +| 框架设计文档 | Random number generation | 1 | 分散在 API 文档、源码中,其实比较丰富。30+ | 30+ | 设计白皮书 全场景统一 函数式微分编程 动静态图结合 异构并行训练 分布式并行 中间表达 MindIR 高性能数据处理引擎 图算融合加速引擎 二阶优化 可视化调试调优 安全可信 术语 | 13 | | 0 | +| 其它 | Integrated gradients Uncertainty quantification with SNGP Probabilistic regression Keras一级标题下的13篇文章 Thinking in TensorFlow 2 Data input pipelines 一级标题下的3篇 GPU TPU | 20 | Learn the Basics Quickstart Deep Learning with PyTorch: A 60 Minute Blitz Building a Convolution/Batch Norm fuser in FX Building a Simple CPU Performance Profiler with FX Channels Last Memory Format in PyTorch Forward-mode Automatic Differentiation Using the PyTorch C++ Frontend Dynamic Parallelism in TorchScript Autograd in C++ Frontend Static Quantization with Eager Model in PyTorch | 11 | 基本介绍 快速入门 进阶案例:线性拟合 混合精度 梯度累积算法 自适应梯度求和算法 降维训练算法 | 7 | 10 分钟快速上手飞桨 使用线性回归预测波士顿房价 模型导出 ONNX 协议 飞桨产品硬件支持表 昆仑 XPU 芯片运行飞桨 海光 DCU 芯片运行飞桨 昇腾 NPU 芯片运行飞桨 环境变量 FLAGS 下9篇 hello paddle:从普通程序走向机器学习程序 通过AutoEncoder实现时序数据异常检测 广播介绍 自动混合精度训练 梯度裁剪 升级指南 | 20+ | + +可以看除,PaddlePaddle 在文档上是比较完备的,但是在个别领域,还比较薄弱甚至空缺,主要是: + +- 语音领域是空缺的 +- 与 PyTorch 相比,分布式领域的文档还比较薄弱 +- 框架设计文档在官方网站上也空缺 + +### 行文风格分析 + +整体而言,PaddlePaddle 的文档保持了较高的水准。不过因为精力有限,笔者虽然有较长的 Paddle 使用经验,但是也没有对所有文档做“深入分析”,在此仅针对一些有代表的案例,发表自己的看法,讨论下是否有改进的必要。 + +**代码风格的统一** + +首先,我认为应该在形式上,尽量追求统一,形式上的“统一美感”,可以给读者留下好的第一印象。 + +文章中有些地方出现了代码高亮格式的不一致,甚至是同一篇文章中就有高亮风格不一致的地方,如 [自定义指标](https://www.paddlepaddle.org.cn/documentation/docs/zh/guides/02_paddle2.0_develop/07_customize_cn.html#zidingyizhibiao) 一文中,一些代码中 docstring 有高亮,一些没有: + +![](./images/code-style-01.png) +![](./images/code-style-02.png) + +**标题的统一** + +其次,有些二级标题,在导航栏的显示名称,与导航页面的显示名称,是不一致的: + +![](./images/inconsistent-title.png) + +**文章的新旧更迭** + +还有一些文章的链接,已经失效了,比如 + +有些文章中引用的链接,虽然没有失效,但是其实不应该引用,或者需要做更新。比如 [使用动转静完成以图搜图](https://www.paddlepaddle.org.cn/documentation/docs/zh/practices/jit/image_search_with_jit.html) 一文中引用了 [基于图片相似度的图片搜索](https://www.paddlepaddle.org.cn/documentation/docs/zh/tutorial/cv_case/image_search/image_search.html),但是后者其实已经是一篇“孤岛文章”,并没有被纳入到 Paddle 的文档体系中: + +![](./images/outdated-article.png) + +很可能应该被 [基于图片相似度的图片搜索](https://www.paddlepaddle.org.cn/documentation/docs/zh/practices/cv/image_search.html) 替换。 + +这类问题,仔细找的话还可以找到不少,不过定位所有这类问题,超出了本文的范围,建议可以组织人手做一次系统的摸排。 + +**空格的细节** + +中文和英文之间,是否有空格,应该没有严格的规定,但是在官方文档中,应该统一,要么都有空格,要么都没有。如果混用的话,也会有不协调的感觉。 + +![](./images/blanks.png) + + +### 内容分析 + +按照本文开头谈及的“文档体系分类标准”, Tutorial 和 Guide 是两类相似,但是又不同的文档。一般而言,Tutorial 的风格更像一堂课,需要动手操作 steps,也需要介绍“只是概念”。而 Guide 是解决问题为导向的,需要一系列的 steps,以及较为直接的解决问题。 + +因为 Paddle 中的一些文章,并没有显式地说明到底是 Tutorial 还是 Guide。笔者只能根据自己的感受主观上判断,然后依据 Tutorial 或 Guide 的要求,来做分析,不一定准确,仅供参考。 + +我认为,Paddle 当前文档中的 Tutorial,特别是初级内容部分,都很好的遵循了 Tutorial 的写作要求,如 [基本概念](https://www.paddlepaddle.org.cn/documentation/docs/zh/guides/01_paddle2.0_introduction/basic_concept/index_cn.html) 中的所有文章和 [模型开发](https://www.paddlepaddle.org.cn/documentation/docs/zh/guides/02_paddle2.0_develop/index_cn.html) 中的大部分文章。 + +但是,对于一些类别为 Guide 的文章,往往还有提升空间。以一级标题 [动态图转静态图](https://www.paddlepaddle.org.cn/documentation/docs/zh/guides/04_dygraph_to_static/index_cn.html) 中的文章为例,我们继续讨论: + +**不必要的拆黑箱** + +在 [使用样例](https://www.paddlepaddle.org.cn/documentation/docs/zh/guides/04_dygraph_to_static/basic_usage_cn.html) 一文中,除了提供直接可运行的 steps 之外,还提供了对于用户而言,比较复杂的 “@to_static 的基本执行流程如下图”: + +![](https://githubraw.cdn.bcebos.com/PaddlePaddle/docs/develop/docs/guides/04_dygraph_to_static/images/to_static_train.png) + +但是这个流程图个人认为可以在此省去,或者直接移动到 [转换原理](https://www.paddlepaddle.org.cn/documentation/docs/zh/guides/04_dygraph_to_static/principle_cn.html) 一文中。 + +**缺乏 steps** + +在 [支持语法](https://www.paddlepaddle.org.cn/documentation/docs/zh/guides/04_dygraph_to_static/principle_cn.html) 一文中,几乎都是大量罗列,而比较缺少代码的实例。 + +当然,静态图所支持的语法限制,本身就难“正向”做展示。在这里,我建议可以考虑,干脆“反其道行之”,展示“反面操作”,即如果使用的语法超出了静态图的范围,会报怎么样的错误,如何纠正。这样的“做中学”,可能可以给读者更深的印象。而将现有的这种大而全的正想罗列,放入到 API 文档中。 + +**缺简单易复现的环境** + +在 [报错调试](https://www.paddlepaddle.org.cn/documentation/docs/zh/guides/04_dygraph_to_static/debugging_cn.html) 一文中,细致地教用户如何看错误信息,以及介绍相关的多种工具,这都是非常友好的。但是美中不足,并没有配套的仓库。如果能为用户专门准备一个配套的“试错仓库”,用户克隆后,可以直接复现这类错误,并且根据文档定位、纠正,这样可能会更友好。 + + + ### 组织结构分析 @@ -475,6 +697,25 @@ MindSpore 的有自己独立的文档分类标准和风格,所以硬套本文 其次 [环境变量](https://www.paddlepaddle.org.cn/documentation/docs/zh/guides/flags/flags_cn.html) 这种纯粹的 flags 说明,应该归类为 Reference,感觉将它直接放到 API 文档中可能会更合理。 +#### 与《教程》栏目的大量重叠 + +[教程](https://www.paddlepaddle.org.cn/tutorials/projectdetail/3465990) 一栏下包括了三类个子栏目: + +- 零基础实践深度学习 +- 产业级实践深度学习 +- 飞桨产业实践范例库 + +这些内容在 [PaddlePaddle/docs](https://github.com/PaddlePaddle/docs/) 仓库似乎找不到,有可能独立于 [文档](https://www.paddlepaddle.org.cn/documentation/docs/zh/guides/index_cn.html) 团队之外的另一个团队做的。 + +但是从用户的角度看,它们之间有大量的内容重叠,比如: + +- [使用飞桨重写波士顿房价预测任务](https://www.paddlepaddle.org.cn/tutorials/projectdetail/3469365) VS [使用线性回归预测波士顿房价](https://www.paddlepaddle.org.cn/documentation/docs/zh/practices/quick_start/linear_regression.html) +- [分布式训练](https://www.paddlepaddle.org.cn/tutorials/projectdetail/2538251) VS [分布式训练](https://www.paddlepaddle.org.cn/documentation/docs/zh/guides/06_distributed_training/index_cn.html) +- [外部用户如何贡献代码](https://www.paddlepaddle.org.cn/tutorials/projectdetail/2538259) VS [参与开发](https://www.paddlepaddle.org.cn/documentation/docs/zh/guides/10_contribution/index_cn.html) +- ... + +它们有些是内容上就是同质的,有些是标题上比较接近(但是内容风格不一致)。我建议如果能更加清晰地将他们做“差异化”处理,可能会更好。 + ## 用户角色代入分析 ### 初级用户 @@ -495,5 +736,11 @@ MindSpore 的有自己独立的文档分类标准和风格,所以硬套本文 ## 报告总结 -飞桨文档的内容完备性已经做到了同类产品中的顶尖水平,能够满足初级、中级以及定制开发用户的需要。 -但在个别文档结构上,存在一些可以去除冗余、调整层级的改进点,值得讨论。同时也期待飞桨能整理开放出设计文档,让更多人可以了解飞桨开源代码背后的原理和巧妙。 \ No newline at end of file +飞桨文档的完备性、质量和组织结构都已经达到了很高的水准,但是在此分析过程中依然发现一些可以讨论、改进的点,包括: + +- 完备性方面:可加强语音、分布式、设计文档方面的内容 +- 组织结构方面:一些二级标题升级为一级标题;与“教程”中重叠内容较多的文章,考虑加强区分标志 +- 行文风格方面:建议对行文形式上做出更显式的要求(如中英文之间的空格),并做一次彻底的摸排 +- 内容方面:Tutorial 类别质量已经很高,Guide 类别的部分文章可能存在“不必要的知识过多”,“实践性不足”,“配套不完善”的问题,期待改进。 + +个人非常期待飞桨能整理开放出设计文档,让更多人可以了解飞桨开源代码背后的原理和巧妙。 \ No newline at end of file diff --git a/docs/eval/images/blanks.png b/docs/eval/images/blanks.png new file mode 100644 index 0000000000000000000000000000000000000000..dc67d0f7133f6ec4acce906f322aa9c0b8751fc9 GIT binary patch literal 26233 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 literal 0 HcmV?d00001 diff --git a/docs/eval/images/code-style-01.png b/docs/eval/images/code-style-01.png new file mode 100644 index 0000000000000000000000000000000000000000..717c1b047d5bca17d2bf83ce372c00e650a19c2f GIT binary patch literal 16426 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 a3m$Lu+2!n~x&2@PqoZCY4pkmJllBh|O&)Oo literal 0 HcmV?d00001 diff --git a/docs/eval/images/inconsistent-title.png b/docs/eval/images/inconsistent-title.png new file mode 100644 index 0000000000000000000000000000000000000000..f3ea88b7d5914968fc3b46fe4660ccfdcd5a0b83 GIT binary patch literal 27666 zcmd?RXH-+|7d?og!9o!WLTD;Yia>x!2Rj|5haQLlLMQ@Kf)p_bB29V+rI!#w?_fYd zy0ip{fJh0w7wP}->aWeG`7mqES~DM9+$8s&`_yyx*=IinJ=0X8y8ygEMMXuYqWnmk zii#RSMRm&M9Dwo-7c%!H<ZKVfP*lxBt%7-)7_ciWQQ5A<@Jg_)R`F#F`vY`tV z6@Bx`zf-M_xzDMnkU1)k?(2G(E!Bq-;d%tY!<>8fAX*z-9ao)?-Ne#z~ zE*A2eojXtcVNVsW(Eo7v{e3__7W3M2JQkK)OUZCB9CT0h60jTfv=}Nw=;Vnk){C1s zeGS7qMP-H!T&v$OU7>d$_YNmD%=Wg@$4yTcWvlFp_jtjpCIZ6g`ZCSu8s{K9u4SoZ zT!$S}FBgrTD3UzKOfYpvmy8%rQAX(VONb;IzV-8AU{mYP;(7C0vYDh}9I%l0VN}vJ zJ%{g!FT175ynv2Gc6(V#-Q8m4u=3P03%XeL9Lbpq)VmWqB7g0W*)c2OW$3KLFVN5$ zbXF_z0KeZ}p;wJ>3!g6C%sNy#3dA0-4gu8m2Pf+k{Rujh*HekI6S|=Cu8Rq)pV2hU z^VY}dq6Wx`S)Fk~jW~n5L~a0bfL+MG2gufwI~_pYWANqnn)E}fNRQ&R`+2<)wY%{f zWp#%K%%8Tdo|sb)bQOotFetD&)Glqm`1zUGk%DQMQI){rwNU_-sljU*+yTm=A2LoRc@(mpm%bJ6@AI$j0+9=pvqpD6Mm>SO^@WjEKb zU;^oVN)MJ}7N4Vb?Mnb^AtB7PDp7Jh+(F!T#`ESQH!Vnd;!|5UTWxV)q*Ua4pl#M5 z1MRU2{<&(zmA2x=+_}lO6?Y=+sXuL9{?puqx+zQDJiIm+cgvFvxs52bcCtvxrSd^N zE-rwQTaT9?%gDVD?sp4)J1(51~3@YgH|`s!>aB+0Oc7xFE2SSOe}WZQ8H z^xVEBVgF|q0iu0{Eo zh5Vn@v7cOj&isGkfzCJ7X;pHI4RCX*)h}!Dzg!Mxdta34zN#+vxOrqhWh3>XfBVHY zvgpEo!}Tc77YE<*>AaM8=h6LX6z&M~7U^rNGgPKhCT-%Q6oneOjuq&5cOmMEP7Z!; zf7?IUyk5F)A{!0L>W(n32#UMdTtrFSCB_{R14_$|W;&Y3TDtOF#ULVA0Y#$s^=gfq^xVO8 zKcPb#*SN;r~5bwUvQ@V$N!b7DK0Hi(H5WQ!; zWD=amu~3P=M!$64afppHb`XFgKU43SGZtnO>Bh%O5wIl@N<01=A~$WdZs9Jr5P)BbQlxtD-9UZ04y{uG>^${ZxfX&!mi^u$6199noH*DaQlAo%VITn znWIO?j*9Gcb987WD#`j9n?{Suxu2YAoUJ&1JD>h8tHS_p`|{=YETR<0i~I6-K$2k5j%JjUFezV&Os5=j-Cgm-vK+8l$)d~31o7kvbQ3xS7 z`5JbVGm4evD-=HN>$y~JQP|2G*${2nUm!yNY8i>W!8^Zr5li<Cm3@ockFU zu+E~4C62O)@BXXJooKv_PwRAZ>ujWxL@)8g*8KiEv#HDhwIFQoczMw)_~+0(47a$V8I%pf(T{l+qpJPuGA*Cl908&c3prz#gxv`? z@)D384i|+Zz5No}-nof`@mgt&#sT^(vk=9e{J-q&V{v#CI*~SZBXN5{WWdw7dCPF@ zb`e6+xqlT*j^UMrWF!dU%LW(r&HF8IE<@Jct>OOloIilw9Ca;b<cUc`=fRRYe zwn@e)OR$NFIBgUQ2JM@yz*M!XQTwVc*83D~?0QoKZY5x8LQdZLNsjpoy(-jk?vsoE z^BVXalWU=!hAWOBHLm#J;?Da`Yq*`u8}plfEntXJ^T>WrN9SN_sw0)j4RluBv(BB^ zf~MWn-o5E1iyhPY9&W%zDk>}bKRzP3z2OClHod1YkHdqrUPNJJXOOGjoJS##vLCWK znhk+Nj$?8YYQo(N#^cVO2PTxIY#_^VvFtaX;OO_SOjXW=; zcI1Fv{|Xc;=$fe8DSE5L87=FxX(MH1YXc&Zpl??O_t}!JudmqH)02)%lxk;2;-{A> z{x*5!@5=tT*m!rDDdl97P+oKpHW(d!5Ju?5dG@aMex|rKCjLpe>=_o!9m=crR*YSp zHnF42q~pE$eD@U2Zsiu@O8M56nndPM6fspWdhJL{KwaORvH1OdZKLU{=25w<2tE1hUCiJ8bxP8lO}~Q}5^jSF<2YAa zs&rbie(x8K+>m!DHSqkKLtnR~zj)_Gxx0;SuZCQDsvP%{cw3tzYPbFC8NNI`*?D$U z7cFquDoZ7P5fS33`}h^%s-Lb|!)+Uxp~$13-tdO#C<%VPxpCBbp0;tNnG~%paKP%L zL)8Qf&e|6nR}|?ymdtJXyuZ#VC?cwQNJ6k}hd_1nX>jMNRwb{vE@H>Dmx>wfI%uk= zt+}%k7=kE~g|zMjbf`@_=~o@7*}mHYVlpN^Ymib5Vy-_a+|ckV{U|EpZj#jC@xX`q zcQ!SbVu_S}*jOdd&0I{v8@=%!f12tw9dwkI@Q}ePq#=Ow)$-hL#yxc%cdfu-x3%0EgYDZQs+~D;56!PDklM8wZqYSakG!lT{mIf zcKD!!5ZBAPo5t8(JG+M~@{%Zpt{&Dsh+AAbWKyA`daXi%qdc+(405Z_Af|_QzvsuX zZ!?~H7ge?aTcJU7zlr4JE6aQBKN=>wD z01E~no!qJpM66dZQ{a7X^}()vhJeZ4utaI%DEa&eBElr$FN?b_&RIA4?JqN=9Uqu8 z@h+@1T^X02kL?17IknM6u#wpLz|RRoHi=~!GmrWUBN$NtBpV{lGE724VWIfoTE=Zy zC9JQ8S*VP|$Vg5c-Y0yFX;76LoPV{+;evv=u7`7&vL9>{Ab^GMsjGl}(}FH*>v4Eu zBwnUQWYMi5{O%Rd8P?sfB137G<%Jf z&@e75Z-?s8v*=-eYZyf*yU(6Ur`O8LVJ^i%KUU6X@~RirMmn#PP`!1yeEq~N-+k>m zhTl6Hl7&n%3ne+Y=MUUdNj+SgMvi!@s7J`PHS09UJJo!kbo6*?!?|Cu{RlEz=|jvyBA z33Xi^{it_%e*Upe{Z7EpKm0U-gy2d#~!z7CS$?C|IW}Wd`~L&`}rZ(_dX1tfd*~3WA(%DFX8~^bQq7y?_t4X}JFYQQFZAZMig-~lB zQE-`t+nMY4nO{3MFdY-;R#&2LihTFMRyty3?~5;kqN_dg^femOmc`%faST4q^O$iG zagDlSk{MI}V(_QEr*+`MN^sj9Oues~kh#r!#r#?`08(DsvnTb%T7m12q^6mjRW1r^ zAu3Br>u&m66=Y3)K%vJT7fd^EM1T&(9B?2^oEBuN}B<@7hly7bUnEA2LR zyfhmcT{XqNccP621*XTPaboMU6qZ#BEP7sbtNE09EZpfI!Adi4AF$fHPtpBnm1lSh9y*Se;gau{<5`IBg%Z{PpD9j}p$=?|o0L@N52MT(IUj5VWleGD@ z3Z62>zm`s}sd&%+1FI?PpMu@5{%QBgHB|fmFAqdlOF+UE+@wx8uU&)w6I3_xUeL|I zcBO&O~-8-yV}zj#}4#I!`J&ck=`{QhhF?z=y5x565X46kgtzb6sSS zY}Ba6w`;^O^MQ;j!kBRyNq0jt>*)M7^(cYhg#A)PyRIfp5J(OeY3RM=*#y-I;^T@F zu^l|wt%)Dq8x}^hhD#9D+~#hDWpr-1OF)g2+4zUGYU>`PW{|t8Z=lH9uvhsHX|-Tq zvPd5b6b7rMqAs^NIn>o~*P2!Q*V`!I#%g}3zsH|?XOvUnc(+kVoiP5Eufb*DPLdj3 zY&`EU{xXHAiecp$&Weu+NU6VF(!PIr^$RPC+4>bDSfr|?y!*G@jD)BJyb>p&T$+4PG{&Lh{p zIse{fw;;t7JU*W$=1ZzD8*!?&hu^{2iF;!Ut6U!;>fe`}CJMvGne;n<^7L?2mM`VQ z8zw)5(-4~wI$@U=nQKzV0ho1gJ1f0!cdL+2ymvdc6&4^=)fVOUhO5d*}>ceHq z9K5~2=)o&_WWeksbS5f{kJV8u?j{-~nLxec)s{#grn`=+u|;LsFOazc7htpZ>yNV+ z+E|G%zaw>fiX2-`Qqm2;-`rgdekT8hJi{Xw1k?ynq}jk%sB`fp&+E8*W7#a=v$JNO zlMBp0V_fd?!nDQEVCH`8ApUnjd6dG%jmRz8FuVY%qc3yi$D?n|?MJFE)-8mGZJx1Y zjCWV$(ddzY&a}BwzZ9pKb-yP1(_lFsdWx!(;SYn7Y!vOcM(d8tzxM<1ZR;~+Z=Urw zLua_PCGSmfNb}mGC@$}rjXQK|or1dEwOwa;U|4lag_VgKr7MViJ26LL4Zw3LPRFjO z4YLIiGivNygj)_2*A8Z{Fs(JCfjQ4y?+KI?p`wEL{*8!o0NxCyDXZuBe9=6-(coS} zH4Zqy8eI&_rD@6ggt%D|7w#&cOmZ^qTa!4m{`kZ3j@4)#c))qgW{YiRLzw7IRE77I zY)Eh?7Cmt_xz5vT!{hzj#g$GU)RV4$$fi7M>t19>WH$&7K>))P9Sf9OPda<&FI^CxLdY4jZk_N*f>5P)#XdCdEjQFJTrrVfdr`Q4N$p~6~v_(RECv@p{ z=Ywkc$3_YY;Jhs-_oUzwFT@%BruX72P6X6F31-;fown{!B<@$W#DbnyLJ@%-vo2Fk ze4tv6{aQ1muvr?G)kSH-=YT&{Gd?|%HIDgX?5S-d7B5e~ibU$*%xSn<6k~sWPXYR< zEKQ$o@7<*Cm7%P=)I6u$VLp}BPFYKjU9=HOj8zP;@_H)8F53p^YV)1nD_zUKX-ooR z9O;@?55U-aT!WAnuSZ34lFg$zU!V!QdO$OmX%Cu>0`qXaL>8Ul)Y!bZr*ylkUhN+3 z4O59t|1&UV_XIQj5S-i|OZ4+edxE)3RuH54P}KrFFs*$^{ccOU5QX<^U#-gLBj4*w z?0yVSf1=xuDh_ZKZLvF`7S9;ynO+@P+lV~6g1)waB#T#wS7lFC0j;HlDIx6hkAHWb zrVRM5g&i#x9|J2=H=lOx|LFleV}~peRfwkw3F2pP->XQ#hzvRYHZ zDSgy5CfiJjB*xiD7L`(O6wF@7`1qWC858ilOvgQ4wCC{}&Y76O^;@%3o9pgssJHD0 zVVD!O8~$Qla4}QMgIAc-$3nT=vj}dha7@`uBvyWOF`Z(Q zNDv5)7T;k03gwyMM=Is92;CG(+WJIPTN-hr)vs=e7p6ENORPKYOLQ*YlUzGyDz05U z#~8$a*@YXG7|SZe&$Wf|TUU>*C`?;9Zh2S^+SH1}KeWjx$JyYP&n!)f=HmsZk8Z7+ z>A<)rXJNSZHBY>=T`5d>#F40M{S^J_-KoYHQ*r~KLrv|2Pj<2J?v`$1(#wNT^0$yr zYo5+@`hElKCWU<3R3v3cY(cHR5%9Ji%VSyQh3bBQ}lry6{)KF}(`b0WGI<28Q%xQF<7IU~E) zJN9iP*rM+g|?~`x62tfk?@cY*0{YSpka?if<86j9^BSmF~Op(#ds?ZHuuWm z342bxSq&lQ(33(>4VMT57Szm-j+^Rf8aPsq#!4p=R?=?sq^;ENG^~yv@5hbG2!MnL zow@k=jdvfJv%PjyGXY8)(~ynC&LlptHEKUmc(QHd5wnoQ%AatJqgdp;z~$P??jBGy zetb`AZ(v8&`*49F8WBkz)CywM61P+=`0{y5R#yNdmf9Ba5~O9>hp8^n-hg){=^dpA zJ+&>f9vY?~vfd2@ex9XMnCbYpd#XL z^mOK~0j;mAi~uXK=g@DN?w>?`3M^Zag;)w5Z95X1$O=2V+UtgWl+=vk1}aClhrfLM zW-d*r82DhiL9-&rxzjR2*5xi{?QQzHdbgtc^tal!t_AwOX{k`(8(( zi~iOORkB(h(ZzzLs-4j>Nn$-vmDI!=Nn?`cS+dV>^>|p|zTZ0c=Ux+5Ar$EGkw+?6 zVO`pH*FQe_N2dos&Aq}dQ7;a^KBhdY(mp&+d|<=z7w|aH=|_PWCt>bIj|g&GV2Iht zee;5doF3M5j3df_5N^CI8cr9T$b-y&L|_g&RoV!nP-6U1$6>M7o-YmB7jlX+!IC ziI+q7G?ULwNcw{PmmDuzEERx?S^r51I$8fdBO0#2*7P)$sfpqE-npW~;Y)75-2RS= z9OB+5@PbOz@lWa|O5?S>-3~Q8>?T}VK6oJX;mrxweT}02gL0&Qjuq*JUzp)l+jJ?S zok-l#mo<$*i9w!v&GfDkdf0-M0vzQz#`f|959N4br86`fedXjBgC#ef4jDI^?sB^a83f`@se=)=v?tHMF{h0#GV5AD% zE8+J5u|CgRklaCH zxZctQ5=jAIu_?Xm;KJVS1>i`uw08l-I3Z13)54op|Jse^p>pl`9PH5gP9AnCOUdYst=RIa+)Vrjmj&Q8?VqZJ^BmK_@1|_aIC#L9*hA+rrhq42>ldy z^p)Xl&iEQ(bttZpO_l^zjna;fxb@wDYeFmWBc(k2hB>sv7j!Q>Z2&4=d*5)k-2~C7 zt&kKKy&{jbwN{-cx#>K#Y1Q2#vt;AcurL{rkT}nXyS> zMjuD6MwbIJG-Zod{9GvGOa^M$=7#6l1C~-T2wV{k9W!uS z>MJjURUl_mNMagCf%g_hwyT82Yu2w!dBse|_;hZ?nD%eoEnOdOl;%%MtzAZTi$Rn~ z4ycBHg_r7Z-!U0_EaTjGYI9A?e&w0qzjZX7dt+3;gX9M@yw-Ea1@G3j*qCzHLf79- zygQhTXl?dw@NxGbZ40(HI?IWrp0YiEgq$gmu<{x9^JGo9T3aA40Wl3<)0^Q1`SGOA z1%+Q4DXwYfTw<*^v%R#S?n+ZY`#Je_pISKnNHn*Ps`x@f9n}yaZZf~q25-c2APtuT z15iN;?`YplYR%ER1-itb)6<+N!T3x^=!UIDHlScfW(FC@u>*pvOS4-`?00YdEPR!= zfJk;#?oPqjADDFKO&=Icwqd*8h>cb=)ve96w<Y^i|qsIkG|?sA3woZ6i+fQU!bE^ zwKxixY@2^vO01wZSiU#dX>dQh=3(YImYugYLodX<<<8{hp73ma_vJIve#UPBSsJ?! zBp#qvO)8Afe%1SFb$aHDe?mov43OLUz8h1gN)q9j#MuGVCH`q(sIn!mKzng(_4KJ+ zV%p47m3O%nE^_ay$rNJ+9%75PF(KZ6W!0(qQzqHKfxE=zIuWv=-*q6+=VS05MImN0 z>t8k~IC*9F9GDmhz$|n-Uv-5Hr#`I(6ozA^$tZaonS@OUDV5_e>HnITw2?q4C^86L zXY<&Y(;|L%fV6kpCk|FXZC;oAs-#??rbH|n|>BE0(JnT6>DB$&c^gU5< zu!@%Ypo)4R^SNYx21XBEtgNCDl;urxyNF!IRqMRW{F46ht}|H}tU1l)UEaF&WE?NR zuaT_S7(}NpaUZD8G@=PkE>j3GnL#*WxgUNst_?|rhvWM zUNab9OTGW{Xxa#f&YH|iF?LbtkP#yS=*T}z-EO;R8s(ZNF|wFST5x?A z9RtE*^vGom!iGlo$5A=3Z`ku4w~5q3;6JhE>NhT*k}I2IJDo?2jUevv#=RMIAg^cJ zS6w%p?YjwP;Ct@XB6-dDSo?Gd{tRY}LOA>TA1jLIXNJnkOPSHJc_C4mIn!f%Zo6iB z7BiOYzCSWnpgbXRjlFAc9;s}chMgbKcT=H~r~Nkarm|$zhBm-n-|v%w8GN7cx+J^~ z6qh?8>P)SKKeN(CK1I0t`@T(y&s}EM(>jKYnRa5`Gxr)z+^s8>igz9EC3oIQQL2}3 za|E$FdDnxc5d0c|0;Jr-NR$;>ZGPA#D%zf#U58a~e-P5YF@qSgQov3WBMN@I>wDzB zuWE=)jgC5Y(kc@?-bkP4YSb63>3Qg_{_sf}XYz@9NapO;;^a6zUxSCWhYwkA;%o3& z$wc_?P@&!XzxeAPzYrM5zYl3d$FR^1pKTAhPoeXRERrgGO8Hs5X*!VO7Em|KL+9&i z9M>>zc?U{>)*twFg4zp$omk&J{Rn8s#c$m549^aK7LGZL%uKw1po@iWYm%be)<4^q zf#RNf59G2WK?vf!DpboflWh=nR`~0*%`1ae{~?m*{?=sJDu#_h3hvXHfJ6iLqd2xzWXnJzRmF;Y;H;_)lLlR3sm?2g*L%Vf zu?do~0(TM$Dn!y)$wuETaqGLot{XGL2y{c88;`wcOR9>ylV)we*ae4qZlp;$QEEJ3Lo3b2H94ME zw$Ztv*-IWf$T`q9vf{E-mQJo1&DBLBS}n-8>@x$>jrw0=^icLW!nFjr;R&m8nXboa z#F16(sN^u6ofPgnO5f`l=xENr&r%lkA&sIDNaP{w6GgDKGYPv}2H>3$qif3JbB!SD zknEnlWa#i`=*_a%p4$Y9+Vc-fqr!7Y zP!)NwV3-plCW4}=w6@#YdbdR05FzCf-Ra<6QiHAW@s(e`0c+k&8GV<}K3>#g~-$_`jN@RU`Ze0)@A8= z`7_dxU8knIBpaSIRvqHf4=(Cf@(j}sAnTItdMqYgqd~b*MWG=%@cOb;cE|dsvd4QK zG*U$MK_8!b1N(vbR|_mXZ|@jWcB;Joq{P+;77hVY_Fz|aSka-W)Ee3MuGg0pz6+C< zq3Ti2{StFnN=g(_cjjSNpS1%=V%G23u`l0N3=xf%-3?2=BDOxXv2>e(vd@;?!_)cs zyObxof0STm`ZNeNoV>c`p2*gJO{K$~`2pCPZexvBKXoRw2U|T=Oa2%t zmTOCY@9=ex(&;tN;cP1VJAhsdzf`&*?i-!diZ?I*vc1pI87UAS-tH!+J#bH&%rCC2 z+UHis6q#~O{@CG0(V^Z}T}9$E7sJ{oSAev^-)(Uir}x~%wP&HnfYNpEmf_zk&EgPL zqNKtrERUih-`kPavmI1`i=R-vy*UL+2l@&F$Bd0%B;d8$cOuzE5aydrvc9iuV%>b7 z+r&){U8-%TlGnmJ+qsHk*>V(@#*z1B^>UMp$-=DU)|h>uTw=CLn+E`-1J z-I>|pn-ky{*|L+>Cf6)Da^gIin|icIIOc z(f~oxNG>M)xA&3DAa=m9zG0fNaan0s^C*}T7@u{0+{0%$Ta`9Rb&PE`^s$6NvXqwh z^@2cr^GSO?*A)*?l6lnu=;6`61C}N4$L6~)SA(P@qAagmO4X~8Bo}8)H(sDsV2jr=U^+}CiPNin{67^A1gPrbD(Ds%R4*8q8QDb`9mV* zpsl~DE$yiIg>y&3#8=;A$L5QT`-Ihl<5!P&<9~h@l3)Eu>ZwW;oB}mxufX9a;w~!a z*k>plKoRL8F25|u`|z?YZks#a@r2mfEU@pe&MRu^j9T)|$lQo6-UNy1i)|xVuRF5! zJtZ0$p~$}STYbpxeAgar8 zVM4@53X?ocW&CFAFBwy4Xd~vBI*>WFgschS>$!qBM(qjlYz(l=IEFqF(=;^zD~dTd z7TVW8`x%`Mp$tq{^JTdfn4`((6V z0@U7Eg1NR!RZk;DY_6-kxPyP`z`YkdnyN>Q#EJifgi}WVrTSESewKdmPA8U zf>tY!?}qCKuUhQ(5MfZRmSY=21UZhkFN{Yq-;%cOYsen1*)9J-9tKhL1lj-7!4HKj zTIgR195K;Esu6MVzU=5yKTmTN<4MA`E;L2oodLTv={!Nw2gu5xe1sEff!B*L-CFIg zJk!tbOu6V7w#8AZ-ng0;T!@kGUrs=1OHG&?vW&#p zu}fF@)n$UuZbn+unR2SI7u}gN=$K`8WsA)5YqT#2KUxV^V5>0OWRxt@=p%j#Y&6{- zj~0R1ifQB{fI<<`_C^l{i$shK_P!OJWdtCdKK~u{GJslW5KyS+My}nBJEzel=%?P%lIfD4e|pI!DfY1kY| zZX0qvKuOnD>>9Ndo4UWkEJUWEP5M&pA9622n&l|k8aYw}ksyZnw{c3NPs4iRm49Mn zp9q}q1e>2;l&gx9FwW-h5?~l>)#I4$(YAFb%U@axdGZByPEBU zH0q}np>^yLn2Zm+e}apqxgp4@rdvM~ajt>G(3FLB$GR$6~wG6yVw7OTi6 z6WoDXYcC&&+XZ7E>bz3>GJ>_YAXUWRn8K4jILkUHvN7ntm(lLg86y}$hAX%*96^DM z2*<3vey#$GKvG4{a&fbe6s2ToC!KS4usqflZqQL)h8*j*>t~w=I>y(UbQoZn!16Uj z+8J~f7;?Oo-FU(GxA~EAq&p=9#aPXZ#*M}^3l(y;sAU3FJ7cm{C_+#14rp4#-`UV$o2O(f1cLPU?mljIq79tDGZgo z)_@?9AdXG}6aXFV+0`Brt-@Ss>3F4q-#_JpsurYAQCK;xGbMtLKadzZ-+yx6;K7vv z_!Nad)EF$!TE|OV+IrJhk|I2X6{Sqo;JeukwCU`q-!dD7Z&Rmk{d<2cMlYnYXu^ z&N$!a6zihqcDlYCc|YXcz|#>8x=-vn!)di)+Da{kTWN_&>N8$(OV#A#-llt=3&xwU z4p~`bR#1B@B)VWm{MTOD$C>>1OO~rc&(kHSy59^NT{01W(sk-NnO>jcd}Z-bt# zOOC@YPjc0o^u=1^>`?r#D8Z+_QCq)Df81-16aDtCQESNz$pWZ&&w#2j;WB=HPDW z@B9k77;7uH#m-9H9B_N#HQ1u)Tp#8#5x;m-n>g&JEk0sophBlp&D2(|nxMd+4qK`@vK}hjwcs{U?1n>ItH(Pu=4W?V*appdgx2MRAvD5GFtD3 z)yIAlkIwJVEo@v`;NnmjoG5DA1K9N3AmE;iI1V3ubBWv9!s6AlO${A;Ug&ucZ+CL3 z+2g(p%);KR8`8#38B^3MDxBm}Z7zxT`1Q`nvYS?g{ECj8pF+Q=q0gSP<~&T&%VQ>g$$$y{;&)b@HLU;{CWY5B{2S6LNMrxVZHN_ zeaj~at|Kp*1*6Py`VA1VJV_<8A=!zJ(xNxT6wIm>c_jft3-H;pR3iY@gRFk@=^S8}UHU_o2j}2g)+ZzL81?*$* zAJ+zDz8s{RqdEooqXx{+7qlHv&Qu{8;h|`8np*ufsS8;L1@B)}VVt za!rpWk5$~XAK7JDuZ|`LuspOMqg%SIoej)z!6JuT`f}=&+)_NbiP%Mm9x#(r?qp(li0VARv|F4x{6YmSy| zl|m-9=wJqbCazs$VMjB;14_ea_sf=J1bohU1o5G2E9l-+WfSJlp!&l=_F!jWKjd znAc9etvExxWD_(7d8rjw(J>HJp&>gBu{VeNSgEhCy|-ZQEaK>7pkA~yDVNse&1n~D zUj~M8u^WszXz9#Ycl#EhXxHr<-=sXGaXNyVB1#9D;Tw`LW?;6|cDGwebw%`3qNRT| zk1kR|;vHQHQkZ+eu8nYdCN}FX#91i&NrQXV6G2Hx>Rd7KD^z9pfblc-0DHuk_?9UK zK~WMfLa*JgiKjnbb7cc`t|E!rWHc|I1682@nzgEcadyaF<%0|z-lMCE8=mwm<2r-! z_wB$9WL!l;cn1f=i0A&qYFpDweO)B)9HKhi3`D48n#r2az(c>)$r8#c^aHeJ$Q4mV zuj1~jts8~tJUHGUyt9S^yHpu<&8oG(0mAS2S=m)eh-P<*ecozkm|~7KTW=B4#Ur&V zKvb2dDmgdbqk4ai`{?&kjhB%N3&1zKO<1WNNU_A_cN@y5eOu3bOI}CO2NCZzWV<;C z4_B!-y4jfqu8yAbP_*i%j{bvtza zXZaUshGHdfmG(&u1JU5y=eOC>Jl>fBHy8#2XR@R7#_d!`$Z^C1^~ZLN&FAJ4b+-zN zV_~-9;p`_=m6%**tQ*&4p-R+!wT`dVAw%OI8m5h2yqRmEDp&78_XgZ66`YlK_V^H& z7>$ufv|jwNA6A_SbN`4zQX8jaaC$McE>x0iaEWhhQ`8pNF4%6t3?1boi`}~((g)b< z@_yOAGI(tzQv!zcgVDrEML`PbDI9g8Zv3 z=IHbtY}a8CK=#9<7_i((YJ)Vc3))s(QDi?{a?Ac{BbjHMu^IX)l#m{|2=$(sx#Tkk zzIhPnZjcr(e@(3`YyfJg16REGFe-xi9sM-EIv9KVzxGd1rhDmuPzr0;8mVl-cg%}5k}I-D{oD?-(4Fd&+f zlze}D#tMFa`r%$be-h21N)l*@{Y?MXPxFYi!8b2^o|T1F^Sr|jmQJqC>mg)#dmcrf zYP6?M}?15#4ld7!-6)f(mG%yD?o#w45Oq}HL z&8P&{<2{N(%E7!1a<~okfyhv5k3iF4RZE;dO`}!39d1{37((^iOUdR*mjm3i}&!l&}3NO@c=(EDidJs8HA+^OJx8T9W)9_z=F=cXY z@svY_5@%BF{e1AExv^q&rz|c@FiF|dj}%XfaX%{z6>&7SVRun`ol?ouYBj1_s@uT{ z=ow^FZ=9CG1mOT5fq~aO;>tR2GIaL)WQCWFI{)D667bIGnSguMnJe^<2v1e)Bmu{^4-z%B zC2l=t0n<=VT8_+FLiiXK;c`oWj%^(d;$GR4B89P2Va2&4J;Yqw42P+@ElhXm3Cm

HX)|LrCrv_ZD1S)^?V!Zpc`>quZF^0VdP1;PYZgc@pK0O0r%fHZ0-*@${ z2TaCZ(Y(d=gOxG zpP#!1f91^a+`)-9sAQoltX$V8RGJdh`1$MyTc)wa@`1bM%q{>5O$Lj<_OIcy#d7Sg z$2}Z6jJV`;Xfh5#d48R_B3&)#@A6j*ggYjq59094YM5TGuHxjGcqP{;i!8rBv>vwvX$$>Q+k?Cs=c} zw)z!0npW&m5{FN(BF3u|@1j#gDQO(bpRRXGulK!wx|pZ_{b}k+am6eBb6U zOzY#pO!+}m{*Rq_G1lGLwApgSg(T^*t0#()g>!!tkvdQ`$D!;$CCL-{!;ZP>QuJJg zFKPU)P;1g@3bz9V{IM;{%epo@E>h3yf4sW9`b9~R?PR{2KPer7=y@NutDyea75^*f zOg(8y+R@s{5;(_sbPpcc>7Mfil4q+do!9fnaKInK-65*U{ZmEpdGrr?WXF?f5$yiVNfc(xzycKzCaIyqyK5`F}(i+`XVKOjqCw)KJHMfQW~ z|79sT?>NKv;X|I8g|FkD-X2Fa$bwP+oYA{?1pY%`boq^N9u}-<*8g_&m6r1zj5#S( z(f25<$CGAm|C@23Oz_AJu;N}^VqVnoe8_5(e{n4mTw9)- zD@w;I9&?KZ*IO1M`(9IcvO)w>D}fJPeq0mSY^>;lk@-!SoG2{vluGW+UP#5X*HCx~ zw^#)9cq09<*}_+DvH40G>ZQ~+Q>KYnc1clSv*r>;&PT#)-FU4kB6S0q*um^VI|2DU zMe2gw^ruh@trhkbtxJKh2h{ND7@R%_8-0O+!$s12&(!q_`tb%XJCfcY+l?jDYNN8L z(uxj8k`8&u;x4Ap-~J9+x2SyTz_j|ZKCme3L@tA=&6U8Y>^i1f6i$tpw;ff}&Kkku z1u2WLFayYW7%Y-4wHuZ5HqPhpdh^E0{$clZEldtm%q|GhN;w4hK6_#*{Ce6&G>(vVKe;$2zd*Fe^hg886cjsA>@ zV5{$4tj|Kr*2w>f?EPNy*o!ANVBW^u`Y>9I%sS^qdSeLE^=UZsp73+3 zRc|ysJiUSQQBL3I5{~EkOH+P1(MSo%<&e8&ief?d%@5^l*a)NmYi?3oh0n;`A`#RM zD^dxa_nc35x4fL#@&Rj2*Mqs1Up{Fb=r&~_Gz>$-k5crR^TnSsh#bxwGo~KT2L7mF&3X){6ip&mBI74ps0`oiO*p8R zTw#ik5MdS}>2euVq%F@&l*iDl+5^KzRSY5vSF#x7m4o;njdLDL+J{ij?>n;eVoj4NF+04KQU zkX?HIjgkuifu~-|pTn|bWWUC>((41O!Vow+PS9;f+IJ*~H5yKSMquxM-qiyAx&VdJ zdVWg{oT?iF4S^S7xDxPtvSdP|`(X^xvu0+L{Bdtb+nAJoXJ=1v|J|fWD>ym0zGB*C zvN62mc*rprSmZnOBDNhWzdH(>m@g<&5pFP6*qVFsvthqkc5JQo-`ZJ2!`<1R5XydZuI=g2at-^#jLUgEHWkeqW$WzsuT7gvb0ow<<-k|WE}61?NU^-l zU8I(vl6!h{$RWuxEj0mgOC)KzjwNz;AAro<4T=ywRBoJ>nOR7Vxgv)y->Av=DOreR zjj6L=Nsj&I6{6)JCO-x#bw;DEanE2QFe^^)PFdZ-ZTEp~*p<=U0;?TpSys6V&7WP% z?iJI@rHG{hsnrvnGS#X6l+(XAe|GbH-p%+gP`&JouO?-pYUsgQGart~N&f%S+;>Jb zwMFaN4(buqW1|^RDJsPnARt`?flvh$0-*^84WTH#qeelL8VF4Ul_n4pYG|RT2+}1$ zB1N$fkS3DQ>s_&&d&e8&{&?fvJI4E)oxRsybFaDPTHpNUw*-iIV!9_!!nOIDP7T$1 zVS)*pj4F6()mllNl`v%Ask)Z;i^99ou#;5q-=}-_L4qpf!_+2Z{7Uidnr>XdO(!OA zj%O$F&>d?N$gA2D*^IQqM(N8UpWi6hUD{aamHYTzK~h?x=PdFMS7+NY?R?`Wi@TVE z)?-bgJUNovpQCHfD=R1+CPZ9%eQcTHMvHdT(r%u!C?g~v)~R|a;2L7u>|SBgO}*@z z&85$Sc>J=p%cS(B2c0g9tm^h^^cmI(0;qDKEDz=Qt-5U zM=`o6|K)Q`4Kec$=E#!MoojAEqE8LC`>DTh=LvdZ-<#Nl8!nr!+?(nfDD-a9%6!0N zq(YEbRvSbbKRRWVz24htW9`_1n*OHnB)l{S5jYwI|EFuchzC=eXRCCiJ9?1O&NoG! zz8>Cw%o0EEMY{9Q>wDqY(`@n?*5rWZiV$%)?)fk)NMVj~PB>ZTEHdRKp5>nkKZifF zOiSOfNb~9Wj*KVz$9I|5cN_ys88rVkBZ6&lE#V#R4jSshs?XNAq&b;B?E-V_xn&bOyMJzEx8-S*rR*EjZ$#%?djlFOH}TDQUD`zr-!c@Sh~+!zL;?C!F)HRS6&u8AD=_SA?+SN)-qd#IQFmMnERQs5oq?y5HK zL)>c>Ak!xCU8`>d9fk*?na_9FM;2$6%4Z5Rww8U(x8AZa(fo;@w~}wRJ&yo+^_Lctg5pQxm57 zivl%>9lp5L-u+&GE#t{wNgd^4w<*&BV+94nUQ?K3cJAa4Qdbz~)79_1)N7It#P#{@ zO_Rs729j{9U52`-<@z@don7&_swR-`@6RT7+9Pffof<>T5&PW?2?VauD*sq78215} zLHiF9`xZR&PXCz5ms?uozH|MC(`ic`NYYvdLnGST#=G6w=-QOehL4dm$txr^*LA#l z)D^plclRxtIyZtGAj~rs2AfVVgQyUa;aTy`>N1B@!-5cX4_uPOJ;8^ax7)sKwZ%3` zV9V|wzTbrfc;P!Kn^re7_=rP(pnRRLcgEM(IExh7mHJQ51|PfNW_#TA0MWwmm-xAW zjMo$|o}GTd7oD+_0zwc?6&ERscQgyv=KR7Zwpn+|P4^W^w%W_=IkDbQ{F8q4MNL56 zX{*OTI&W5t{3t&0Q?(W=e$&X}D`K11n`nk>MZY~EBR=H0LkPf1TIb1qY(^&CeNY82 zpWlU0H}MxfU7Wtq;}FCpI;n8HM6>=4L>D= zlkE`w>qVls>GoDx8fCsF1zA)snkk*mkk7Vuqp#?4i1E7388Mhd(|C|bm38n9X01^p zE$j?T;xWbI%~<6w_du<8^u<=aY5`&nWn?WTaO23up8)sV4+A~)T{TOtmKffx6$iCW zZY_29((}BuC%=G_t%{YH5I@n%HC}$(*3guM%sI8$@EVsLolAPy|86KOp{dOAjh4E?PlIz#2zL!W8VBPJf>j7dn()HhV2R7sJlNXiX;9M8*+M<*gB;{ z1Z9@@m`sjI%Lq8ycgC}Jyb?cq#Whhm8z;wahkJGdv|U}nbs_Pi&)!s$>a%qvp)VVO zm{iTGBg@ntSmpG~q2dItwvE?y?9O^U?uToApRC*T2ci^0h}=X^ocNvcGFhYB(ysj< z;!H%n8=n%VH&=NSkjtrg<2~^1;sO6rr;GFpq8ZugAr$7DUE}^e8$=CSiRtiYV2*Cr zW4#G|{?n4)WoeKa-Oi-KT!FDQDEV&iIc*codcIIr+-zZYd^%Il|AtxH>NRreQGD7xgr zl9L)r<<->RxaRLzkbzKg;nQEo@7eujRX_@*6I~b)Tb8p0#iE6Ze!wf)qG;sA zZrH>*QK-W4VDA>Oqy!dgKr|S#GAe@JG+dSu$C`SbshW+O)nCSi3kkLBw2h~EMKQ^p zcITwh*qQQnP@KlVXZp0Jf);GWc5;bY#i zIQwl&1AZQkhnh_Y{2lfL@tn5E1Opj$NI{AYErt?LH;zh3$XkInt9&yWvFP>#@K!% z^r+E!%TGyB=U&e5KlqI|Kg6ZK-K67Tbn)7(MGY5bod8!9>dZbOdUE=Wykmc-VzQEC z4b3N>eW~5MuzWa3=qGi`y!0|mCASzrKZP?kfmY_tX=$>SJ#*E9mrz|qsF-E_i+1X+ z!ZG{v0iBZYNGOQWs|psK$H{i;C(Db`3@vX+NzATb@`Bmys_a{Jh>7!Nu3WYeT zUmdJkV+F|Datob1O4P=7TP7LB)6et2TkKl=50zR7Q_GQv)q!>o2S=6)Q!@fPP3X@Q`#De9%ZqU zQuvy=rS~c&g<*RES;{I&BOwTDP$EXRtug+XA$8x&x3S2D7huU(1Ig>kOB}M<8q*ugG2UD9uC~(l+ci%_lp+#lHdIyK5)GB9#B9z z3+t_}@s_}zS!(Y%zBYn6zV>6^<&|v4y&sS31pv0j^LgFE;=n=i6`y(3m49J|ZwaP# znGsd_atbO-QLV_lmI*wc4D9N2>_=2e(LcT~0s6BgXZJ54%k!?vnWf3Gm9Tt$^~Kix z(W-|9f0mj5mN0AIno$#629YYTaB*7XNHWSF{e{8F?+3NwDx+ikxpf2Uaql^(Swqur zMRAWsIPy;Rs79q%th`uB)A23 zVQ_dF;Q(RG%OtTCh z_G3||g}K_qsG$S~)s$7eGJ$;+Kdd^Mco?F_@~fOGX=|-|TMR*^GjsrRH-_YmS5mSa zH(n`UmI+A-Piz^)v+x-VO?GD939^0?uQ5_nF1k^x#qqvF)-~St(UuuBfCRU+AJ@kg z$$jJX{FHK6-twTV^thjgCVXN^oc}Rj9@UMZgs6s;&bi0z1CpeE&B`GaPA{^g2a^~I zsltZ$0aQ987bOC_Ua|_TBLVX0<3B%?8Az!kKGi!mN8cP~)SGavemoPiV{N%JlJ76W zwy2A?<}@Zbp=P!zrf&ktY|;{I#*?@%Zs?(C;bn_JV{C6zM$9y*_{;0)cpSgLzO&ET zg7hfyaCu?8K(>lutA1_JlsP_>v(;PaDf#GsUXUCS`ytCNz|a}r)Qt_L$Y6w=i?SkB zLOAH?*<7i@m-wf4z6K-ib%7_AK~0V$%7RU_EN*tbz*;CAh}1oET15GRvw=svWAi8z z-hpU+uR?G&-k@}7UW+nwdtQBQ^#VJ)IF^yw_DI|#Q!YP*ZJ}Ao-c#Jo)o9-$xJ!6V z+ko>4lZ_K;_RJ;`g>C*JB>96PC1H65(k2-)64-|$=g5O{6q1^XXFOxvF*%FJRc8Vb zj5!G%!}PLl_y|M<)|;oC=#q*$v8*bEDcI*wl#BuKZ}eIX2JQWu^177z zyfy;eV}rNIB`W>$+Kaz*G1- zD#Ef0q_4Q85woDvP-s%cFzEO#T}WO*b1)qd?M?dlep>0hSDZq6j#_t98*?zmqQ)@& z>O=vB*Mjp*spH@so8U4II~w;tfE9^rw>jH}453{v8){!%DTacD457jue5WXx+#o55 z)46D-yP0B~fDFdC$IIGZRawYTll^Q*Ke~FfwohM7rKeXX*w&ge(u?i^UMsEPBiE|= zflnw|kx>odN2TM=0!02;`C6TCWyWwto08y%9tZJ)8Ps593a5~@a3)6)!S7lzqx9j{ z7;js>4^?6?mvWt5OA#}S5=?~>-cEKg(Fa(nr@Q3lyHEXV6_yz9i!(5Dhaw^@H9ISG z#<%j_(Qn^+j!$jq&U60jjT!pWTRx(ht^-Nlc_&6>Rl6hL``6GzKM`vqn=fyEN?5?p zB6E`)N90rmDsAyPyU>dU8v)BV7L;yH=Dyai{~=pPNN>S_ayQ_f+! zPphW!kz_;3;@k)XRA)zCdsF!Qb%szlmaM9xAz6n3?w zO>DTUb#Oc10mBGeWp)uxtOiqsz(XYAHr0XmL3ZM{;uc`NyW>?co832>@=vX33=(6z`*p%5{sen?nYs+AeTGhxK*et5^0+x(!&|AvOwm#$5zv>}fi z;cH3(iI>WL~?i*+};Bw)q|;ts@Lk4kC3YHKUI58TGhxy`@<&q+yu z_DlyKNoxO-_Uc6(%l5?a@${7OfetHZHMhCLi-*f^eM>{KUx4h`SxqqRIwBfHYnM=D z;pE)vFlBS#jj)HG4rRwgILpX7`_R3^Pkm2*Gg)V%q>XKulXc(Eu?r5^1vft>5<`et zth(cvWAgK+%Oc;um#G3WSCO6*Rlm0!Ck6;gOgHnkHSp2tyTMl%%%UM}Zeezj-&@O? z5`c#?*ZX_ zkL{`ztY@q@hw`53!KXPEy)D3YDJlt7Wrwa;#GILT2T-2(=icLFu`%SfW^ z$}xLkbr;#&38< z8#6f%cc#vPt~hZR|EDJ!d1ttx>jR43n&=Ja8j)i)U>Z=r>ph#9aj#J*iSHukA7>$;qlQnvZr*hFo2{_5Q!wwgexkzGk)Hy=gA+!#6`dvmB&5KksFK~DWcHab5+dtc4RFvK;)AS*>_Uvw~Uc}kql0Z$(F<3?7gWQ=#W3) z)0}!ODk3Ox#kpMtu-;oc5;_A@4CoOkbqJ>js3o#*UxL$QW3HReq|_shQSFtafE3d0 z;Z%M&GFa%JIUll?^G!LsXgIlr>hCNg2}BxZx!Y6#=RB)l=lHY=t9-gO$vXkkP`~u3 zYaeS`iJWT`G~4-u2Hgm9BHA9YT^SBlOIxDZRe2}=7PkV?{f~CTp^-cFdfNhaPkG87 zA9r}(2pI6|&UL*)8Phg9@o_LI})vzu)P>3lscx*jo_?8&iEOhpHMOM>9#(LN1`@Xdu(xDQ+B_2%c zM=t!4gh<^9bRK zwQq^)1P<9ydf?oC#1h@6V=SGNikj(QH53LXKh!LUi| zZa__-ScwL8$5K^FY?;ctMH(?HN*>o|LBHp>JSh!VT2A#JmX3$DBFhcbzEgq#rJ|_u z5Vj8PSnD-6{$r>${8fv^IucE^-7tRDvN>-Tb};nTV>=<9-yS;-$d;F!6X%fVsJI;q z3%*1ZTy~8lg{Nz7gv%lA18<(=>TG1Yj2;iY(lZz=x~>8L3IiE=I|BLYV(atYUdk!^ zc=zRoHBO9dtqvS{V)e@AS_b&v`jAYA}%&zOJ6-AuO5!<+wt$T z_J4}yKWcuxPd#$~g6RS;^TjQd|d}2YeZJHQp*1 z<;>m`t?(EXp))m8CARC3%9#yLzKjrB8+1i2yl&oO{JprPnR30!=tCzF&ZtP<3-*Sr zPc{Z`IGM~^+=`_jasFM|=&`UHAbSaSly6OS$RGWE?0^wJP7E)%nH=F()m9h%Bt2|DdTcPgHLoNQ%?K zK1AT<%hDD;cN`}(R6K$}$r~EpqZf0%qL4HCbZ^)JOtJ^xLL`#Gpqo`w*rmh!a2a{NaTx}8=n!^EAQ|DZ(%bs!31WOm7 zjup#>8Lop8HDR%`^*shklY~3WJC@}N0#%bDUrK2Tq5o#74)m* zTkSD*x+@2IdafOCtp(bw6*x3{kTNclgWyh_Mh%o;@BZg)`e&xbsA;F%bK7D;-tWM8 zWi~a0?&G40z&@@gK!BPstI4IACZ`U{JS{c-?>s0IW7f*tkogss&!M>!lehQxcY8@E z2_Az({FR+|G)mp@#|BJY@5s3SvcxgbLmrxeOS(Q5A7g=TP8qXApnRkj-gmZy&^>%? zSc>3KjCOxV&7NQDg>W!QECgOyC{{$7Zx04gRY2U14Ls>iZEuoK85RCl6=FX#>|*3y zX^~(<$DR5s?_d$E0K7Pw6|lUF1cD-fwdJ zVHmz+1Rx)@Q3(zk@ObUek*F6HV>p8{q9bS?nxgZC{`gxD{0VbZYd2>xX=u2-E$8;1 zku?JGmgk<{-N256xMN&jngrF&1)%VQAVufEqPW!YrBNVKhwJ3 zeikVLB$x_L30n+%uo$vPC7+Z>0;S?TqU-NfP>e)PL9hz{`G(hvw0D2%yM!z~o>7>$ zKmMv=bccoKv!>GuryQhM6j8fYOg~i`qR&tfwP9ta<-qw*#$^?BkE2L2FIi39VuL$V z|D1E91S$m^plIT8*0nZ2X12QfPJOjNE=0$DMq*aMGfX}iA5gW7ku{PhyDO6S#f@MC z%u?k0{W+WNUjyN$9-kC!>q_Ml-N>ksKye*0@dkRF4BY^uh`r|$=pm(yqVN#PrsrLw z!d)%cg~WfH_1UbI#5RUu_GB*Fqg2%OJF6|fDo$E z1sGHHjMC`toJHxe`OgT(m4Whc(_xTN?CeR@5&S(X>0^p60|Dp2^Agw_D)E_48g0Y= zV|IO!z&^I6->2>U(HB#}w$A0lQ00TH`ZbvH>FcYe%=y*C_~Lo^1yk+TfrVbbQ8e22 zW7@l>Kg%saBARhR;4ti-Ln9HU^=Bya5&ue@+S{@Z0;Og8IPB`LO;!Kn<(TAF_O|88sk_s+24jNSj;Q*!=)YN4cvYjRKE3^zE6fv=7|V&+z-*J^X?&0Ym# zuf-3G_c$WDXk`jDel)pV bpEq}YXXt%z&hJsL>Fb$=)D_^G=x!t=w+fuCwdtY3=z?L zo#?&K7|h_iCin08p67kn`u_U$e>j*`t}&6%1J>WLhcoyisqe zcU$%5ud7({$X~UHcwoQ~{0&57ZpPR;KY25@`2M(MsMdRE6x{XxR=d2UP>8U+I=|(u zy5!(H`ky57tS#TOMUHMh+5ciG=slz*j@mIY#T06UyQN@~}2 z0vom!@mv!#Ak68$>Q2)FC-?E7Ppe-lw<7*0q5q(6R9i4OTJG6vxGtA~YN6>LV^>lB zk&?+s=?S;FeT1p3p;gc4-}R*mc}1L2*OO%nnM6WRg2_Yolk2YLF=^6% ziilxM;2I3jT4my#D)@XU;AiWta@=~+deADq7^Hin-m>e<%3FJ?d;AnDMP+AiC!b~) zy$~7{J6mn9AIN3NO%FqHZ>7&~dpMPeji$uKp2*gyusk?crM_>0gt<+>D`b?Y>jgU- zy3KzJmAQ-+NL5I;Q%|-zbresqh%$PdW__-)e@UCG$~2ve(5jhB<2-7G(_d9F&rvy3cDIcZ6?L zMsxqTmPs)p%)J^hchRF-v~)YUcZAC4WKzt&VOJuW?WvW6wS8d|r~f%Ko96((T*JzC zhJJ>MPnCbkePKMC!jph=Z-q^6N7uOI_fR3`;X5;DhnA?cnsB?;IlX_{ctBf*7JSco zCL~lndqgg;d)pZ9xTxjxg!}0|rO=ltto&8RnzbH+O?oO!FdMZrib<47iA{ndX56RQ z4({W7Fz#CeuDL^Y-LYXBZ)wzqsBymDC^`b~I$FI`m;=CGQQ(nI`tpwgPYMqPhOgFU zisZFHOOL>lvwt*dnI`J?IDSwi@zWL8R&KHc_4+d5g*jebctP;XdKV^ zZa)O;y09rk(X*TKSvS&NmR1i@^{S1d^6|ao!hIcG7VhWcCdxrys#R5bq7m=8X-8PJ z*Q-0P6`p9l=wor9?N%8Hw-$l9nqOJ4+J%o@L$j1_Pp?-+Jhc&(7R#_ydIi&*;{xU@D6iuG8{)6Sboq6~2ePNhK9Jn3V$ zEKbaLO19i#3~7ceXyd4Bct!$EH2RR0#Enx= zjjB)76D@Qrt@0>RJnX4r82YVwef1Kk=TO6YB$joCrEy;5#(L!eMs=J|PR`?9&17_3 z!H}}VqsGsvDi2k$F9e>gZz%IBe|zNc4^wQZN8v(!+O6M7#a)ROG4=rslk)E?4-4xu zL+J6tpFO{h@+VXqE$lw2g|0e01^0w-jcG_G!?|DKT1D>|6Mkt&z3tt~&X2K>Ew43L zN4S?(zE;giof}34DP}U^6pW+A#&9v?>$k+lrX2s-jQ3kd`xfDOIFaHX!UUc(kgu+? z&J5kDyw+^rA3BtLZT6z1c(fARvJ&e0;3Z-D-Z(F+FZmLtjQa8R^9J=_@BT27c)78g z@FGdJFvOrn`}UlFCA;)gH_U6#M$XPMt$%}M)FJwcZ(zZLd{s7qXHcfi2CYn85UTzo zR^IMiTKS{gk0se0Y1X1+mV-Kz5M$1QaNmV7sGV@zctuI)ppRj;0sPN^s!H$8(uAa; z86NV}=I>P}Rn|d%zr?=GB=Q(fzggCbaSn-0`#A$DNtSLed6jxTf{4!fod?C$_$}mr z%S9@0gqPx_n>jVnt6L5L$$@LioR=2X)(RV<0h(CY7nR?1UXi~n#hLqgNGGLo{*#mXEqf_zs!loa$&V1J^DGN%*GF^pRbm)+w-a?neJ0@zt^H@^_L?t- z64HkUZ^zPzOFSMyqSmFsk?G>^l_MOadj9zSp%rO3Qi4_Ri~CiX1h{?8(wW6M&-RVi zj6+vD(R?_=g*>X52os)TBfk%aiq&R}>h@Dxr_kuW{obwid=CFS({*#lyIT>iHc}(( z`X|Fa!eu7~Mxf_*k?v2gFHdyQh1XF$yPx9MzJ*vSsr^}}Y2vAuSidM{dH=nO+*tZ( z4!iJlQpw8||C%~B;n2s8%&Y$ttd+{3>8`)e#WerSz^*v4@*7NrvZhfi<;OdHvIq!iLVp_ zA*!OcnCDp-*v^vnUNsD0?vD!|^dpSo!U$~R7L7&(UstjIYvu~UVLaEw1#$_JS2!=Z z8B2wh^_WE~T52&zTND?y!Fam1h8eUxR4>cbeq|FAkfJKOq07LKZvVa(9$T1qw^K-S z}YfkBE`e1?QTidcr>p`w? zvjUdN@Vd)9QV`qV!*+4SXX*a-1N|M$*|`!@CnUiPK5?FPbVY>Tk z=H3$9bb}jAz~6Wqj8nZ)t+Gdai!jGzKH8o*)AP)#{q*sCOKitt<8-HI!G&^+c&5N> zUsDI3ez~XkHPGf=z1QBrw&I4pWKrAVfU%Uy)Y6se+dL0@7w+D39tTHDO3F!JtDmk+ z;fwyxL8p3;jlf3b|GF7AAY2h zKrO|#v+kXUp7>HMq(jFUChBf5MeAgS&HIV5WKA)hmaIN@p}(>xq4Z6$K^b$3Rtil14c!67>ng zi`FC+Kkx&gX?pr~x76KhL$mLtFrDLCq9j97;yzj*yy$ZS<@=4_Y2iH! z#0VN6|CQZA>1Bsj_xO3%#yjohp@o&q)STDQj>#06tS%+N610WewgZe~_C3=>L^_Y? zKAyQ3$y>HAah&Ch)|}Q}8mCO3ep})!AXFFMkXs>PVl${y=|Us=#si%`&vMhjYpEXv zy!Q*w_}>Z$1?i0RWuV=aE**=%SUt+sSGaQA6I&pFySlz#el;p{l-q?ZCuc z@&dPN!NmLzOQZi}D;_FytmGmUsUNqjZ+&$lO9FeqA#9}m4h`%7x$ThZ*$om3U$_rJ z=E}!?=f{xqEzH>#yGzqvHuow2?H*b&|F)ZyT8LpL5ul&Y%~fRs%_eBTDQ?Wi+xy{Q z6FrLG0_$?N?D8psjI4b43os4+1-@tM*lF6Jqqa|yF0;N1*Xgqz#V(S4|MnjGfr)nw z%}xA6d2@}7PVD4lqfAYiM7;sDA5orl8+9}mbUOC;+d3vz1=uZq-+u=TLT{kirJet7 z6GI+=Tf^Nwuvsjsq|blnT*_NhF8I5dRJ#tN*ZV96+l$wS9*Pu*l>9xypBzS-5-T?4l zM?j}1Cj5H#P&-P>nfED4n^lgBB(x(25L}uc%9{3{$t2VNFU_$l1kCxFmH5Q; z^yeY&dT!dyeSl;F(d2&t8%{@*K3~S9Df;W3#Sei@1NPX3OHEt04}2bwNW4jgq7wYY zf;vhJI!;8M6IbG(#L2PdL$Hx?y*qkk=N+(Je)EWoM0gAV0dCrD-8nzo@kjZdp5V@F z(ckmg2mU9KS8uTb5YR#AJLf1!0?~xDK*)OP|K^d(y7B{e_&EVX%O~+a<`#o#TFrO! z_-<8?J$y?;S~QtUq~&JK29-fkC!svPXU8j#{@ z5_JT~8x`q1;NK-o%?1VSzUTg}0fw(=XdvP9$4V~eC+p~;Aj8xC-}o{mx4rcXQe{6p zkj)D`rZCyG$G7)}`hqQ&8Z`nIqs)~SD%E}zuypsqPoijp)*9#9_x2N&wDh*bp zJ)>By0!;H|mjR;n{vbj{&l>erpHOWbS;raGvA_t#$Tyz-N;na)Ku50UtM5gfOdz1e z;sJOyZjr~CdMQHe`qVMfdB>Sw#>?0SaSvp^)Z}Z~4+-?{DB)SdIub3&H%H7HIxhU_ zCrLb@CMetN0pe~bgrscv9FXo@xF82V|prW#p=lqOh8fNhz<%9II zp`8zLAD-MF2@Xl%pWYx0n4X`EwGfxUEkyScg33SdvY#3SUjo#UNszk+rtIKmSdyI_ zV&`~Wij(GDpMb0lrm$kwNfiu-)xk*B@^RT)^gVHqyaE2&eL^sn26a#D2Ko$UA+wW{5(VKK^Zc!jbZ^4 z&D>-aFc%DJJvMk8JU(+zqrkD@@#WDUOcDCJsIIqh;woG5DFu_34)apSlgx}o<2sCM zBOy!sPD|651YYyJoGim-+5T7z%O6H~xcH02BZ_X9I2t-E8~E_IxlII+$!wA&e-E}7 zDLqR^;!$W4Qw9H~kH>(=sRpj+b(>G=@YQ{J{S4n*O@by{@)S8gpTjhdYR?Zb&<4*n z$XVw(ORwrpfJ=H(kv{sVUqu9N$4qT$M|{649x?npn7l#2R*3&Wg`F4o*^_aigMoT$ z?@iWk&|=ZUMgn3#NJQ{S)&N4u3GPIjn{iro{M{nhsmw~G3!VkKphu0pRm`6?_o3xD zwPi2X&BkUW6hfRMoe8$gQfe8~$y>Z|3||U#5rO>@R*8wmHU7pN4+-i&%807NZax5? zH3s2#4s$?T+bQ`vQYKe_SPi^GM(v9{<>krvrNJGZ&a7g2tZ*3iC+fCV)s?=$j;2@B zFD+kZ!%|<)*GOIe@op$@7B22j<^;-~HCrnjFaD-mUP46%2$ad=js-IDPO@R}v569LW7_ zTlTA>@*AcG5o}PXSNisujC~^;&fd_3m5jq4u-=2KT-n-@@A#Yi=B~pQGV@LslrqPe z5Df(1*C&tqCAPru(+$&ez}|YF!dmL#kIjAkV%neO8nQ(UBDiKS`-GsVTaPNU?818P z8p6c>fMum4`fj1${m2m_FD(5=ehL$dy^$KlOZnke+iJ~}mU~(;s{qID2u@p)fs95L z;EGpMp*+>Y%Lflyboa1mzBDUG_(Qi0*j~5k*}hMUd?U;1#J6zIYE7#YDB}!+6zNorTu&EBKrn8J!d-$`syy2G>;$J}wuM{r3#Yte- zk`k=Hh4mJtd`!zP#teR?-cVG25v?OKq4w>Y0baV8!kb~Q#N`*880xW5vljd{a0>i}97W~&^>|r&{YCrR#MPge<4c7= zAaWOg7@EG&qPNjnP(~TGt)6iOeSyqui8Kotx36glRc8}?&*X$v6$p#`Na%eB&}+d` zS95S2H!KJ@MhB$0j9(x#cny3jdP~(DgS2pLhFiSAjGY~tUUC4!uxCKzqDK)E0l{lm z)1~2XZ}D63B`s0FxfWf3(VNBluAyb0sQ87&VEiMb3oel9T>{7q-|KOyY6)_q1y>w| zQR==2B9BZ86jeFwqZKi%`pfaQZ+ElO*s3Wl#|W655{Nji0#orGPjXXs9lgb`tqq$7 zu^!x*ISxLs2eL3UpjG8Jx=UfyclRH2dfS~fV1JHrx@gXHMYjW7zeOS|;^RY2Uv0=6 z-zB@#s~xnb-|QakzK2gKCztb4tOZ9z#*fo$O z1c*i@02uK$5Ly{iKNx;G`=qIRcMSVex2prc1AOHJq#}u-tf|;2zU3fn7Q;mhyLbBh zHl~G~tlSac&>yoTg>3)u&LAf|r%O@r0_AKztt~m(_t-bkOK;w<_y^@)+zUEiX*^%( z+iYIjp%^*BoYyMQ0izj7qw@}i^?ibH$n7(q+70L2C zufwSaBU@XzgBJDxTObH~lX{WV{bDVTZSe3DiNAi;9A*v!e?r$;!=CywQ|@KjPyq5z0Mf z!t}1lpC{~na%T%*p9EpvQ*hFK@dreg3_;SN1e$zMA6!1oF9c_CLS~_Rw|q?TVGHj> zO}##8xG#yq3EO9F<|r9rGP-$;k<(g9OID@A4{(zcs6prz+d}q(l(7|o3uL7J0Uvh< z^R*sBk~x2rLO(mkTknUL#9Ayc2ofbG7krK;rDhrz7jX0ZOfpJ*WZ(HoLmYiGmoHmr zDOa<3q!hr${i0x+I_c6Gi|LH4@R|lE1^`nvAowLqpynwretcjr6!^K{;a7N`1v@gS zJXVC$6oIK6=Nq1s0;1q@AY#2>R=_{&<89Fm8Qy%I0NK{|_ZUEoR zAgU)T*ZG+CjXm^Mt4^Bi2(P#xr!?}_VYm~qNN}<#sj?$=zn4!h+(`tcDH0iw2}}wn z%^bEmA$yP-WpiFW3T1Lak7gx%+-LK4f+gOy6O>IY+k?4%zG@XjPqzGb@hM}Bdum}r z`Ah_H-;ND5TP^i?)wJNwCH=dBlt(`&L$6&Vn`R@SBIG&Sfb->Kp5+nYHAEM~H1SmF zDvnBu3#{Os!vYXGS!wN+kv9QhX?&54P^(UD> z54DSseV6%n1)U_V4;%w}6)S^KtMSM{-BBHaH$-ub(ZfDvth44z4v|PsQdVl<5AgH< zBQKalJ2fRgNA<7y30}!Pz;kGB`vnN*M9lpXFkL08-87G%n4pP>l`vxO#CVOF?4PW5 z2+`}`L3&-rcv;`LK@*$aqrD>sBUY|}gB;{@s>aU_sM-6t>LRA#hph#8jJMU+ct_FA z*APdDA90(YfednY->UvJ*m;Ov@Cn>Kss}qm*~5QixoUUJjUMA0jn3mzZ<^nA3z7BW zz5P3;q!YEpnh!Qm02o8vXFhkd7{*48Yq7}oZg$r<3d<(I)Y*Q;p_WE)4nlk8$(%|cR&6J zeSkK3SBx@eL!+GzuY7Vq;+<#xGsn8qyJ=xh>%BKEx}V#x9ihG|K^p_6^}QCiJup}8 z{1->4RZ+P}B}L^9XBUnG*)ervt`aR;f(*wfLVgPTTtvZ}I9uB=yHEI`0zT}a(8o78 zML-oK0c~N9!shAz>FYaY#b@-HTo5rS-AIfJVz&(Z$c|l{_7?yFX)Mwv3@RpB+8EU{P^)iU_&_IsERdh+@!cLRo z6Ik0;OSK)&!qj!Wq;spsV}x5uv5cW*U&>|9sl`33VHiI-zJg(Q6(yk)`JzS4*KF8f zF0CP1fU&id4bRCx#}QcOM`Robr*^pIXXnE|jZ+?>O8l!@$M{ zqSIy1hew3Z_xgS9C{VV=J?RZ12G;<=Ky>tsBC;{jN({5S3hvnFfd#nrKuCj6dh=m@ zBkm-1M-fk4l?H)q)AdwV(HD{}!j$kw4K>9w ziM|id%rgH9Om;#R%|XyC@0E#|@O*3E^x1m%Ul6g1L&25&rt5aBOlgn4f}|m933Kxd za7CD#kI%kqfJQltg}2(X5E?KRMm>Td_wY4|4AP1?W$!xNukL(j%<*84zVDF?jVa1L z3pUr@Xk0*>{xmEu(L1)9^>L=Cs~v}3n|sX~H8U*`o3u*U3#^wL!}fv?@F7kgr*@7F zPW|$>1tGz5cV#H^L3}p9N@Clnb|PI=n`JvVJ#D|lj zNoTO(mMitwU~c{g!&5Wy1B=ys6f2{}Lzcl&qw=aK7EDB`;Y=B*C!b|Z$$EC>h49RK zC z{mJB~X`tW&p#2C8xO=m?r`;V;17B1UXsvdJV5Z7HKE@Y4yClK&O8#*1-6j}1#hBx?K_-KuW7do{Q>)n@ucfZW~xhfj_3Sv+RfSCpC@O+#BU> z)gEWrmL+sOFTi;#3hR2bMWyLoAaD-tHHv1hUNz*|Dywv!lSR*SX35Gm^cJF%c(`7* zL&04Fq8*WW3~qf3#9{`%D#FT~tv4F$U~YuuAs@o)psiBvXygHs-2pr@6*sgK`6{UB zw7sLw3l>#%k$p*D;;|+;%D+KDvARFz<=PxmrXx;rWF&XCcH^5bOf1OVZGD_87eqTF zla>Wq*@b)lh7hkLQzIjS#+pvY>-jc{dd7mILt9My5!8UgGn-?rX7n;}MEP#*`L~Jm z7#@wrrmwVV1x``+O*oZr+4N2`aNm+W86SZ`?B0&r5!$!kK+|HLJzPR+YW~vOF#*pK zf}3xsfSGCMpv}Z!2DlUQ7TddvbsO!Vb+u*oM8Nku%ym0I9$W%vY+5!z6(SZ~!=XZ- zkv5}hL+p)#xQcA0av%6nYc=*b)ULhs0aye$kpd*Nw>Na-bk$)c=(W>UI-kgt%cX!h zqGrqOmg9^e4W}(fQ^oUv#&>dtjRdSjBqx$yE%DRn8o5d6o%{oaM#@}JoZtw^i4oY(L;bb<*xDO|TwgoE^V%cI+jfD)6kj02a6 zvKcQTqNfiXo}%ErS#i=ve-Y*u1MFdh6x_UL8BQg3YNh0m!EA6&gjOyr$?})rX@h>f zI<@=>)Ib^D4c6YmGF}6lysc8_o*JVaxz5mHJ9*QospiD%8baht&s+~NMRZ>P4K&ppq!zJ;IVb_4v0 zF?6EcG=}%X0{b*)EM7GdwBv5G;>$pM$bHQ1z?C(P;J_c>MkIhWL#Cd%RjdJ}ErbD} zuHwdSSANsdetq1#7+6L3e$=BM02dwDk&52<)EPw<#ip&Tbo{OPooBShcd-`4y;UME zu66YF3|`l{ab<3_%`EEP+((;q1Pz%XHexS$>)o=O|{LzuJ++l?>`m;1o$&5E7x zJsc4P^#*RvmP^Vy`}b8aaF6Bo&cpGC*m^K@HUO?x`~1V@SNUxc-7fw{0gMZ?rhAcH zv2HCeu^P{b>;q+62K?bR z4CH(CXn!T2dqB+fwB@o_Up<8O3bU@LOVv7?1&^aWr)&kimP*X*rr_w>SWTH?quW_! zXLQH)i0_kIc=$eXStSwey5M}w_K@NjQGPP4N7RB6JD3AG(nHm)T%-#$q~S&!YpPS!}Z-Z z1hk_xnAO}lB2qTwXT$%^n=pe%*6(iW86xF>zC*d4%~|@i+!GFQ;LG^cc<22F7OseV zNPO7d$la*-v2|=v|NaKWcrzw?bj7Y!nx=4jR*7Nnz}+k;nq%BSs7b?orIt(sbH z#j}ZnM5GTPy>YBJXm{1Ec5$)xIHjp3cZXf6$xS!P#wfoC>BWVUJ9u6`*apOu&dJ^y zo1vr7upN6m={K*RJp90+S`hAdILTdJQG^gx~Uz0P|I+wUTZ(jg4(>4O8kc&XB|-uH^zy zZmxVh!*O>h!?)sDkIjW8O7z{1;-M+_k|j@}HpFVLejEPgNg280$5xP(v}ynOLT=2? zvZ*3I+W0W=T=7e_<{(Bt(5T=8Qg|#1Fre=fITZcmpp>?0& zA(|~kwq}ALW-=h)dRG~Eyf7EZ$%Gi;YhREvEaTl?co0?H7~}xOyl^Xr4ScIa1#V4r zvqvLkPb;$b5S=BXViB+M<9;04# zK;Ev4_9ecOr>M7j*-+dfU0ra=1nKahJlbue$|w~RC!GdF&@lrJ0dO%16|l2L?}wc> zk0z4;%oi)KJnq`PzcB!&p@}HW!osl!d%}P485xejRZ69bfp?YS+->?o@MpLz{y*Kg z5WN!$oEXflzB4no1f)xBn63K*aVF44yBy_f!Nvn*HlN~yP`NJyw^o}0uY#>St^Of= z88Gc%j0qMe-;ZK=ZXFF`Ru7q)KR4o(S@s)zPiBKw%cubhfStBJx0ioMK7dF?dPWZW ztYUdAY`8FW0ZWDapDGX?STEShey1_bxv*z8YrVQl(B5bGj~7-qvGWkQ${3^+UCu@~ zX7>fVi|VZR{90zx?XaQi4^Ko=t4 d~SpyyZ4nELRW!G6%&gBd)3{SQI8%)L!UR% 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 e(^IFXe_zoOM>L(EFpoTDJeB1& Date: Sun, 1 May 2022 01:45:22 +0800 Subject: [PATCH 3/9] refine --- docs/eval/evaluation_of_docs_system.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/eval/evaluation_of_docs_system.md b/docs/eval/evaluation_of_docs_system.md index 9670d572570..2fec30fca5b 100644 --- a/docs/eval/evaluation_of_docs_system.md +++ b/docs/eval/evaluation_of_docs_system.md @@ -429,7 +429,7 @@ MindSpore 的有自己独立的文档分类标准和风格,所以硬套本文 - 分布式训练 - 框架设计文档 -## 文档的完备性 & 宏观组织分析 +## Paddle 文档体系分析 现有 Paddle 文档,结构如下: From 8f2f4a4d51262f56e951264f547403ffc6d46b6c Mon Sep 17 00:00:00 2001 From: yaochi Date: Sun, 1 May 2022 10:50:51 +0800 Subject: [PATCH 4/9] update pic --- docs/eval/evaluation_of_docs_system.md | 4 +++- docs/eval/images/invalid-url.png | Bin 0 -> 28717 bytes 2 files changed, 3 insertions(+), 1 deletion(-) create mode 100644 docs/eval/images/invalid-url.png diff --git a/docs/eval/evaluation_of_docs_system.md b/docs/eval/evaluation_of_docs_system.md index 2fec30fca5b..b70ef312b9d 100644 --- a/docs/eval/evaluation_of_docs_system.md +++ b/docs/eval/evaluation_of_docs_system.md @@ -593,7 +593,9 @@ MindSpore 的有自己独立的文档分类标准和风格,所以硬套本文 **文章的新旧更迭** -还有一些文章的链接,已经失效了,比如 +还有一些文章的链接,已经失效了,比如 [本地开发指南](https://www.paddlepaddle.org.cn/documentation/docs/zh/guides/10_contribution/local_dev_guide_cn.html) 中: + +![](./images/invalid-url.png) 有些文章中引用的链接,虽然没有失效,但是其实不应该引用,或者需要做更新。比如 [使用动转静完成以图搜图](https://www.paddlepaddle.org.cn/documentation/docs/zh/practices/jit/image_search_with_jit.html) 一文中引用了 [基于图片相似度的图片搜索](https://www.paddlepaddle.org.cn/documentation/docs/zh/tutorial/cv_case/image_search/image_search.html),但是后者其实已经是一篇“孤岛文章”,并没有被纳入到 Paddle 的文档体系中: diff --git a/docs/eval/images/invalid-url.png b/docs/eval/images/invalid-url.png new file mode 100644 index 0000000000000000000000000000000000000000..b31f82b708ff042b4ffc080bcaa624a10694a0bb GIT binary patch literal 28717 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 Date: Sun, 1 May 2022 10:53:37 +0800 Subject: [PATCH 5/9] refine --- docs/eval/evaluation_of_docs_system.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/eval/evaluation_of_docs_system.md b/docs/eval/evaluation_of_docs_system.md index b70ef312b9d..670ee27f14f 100644 --- a/docs/eval/evaluation_of_docs_system.md +++ b/docs/eval/evaluation_of_docs_system.md @@ -614,7 +614,7 @@ MindSpore 的有自己独立的文档分类标准和风格,所以硬套本文 ### 内容分析 -按照本文开头谈及的“文档体系分类标准”, Tutorial 和 Guide 是两类相似,但是又不同的文档。一般而言,Tutorial 的风格更像一堂课,需要动手操作 steps,也需要介绍“只是概念”。而 Guide 是解决问题为导向的,需要一系列的 steps,以及较为直接的解决问题。 +按照本文开头谈及的“文档体系分类标准”, Tutorial 和 Guide 是两类相似,但是又不同的文档。一般而言,Tutorial 的风格更像一堂课,需要动手操作 steps,也需要介绍“知识概念”。而 Guide 是解决问题为导向的,需要一系列的 steps,以及较为直接的解决问题。 因为 Paddle 中的一些文章,并没有显式地说明到底是 Tutorial 还是 Guide。笔者只能根据自己的感受主观上判断,然后依据 Tutorial 或 Guide 的要求,来做分析,不一定准确,仅供参考。 From 1bda079ca8a4bca3c13b8d11a01bc4297c7a309f Mon Sep 17 00:00:00 2001 From: yaochi Date: Sun, 8 May 2022 22:35:58 +0800 Subject: [PATCH 6/9] refine 0508 --- docs/eval/evaluation_of_docs_system.md | 117 +++++++++++++++++++++++-- 1 file changed, 110 insertions(+), 7 deletions(-) diff --git a/docs/eval/evaluation_of_docs_system.md b/docs/eval/evaluation_of_docs_system.md index 670ee27f14f..b60a3a80b46 100644 --- a/docs/eval/evaluation_of_docs_system.md +++ b/docs/eval/evaluation_of_docs_system.md @@ -566,11 +566,33 @@ MindSpore 的有自己独立的文档分类标准和风格,所以硬套本文 | 框架设计文档 | Random number generation | 1 | 分散在 API 文档、源码中,其实比较丰富。30+ | 30+ | 设计白皮书 全场景统一 函数式微分编程 动静态图结合 异构并行训练 分布式并行 中间表达 MindIR 高性能数据处理引擎 图算融合加速引擎 二阶优化 可视化调试调优 安全可信 术语 | 13 | | 0 | | 其它 | Integrated gradients Uncertainty quantification with SNGP Probabilistic regression Keras一级标题下的13篇文章 Thinking in TensorFlow 2 Data input pipelines 一级标题下的3篇 GPU TPU | 20 | Learn the Basics Quickstart Deep Learning with PyTorch: A 60 Minute Blitz Building a Convolution/Batch Norm fuser in FX Building a Simple CPU Performance Profiler with FX Channels Last Memory Format in PyTorch Forward-mode Automatic Differentiation Using the PyTorch C++ Frontend Dynamic Parallelism in TorchScript Autograd in C++ Frontend Static Quantization with Eager Model in PyTorch | 11 | 基本介绍 快速入门 进阶案例:线性拟合 混合精度 梯度累积算法 自适应梯度求和算法 降维训练算法 | 7 | 10 分钟快速上手飞桨 使用线性回归预测波士顿房价 模型导出 ONNX 协议 飞桨产品硬件支持表 昆仑 XPU 芯片运行飞桨 海光 DCU 芯片运行飞桨 昇腾 NPU 芯片运行飞桨 环境变量 FLAGS 下9篇 hello paddle:从普通程序走向机器学习程序 通过AutoEncoder实现时序数据异常检测 广播介绍 自动混合精度训练 梯度裁剪 升级指南 | 20+ | -可以看除,PaddlePaddle 在文档上是比较完备的,但是在个别领域,还比较薄弱甚至空缺,主要是: +可以看除,PaddlePaddle 在文档上是比较完备的,在本文划分的 19 个具体领域中的 17 个领域中都已有文档,包括: + +- 基本数据(Tensor)和基本算子 +- 数据加载与预处理 +- 如何组网 +- 如何训练 +- 保存与加载模型 +- 可视化、调优技巧 +- 自动微分 +- 动态图与静态图 +- 部署相关 +- CV 领域相关 +- NLP 领域相关 +- 推荐领域相关 +- 强化学习领域相关 +- 移动端相关 +- 框架之间的迁移相关 +- 自定义算子 +- 分布式训练 + +并且,与其它框架相比,有一些独特的文章,它们归类到了“其它”中,比如与国产芯片的适配,Paddle 的环境变量的设置及意义等。 + +但是在个别领域,还比较薄弱甚至空缺,主要是: - 语音领域是空缺的 -- 与 PyTorch 相比,分布式领域的文档还比较薄弱 -- 框架设计文档在官方网站上也空缺 +- 与 PyTorch 相比,分布式领域的文档还比较薄弱。PyTorch 有 13 篇分布式有关的文档,涵盖了分布式训练的基本概念、设备之间的通信、不同模块的使用、不同分布式策略的选择和使用。而 Paddle 只有三篇,并且主要集中在 API 接口的介绍,没有结合分布式策略详细介绍,对于没有太多分布式训练经验的人而言,容易困惑。 +- 框架设计文档在官方网站上是空缺的,像 PyTorch、TensorFlow 都有深度介绍框架设计的文档,这对像参与开源建设或者自定义框架的高阶用户,还是很必要的。 ### 行文风格分析 @@ -614,11 +636,24 @@ MindSpore 的有自己独立的文档分类标准和风格,所以硬套本文 ### 内容分析 -按照本文开头谈及的“文档体系分类标准”, Tutorial 和 Guide 是两类相似,但是又不同的文档。一般而言,Tutorial 的风格更像一堂课,需要动手操作 steps,也需要介绍“知识概念”。而 Guide 是解决问题为导向的,需要一系列的 steps,以及较为直接的解决问题。 +#### 概述 + +按照 [The documentation system](https://documentation.divio.com/) 中对文档的划分(见本文开头图片),每类文档都有自己的特点和写作标准。而相邻区间的文档,又因为有相似的性质,所以容易“混乱”。 + +比如 Tutorial 和 Guide 是两类相似,但是又不同的文档。一般而言,Tutorial 的风格更像一堂课,需要动手操作 steps,也需要介绍“知识概念”。而 Guide 是解决问题为导向的,需要一系列的 steps,以及较为直接的解决问题。 + +如果在 Guide 中引入了太多的“知识概念”,会让急于解决具体问题的读者,感到重点不明显。 + +而如果在 Tutorial 中,不顾及读者的已有知识体系,单纯地“灌输”操作步骤,就容易让读者失去阅读和学习的乐趣,过早地产生放弃继续阅读的想法。 + +再比如,Reference 和 Guide 也是相邻的象限,不过 Guide 更侧重实际操作,而 Reference 注重理论知识。如果不注意它们的区分,比如在 Guide 中只介绍接口参数,却不举具体的接口使用的例子,容易让读者“心中没底”;在 Reference (如 API 文档)中如果不追求 “dry & clean” 的风格,以及完备的信息,就容易让读者怀疑资料的权威性。 -因为 Paddle 中的一些文章,并没有显式地说明到底是 Tutorial 还是 Guide。笔者只能根据自己的感受主观上判断,然后依据 Tutorial 或 Guide 的要求,来做分析,不一定准确,仅供参考。 -我认为,Paddle 当前文档中的 Tutorial,特别是初级内容部分,都很好的遵循了 Tutorial 的写作要求,如 [基本概念](https://www.paddlepaddle.org.cn/documentation/docs/zh/guides/01_paddle2.0_introduction/basic_concept/index_cn.html) 中的所有文章和 [模型开发](https://www.paddlepaddle.org.cn/documentation/docs/zh/guides/02_paddle2.0_develop/index_cn.html) 中的大部分文章。 +因为 Paddle 中的一些文章,并没有显式地说明到底是哪种类型,除了 API 文档明显应该属于 Reference 外,其它的笔者只能根据自己的感受主观上判断,并且笔者认为几乎均为 Tutorial 或者 Guide 类别,而没有显式的 Explanation 类别的文档。以下内容依据 Tutorial 或 Guide 的要求,来做具体案例分析,不一定准确,仅供参考。 + +#### 具体案例 + +Paddle 当前文档中的 Tutorial,特别是初级内容部分,都很好的遵循了 Tutorial 的写作要求,如 [基本概念](https://www.paddlepaddle.org.cn/documentation/docs/zh/guides/01_paddle2.0_introduction/basic_concept/index_cn.html) 中的所有文章和 [模型开发](https://www.paddlepaddle.org.cn/documentation/docs/zh/guides/02_paddle2.0_develop/index_cn.html) 中的大部分文章。 但是,对于一些类别为 Guide 的文章,往往还有提升空间。以一级标题 [动态图转静态图](https://www.paddlepaddle.org.cn/documentation/docs/zh/guides/04_dygraph_to_static/index_cn.html) 中的文章为例,我们继续讨论: @@ -647,7 +682,75 @@ MindSpore 的有自己独立的文档分类标准和风格,所以硬套本文 从组织结构角度分析,以我个人的感受,飞桨还有一些值得讨论,和可能改进的地方。 -#### 整体介绍 +#### 从 Paddle 文档一级标题看完备性分析 + +在上文 [完备性分析](#完备性分析) 部分,已经 Paddle 文档体系覆盖内容的分析。在本节,笔者尝试讨论,如何对文档的标题做重构,得到更好的文档结构,个人看法,仅供参考。之所以认为这样更合理,是可以为读者提供“一站式”服务,而现有的 Paddle 文档体系,同类别的文档,有时会分散在多个栏目中;或者某个重要的内容,藏的目录级别较深(如 “整体介绍/升级指南/使用高层 API”),不容易被读者发现。 + +建议,可以分为以下几个 “栏目”,每个栏目中有若干篇文章(一级标题)。 + +- 使用 Paddle +- Paddle 与 CV +- Paddle 与 NLP +- Paddle 与语音 +- Paddle 与推荐系统 +- Paddle 与强化学习 +- 自定义扩展 Paddle +- 框架设计文档 +- Cookbook + +它们与现有文档体系的对应关系,以下分开阐述。 + +**使用 Paddle** + +在这个栏目下,针对上手 Paddle 的用户,分模块介绍 Paddle 的各个功能。可以包括: + +- 快速上手(对应现有的《10 分钟快速上手飞桨》,同时应注意链在文章内连接重构后的其它更细节的文章) +- Tensor(对应现有的《Tensor 概念介绍》) +- 数据加载与预处理(对应现有的《数据集定义和加载》、《数据预处理》) +- 搭建模型(对应现有的《Paddle 中的模型与层》、《模型组网》) +- 模型训练(对应现有的《训练与预测验证》、《自定义指标》 +- 自动微分(对应现有的《自动微分机制介绍》) +- 转静态图(对应现有的《动态图与静态图一栏》) +- 模型的保存与加载(对应现有的《模型的保存于加载》) +- 分布式训练(对应现有的《单机多卡训练》、《分布式训练快速开始》、《使用 FleetAPI 进行分布式训练》 + +**Paddle 与 CV** + +对应现有 [计算机视觉](https://www.paddlepaddle.org.cn/documentation/docs/zh/practices/cv/image_classification.html) 与 [目标检测 YOLOv3](https://www.paddlepaddle.org.cn/tutorials/projectdetail/3106208) 中等的内容。 + +**Paddle 与 NLP** + +对应现有文档中的 [自然语言处理](https://www.paddlepaddle.org.cn/tutorials/projectdetail/2504863) 与 [持续学习语义理解框架](https://www.paddlepaddle.org.cn/tutorials/projectdetail/2538222)等内容。 + +**Paddle 与语音** + +这一部分 Paddle 尚缺少,可以参考 PyTorch 的文档 https://pytorch.org/tutorials/beginner/audio_io_tutorial.html + +**Paddle 与推荐系统** + +对应现有 [推荐系统](https://www.paddlepaddle.org.cn/tutorials/projectdetail/2200430) 中相关文档。 + +**Paddle 与强化学习** + +对应现有文档 [强化学习](https://www.paddlepaddle.org.cn/documentation/docs/zh/practices/reinforcement_learning/index_cn.html) 中相关文档。 + +**自定义扩展 Paddle** + +对应现有文档中 [自定义算子](https://www.paddlepaddle.org.cn/documentation/docs/zh/guides/07_new_op/index_cn.html) 中相关文档。且其中的 “Kernel Primitive API” 中的文章,可以上升一个级别。 + +**框架设计文档** + +现有 Paddle 文档欠缺这类文档,可以参考 Mindspore 的文档补充 https://www.mindspore.cn/docs/zh-CN/r1.7/design/technical_white_paper.html。 + +**Cookbook** + +建议将现有的已经足够丰富程独立产品的文档,分离出去,变为独立产品的文档(如部署相关的文档)。 + +将内容不够丰富,又不方便分类的“其它”类型的文档,做成 cookbook(具体名字可以讨论,这里主要是参考的 Python Cookbook 一书),意味着以解决问题为导向的实践指南。 + +比如现有的《自动混合精度训练》、《梯度剪裁方式介绍》、《飞桨模型量化》、《模型导出 ONNX》 等,可以放在这一个栏目。 + +#### “整体介绍”栏目下的结构问题 首先是 [整体介绍](https://www.paddlepaddle.org.cn/documentation/docs/zh/guides/01_paddle2.0_introduction/index_cn.html) 里的目录结构和内容可以考虑调整。 From fe16794a74de0d50f54d2334c00c61bd34dfac18 Mon Sep 17 00:00:00 2001 From: YaoChi Date: Fri, 13 May 2022 13:47:33 +0800 Subject: [PATCH 7/9] pre-commit migrate-config --- .pre-commit-config.yaml | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index e06e02f312e..45fdc772502 100755 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,10 +1,11 @@ +repos: - repo: https://github.com/pre-commit/mirrors-yapf.git - sha: v0.16.0 + rev: v0.16.0 hooks: - id: yapf files: \.py$ - repo: https://github.com/pre-commit/pre-commit-hooks - sha: a11d9314b22d8f8c7556443875b731ef05965464 + rev: a11d9314b22d8f8c7556443875b731ef05965464 hooks: - id: check-merge-conflict - id: check-symlinks @@ -15,7 +16,7 @@ - id: trailing-whitespace files: \.md$ - repo: https://github.com/Lucas-C/pre-commit-hooks - sha: v1.0.1 + rev: v1.0.1 hooks: - id: forbid-crlf files: \.md$ @@ -26,7 +27,7 @@ - id: remove-tabs files: \.md$ - repo: https://github.com/reyoung/pre-commit-hooks-jinja-compile.git - sha: 4a369cc72a4a2b8d3813ab8cc17abb5f5b21ef6c + rev: 4a369cc72a4a2b8d3813ab8cc17abb5f5b21ef6c hooks: - id: convert-jinja2-into-html # The argument means repleace filename from pattern `.*/([^/]*)\.tmpl` to `\1` From 83f0827201901646225138e17c368563531304ed Mon Sep 17 00:00:00 2001 From: YaoChi Date: Fri, 13 May 2022 13:55:41 +0800 Subject: [PATCH 8/9] pre-commit migrate-config --- .pre-commit-config.yaml | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index e06e02f312e..45fdc772502 100755 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,10 +1,11 @@ +repos: - repo: https://github.com/pre-commit/mirrors-yapf.git - sha: v0.16.0 + rev: v0.16.0 hooks: - id: yapf files: \.py$ - repo: https://github.com/pre-commit/pre-commit-hooks - sha: a11d9314b22d8f8c7556443875b731ef05965464 + rev: a11d9314b22d8f8c7556443875b731ef05965464 hooks: - id: check-merge-conflict - id: check-symlinks @@ -15,7 +16,7 @@ - id: trailing-whitespace files: \.md$ - repo: https://github.com/Lucas-C/pre-commit-hooks - sha: v1.0.1 + rev: v1.0.1 hooks: - id: forbid-crlf files: \.md$ @@ -26,7 +27,7 @@ - id: remove-tabs files: \.md$ - repo: https://github.com/reyoung/pre-commit-hooks-jinja-compile.git - sha: 4a369cc72a4a2b8d3813ab8cc17abb5f5b21ef6c + rev: 4a369cc72a4a2b8d3813ab8cc17abb5f5b21ef6c hooks: - id: convert-jinja2-into-html # The argument means repleace filename from pattern `.*/([^/]*)\.tmpl` to `\1` From 425add85ad5d54f983fa54a8375dd5cdf6c73a28 Mon Sep 17 00:00:00 2001 From: YaoChi Date: Fri, 13 May 2022 14:03:40 +0800 Subject: [PATCH 9/9] refine --- docs/eval/evaluation_of_docs_system.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/eval/evaluation_of_docs_system.md b/docs/eval/evaluation_of_docs_system.md index b60a3a80b46..607dabdadc2 100644 --- a/docs/eval/evaluation_of_docs_system.md +++ b/docs/eval/evaluation_of_docs_system.md @@ -848,4 +848,4 @@ Paddle 当前文档中的 Tutorial,特别是初级内容部分,都很好的 - 行文风格方面:建议对行文形式上做出更显式的要求(如中英文之间的空格),并做一次彻底的摸排 - 内容方面:Tutorial 类别质量已经很高,Guide 类别的部分文章可能存在“不必要的知识过多”,“实践性不足”,“配套不完善”的问题,期待改进。 -个人非常期待飞桨能整理开放出设计文档,让更多人可以了解飞桨开源代码背后的原理和巧妙。 \ No newline at end of file +个人非常期待飞桨能整理开放出设计文档,让更多人可以了解飞桨开源代码背后的原理和巧妙。