CoDL技术介绍及代码复现
1 CoDL MobiSys2021 技术介绍
CoDL是一个移动设备上并行DL推理框架,它基于Xiaomi MACE框架开发,主要利用手机SoC的CPU和GPU并行加速模型推理过程,而当前的主要的推理框架还是依次只利用一个设备去推理.
1.1 挑战和解决方案
- 减少异构处理器之间的数据共享开销
- 如何为异构处理器恰当地分配OP
为了充分利用异构处理器来加速Model的每一个OP,论文中提到了两个技术来解决上面的挑战.
- 混合类型优化的数据共享(hybrid type-friendly data sharing),这个技术允许每个处理器能够使用其最高效的数据类型去进行推理,因为文章中设计了实验,其结果表明如果异构处理器共用统一类型的数据结构会导致推理效率并不高效且不合理.为了减少共享的开销,同时还采用了hybrid-dimension partitioning和operator chain.
- 非线性和并发感知的延迟预测(non-linearity and concurrency-aware latency prediction).通过构建一个轻量且准确的延迟预测器来指导OP切分来确保合理性.
有空再详细介绍介绍CoDL的技术实现
2 代码复现
CoDL的代码已经开源在了GitHub上,地址是:https://github.com/csu-eis/CoDL/
2.1 CoDL运行流程
2.1.1 离线阶段(offline)
在离线阶段,CoDL设计了一个轻量的延迟预测器指导在在线阶段的OP切分,它会考虑到data sharing的开销.
2.1.2 在线阶段(online)
在线阶段分成了两个部分,一个是OP切分(operator partitioner),另一个是OP协同执行(operator co-executor).
- operator partitioner,这主要负责去找对于输入model的优化的OP 切分的计划,同样OP的权重也会被预分配CPU和GPU上,从而避免推理时再去转换.
- operator co-executor,这主要是就是根据切分计划去对OP执行进行同步,并对不同的处理器采用不同的数据类型.
2.2 基于CoDL加速模型
废话不多说了,开干.
2.2.1 构建Docker环境和可执行文件
编译镜像
1
2
3
4git clone https://github.com/csu-eis/CoDL.git
cd CoDL
# 基于dockerfile 编译出docker
docker build -t codl/codl -f ./Dockerfile .创建环境
1
2
3
4# 这里的{worksapce}设置为自己电脑上的工作区绝对路径
sudo docker run -it --name codl-u16 --privileged -v /dev/bus/usb:/dev/bus/usb -v {worksapce}:/root/worksapce --hostname codl codl/codl:latest /bin/bash
# sudo docker run -it --name codl-u16 --privileged -v /dev/bus/usb:/dev/bus/usb -v /home/yanghuan/Workspace/transsion:/root/worksapce --hostname codl codl/codl:latest /bin/bash这里我们需要注意一个电脑上只能同时开启一个adb server.请使用
adb kill-server
命令关闭其他正在运行的adb sever,确保只有docker里面的adb server正在运行1
2
3
4
5
6#查看一下手机序列号
adb devices
#结果
#root@codl:~/codl-mobile# adb devices
#List of devices attached
#3a9c4f5 device编译可执行文件并push到手机
1
2
3
4# 确保进入了docker 容器
cd ~/codl-mobile/
# 编译可执行文件
bash tools/codl/build_executable_files.sh构建成功如下图
push 到手机
1
2
3
4# 确保pwd还在~/codl-mobile/
bash tools/codl/push_executable_files.sh 3a9c4f5
# 确保push成功
adb -s 3a9c4f5 shell "ls /data/local/tmp/codl"push成功如下图
2.2.2 构建延迟预测器
收集延迟数据
1
2
3
4# 确保还在docker 容器内
cd /root/codl-eval-tools/codl-lat-collect-and-eval/
# 注意,如果我们需要对其他的Soc进行测试,我们需要改写collect_all_op_latency.sh,这里的.sh只支持[sdm855, sdm865, sdm888,kirin990]这几种
bash tools/collect_all_op_latency.sh sdm865 3a9c4f51
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17|-- t_conv2d_cpu_direct.csv
|-- t_conv2d_cpu_gemm.csv
|-- t_conv2d_cpu_winograd.csv
|-- t_conv2d_cpu_winograd_combined.csv
|-- t_conv2d_cpu_winograd_gemm.csv
|-- t_conv2d_gpu_direct.csv
|-- t_data_sharing.csv
|-- t_fc_cpu_gemv.csv
|-- t_fc_gpu_direct.csv
|-- t_mulayer_conv2d_cpu.csv
|-- t_mulayer_conv2d_gpu.csv
|-- t_mulayer_fc_cpu.csv
|-- t_mulayer_fc_gpu.csv
|-- t_mulayer_pooling_cpu.csv
|-- t_mulayer_pooling_gpu.csv
|-- t_pooling_cpu_direct_max.csv
`-- t_pooling_gpu_direct_max.csv训练延迟预测器
…
CoDL技术介绍及代码复现