docker安装
可自行到https://tvm.apache.org/docs/install/docker.html 官网下载安装
环境:
系统: ubuntu22.04系统,
docker版本: 20.10.17
cuda: 11.6
因此在安装时选用了nvidia/cuda:11.6.1-devel-ubuntu20.04这个镜像文件
镜像 环境下载:
docker pull nvidia/cuda:11.6.1-devel-ubuntu20.04
通过sudo docker images
查看镜像,并使用如下命令启动镜像:
sudo docker run -it --shm-size=10g -v /home/ngl/workspace:/home/workspace --runtime=nvidia -e NVIDIA_VISIBLE_DEVICE=0 nvidia/cuda:11.6.1-cudnn8-devel-ubuntu20.04 /bin/bash
mmdet与onnxruntime环境安装
进入docker镜像后,执行apt-get update
和apt-get upgrade
对系统进行升级
安装pytorch
根据pytorch官网下载pytorch版本
pip3 install torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu116
安装MMCV
MMCV地址:https://github.com/open-mmlab/mmcv
安装命令:https://github.com/open-mmlab/mmcv
安装MMDetection
git clone https://github.com/open-mmlab/mmdetection.git
cd mmdetection
pip install -v -e .
验证MMDetection安装
下载config文件和checkpoint文件
yolov3_mobilenetv2_320_300e_coco.py
and yolov3_mobilenetv2_320_300e_coco_20210719_215349-d18dff72.pth
在mmdetection目录下执行
python demo/image_demo.py demo/demo.jpg yolov3_mobilenetv2_320_300e_coco.py yolov3_mobilenetv2_320_300e_coco_20210719_215349-d18dff72.pth --device cpu --out-file result.jpg
因在docker中执行,图片文件等不方便展示,在与宿主机共享目录中创建生成的目录文件,将结果存入其中
python3 demo/image_demo.py demo/demo.jpg ./configs/yolo/yolov3_mobilenetv2_320_300e_coco.py /home/workspace/Data/CheckpointFile/yolov3_mobilenetv2_320_300e_coco_20210719_215349-d18dff72.pth --device cuda --out-file /home/workspace/results/result.jpg
可在宿主机的/workspace/results目录中查看运行结果:
至此MMdection便安装成功
报错:
ImportError: libGL.so.1: cannot open shared object file: No such file or directory
缺少GL库文件,因此安装GL库即可
apt install libgl1-mesa-glx
ImportError: libgthread-2.0.so.0: cannot open shared object file: No such file or directory
解决方法:
apt-get install libglib2.0-dev
安装ONNX runtime
下载onnxruntime-linux 并暴露出ONNXRUNTIME_DIR
,将lib库加入到LD_LIBRARY_PATH
中
wget https://github.com/microsoft/onnxruntime/releases/download/v1.12.0/onnxruntime-linux-x64-1.12.0.tgz
tar -xzvf onnxruntime-linux-x64-1.12.0.tgz
cd onnxruntime-linux-x64-1.12.0
export ONNXRUNTIME_DIR=$(pwd)
export LD_LIBRARY_PATH=$ONNXRUNTIME_DIR/lib:$LD_LIBRARY_PATH
因为在编译mmcv时,需要用到onnx中的头文件,所以必须要导入这个
pip install onnxruntime-gpu
pip install onnx
验证
import torch
import torch.nn as nn
import numpy as np
class Model(nn.Module):
def __init__(self):
super(Model,self).__init__()
self.conv1 = nn.Conv2d(3, 16, kernel_size=3, stride=2, padding=1)
self.conv2 = nn.Conv2d(16, 32, kernel_size=3, stride=2, padding=1)
self.bn1 = nn.BatchNorm2d(16)
self.bn2 = nn.BatchNorm2d(32)
self.relu1 = nn.ReLU(inplace=True)
self.relu2 = nn.ReLU(inplace=True)
def forward(self, x):
x = self.conv1(x)
x = self.bn1(x)
x = self.relu1(x)
x = self.conv2(x)
x = self.bn2(x)
x = self.relu2(x)
return x
model=Model()
model.eval()
x=torch.randn((1,3,12,12))
torch.onnx.export(model, # 搭建的网络
x, # 输入张量
'model.onnx', # 输出模型名称
input_names=["input"], # 输入命名
output_names=["output"], # 输出命名
dynamic_axes={'input':{0:'batch'}, 'output':{0:'batch'}} # 动态轴
)
最后输出model.onnx即可
TVM源码安装
进入系统,便可根据官网中的操作步骤进行源码安装:
- 下载源码
使用--recursive
选项,循环克隆git子项目
git clone --recursive https://github.com/apache/tvm tvm
注:
relax并未合并TVM main,目前文档也相对较少。可以考虑查看https://github.com/tlc-pack/relax/wiki ,或者查阅源码
git clone --recursive https://github.com/mlc-ai/relax.git relax
在进行项目编译之前,需要安装必需的库:
sudo apt-get update
sudo apt-get install -y python3 python3-dev python3-setuptools gcc libtinfo-dev zlib1g-dev build-essential cmake libedit-dev libxml2-dev
- 创建编译目录
mkdir build
cp cmake/config.cmake build
修改config.cmake中的配置选项:
- 如需要使用cuda,将
set(USE_CUDA OFF)
改成set(USE_CUDA ON)
,使能CUDA后端,OpenCL/RCOM等都是一样的 - 为debug方便,可
set(USE_GRAPH_EXECUTOR ON)
andset(USE_PROFILER ON)
确保嵌入式图形执行器和调试函数 - 因LLVM用于CPU codegen,强烈建议安装LLVM,并修改
set(USE_LLVM ON)
可使cmake搜索一个可用的LLVM版本
LLVM安装:
apt-get install llvm
使用如下命令测试llvm是否测试成功:
llvm-config --version
- 如果要加入VTA,将其中一行set(USE_VTA_FSIM OFF)改为set(USE_VTA_FSIM ON)
如有其他配置需要,可自行根据官网提示进行配置
- 编译TVM
cd build
cmake ..
make -j4
最后在build目录中生产libtvm.so和libtvm_runtime.so两个动态库
- 增加python支持
在~/.bashrc
中加入如下几行:
export TVM_HOME=/home/workspace/tvm/tvm
export PYTHONPATH=$TVM_HOME/python:$TVM_HOME/vta/python:${PYTHONPATH}
export VTA_HW_PATH=$TVM_HOME/3rdparty/vta-hw
- 安装python相关依赖
pip3 install numpy decorator attrs
pip3 install tornado
pip3 install tornado psutil xgboost==1.5.0
pip3 install mypy orderedset antlr4-python3-runtime
注:
踩坑记录:
-
CMake was unable to find a build program corresponding to "Ninja". CMAKE_MAKE_PROGRAM is not set
On Ubuntu, I think it'sapt-get install ninja-build
. -
Crttest failed, no rules to make the target “crttest”
I think this is because you don’t have set(USE_MICRO ON)
in your config.cmake. tests/scripts/task_config_build_cpu.sh turns this option on, which is why task_cpp_unittest.sh assumes that that target exists.
参考链接:https://discuss.tvm.apache.org/t/crttest-failed-no-rules-to-make-the-target-crttest/8450
python倒入自定义模块的方法:
要用import mymodule导入自定义的模块,其必须在python的搜索路径中,一般有三种方法可以采用:
1.将你自定义的模块(.py文件)放置在python的任意搜索路径下(可以在python中输入import sys
和sys.path
查看搜索路径)
2.修改环境变量PYTHONPATH
以包含用户自定义模块的路径
-
临时修改: 在终端输入
export PYTHONPATH=/mymodule directory:$PYTHONPATH
,利用echo $PYTHONPATH
命令可查看是否将路径添加成功。该方法在当前终端下有效,但若关闭终端后重新打开,则会失效。 -
彻底修改: 要想使修改始终有效,则需要修改用户或系统的环境变量配置文件。以修改用户的环境变量配置文件
.bashrc
或.profile
为例(两个文件均在用户主目录下/home/用户名,.bahsrc包含专用于你的bash shell的bash信息,当登录以及每次打开新的shell时,该文件被读取;.profile包含专用于你的shell信息,当用户登录时,该文件仅仅执行一次,它设置一些环境变量,执行用户的.bashrc文件)。cd到用户主目录下,打开.bashrc或.profile文件,在末尾添加一行export PYTHONPATH=/mymodule directory:$PYTHONPATH,保存退出后,执行source .bashrc 或source .profile命令使修改生效。修改系统环境变量配置文件的过程也类似,只不过相应的文件要到/etc 目录下去找。
- 修改python的sys.path变量,在导入自定义模块前,执行以下操作。此方法也只能临时起作用,退出python下次再进来就失效了。
import sys
sys.path.append('mymodule directory')
参考:https://blog.csdn.net/Blateyang/article/details/78753051
此外,该docker镜像中,根据mmdetection中的关于pytorch模型如何导出onnx的guide,安装了mmcv,pytorch-gpu,mmdet,onnxruntime及onnx等程序包
如有需要,可通过以下命令进行拉取,但请注意,本环境cuda版本11.6,不知道在其他平台上会不会有影响,请自行评估
docker pull niuli/tvm_onnx:v2
docker访问X server
在宿主机安装如下
安装xserver
$ sudo apt install x11-xserver-utils
许可所有用户都可访问xserver
xhost +
在创建运行镜像时
sudo docker run -itd --shm-size=10g --net=host -e DISPLAY=$DISPLAY -p 7789:22 -v /home/ngl/workspace/:/home/workspace --runtime=nvidia -e NVIDIA_VISABLE_DEVICE=0 tvm:v2.3 /bin/bash
其中最重要的是:--net=host -e DISPLAY=$DISPLAY
验证:
使用带有界面功能的时钟软件尝试
在docker容器中:
$ apt-get install xarclock
$ xarclock
应该可以看到xserver端显示器显示时钟界面。
VSCode访问docker容器
在服务容器中配置ssh
- 通过一个其他的端口进入容器,这里使用6789端口
sudo docker run -it --shm-size=10g -p 6789:22 -v /home/ngl/workspace:/home/workspace --runtime=nvidia -e NVIDIA_VISIBLE_DEVICE=0 nvidia/cuda:11.6.1-cudnn8-devel-ubuntu20.04 /bin/bash
登陆到容器中后下载openssh
2. 下载openssh
apt-get update
apt-get install openssh-server
-
设置root密码
passwd
会设置两遍相同的密码,之后登陆的时候用到 -
修改配置文件
vim /etc/ssh/sshd_config
注释掉PermitRootLogin prohibit-password
这一行
添加这一行PermitRootLogin yes
-
重启ssh服务
service ssh restart
# 或使用
# /etc/init.d/ssh restart
-
本机链接ssh
ssh -p 6789 root@0.0.0.0
-
远程访问服务器docker里正在运行的容器
ssh -p 6789 root@192.168.x.xx
如报错:ssh: connect to host 0.0.0.0 port 6789: Connection refused
原因:没有开放对应端口
解决方案:
在主机上:sudo iptables -I INPUT -p tcp --dport 6789 -j ACCEPT
- 在宿主机上配置vscode
8.1 安装Remote-SSH插件
使用插件连接远程服务器里的容器
这样即可在本地vscode中使用docker中的环境,但美中不足的是如果想要显示图片等可视化数据,存在一定的限制,目前,我想到的仅是先本地docker保存起来,然后在宿主机中打开查阅
如:
在plt.show()
后,执行plt.savefig("filename.png")