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