目的是Anaconda虚拟环境中调用支持GPU的OpenCV和支持CUVID的FFmpeg,且支持H264视频编码格式。前面文字都是踩坑记录,如果想看详细命令,直接查看文末Dockerfile.
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 |
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 =""
详细可以看:
以下只叙述流程,详细的步骤请参考文末Dockerfile
这部分是常识,这里不做赘述
也可以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
可以使用官方Docker镜像,也可以从源码编译。
这步可以参考
使用GPU硬件加速FFmpeg视频转码, 写的详细且亲测通过。
--enable-libx264
; --enable-cuda --enable-cuvid --enable-nvenc
. 编译完成后执行ffmpeg -codecs | grep cuvid
查看cuvid提供的GPU编解码器,应当有类似如下结果:详细命令见Dockerfile。这里有几个坑需要注意:
未定义的引用 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}
opencv_contrib
, 有可能缺少文件,是Cmake配置时候下载失败导致的。错误信息如下:/boostdesc.cpp:654:20: fatal error: boostdesc_bgm.i: No such file or directory
解决办法: 参考[安装OpenCV时提示缺少boostdesc_bgm.i文件的问题解决方案(附带百度云资源)](https://blog.csdn.net/AlexWang30/article/details/99612188?utm_medium=distribute.pc_relevant.none-task-blog-2~default~BlogCommendFromMachineLearnPai2~default-3.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2~default~BlogCommendFromMachineLearnPai2~default-### #### 3.control) 把资源下载下来拷贝到opencv_contrib/modules/xfeatures2d/src/
目录下。(Dockerfile中我的链接有可能超时失效,请从这里下载)
CUDA_ARCH_BIN
请根据上文所述显卡算力进行修改各个型号的显卡算力【CUDA_ARCH_BIN】如下图,该部分主要用于OpenCV编译时指定, 也可以从链接对应官网查询(以下为截图)。
Dockerfile中,python库安装到了Torch_37虚拟环境,这里可以根据实际python解释器情况修改。
# 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
COPY env.yml env.yml
SHELL ["/bin/bash", "-c"]
ENV PATH="/root/miniconda3/bin:$PATH"
# Install OpenCV
ARG PYTHON_VERSION=3.7
ARG OPENCV_VERSION=4.3.0
# Install all dependencies for OpenCV
RUN source ~/.bashrc && sed -i s@/archive.ubuntu.com/@/mirrors.aliyun.com/@g /etc/apt/sources.list && sed -i ‘$a\deb 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 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 zlib1g-dev yasm nasm ninja-build curl vim sysstat libtcmalloc-minimal4 autoconf libtool flex bison libsm6 libxext6 libxrender1 apt-utils rsync openssh-server mysql-server wget gcc g++ && # 解决VIM中文乱码
sed -i ‘$a \set encoding=UTF-8\nset langmenu=zh_CN.UTF-8\nset fileencodings=ucs-bom,utf-8,cp936,gb18030,big5,euc-jp,euc-kr,latin1\nset fileencoding=utf-8‘ /etc/vim/vimrc && # install python dependencies
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
wget https://repo.anaconda.com/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="/root/miniconda3/bin:$PATH"‘ ~/.bashrc && export PATH="/root/miniconda3/bin:$PATH" && # echo ‘export PATH="/root/miniconda3/bin:$PATH"‘ >> ~/.bashrc && source ~/.bashrc && conda env create -f env.yml && # pip install tritonclient-2.4.0-py3-none-any.whl && # 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://shield.mlamp.cn/task/api/file/space/download/84d6450f9ad9921e4b4ae23bc2e95d37JMCTS9Ed/235054/boostdesc.zip && unzip -q boostdesc.zip -d /opencv_contrib/modules/xfeatures2d/src/ && unzip -q boostdesc.zip -d /opencv_contrib/modules/xfeatures2d/test/ && rm -rf 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())") && conda deactivate && # Prepare Build
mkdir /opencv/build && cd /opencv/build && cmake -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 -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_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} -D BUILD_EXAMPLES=OFF -D WITH_IPP=OFF -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 # https://kezunlin.me/post/6580691f
# https://stackoverflow.com/questions/28010399/build-opencv-with-cuda-support
# https://en.wikipedia.org/wiki/CUDA#GPUs_supported
# https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#features-and-technical-specifications
# -D CUDA_ARCH_BIN="3.0 3.5 3.7 5.0 5.2 6.0 6.1 7.0 7.5" -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 .. && # Build, Test and Install
cd /opencv/build && make -j$(nproc) && make install && ldconfig && # cleaning
apt-get -y remove unzip gfortran apt-utils checkinstall libatlas-base-dev libgtk2.0-dev libavcodec-dev libavformat-dev libavutil-dev libswscale-dev libjpeg8-dev libpng12-dev libtiff5-dev libdc1394-22-dev libxine2-dev libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libglew-dev libpostproc-dev libeigen3-dev libtbb-dev && apt-get autoremove -y && apt-get clean && rm -rf /opencv /opencv_contrib /var/lib/apt/lists/*
CMD ["/bin/bash"]
ENV LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/local/lib"
cmake配置结果类似如下:
Docker中配置OpenCV-FFmpeg-CUDA 以及Anaconda虚拟环境调用
原文:https://www.cnblogs.com/geoffreyone/p/14765124.html