最近在学习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++样例测试一下。