制作支持GPU的用于部署AI模型的ARM64版docker镜像
hub.docker.com上绝大部分镜像都是只能在X86平台上使用的,arm上的很少,arm64上的装有Ubuntu18.04的只找到个arm64v8/ubuntu:18.04镜像,pull下来后使用过,里面很多东西没安装,连基本的vim都没有安装,而且安装完一些支持包后使用nvidia-docker run 创建的容器里面GPU设备总是找不到,GPU测试通不过,虽然CUDA和cuD...
hub.docker.com上绝大部分镜像都是只能在X86平台上使用的,arm上的很少,arm64上的装有Ubuntu18.04的只找到个arm64v8/ubuntu:18.04镜像,pull下来后使用过,里面很多东西没安装,连基本的vim都没有安装,而且安装完一些支持包后使用nvidia-docker run 创建的容器里面GPU设备总是找不到,GPU测试通不过,虽然CUDA和cuDNN都可以找到,不知道具体原因,没时间进一步查找,只好改用NVIDIA提供的l4t-base镜像,在NVIDIA的l4t-base镜像上的基础上做出的镜像使用GPU是没问题的。
首先查找镜像版本:
docker search nvcr.io/nvidia/l4t-base
然后执行下列步骤拉取镜像并创建并运行容器:
docker pull nvcr.io/nvidia/l4t-base:r32.3.1
xhost +si:localuser:root
sudo docker run --runtime nvidia --network host -it --name nvidia-l4t-base-container -e DISPLAY=$DISPLAY -v /data/workspace:/home -v /tmp/.X11-unix/:/tmp/.X11-unix nvcr.io/nvidia/l4t-base:r32.3.1
在容器里安装g++和make。编译测试GPU能否使用的sample代码nbody,运行编译出的nbody,如果能弹出炫酷的动画窗口就表示没问题了:
apt-get update && apt-get install -y --no-install-recommends make g++
cp -r /usr/local/cuda/samples /tmp
cd /tmp/samples/5_Simulations/nbody
make
./nbody
测试没问题的话,接下来安装部署运行AI模型需要的若干支持包:
apt-get update
apt-get install python3-pip cmake libopenblas-dev
apt-get install python-pip #可选
apt-get install pkg-config libfreetype6-dev
apt-get install python3-dev libxml2-dev libxslt1-dev zlib1g-dev libffi-dev libssl1.0-dev gfortran \
libatlas-base-dev liblapack-dev liblapacke-dev checkinstall
apt install -y vim git wget gcc g++ automake autoconf libtool make build-essential zlib1g-dev openssl libssl-dev libbz2-dev \
libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev \
xz-utils tk-dev libffi-dev liblzma-dev python-openssl libxml2-dev libxmlsec1-dev
python3 -m pip install --upgrade pip
pip3 install -i http://mirrors.aliyun.com/pypi/simple/ setuptools cython numpy scikit-build ninja pyyaml cffi future six typing matplotlib --trusted-host mirrors.aliyun.com
apt-get install python-opencv # 可选
apt-get install python3-opencv
安装python版本切换环境并选择设置python3为默认python版本:
sudo update-alternatives --install /usr/bin/python python /usr/bin/python2 200
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3 300
sudo update-alternatives --config python
输入 300并确认
安装cocoapi:
git clone https://github.com/cocodataset/cocoapi.git
cd cocoapi/PythonAPI/
make
python setup.py install --user
安装pytorch,pytorch官网默认没有提供ARM版,以前nvidia的论坛上可以下载编译好了的pytorch:https://forums.developer.nvidia.com/t/pytorch-for-jetson-nano-version-1-4-0-now-available/72048,但是现在经常下载不了,只能自己下载源码编译,选择安装很多基于pytorch实现的模型都支持的版本pytorch1.2:
git clone --recursive --depth 1 https://github.com/pytorch/pytorch.git -b v${PYTORCH_VERSION=1.2.0}
cd pytorch
git submodule update --init --recursive
设置环境变量
export USE_NCCL=0 # Xavier上只有一个GPU,用不着NCCL
export TORCH_CUDA_ARCH_LIST="5.3;6.2;7.2" # Xavier的compute capacity是7.2
export PYTORCH_BUILD_VERSION=1.2.0
export PYTORCH_BUILD_NUMBER=1
执行命令开始几个小时的编译和安装:
python setup.py install
安装完pytorch1.2,安装torchvision, torchvision和PyTorch的版本有如下对应关系:
PyTorch v1.0 - torchvision v0.2.2
PyTorch v1.1 - torchvision v0.3.0
PyTorch v1.2 - torchvision v0.4.0
PyTorch v1.3 - torchvision v0.4.2
PyTorch v1.4 - torchvision v0.5.0
所以选择安装torchvision v0.4.0,安装前先安装支持包:
apt-get install libjpeg-dev zlib1g-dev
pip3 install -i http://mirrors.aliyun.com/pypi/simple/ 'pillow<7' --trusted-host mirrors.aliyun.com
再下载源码安装:
git clone --branch v0.4.0 https://github.com/pytorch/vision torchvision
cd torchvision
python setup.py install
安装完毕,记得执行 cd .. 退到上层目录,比如做测试时会报错,import torch时报找不到 ._C这个库的错误
编译一个文件test_gpu.py,内容如下:
import torch
print(torch.__version__)
print('CUDA available: ' + str(torch.cuda.is_available()))
print('cuDNN version: ' + str(torch.backends.cudnn.version()))
a = torch.cuda.FloatTensor(2).zero_()
print('Tensor a = ' + str(a))
b = torch.randn(2).cuda()
print('Tensor b = ' + str(b))
c = a + b
print('Tensor c = ' + str(c))
import torchvision
print(torchvision.__version__)
保存后执行 python test_gpu.py,如果没有报错,正确输出全部打印,则上述安装没有任何问题,GPU可以正确使用。
最后一步,设置容器的环境:
vi ~/.bashrc
export CUDA_HOME=/usr/local/cuda
export PATH=/usr/local/cuda/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH
export LANG=C.UTF-8
cd /home
然后退出容器(停掉了)并将容器实例(id 774f8eba107a )提交为镜像arm64v8/ubuntu18.04/nvidia-cuda:pytorch1.2-cec:
sudo docker commit -a "nvidia/l4t-base:r32.3.1 python2.7 python3.6 pytorch1.2" 774f8eba107a arm64v8/ubuntu18.04/nvidia-cuda:pytorch1.2-cec
测试新生成的镜像,创建一个随docker service启动的容器(name为pytorch1.2_centernet-efficientdet-cascadercnn):
sudo xhost +si:localuser:root
sudo docker run --runtime nvidia -d -it --ipc=host --network host --restart=always --name pytorch1.2_centernet-efficientdet-cascadercnn -e DISPLAY=$DISPLAY -v /tmp/.X11-unix/:/tmp/.X11-unix -v /data/workspace:/home arm64v8/ubuntu18.04/nvidia-cuda:pytorch1.2-cec
连到容器并执行nbody做测试
sudo docker exec -it 56348e37173b bash
cd /tmp/samples/5_Simulations/nbody
./nbody
弹出动画窗口则表示使用GPU没问题。
再在某个test_gpu.py文件里输入中文,检查是否可以正常输入和显示中文,加#encoding :utf-8后保存为uft-8格式,执行它如果没错,则容器OK了,可以继续在这个容器里安装部署一个或多个使用pytoch实现的AI模型所需的环境了。
可以使用docker save命令将上面的arm64v8/ubuntu18.04/nvidia-cuda:pytorch1.2-cec保存为一个基础镜像tar文件,供在其他需要这样的镜像的arm平台上部署:
docker save -o arm64v8-ubuntu18.04_nvidia-cuda-pytorch1.2-cec.tar arm64v8/ubuntu18.04/nvidia-cuda:pytorch1.2-cec
更多推荐
所有评论(0)