可视化教程

流程

1. local 本地算法跑通

1.1 准备工作

  • 根据算法所需要的依赖配置算法运行环境。

  • 准备好算法相应的数据集,下载解压后放入 cnn 项目的 root 目录即可。

1.2 更改传参

benchmark 下统一的传参和平台前端传参有所区别,需要根据平台上的传参规范,将算法中的传参进行更改。传参变化表如下:

benchmarkDubhedefault
of_cnn_train_val.py config.py“--model_save_dir”"--train_out"
/"--train_log""/train/log"
/"--train_visualized_log""/train/log"
of_cnn_train_val.py, ofrecord_util.py'--train_data_dir'"--data_url"None
"--optimizer""--model_update""momentum"
optimizer_util.py"--momentum""-"--mom"0.875

1.3 可视化summary

保存可视化日志,关于 oneflow 可视化例子可参见test_summary.py。在算法中,主要有以下两个地方需要添加

  • util.py 中定义 summary 类
class Summary(object):
def __init__(self, log_dir, config, filename='summary.csv'):
self._filename = filename
self._log_dir = log_dir
if not os.path.exists(log_dir): os.makedirs(log_dir)
self._metrics = pd.DataFrame({"epoch":0, "iter": 0, "legend": "cfg", "note": str(config)}, index=[0])
def scalar(self, legend, value, epoch, step=-1):
# TODO: support rank(which device/gpu)
df = pd.DataFrame(
{"epoch": epoch, "iter": step, "legend": legend, "value": value, "rank": 0},
index=[0])
self._metrics = pd.concat([self._metrics, df], axis=0, sort=False)
def save(self):
save_path = os.path.join(self._log_dir, self._filename)
self._metrics.to_csv(save_path, index=False)
  • Job 函数

of_cnn_train_val.py根据需求,定义不同可视化数据的 Job 函数,比如标量可视化 Job ScalarJob 、直方图可视化 Job HistogramJob 、媒体数据(图片)可视化 Job ImageJob

@flow.global_function(func_config)
def CreateWriter():
flow.summary.create_summary_writer(logdir)
@flow.global_function(func_config)
def ScalarJob(
value=flow.MirroredTensorDef((1,), dtype=flow.float),
step=flow.MirroredTensorDef((1,), dtype=flow.int64),
tag=flow.MirroredTensorDef((1000,), dtype=flow.int8),
):
flow.summary.scalar(value, step, tag)
@flow.global_function(func_config)
def HistogramJob(
value=flow.MirroredTensorDef((150, 80, 120, 120), dtype=flow.float32),
step=flow.MirroredTensorDef((1,), dtype=flow.int64),
tag=flow.MirroredTensorDef((1000,), dtype=flow.int8),
):
flow.summary.histogram(value, step, tag)
@flow.global_function(func_config)
def HistogramJob2(
value=flow.MirroredTensorDef((130, 2048, 10, 10), dtype=flow.float32),
step=flow.MirroredTensorDef((1,), dtype=flow.int64),
tag=flow.MirroredTensorDef((1000,), dtype=flow.int8),
):
flow.summary.histogram(value, step, tag)
@flow.global_function(func_config)
def PbJob(
value=flow.MirroredTensorDef((1000,), dtype=flow.int8),
step=flow.MirroredTensorDef((1,), dtype=flow.int64),
):
flow.summary.pb(value, step=step)
@flow.global_function(func_config)
def ImageJob(
value=flow.MirroredTensorDef(
shape=(100, 2000, 2000, 4), dtype=flow.uint8),
step=flow.MirroredTensorDef((1,), dtype=flow.int64),
tag=flow.MirroredTensorDef((100,), dtype=flow.int8),
):
flow.summary.image(value, step=step, tag=tag)

1.4 运行代码

运行相应指令进行算法的测试,比如对于 resnet50,运行以下指令:

python3 of_cnn_train_val.py \
--train_data_dir=$DATA_ROOT/train \
--num_examples=50 \
--train_data_part_num=1 \
--val_data_dir=$DATA_ROOT/validation \
--num_val_examples=50 \
--val_data_part_num=1 \
--num_nodes=1 \
--gpu_num_per_node=1 \
--optimizer="sgd" \
--momentum=0.875 \
--learning_rate=0.001 \
--loss_print_every_n_iter=1 \
--batch_size_per_device=16 \
--val_batch_size_per_device=10 \
--num_epoch=10 \
--model="resnet50"

2. docker容器内测试

2.1 根据算法所需依赖,制作镜像文件

oneflow预置镜像的Dockerfile以及使用说明:

note

在任意空文件夹下建立名为Dockerfile的文件,写入如下内容:

# 根据宿主机的cuda版本拉取对应的cuda镜像
FROM nvidia/cuda:10.2-cudnn7-devel-ubuntu18.04
# 删除nvidia更新源以避免apt update失败,安装python3-pip会同时安装python3
RUN rm -rf /etc/apt/sources.list.d && apt update && apt install -y python3-pip
# 升级pip3以支持manylinux的方式安装wheel包
RUN pip3 install --upgrade pip
# 此处的cu**要对应镜像的cuda版本,如cuda:10.2对应cu102
RUN pip3 install --find-links https://oneflow-inc.github.io/nightly oneflow_cu102
# 实测需要额外安装pandas才能正常训练
RUN pip3 install pandas
# 建立python软连接到python3,以兼容使用python运行命令的情况
RUN ln -s /usr/bin/python3 /usr/bin/python

保存后,在当前文件夹下执行:

docker build -t oneflow:cu102-py36-of018 .
note
  • -t 后为 镜像名:镜像tag* 的格式,建议tag中包含各主要模块的版本号以作区分。注意最后有一个“.”表示在当前文件夹寻找Dockerfile

2.2 启动容器

使用制作的镜像文件启动容器,并将算法和数据映射到容器内。例如将 /home/zjlab 映射到容器的 /home ,使用执行:

docker run -v /home/zjlab:/home -it 135b01da1952 bash

2.3 启动训练

在容器内,执行相应算法运行脚本:

python3 of_cnn_train_val.py --gpu_num_per_node=1 --model_update="sgd" --batch_size_per_device=8 --val_data_dir=/dataset --num_epoch=1 --train_data_part_num=1 --loss_print_every_n_iter=200 --learning_rate=0.256 --num_nodes=1 --train_log=/workspace/log --train_out=/workspace/out --train_visualized_log=/workspace/visualizedlog --data_url=/home/Caltech-256/ofrecord/train/ --gpu_num_per_node=1

3. 天枢平台算法部署

3.1上传算法

将上述步骤准备好的算法文件打包成 .zip 格式。登录天枢平台,选择算法开发-> 算法管理->上传算法,

上传算法
上传算法

3.2创建训练任务

在新创建的算法选择【创建训练任务】的操作,

添加训练任务
添加训练任务

3.3查看可视化输出

等待训练任务运行完成后,点击操作栏下的【更多】,选择可视化查看训练任务的可视化结果。

  • 模型结构
可视化-模型结构
可视化-模型结构
  • 标量数据
可视化-标量数据
可视化-标量数据
  • 媒体数据
可视化-媒体数据
可视化-媒体数据
  • 统计分析
可视化-统计分析
可视化-统计分析
  • 降维分析
可视化-降维分析
可视化-降维分析
  • 超参分析
可视化-超参分析
可视化-超参分析
  • 异常检测
可视化-异常检测
可视化-异常检测

常见问题

1.F0506 02:15:58.844909 6 memory_allocator.cpp:35] Check failed: cudaMallocHost(&ptr, size) : invalid argument (1)

F0506 02:08:35.226070 6 cudnn_conv_util.cpp:269] Check failed: cudnnCreate(&handle_) : CUDNN_STATUS_INTERNAL_ERROR (4)

平台资源不足造成报错

2.num_gpu_per_node 和平台资源选择相冲突,当节点规格选择: 8cpu16GB 内存 4gpu, 优先选择分布式

Last updated on