后台指南

VisualDL有三个功能模块.

  • 在训练过程中用来记录日志数据的 Python/C++ SDK。
  • 用来可视化训练数据的客户端单页面应用。
  • 后端 Flask 服务器,用来读取日志数据并提供给前端应用,以便前端可以展示各类图标,如柱状图,嵌入图等等.这篇文档用来介绍 后端/SDK 的架构,以及指导用户自行开发。

关于前端的架构和开发指南,请看 这里

代码结构

所有后端和 SDK 的逻辑都在 visualdl 子文件夹里面

  1. ├── build
  2. ├── build.sh
  3. ├── CMakeLists.txt
  4. ├── frontend
  5. ├── visualdl
  6. ├── logic - API for C++ SDK, information maintainer
  7. ├── python - API for Python SDK
  8. ├── server - Flask server, provides front end APIs for read data
  9. ├── storage - Data structure and protobuf
  10. └── utils - Helper function and classes

开发

任何在 server 文件夹里代码的改动,都可以通过运行以下命令

  1. 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 脚本来重新安装所有组件,要么安装特定的目标组件如下:

  1. mkdir {VisualDL_ROOT}/build
  2. cd build
  3. cmake ..
  4. make {TARGET MODULE}

测试

任何关于 SDK API 或其他核心组件的修改都必须提供相应的测试案例。

在 {VisualDL_ROOT}/CMakeList.txt 中,我们有一个测试文件清单

  1. add_executable(vl_test
  2. ${PROJECT_SOURCE_DIR}/visualdl/test.cc
  3. ${PROJECT_SOURCE_DIR}/visualdl/logic/sdk_test.cc
  4. ${PROJECT_SOURCE_DIR}/visualdl/logic/histogram_test.cc
  5. ${PROJECT_SOURCE_DIR}/visualdl/storage/storage_test.cc
  6. ${PROJECT_SOURCE_DIR}/visualdl/storage/test_binary_record.cc
  7. ${PROJECT_SOURCE_DIR}/visualdl/utils/test_concurrency.cc
  8. ${PROJECT_SOURCE_DIR}/visualdl/utils/test_image.cc
  9. ${PROJECT_SOURCE_DIR}/visualdl/utils/concurrency.h
  10. ${PROJECT_SOURCE_DIR}/visualdl/utils/filesystem.h
  11. )

在相应被修改的代码文件处添加测试用例或者新的测试文件。你可以制作 vl_test 目标或者运行 vl_test 可执行文件来运行所有测试案例。

  1. mkdir {VisualDL_ROOT}/build
  2. cd build
  3. cmake ..
  4. make vl_test
  5. ./vl_test

后端 / SDK 架构

服务器

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

逻辑和 SDK

Python SDK

  • pybind.cc : 为 C++ 创建 Python 接口
  • storage.py : Python SDK 的 LogReaderLogWriter API,对应于 pybind

C++ SDK

  • sdk.h
    • 定义了 LogReaderLogWriter 的 C++ SDK 的API
    • 定义了诸如Scalar, Histogram, Image 的功能模块以及它们相应的 Reader
  • sdk.cc : 实现了 Reader 以便使用 Storage 层来完成读和写

信息容器

  • 目前我们仅仅处理写操作时的同步逻辑

存储

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