最近在學習docker,實戰是最好的提升,于是就想著慢慢出一波案例來感受。
場景描述
altas 200dk RC ubuntu18.04 分設模式下 + 參考Ascend/samples v0.6.0+(不過目前環境指導沒啥變化。之后版本應當也可以)開發c++和python應用
之前都是裝在物理機上的,但是目前出現了docker的場景,但官方提供的鏡像貌似有問題,且不包含python和C++環境,于是產生制作一個docker鏡像的想法,搭建支持samples c++和python樣例的環境,達到開箱即用,之前也沒學過docker,現在正好學習一下。我這里的docker使用的都是root用戶,望周知。
官方文檔參考連接:
https://support.huawei.com/enterprise/zh/doc/EDOC1100191942/f3364285
前置條件
已經包含驅動和固件的一臺atlas 200dk物理機(配置正常聯網,apt鏡像源)。
已經在物理機正確的搭建一次samples的環境,樣例測試無誤,準備好第三方依賴包和driver包。主要是為了保證第三方依賴安裝的沒有問題,環境搭建中涉及到的編譯的文件只需要拷貝和解壓,節省時間。
準備Ascend-cann-nnrt_5.0.3.1_linux-aarch64.run安裝包
安裝過程
一. 安裝docker>18.03
在物理機上
su root
apt remove docker docker-engine docker-ce docker.io
apt update
apt install -y apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
add-apt-repository "deb [arch=arm64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
apt update
apt install docker-ce
systemctl status docker
檢查一下docker版本:
docker -v
二. 準備以下文件
Ascend-cann-nnrt_5.0.3.1_linux-aarch64.run
Dockerfile
ascend_install.info
3rdenv.tar.gz
driver.tar.gz
install.sh
version.info
統一放置在同一目錄。其中:
#操作系統及版本號,根據實際修改
FROM ubuntu:18.04
#設置離線推理引擎包參數
ARG NNRT_PKG
#設置環境變量
ARG ASCEND_BASE=/usr/local/Ascend
ENV LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ASCEND_BASE/nnrt/latest/lib64:/usr/lib64
ENV ASCEND_AICPU_PATH=$ASCEND_BASE/nnrt/latest
#設置進入啟動后的容器的目錄,本示例以root用戶運行為例,如果想使用非root用戶運行,可將命令改為WORKDIR /home
WORKDIR /root
ENV DEBIAN_FRONTEND=noninteractive
#拷貝離線推理引擎包c79_withruntime:0.6.0
COPY 3rdenv.tar.gz .
COPY driver.tar.gz .
COPY install.sh .
#配置樣例主要環境變量
ENV CPU_ARCH=aarch64
ENV THIRDPART_PATH=/root/Ascend/thirdpart/${CPU_ARCH}
ENV INSTALL_DIR=$ASCEND_BASE/nnrt/latest
ENV PYTHONPATH=${THIRDPART_PATH}/acllite:$PYTHONPATH
ENV LD_LIBRARY_PATH=${HOME}/Ascend/thirdpart/${CPU_ARCH}/lib:$LD_LIBRARY_PATH
# 運行環境安裝腳本
RUN sh install.sh && \
rm install.sh
#創建驅動進程訪問目錄
RUN mkdir -p /usr/slog
RUN mkdir -p /run/driver
RUN mkdir -p /var/driver
#修改目錄權限(非root用戶運行時需要修改)
#RUN chown -R HwHiAiUser:HwHiAiUser /usr/slog/
#RUN chown -R HwHiAiUser:HwHiAiUser /var/driver/
#USER HwHiAiUser
主要內容如下:
#!/bin/bash
echo ". /usr/local/Ascend/nnrt/set_env.sh">> ~/.bashrc
echo "export ASCEND_GLOBAL_EVENT_ENABLE=0">> ~/.bashrc
source ~/.bashrc
apt update
# v0.6.0 sample c++ ENV
cd /root
tar xvf 3rdenv.tar.gz
rm 3rdenv.tar.gz
mkdir -p ${INSTALL_DIR}/driver
tar xvf driver.tar.gz -C ${INSTALL_DIR}/driver
apt-get install libopencv-dev python3.6 python3-pip -y
python3.6 -m pip install --upgrade pip -i https://pypi.tuna.tsinghua.edu.cn/simple
pip3 config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
# v0.6.0 sample python ENV
python3.6 -m pip install Cython numpy tornado==5.1.0 protobuf
apt-get install python3-opencv -y
apt-get install -y libavformat-dev libavcodec-dev libavdevice-dev libavutil-dev libswscale-dev libavresample-dev
apt-get install pkg-config libxcb-shm0-dev libxcb-xfixes0-dev -y
python3.6 -m pip install av==6.2.0
apt-get install libtiff5-dev libjpeg8-dev zlib1g-dev libfreetype6-dev liblcms2-dev libwebp-dev tcl8.6-dev tk8.6-dev python-tk -y
python3.6 -m pip install Pillow
三 開始構建
su root
chmod 600 Dockerfile
chmod 600 install.sh
docker build -t 鏡像名稱:tag號 --build-arg NNRT_PKG=nnrt軟件包名稱 .
鏡像名稱:tag號
鏡像名稱與標簽,用戶可自行設置。
–build-arg 指定dockerfile文件內的參數。
NNRT_PKG=軟件包名稱
舉個例子
docker build -t nnrt5.0.3_sample0.6:0.1 --build-arg NNRT_PKG=Ascend-cann-nnrt_5.0.3.1_linux-aarch64.run .
中間會持續一段時間,耐心等待即可
當出現“Successfully built xxx”表示鏡像構建成功。
然后我們可以查看一下image信息
docker images
執行下列操作,不過中間的鏡像和tag號要對應修改
docker run -it --device=/dev/davinci0 --device=/dev/davinci_manager --device=/dev/svm0 --device=/dev/log_drv --device=/dev/event_sched --device=/dev/upgrade --device=/dev/hi_dvpp --device=/dev/memory_bandwidth --device=/dev/ts_aisle -v /usr/local/Ascend/driver/tools:/usr/local/Ascend/driver/tools -v /usr/local/Ascend/driver/lib64:/usr/local/Ascend/driver/lib64 -v /usr/local/sbin/npu-smi:/usr/local/sbin/npu-smi -v /var/hdc_ppc:/var/hdc_ppc -v /etc/hdcBasic.cfg:/etc/hdcBasic.cfg -v /etc/rc.local:/etc/rc.local -v /sys:/sys -v /usr/bin/sudo:/usr/bin/sudo -v /usr/lib/sudo/:/usr/lib/sudo/ -v /etc/sudoers:/etc/sudoers/ -v /etc/sys_version.conf:/etc/sys_version.conf 鏡像名稱:tag號 /bin/bash -c "/usr/local/Ascend/driver/tools/minirc_container_prepare.sh;/bin/bash"
進入后
我們用vgg測試,和C++樣例測試一下。