使用来自 docker 的 openvino

Use openvino from docker

我正在尝试使用 docker 容器中的 OpenVINO。 我使用来自官方网站 https://docs.openvinotoolkit.org/latest/_docs_install_guides_installing_openvino_docker_linux.html

的 docker 文件
FROM ubuntu:18.04
USER root
WORKDIR /
SHELL ["/bin/bash", "-xo", "pipefail", "-c"]
# Creating user openvino
RUN useradd -ms /bin/bash openvino && \
    chown openvino -R /home/openvino
ARG DEPENDENCIES="autoconf \
                  automake \
                  build-essential \
                  cmake \
                  cpio \
                  curl \
                  gnupg2 \
                  libdrm2 \
                  libglib2.0-0 \
                  lsb-release \
                  libgtk-3-0 \
                  libtool \
                  udev \
                  unzip \
                  dos2unix"
RUN apt-get update && \
    apt-get install -y --no-install-recommends ${DEPENDENCIES} && \
    rm -rf /var/lib/apt/lists/*
WORKDIR /thirdparty
RUN sed -Ei 's/# deb-src /deb-src /' /etc/apt/sources.list && \
    apt-get update && \
    apt-get source ${DEPENDENCIES} && \
    rm -rf /var/lib/apt/lists/*
# setup Python
ENV PYTHON python3.6
RUN apt-get update && \
    apt-get install -y --no-install-recommends python3-pip python3-dev lib${PYTHON}=3.6.9-1~18.04 && \
    rm -rf /var/lib/apt/lists/*
ARG package_url=ARG package_url=http://registrationcenter-download.intel.com/akdlm/irc_nas/16612/l_openvino_toolkit_p_2020.2.120.tgz
ARG TEMP_DIR=/tmp/openvino_installer
WORKDIR ${TEMP_DIR}
ADD ${package_url} ${TEMP_DIR}
# install product by installation script
ENV INTEL_OPENVINO_DIR /opt/intel/openvino
RUN tar -xzf ${TEMP_DIR}/*.tgz --strip 1
RUN sed -i 's/decline/accept/g' silent.cfg && \
    ${TEMP_DIR}/install.sh -s silent.cfg && \
    ${INTEL_OPENVINO_DIR}/install_dependencies/install_openvino_dependencies.sh
WORKDIR /tmp
RUN rm -rf ${TEMP_DIR}
# installing dependencies for package
WORKDIR /tmp
RUN ${PYTHON} -m pip install --no-cache-dir setuptools && \
    find "${INTEL_OPENVINO_DIR}/" -type f -name "*requirements*.*" -path "*/${PYTHON}/*" -exec ${PYTHON} -m pip install --no-cache-dir -r "{}" \; && \
    find "${INTEL_OPENVINO_DIR}/" -type f -name "*requirements*.*" -not -path "*/post_training_optimization_toolkit/*" -not -name "*windows.txt"  -not -name "*ubuntu16.txt" -not -path "*/python3*/*" -not -path "*/python2*/*" -exec ${PYTHON} -m pip install --no-cache-dir -r "{}" \;
WORKDIR ${INTEL_OPENVINO_DIR}/deployment_tools/open_model_zoo/tools/accuracy_checker
RUN source ${INTEL_OPENVINO_DIR}/bin/setupvars.sh && \
    ${PYTHON} -m pip install --no-cache-dir -r ${INTEL_OPENVINO_DIR}/deployment_tools/open_model_zoo/tools/accuracy_checker/requirements.in && \
    ${PYTHON} ${INTEL_OPENVINO_DIR}/deployment_tools/open_model_zoo/tools/accuracy_checker/setup.py install
WORKDIR ${INTEL_OPENVINO_DIR}/deployment_tools/tools/post_training_optimization_toolkit
RUN if [ -f requirements.txt ]; then \
        ${PYTHON} -m pip install --no-cache-dir -r ${INTEL_OPENVINO_DIR}/deployment_tools/tools/post_training_optimization_toolkit/requirements.txt && \
        ${PYTHON} ${INTEL_OPENVINO_DIR}/deployment_tools/tools/post_training_optimization_toolkit/setup.py install; \
    fi;
# Post-installation cleanup and setting up OpenVINO environment variables
RUN if [ -f "${INTEL_OPENVINO_DIR}"/bin/setupvars.sh ]; then \
        printf "\nsource ${INTEL_OPENVINO_DIR}/bin/setupvars.sh\n" >> /home/openvino/.bashrc; \
        printf "\nsource ${INTEL_OPENVINO_DIR}/bin/setupvars.sh\n" >> /root/.bashrc; \
    fi;
RUN find "${INTEL_OPENVINO_DIR}/" -name "*.*sh" -type f -exec dos2unix {} \;
USER openvino
WORKDIR ${INTEL_OPENVINO_DIR}
CMD ["/bin/bash"]

但是如果我尝试使用此行启动 python 程序:

from openvino.inference_engine import IECore

它写 ModuleNotFoundError,没有名为 'openvino' 的模块。我尝试使用这些命令获取文件 setupvars.sh 的源代码,但没有帮助。

RUN /bin/bash -c "source /opt/intel/openvino/bin/setupvars.sh"
RUN source /opt/intel/openvino/bin/setupvars.sh

我应该怎么做才能使用来自 docker 的 openvino python 应用程序?

如果您正在构建 Docker 图像,并尝试在 docker 图像之外 运行 OpenVINO Python 应用程序,它将无法工作。您可以创建 Docker 图像和 运行 Docker 图像以交互方式执行图像中的 Python 应用程序。有关 docker run 的更多信息,请参阅 https://docs.docker.com/engine/reference/run/

在我的环境中使用时,您的 Docker 文件中发现了几个问题。经过以下更改和步骤后,您应该能够导入 openvino 模块和 运行 一个 Python 应用程序:

在 Docker 文件行 #34:

// Before:
apt-get install -y --no-install-recommends python3-pip python3-dev lib${PYTHON}=3.6.9-1~18.04 && \
// After:
apt-get install -y --no-install-recommends python3-pip python3-dev lib${PYTHON} && \


在 Docker 文件行 #36:

// Before:    
ARG package_url=ARG package_url=http://registrationcenter-download.intel.com/akdlm/irc_nas/16612/l_openvino_toolkit_p_2020.2.120.tgz
// After:   
ARG package_url=http://registrationcenter-download.intel.com/akdlm/irc_nas/16612/l_openvino_toolkit_p_2020.2.120.tgz


经过以上改动后,运行docker build . -t <image-name>(即dockerbuild .-t openvino-ubuntu)build Docker 图片。如果成功,您将看到 Successfully built bf2280a70ffd Successfully tagged openvino-<image-name>:latest

然后 运行 图像与 docker run -it <image_name> 交互(即 docker 运行 -it openvino-ubuntu)。你会看到类似于:

[setupvars.sh] OpenVINO environment initialized
openvino@ce618ea2bc47:/opt/intel/openvino_2020.2.120$


要验证 Python 是否能够从 openvino 模块导入 IECCore,请使用 Python 解释器进行测试:

openvino@ce618ea2bc47:/opt/intel/openvino_2020.2.120$ python3
Python 3.6.9 (default, Apr 18 2020, 01:56:04) 
[GCC 8.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from openvino.inference_engine import IECore
>>>    


对于 运行 OpenVINO Python 应用程序,测试 /opt/intel/openvino/deployment_tools/inference_engine/samples/python 中的示例应用程序之一,例如 object_detection_sample_ssd.py:

openvino@ce618ea2bc47:/opt/intel/openvino_2020.2.120$ python3 /opt/intel/openvino/deployment_tools/inference_engine/samples/python/object_detection_sample_ssd/object_detection_sample_ssd.py

usage: object_detection_sample_ssd.py [-h] -m MODEL -i INPUT [INPUT ...]
                                  [-l CPU_EXTENSION] [-d DEVICE]
                                  [--labels LABELS] [-nt NUMBER_TOP]
object_detection_sample_ssd.py: error: the following arguments are required: -m/--model, -i/--input

setupvars.sh 所做的本质上是导出使 OpenVINO 正常工作的环境变量,具体来说:

  1. 将 openvino python 模块路径附加到 PYTHONPATH,以便 python 解释器知道在哪里可以找到 openvino 包(所有 python 源)。
  2. 将 openvino 共享库路径附加到 LD_LIBRARY_PATH,这样任何 .so openvino 运行time 依赖的文件都可以被系统动态链接器找到。

source /opt/intel/openvino/bin/setupvars.sh 修改当前 bash 进程执行命令行的环境变量,以及稍后从同一个 bash 解释器调用的所有子进程(继承父进程环境变量)

但在 Dockerfile 中,运行 指令 execute commands differently,每个命令都在单独的容器中执行,并且只在命令之间保存对图像的影响,对环境变量的任何修改都会丢失。

稍后在构建 docker 图像后,您尝试从它启动一个容器并在该容器内使用 openvino,您必须在该控制台中 运行 source /opt/intel/openvino/bin/setupvars.sh 而不是之前使用 openvino。

但是你可以通过将这个命令放入docker镜像中的/root/.bashrc来避免这样一个繁琐的步骤,所以从容器调用的bash shell会自动执行它为你。这也是大多数 openvino dockerfile 所做的:

RUN echo "source /opt/intel/openvino/bin/setupvars.sh" >> /root/.bashrc

检查this and this

顺便说一下,通常 python 包不应该依赖于某些脚本的来源来使其正常工作,标准 python 包会将 python 源复制到标准位置并且所有共享对象文件都使用 RPATH/RUN_PATH 来解决动态链接问题(w/o 将 so 文件安装到 /usr/lib)。例如,如果您通过 pip 安装 openvino,则不需要此步骤。