how_to_dev_backend_cn.md 4.5 KB
Newer Older
1
# 后台指南
N
Nicky Chan 已提交
2

3 4 5 6
VisualDL有三个功能模块.
1. 在训练过程中用来记录日志数据的 Python/C++ SDK。
1. 用来可视化训练数据的客户端单页面应用。
1. 后端 Flask 服务器,用来读取日志数据并提供给前端应用,以便前端可以展示各类图标,如柱状图,嵌入图等等.
N
Nicky Chan 已提交
7

8
这篇文档用来介绍 后端/SDK 的架构,以及指导用户自行开发。
N
Nicky Chan 已提交
9

10
关于前端的架构和开发指南,请看 [这里](https://github.com/PaddlePaddle/VisualDL/blob/develop/docs/how_to_dev_frontend_cn.md)
N
Nicky Chan 已提交
11 12


13
## 代码结构
N
Nicky Chan 已提交
14

15
所有后端和 SDK 的逻辑都在 visualdl 子文件夹里面
N
Nicky Chan 已提交
16 17 18 19 20 21 22

```
├── build
├── build.sh
├── CMakeLists.txt
├── frontend
├── visualdl
23
    ├── logic    - API for C++ SDK, information maintainer
N
Nicky Chan 已提交
24 25 26 27 28 29
    ├── python   - API for Python SDK
    ├── server   - Flask server, provides front end APIs for read data
    ├── storage  - Data structure and protobuf
    └── utils    - Helper function and classes
```

30
## 开发
N
Nicky Chan 已提交
31

32
任何在 ```server``` 文件夹里代码的改动,都可以通过运行以下命令
N
Nicky Chan 已提交
33 34

```
35
python visualdl/server/visualdl --logdir={LOG_DIR} --port=8080
N
Nicky Chan 已提交
36
```
37
来重启 Flask 服务器
N
Nicky Chan 已提交
38

39
需要注意的是如果你通过 `pip install wheel` 来安装 visualDL, 请确认重置 PYTHONPATH,以便是的上述命令可以运行。
N
Nicky Chan 已提交
40

41 42 43
任何在 ```logic```, ```python```, ```storage```, ```utils``` 中的代码修改,都需要重新 build core.so 或 SDK 来确保生效。

要么运行 VisualDL/build.sh 脚本来重新安装所有组件,要么安装特定的目标组件如下:
N
Nicky Chan 已提交
44 45 46 47 48 49 50 51 52

```
mkdir {VisualDL_ROOT}/build
cd build
cmake ..
make {TARGET MODULE}
```


53
## 测试
N
Nicky Chan 已提交
54

55
任何关于 SDK API 或其他核心组件的修改都必须提供相应的测试案例。
N
Nicky Chan 已提交
56 57


58
在 {VisualDL_ROOT}/CMakeList.txt 中,我们有一个测试文件清单
N
Nicky Chan 已提交
59 60 61 62 63 64 65 66 67 68 69 70 71 72 73

```
add_executable(vl_test
        ${PROJECT_SOURCE_DIR}/visualdl/test.cc
        ${PROJECT_SOURCE_DIR}/visualdl/logic/sdk_test.cc
        ${PROJECT_SOURCE_DIR}/visualdl/logic/histogram_test.cc
        ${PROJECT_SOURCE_DIR}/visualdl/storage/storage_test.cc
        ${PROJECT_SOURCE_DIR}/visualdl/storage/test_binary_record.cc
        ${PROJECT_SOURCE_DIR}/visualdl/utils/test_concurrency.cc
        ${PROJECT_SOURCE_DIR}/visualdl/utils/test_image.cc
        ${PROJECT_SOURCE_DIR}/visualdl/utils/concurrency.h
        ${PROJECT_SOURCE_DIR}/visualdl/utils/filesystem.h
        )
```

74
在相应被修改的代码文件处添加测试用例或者新的测试文件。你可以制作 vl_test 目标或者运行 vl_test 可执行文件来运行所有测试案例。
N
Nicky Chan 已提交
75 76 77 78 79 80 81 82 83

```
mkdir {VisualDL_ROOT}/build
cd build
cmake ..
make vl_test
./vl_test
```

84
## 后端 / SDK 架构
N
Nicky Chan 已提交
85

86
### 服务器
N
Nicky Chan 已提交
87

88 89 90
- 采用轻量级 Flask 框架来搭建服务器并提供以下两种服务
  - 搭建主程序来支持前端应用
  - 提供一系列 HTTP 访问点,通过返回的 JSON 来和前端沟通
91
- ```visualdl``` : 主程序入口
92 93 94 95 96 97 98 99 100 101
  - 定义了服务器参数
  - 给前端提供 API 和 路由匹配
- ```lib.py``` : 调用库函数的入口
  - 读取并缓存日志数据
  - 把数据变成 JSON
  - 重试机制
- ```graph.py``````onnx```
  - graph.py 定义了读取和解析 ONNX 模型文件的逻辑
  - 给前端提供具有结点和边信息的图模型JSON
  - ONNX 文件夹包含从 ONNX 代码库移植来的 ONNX Protobuf 接口
N
Nicky Chan 已提交
102 103


104
### 逻辑和 SDK
N
Nicky Chan 已提交
105 106

#### Python SDK
107 108
- ```pybind.cc``` : 为 C++ 创建 Python 接口
- ```storage.py``` : Python SDK 的 ```LogReader``````LogWriter``` API,对应于 pybind
N
Nicky Chan 已提交
109 110 111

#### C++ SDK
- ```sdk.h```
112 113 114 115 116 117 118 119 120 121 122 123 124 125
  - 定义了 ```LogReader``````LogWriter``` 的 C++ SDK 的API
  - 定义了诸如```Scalar```, ```Histogram```, ```Image``` 的功能模块以及它们相应的 ```Reader```
- ```sdk.cc``` : 实现了 ```Reader``` 以便使用 ```Storage``` 层来完成读和写

#### 信息容器
- 目前我们仅仅处理写操作时的同步逻辑

#### 存储
- 定义日志数据的格式如下:
  - ```Storage``` : 主数据存储地, 包含不同模式,比如 "train" 或 "test", 包含多个 ```Tablet```
  - ```Tablet``` : 把同一个数据类型用 ```tag``` 打包. 一个面板只代表一个数据类型,比如 ‘数值’, ‘柱状图’, ‘图像’。 可以包含多个 ```Record```。 比如,一个面板可以表达在 ‘数值’ 图像中的一条线。
  - ```Record``` : 最小单位,代表任何功能模块中的任何数据结构。
- 处理和磁盘之间的 序列化/去序列化 传输
- ```storage.proto```: 用来定义确切 读/写 接口的 protobuf 文件。