Docker中配置CUDA 版本的OpenCV和FFmpeg,支持H264,以及Anaconda虚拟环境调用 一、 前言 二、安装过程说明 三、详细Dockerfile
1. 背景说明
目的是Anaconda虚拟环境中调用支持GPU的OpenCV和支持CUVID的FFmpeg,且支持H264视频编码格式, 另外解除ffmpeg-gpu的NVENC的限制。前面文字都是踩坑记录,如果想看详细命令, 直接查看文末Dockerfile.
简单来说,主要特性包含以下几点:
- 安装有GPU支持的Opencv和CUDA;
- 支持H264格式编码;
- 解除了FFmpeg最大Session(最多支持编解码路数)限制
2. GPU架构说明
Geforce系列 | 核心代号 ( Code Name ) | 年代 ( time ) | 例 ( Instance ) |
---|---|---|---|
更早 | (无科学家名称代号) | 远古~2006 | GeForce 7800 GTX |
8000系 | 特斯拉 ( Tesla ) | 2007~2008 | GeForce 8800 GTS |
9000系 | 特斯拉 ( Tesla ) | 2008~2009 | GeForce 9600 GSO |
100系 | 特斯拉 ( Tesla ) | 2009~2009 | GeForce GTS 150 |
200系 | 特斯拉 ( Tesla ) | 2009~2009 | GeForce GTX 295 |
300系 | 特斯拉 ( Tesla ) | 2009~2010 | GeForce GT 335 |
400系 | 费米 ( Fermi ) | 2010~2011 | GeForce GTX 460 |
500系 | 费米 ( Fermi ) | 2011~2012 | GeForce GTX 555 |
600系 | 开普勒 ( Kepler ) | 2012~2013 | GeForce GTX 690 |
700系 | 麦克斯韦尔 ( Maxwell ) | 2013~2014 | GeForce GTX 750 Ti |
900系 | 麦克斯韦尔 ( Maxwell ) | 2014~2016 | GeForce GTX 960 |
10系 | 帕斯卡 ( Pascal ) | 2016~2018 | GeForce GTX 1080 Ti |
20系 | 图灵 ( Turing ) | 2018~2020 | GeForce RTX 2080 Ti |
30系 | 安培 ( Ampere ) | 2020~未来 | GeForce RTX™ 3080 |
3. 显卡算力的CUDA_ARCH_BIN和 CUDA_ARCH_PTX 的解释
-
NVIDIA*编译器允许生成二进制代码(cubin and fatbin)和中间代码(Parallel Thread eXecution,PTX)。 BIN二进制代码通为特定的GPU架构生成,因此不能保证与其他GPU的兼容性。PTX中间代码是编译后的GPU代码的一种中间形式,它可以再次编译为原生的GPU二进制码。PTX代码针对我们指定的显卡算力所对应虚拟平台。 在第一次调用时使用JIT编译器转化为二进制代码(实际物理显卡算力需要大于等于指定的算力,否则编译失败)
-
CUDA_ARCH_BIN
一般需要指定,且最好不要把所有版本都编译,如CUDA_ARCH_BIN="3.0 3.5 3.7 5.0 5.2 6.0 6.1 7.0 7.5 8.6"
.
最好根据上面的说明,查一下当前显卡的型号,以及对应的显卡算力,然后在这里指定一个即可,如3080显卡可以保持CUDA_ARCH_BIN="8.6"
。否则全部编译一遍速度会很慢。 -
CUDA_ARCH_PTX
中间代码一般使用得少,如3080显卡可以保持CUDA_ARCH_PTX =""
4. 关于OpenCV编译选项的一些说明
详细可以看:
二、安装过程说明
以下只叙述流程,详细的步骤请参考文末Dockerfile
1. NVIDIA-Driver、CUDA、Cudnn安装
这部分是常识,这里不做赘述
2. 基础库安装
也可以apt包管理工具(Ubuntu)安装(不排除有冗余包):
apt-get clean &&
apt-get -y update &&
apt-get
-o Acquire::BrokenProxy="true"
-o Acquire::http::No-Cache="true"
-o Acquire::http::Pipeline-Depth="0"
-y install
python3
python3-dev
make
cmake
build-essential
pkg-config
libatlas-base-dev
gfortran
libgl1-mesa-glx
libjasper-dev
libgtk2.0-dev
libtbb2
libtbb-dev
libavcodec-dev
libavformat-dev
libswscale-dev
libjpeg-dev
libpng-dev
libtiff5-dev
libdc1394-22-dev
libtiff-dev
libv4l-dev
liblapacke-dev
libx264-dev
software-properties-common
yasm
nasm
ninja-build
sysstat
libtcmalloc-minimal4
autoconf
libtool
flex
bison
libsm6
libxext6
libxrender1
libx264-dev
libx265-dev
libsndfile1
libmp3lame-dev
gcc
g++
libavutil-dev
libavcodec-dev
libavformat-dev
libswscale-dev
libavresample-dev
3. FFmpeg安装
可以使用官方Docker镜像,也可以从源码编译。
3.1 直接使用容器
3.2 从源码编译
这步可以参考
使用GPU硬件加速FFmpeg视频转码, 写的详细且亲测通过。
- x264库在上一步已经安装,请确保 编译时
--enable-libx264
; - 为了支持GPU编解码,需要确保
--enable-cuda --enable-cuvid --enable-nvenc
. 编译完成后执行ffmpeg -codecs | grep cuvid
查看cuvid提供的GPU编解码器,应当有类似如下结果:
4. OpenCV安装
详细命令见Dockerfile。这里有几个坑需要注意:
4.1 如果安装了Anaconda,最好先把环境变量注释掉(重要),否则很容易出未定义的引用 XXX
;
可以先获取虚拟环境的信息,然后取消激活
source activate torch_37 &&
OPENCV_PYTHON_EXECUTABLE_ANACONDA=$(which python${PYTHON_VERSION}) &&
OPENCV_INSTALL_PATH=$(python -c "import sys; print(sys.prefix)") &&
OPENCV_INCLUDE_DIR_ANACONDA=$(python -c "from distutils.sysconfig import get_python_inc; print(get_python_inc())") &&
OPENCV_PACKAGE_ANACONDA=$(python -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())") &&
conda deactivate &&
之后Cmake时候指定这些变量即可,如:
-D PYTHON${PYTHON_VERSION%%.*}_EXECUTABLE=$${OPENCV_PYTHON_EXECUTABLE_ANACONDA}
-D PYTHON_DEFAULT_EXECUTABLE=${OPENCV_PYTHON_EXECUTABLE_ANACONDA}
-D CMAKE_INSTALL_PREFIX=${OPENCV_INSTALL_PATH}
-D PYTHON${PYTHON_VERSION%%.*}_INCLUDE_DIR=${OPENCV_INCLUDE_DIR_ANACONDA}
-D PYTHON${PYTHON_VERSION%%.*}_PACKAGES_PATH=${OPENCV_PACKAGE_ANACONDA}
4.2 如果添加了opencv_contrib
, 有可能缺少文件,是Cmake配置时候下载失败导致的。错误信息如下:
/boostdesc.cpp:654:20: fatal error: boostdesc_bgm.i: No such file or directory
解决办法: 参考安装OpenCV时提示缺少boostdesc_bgm.i文件的问题解决方案(附带百度云资源) 把资源下载下来拷贝到opencv_contrib/modules/xfeatures2d/src/
目录下。(Dockerfile中我的链接有可能超时失效,请从这里下载)
4.3 CUDA_ARCH_BIN
请根据上文所述显卡算力进行修改
各个型号的显卡算力【CUDA_ARCH_BIN】如下图,该部分主要用于OpenCV编译时指定, 也可以从链接对应官网查询(以下为截图)。
4.4 解释器路径
Dockerfile中,python库安装到了Torch_37虚拟环境,这里可以根据实际python解释器情况修改。
三、详细Dockerfile
# ffmpeg - http://ffmpeg.org/download.html
#
# From https://trac.ffmpeg.org/wiki/CompilationGuide/Ubuntu
#
# ffmpeg docker - https://hub.docker.com/r/jrottenberg/ffmpeg/
#
# opencv docker - https://github.com/Valian/docker-python-opencv-ffmpeg and https://github.com/Borda/docker_python-opencv-ffmpeg/blob/master/gpu/Dockerfile
FROM tigerdockermediocore/cuda-ffmpeg-docker:4.2.3-cu102
LABEL maintainer="Geoffrey Wong <wangruifeng@mininglamp.com>"
COPY env.yml env.yml
COPY tritonclient-2.4.0-py3-none-any.whl tritonclient-2.4.0-py3-none-any.whl
# 这是我的项目压缩包,这里可以替换成自己的项目
COPY rail-welding-dev.zip rail-welding-dev.zip
COPY boostdesc.zip boostdesc.zip
# Install OpenCV
ARG PYTHON_VERSION=3.7
ARG OPENCV_VERSION=4.3.0
ARG ANACONDA_PATH='/root/miniconda3'
SHELL ["/bin/bash", "-c"]
ENV PATH="${ANACONDA_PATH}/bin:$PATH"
ENV DEBIAN_FRONTEND noninteractive
ENV NVIDIA_VISIBLE_DEVICES all
ENV NVIDIA_DRIVER_CAPABILITIES compute,video,utility
# Install all dependencies for OpenCV
RUN source ~/.bashrc &&
sed -i s@/archive.ubuntu.com/@/mirrors.aliyun.com/@g /etc/apt/sources.list &&
sed -i '$adeb http://security.ubuntu.com/ubuntu xenial-security main' /etc/apt/sources.list &&
apt-get -y update -qq --fix-missing &&
apt-get
-o Acquire::BrokenProxy="true"
-o Acquire::http::No-Cache="true"
-o Acquire::http::Pipeline-Depth="0"
-y install --no-install-recommends
# python${PYTHON_VERSION}
# python${PYTHON_VERSION}-dev
# $( [ ${PYTHON_VERSION%%.*} -ge 3 ] && echo "python${PYTHON_VERSION%%.*}-distutils" )
git
wget
unzip
make
cmake
libtbb2
gfortran
apt-utils
pkg-config
checkinstall
qt5-default
build-essential
libatlas-base-dev
libgtk2.0-dev
libavcodec57
libjasper-dev
libgl1-mesa-glx
libavcodec-dev
gfortran
libavformat57
libavformat-dev
libavutil-dev
libswscale4
libswscale-dev
libjpeg8-dev
libpng-dev
libtiff5-dev
libdc1394-22
libdc1394-22-dev
libxine2-dev
libv4l-dev
libgstreamer1.0
libgstreamer1.0-dev
libgstreamer-plugins-base1.0-0
libgstreamer-plugins-base1.0-dev
libglew-dev
libpostproc-dev
libeigen3-dev
libtbb-dev
libgtk2.0-dev
zlib1g-dev
yasm
nasm
ninja-build
fastjar
sysstat
libtcmalloc-minimal4
autoconf
libtool
flex
bison
libsm6
libxext6
libxrender1
gcc
g++
# 一些额外可选工具
rsync
openssh-server
wget
module-init-tools
openconnect
kmod
curl
vim &&
# 解决VIM中文乱码
sed -i '$a set encoding=UTF-8
set langmenu=zh_CN.UTF-8
set fileencodings=ucs-bom,utf-8,cp936,gb18030,big5,euc-jp,euc-kr,latin1
set fileencoding=utf-8' /etc/vim/vimrc &&
# install python dependencies, 如果不使用Anaconda,而是使用系统Python解释器,那么运行下面这段
# sysctl -w net.ipv4.ip_forward=1 &&
# wget https://bootstrap.pypa.io/get-pip.py --progress=bar:force:noscroll &&
# python${PYTHON_VERSION} get-pip.py &&
# rm get-pip.py &&
# pip${PYTHON_VERSION} install numpy &&
# Install Anaconda, Create Virtual Environment
wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/Miniconda3-py39_4.9.2-Linux-x86_64.sh &&
/bin/bash Miniconda3-py39_4.9.2-Linux-x86_64.sh -b -p /root/miniconda3 &&
rm Miniconda3-py39_4.9.2-Linux-x86_64.sh &&
sed -i '$a export PATH="${ANACONDA_PATH}/bin:$PATH"' ~/.bashrc &&
# export PATH="${ANACONDA_PATH}/bin:$PATH" &&
# echo 'export PATH="/root/miniconda3/bin:$PATH"' >> ~/.bashrc &&
source ~/.bashrc &&
conda clean -a -y &&
# 添加北京交大源
conda config --add channels https://mirror.bjtu.edu.cn/anaconda/pkgs/free/ &&
conda config --add channels https://mirror.bjtu.edu.cn/anaconda/pkgs/main/ &&
conda config --add channels https://mirror.bjtu.edu.cn/anaconda/cloud/conda-forge/ &&
conda config --add channels https://mirror.bjtu.edu.cn/anaconda/cloud/bioconda/ &&
conda config --add channels https://mirror.bjtu.edu.cn/anaconda/cloud/msys2/ &&
conda config --add channels https://mirror.bjtu.edu.cn/anaconda/cloud/pytorch/ &&
conda config --set show_channel_urls yes &&
# 创建虚拟环境
conda env create -f env.yml &&
sed -i '$a source activate torch_37' ~/.bashrc &&
source activate torch_37 &&
ln -s ${ANACONDA_PATH}/envs/torch_37/lib/python3.7/site-packages/pytz/zoneinfo/Asia/Shanghai /etc/localtime &&
pip install tritonclient-2.4.0-py3-none-any.whl &&
# 清理无用包
rm tritonclient-2.4.0-py3-none-any.whl &&
conda clean -a -y &&
rm -rf ${ANACONDA_PATH}/pkgs &&
# Get OpenCV,下载
cd / &&
wget https://github.com/opencv/opencv/archive/$OPENCV_VERSION.zip -O opencv.zip --progress=bar:force:noscroll &&
unzip -q opencv.zip &&
mv /opencv-$OPENCV_VERSION /opencv &&
rm opencv.zip &&
wget https://github.com/opencv/opencv_contrib/archive/$OPENCV_VERSION.zip -O opencv_contrib.zip --progress=bar:force:noscroll &&
unzip -q opencv_contrib.zip &&
mv /opencv_contrib-$OPENCV_VERSION /opencv_contrib &&
rm opencv_contrib.zip &&
# 这几个文件由于网络问题无法自动下载,如果失效可以自己网上找一下
# wget https://dts.mininglamp.com/pontus/download/wangruifeng/boostdesc.zip?valid_info=%5Ej%A1%B5%83%B0%DA%A60%EC%09%8BM%DB%9DJ%28P%8BF%24p%EE%B1%9E%03q%2F%08%8C%5D%DB%5D%3Dg2%FD%1F%DBp%BD%15%F8%A6%8FQK%B4U%9C%B7%D9%87%29%81x%CA%96%17HUR%3B6%A5%1B6%EA%FE%F9%3D%B9wP%B8G%97%B4%BC%D2A%9A%0B%A2d%C8%20%DC%2B%11%7F%29e%9F%A3%F9v%29i%0D%96e%C2%AA%19E%E6%A5%9A%F4C%CF%02%EC%E6u%29%C9%0C0Gx%18%0A%88%F9%90%0D%FD%EB%24%0C%24%89%7B%13g%E6ihci%24%5C%D4YT%2A%D0%C6a%3Dn%0C%B0%C7U%E7%B9%3E%18%D4%8A%AF%C5%D5%18N_%EAZ98%B1%82jE%88%C0%C2%7BZ%8C%13s%5D%1F%29%9Cj%E8%0F%02%88%EBud%BCm%BFm%1E%9E%B74I%A4%7B%9D%F5%F9%A5%CB%96%09%94%EA%B5%EDV%F1%5C%7F%CE%C8Q%28%C3U%C9%E0%B2%BCD%AF%B5fc%0B%27%AB%0E%20%16ds%20%3E%8D%CB%92%B3%E7%A4%CC%BEyc%C0%D6%243%05%BD%A0NE%2A%83%BAz%BB%AE%5C%9E4%88%26T5%C1%98%AB%FD%CE%8B%2Fd%CC%82z%8B%B1%C2%A8Y%96%9DW%23g%90%00%15M%AF%D4Q%C0%BE%5C%E5%D8%D9%ECq%A0%C0%FF%19%1E%BC%9Bt.Pd3%DC%AE%1AL%1AI%9E%09EG%FE%3E%F2%D8.%F6%8CEv%0D%C2%A0g%0Fq%FB%A7%3F%89G%16%FE%D8%CD%85l%CA%D1pJ%7C%D4%D4Zi%06aS%05r%C2U%F5%20%9AB.%86%94v%81%1Ab%CF%28%F9g%9A%A0%D3F%16%E3%17w%FF%C4%40%C4%2F%9Aj6l%9Cf%83%0B%EB%FAIK%B4%3Di%21%27%23l%CF%DE%BB%C1%F0%974p%B0L%98%DE%A4%8D%E2%D8%C8%DC%D6%F3-L%2FyS%22%C3%19%FC%D8%CF%99%B1%B1%9A%F3%E2%82Z%B7%0C%0B%ABJ%88H%80%B0%09%04%13%22%7EI%ABi%24%D9%F3%C9%E5%0C%7CB%80%28%DF%3C%EC%CB%BA%8By%3E8%27%9B%CFwDk%93d%E0%81 -O boostdesc.zip &&
unzip -q /tmp/workdir/boostdesc.zip -d /opencv_contrib/modules/xfeatures2d/src/ &&
unzip -q /tmp/workdir/boostdesc.zip -d /opencv_contrib/modules/xfeatures2d/test/ &&
rm -rf /tmp/workdir/boostdesc.zip &&
# Python Path,获取虚拟环境的路径、解释器、头文件呢、库文件路径
# source activate torch_37 &&
OPENCV_PYTHON_EXECUTABLE_ANACONDA=$(which python${PYTHON_VERSION}) &&
OPENCV_INSTALL_PATH=$(python -c "import sys; print(sys.prefix)") &&
OPENCV_INCLUDE_DIR_ANACONDA=$(python -c "from distutils.sysconfig import get_python_inc; print(get_python_inc())") &&
OPENCV_PACKAGE_ANACONDA=$(python -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())") &&
OPENCV_LIBRARY_ANACONDA=$(python -c "import distutils.sysconfig as sysconfig; print(sysconfig.get_config_var('LIBDIR'))") &&
# conda deactivate &&
# Prepare Build
mkdir /opencv/build &&
cd /opencv/build &&
cmake
-D INCLUDE_DIRS=${OPENCV_INCLUDE_DIR_ANACONDA} $INCLUDE_DIRS
-D LIBRARY_DIRS=$OPENCV_LIBRARY_ANACONDA $LIBRARY_DIRS
-D CMAKE_BUILD_TYPE=RELEASE
-D BUILD_PYTHON_SUPPORT=ON
-D BUILD_DOCS=ON
-D BUILD_PERF_TESTS=OFF
-D BUILD_TESTS=OFF
-D CMAKE_INSTALL_PREFIX=/usr/local/opencv
-D OPENCV_EXTRA_MODULES_PATH=/opencv_contrib/modules
-D BUILD_opencv_python3=ON
-D BUILD_opencv_python2=OFF
-D PYTHON${PYTHON_VERSION%%.*}_EXECUTABLE=${OPENCV_PYTHON_EXECUTABLE_ANACONDA}
-D PYTHON${PYTHON_VERSION%%.*}_INCLUDE_DIR=${OPENCV_INCLUDE_DIR_ANACONDA}
-D PYTHON${PYTHON_VERSION%%.*}_PACKAGES_PATH=${OPENCV_PACKAGE_ANACONDA}
-D BUILD_EXAMPLES=OFF
-D WITH_GTK=ON
-D WITH_GTK_2_X=ON
-D WITH_IPP=ON
-D BUILD_TIFF=ON
-D BUILD_opencv_cvv=OFF
-D INSTALL_CREATE_DISTRIB=ON
-D WITH_FFMPEG=ON
-D WITH_GSTREAMER=ON
-D WITH_V4L=ON
-D WITH_LIBV4L=ON
-D WITH_TBB=ON
-D WITH_QT=ON
-D WITH_OPENGL=ON
-D WITH_CUDA=ON
-D CUDA_TOOLKIT_ROOT_DIR=/usr/local/cuda
-D CMAKE_LIBRARY_PATH=/usr/local/cuda/lib64/stubs
## 注意这里算力7.5对应2080Ti显卡,需要根据物理机GPU型号更改,或者全部加入
-D CUDA_ARCH_BIN="7.5"
-D CUDA_ARCH_PTX=""
-D WITH_CUBLAS=ON
-D WITH_NVCUVID=ON
-D ENABLE_FAST_MATH=1
-D CUDA_FAST_MATH=1
-D ENABLE_PRECOMPILED_HEADERS=OFF
.. &&
ldconfig &&
# Build, Test and Install
cd /opencv/build &&
make -j$(nproc) &&
make install &&
mkdir /workspace &&
cd /workspace &&
rm -rf /opencv &&
rm -rf /opencv_contrib &&
ldconfig &&
# NVENC and NvFBC patches for Nvidia drivers
git clone https://gitee.com/xsxsxsxsxs/nvidia-patch.git &&
cp nvidia-patch/patch.sh /usr/local/bin/patch.sh &&
cp nvidia-patch/docker-entrypoint.sh /usr/local/bin/docker-entrypoint.sh &&
mkdir -p /patched-lib &&
chmod +x /usr/local/bin/patch.sh /usr/local/bin/docker-entrypoint.sh &&
# Create Project
unzip -q /tmp/workdir/rail-welding-dev.zip -d /workspace/ &&
rm -rf /tmp/workdir
ENTRYPOINT ["/usr/local/bin/docker-entrypoint.sh"]
WORKDIR /workspace/rail-welding-dev
cmake配置结果类似如下: