后台指南
VisualDL有三个功能模块.
- 在训练过程中用来记录日志数据的 Python/C++ SDK。
- 用来可视化训练数据的客户端单页面应用。
- 后端 Flask 服务器,用来读取日志数据并提供给前端应用,以便前端可以展示各类图标,如柱状图,嵌入图等等.这篇文档用来介绍 后端/SDK 的架构,以及指导用户自行开发。
关于前端的架构和开发指南,请看 这里
代码结构
所有后端和 SDK 的逻辑都在 visualdl 子文件夹里面
- ├── build
- ├── build.sh
- ├── CMakeLists.txt
- ├── frontend
- ├── visualdl
- ├── logic - API for C++ SDK, information maintainer
- ├── 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
开发
任何在 server
文件夹里代码的改动,都可以通过运行以下命令
- python visualdl/server/visualdl --logdir={LOG_DIR} --port=8080
来重启 Flask 服务器
需要注意的是如果你通过 pip install wheel
来安装 visualDL, 请确认重置 PYTHONPATH,以便是的上述命令可以运行。
任何在 logic
, python
, storage
, utils
中的代码修改,都需要重新 build core.so 或 SDK 来确保生效。
要么运行 VisualDL/build.sh 脚本来重新安装所有组件,要么安装特定的目标组件如下:
- mkdir {VisualDL_ROOT}/build
- cd build
- cmake ..
- make {TARGET MODULE}
测试
任何关于 SDK API 或其他核心组件的修改都必须提供相应的测试案例。
在 {VisualDL_ROOT}/CMakeList.txt 中,我们有一个测试文件清单
- 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
- )
在相应被修改的代码文件处添加测试用例或者新的测试文件。你可以制作 vl_test 目标或者运行 vl_test 可执行文件来运行所有测试案例。
- mkdir {VisualDL_ROOT}/build
- cd build
- cmake ..
- make vl_test
- ./vl_test
后端 / SDK 架构
服务器
- 采用轻量级 Flask 框架来搭建服务器并提供以下两种服务
- 搭建主程序来支持前端应用
- 提供一系列 HTTP 访问点,通过返回的 JSON 来和前端沟通
visualdl
: 主程序入口- 定义了服务器参数
- 给前端提供 API 和 路由匹配
lib.py
: 调用库函数的入口- 读取并缓存日志数据
- 把数据变成 JSON
- 重试机制
graph.py
和onnx
- graph.py 定义了读取和解析 ONNX 模型文件的逻辑
- 给前端提供具有结点和边信息的图模型JSON
- ONNX 文件夹包含从 ONNX 代码库移植来的 ONNX Protobuf 接口
逻辑和 SDK
Python SDK
pybind.cc
: 为 C++ 创建 Python 接口storage.py
: Python SDK 的LogReader
和LogWriter
API,对应于 pybind
C++ SDK
sdk.h
- 定义了
LogReader
和LogWriter
的 C++ SDK 的API - 定义了诸如
Scalar
,Histogram
,Image
的功能模块以及它们相应的Reader
- 定义了
sdk.cc
: 实现了Reader
以便使用Storage
层来完成读和写
信息容器
- 目前我们仅仅处理写操作时的同步逻辑
存储
- 定义日志数据的格式如下:
Storage
: 主数据存储地, 包含不同模式,比如 “train” 或 “test”, 包含多个Tablet
Tablet
: 把同一个数据类型用tag
打包. 一个面板只代表一个数据类型,比如 ‘数值’, ‘柱状图’, ‘图像’。 可以包含多个Record
。 比如,一个面板可以表达在 ‘数值’ 图像中的一条线。Record
: 最小单位,代表任何功能模块中的任何数据结构。
- 处理和磁盘之间的 序列化/去序列化 传输
storage.proto
: 用来定义确切 读/写 接口的 protobuf 文件。