製作支持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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章