制作支持GPU的用于部署AI模型的ARM64版docker镜像

      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

发布了61 篇原创文章 · 获赞 90 · 访问量 11万+

猜你喜欢

转载自blog.csdn.net/XCCCCZ/article/details/105474382