CV-CUDA是NVIDIA和字节联合开发的GPU前后端处理加速库,该库能实现将图像、视频的预处理和后处理都加载到GPU上进行处理,大幅提高模型推理能力,缺点就是需要更多一点的显存占用。有兴趣想深入研究的建议看一下下面这两个官方的文档。
CV-CUDA的官方说明文档:https://cvcuda.github.io/installation.html
CV-CUDA的官方说明文档:https://github.com/CVCUDA/CV-CUDA
经过多次尝试安装,本文针对CV-CUDA环境的配置进行以下详尽的介绍,包括安装过程中存在的问题和方法等等。需要说明的是为了不影响本地环境和更好地适配NVIDIA对CV-CUDA环境的要求(对软件配置版本要求很高)
,本文通过docker镜像创建容器的方式对安装和编译环境进行测试。因为本文会先介绍一部分的docker容器创建过程,已经对docker镜像容器比较熟悉的小伙伴们可以自行跳过。
CUDA的版本官方要求11.8及以上(12.0以上没有进行过测试),本文在11.4的版本下进行配置也是可行的。
镜像容器的CUDA环境必须要和本地环境中的CUDA版本相对应,不然后面使用镜像中的CUDA就会报错。
报错情况如:CUDA error with code 45059568
和
No error string available
。
docker run -it --gpus=all -v <local_mount_path>:<docker_mount_path> nvcr.io/nvidia/tensorrt:22.09-py3
参考:https://github.com/CVCUDA/CV-CUDA/tree/release_v0.2.x/samples
docker images
docker ps -a
docker commit 要保存的容器id 镜像名称:版本号 # 保存镜像
docker exec –it 容器id bash
docker导入导出镜像文件:
把某个docker镜像保存到本地文件,命令如下
导出镜像
docker save -o 镜像名.tar 原始镜像名:版本号
如:sudo docker save -o /home/user/images/ubuntu_20.04.tar ubuntu:20.04
导入镜像
docker load -i ./xxx.tar
据官方的介绍This container comes with Ubuntu 20.04 with Python 3.8.10.
,因此如果不是通过官网镜像进行配置的小伙伴们最好还是按这个要求来,可以减少一些繁琐的步骤。
按照官方的文档要求,有这些安装的包,有些包还是嵌套需要安装其他包,特别是VideoProcessingFramework(基于python)。
Recommended linux distros:
Ubuntu >= 20.04 (tested with 20.04 and 22.04)
WSL2 with Ubuntu >= 20.04 (tested with 20.04)
NVIDIA driver
Linux: Driver version 520.56.06 or higher
TensorRT == 8.5.2.2
NVIDIA Video Processing Framework (https://github.com/NVIDIA/VideoProcessingFramework)
Follow the instructions from Github (https://github.com/NVIDIA/VideoProcessingFramework/wiki/Building-from-source) to build it from source on Linux. VPF's dependencies include ffmpeg and NVIDIA's Video Codec SDK.
Python Packages:
torch == 1.13.0
torchvision == 0.14.0
torchnvjpeg (https://github.com/itsliupeng/torchnvjpeg)
av == 10.0.0
总的来说,要安装torch, torchvision, torchnvjpeg(基于C++), FFMPEG, x264和VideoProcessingFramework等等。
pip install torch==1.13.0 torchvision==0.14.0 -i https://pypi.tuna.tsinghua.edu.cn/simple
git clone https://github.com/itsliupeng/torchnvjpeg.git
cd torchnvjpeg-main
python setup.py bdist_wheel
cd dist && pip install torchnvjpeg-0.1.0-xxxx-linux_x86_64.whl
ImportError: libc10.so: cannot open shared object file: No such file or directory
cd /usr/local/ && mdkir x264 # 可根据自身需要更改安装路径
git clone https://code.videolan.org/videolan/x264 x264
cd x264
./configure --enable-shared --disable-asm --prefix=/usr/local/x264
make -j4 && make install
ERROR: x264 not found using pkg-config
wget https://pkg-config.freedesktop.org/release/pkg-config-0.29.2.tar.gz
tar -xvf pkg-config-0.29.2.tar.gz
cd pkg-config-0.29.2
./configure --with-internal-glib --prefix=/usr/local
make -j8 && make install
pkg-config --list-all|grep x264
ERROR: libx264 not found
export PKG_CONFIG_PATH=/usr/local/x264/lib/pkgconfig # you can write to /etc/profile
source /etc/profile
获取ffmpeg项目文件并配置:
cd /usr/local/
mkdir ffmpeg
git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg/
cd ffmpeg
./configure --prefix=$(pwd)/build_x64_release_shared --disable-static --disable-stripping --disable-doc --enable-shared --enable-nonfree --enable-cuda --enable-cuda-nvcc --enable-gpl --enable-libx264 --enable-cuvid --enable-nonfree --enable-cuda-nvcc --enable-libnpp --extra-cflags=-I/usr/local/cuda/include --extra-ldflags=-L/usr/local/cuda/lib64 --disable-x86asm --extra-libs=-ldl
/usr/local/ffmpeg
这个路径下,读者可以根据自己的需要进行路径指定,如修改则下面所提到的相应路径也需进行修改;编译安装:
make clean
make -j4 -s && make install
配置环境变量
vim ~/.bashrc
export PATH=/usr/local/ffmpeg/build_x64_release_shared/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/ffmpeg/build_x64_release_shared/lib:$LD_LIBRARY_PATH
source ~/.bashrc
添加库链接:
echo "/usr/local/ffmpeg/build_x64_release_shared/lib" >> /etc/ld.so.conf
ldconfig # 更新
检查ffmpeg安装情况:
ffmpeg -hwaccels # 检查硬件加速,有输出则正常
ffmpeg -codecs | grep cuvid # 输出结果含有h264_cuvid和h264_nvenc即可硬件加速
ERROR: ffmpeg: error while loading shared libraries: libx264.so.164: cannot open shared object file: No such file or directory
vim /etc/ld.so.conf
在文件内容后面加上x264的lib路径,比如这里安装到了/usr/local/x264/lib,保存退出
刷新配置ldconfig
再执行ffmpeg -version就可以了
ERROR: cuda requested, but not all dependencies are satisfied: ffnvcodec”
git clone http://git.videolan.org/git/ffmpeg/nv-codec-headers.git
make
sudo make install
获取VideoProcessingFramework项目文件:
git clone https://github.com/NVIDIA/VideoProcessingFramework.git
cd VideoProcessingFramework
mkdir -p build
cd build
apt安装依赖包,一般在装ffmpeg时就已装好:
apt install -y \
libavfilter-dev \
libavformat-dev \
libavcodec-dev \
libswresample-dev \
libavutil-dev
apt install libnvidia-encode-515 libnvidia-decode-515 # 515需换成本地对应的驱动版本号
下载sdk:
访问https://developer.nvidia.com/nvidia-video-codec-sdk/download进行下载
复制下载得到的sdk文件夹到/usr/local/文件夹下。(复制的路径可以按照需要进行修改,需要记住,下面会用到
)
cp -r Video_Codec_SDK /usr/local/ # 路径可以按照需要进行修改,需要记住,下面会用到
(1)配置:
cd build
cmake .. \
> DVIDEO_CODEC_SDK_DIR="/usr/local/Video_Codec_SDK"\
> DGENERATE_PYTHON_BINDINGS:BOOL="1"\
> DFFMPEG_DIR:PATH="/usr/local/ffmpeg/build_x64_release_shared/"\
> CMAKE_INSTALL_PREFIX:PATH="/usr/local/videoprocessingframework/install"\
> DAVUTIL_INCLUDE_DIR="/usr/local/ffmpeg/build_x64_release_shared/include"\
> DAVCODEC_INCLUDE_DIR="/usr/local/ffmpeg/build_x64_release_shared/include"\
> DAVFORMAT_INCLUDE_DIR="/usr/local/ffmpeg/build_x64_release_shared/include"\
> DAVUTIL_LIBRARY="/usr/local/ffmpeg/build_x64_release_shared/lib/libavutil.so"\
> DAVCODEC_LIBRARY="/usr/local/ffmpeg/build_x64_release_shared/lib/libavcodec.so"\
> DAVFORMAT_LIBRARY="/usr/local/ffmpeg/build_x64_release_shared/lib/libavformat.so"\
> DSWRESAMPLE_LIBRARY="/usr/local/ffmpeg/build_x64_release_shared/lib/libswresample.so"
(2)编译并安装
make -j8 && make install
pip3 install git+https://github.com/NVIDIA/VideoProcessingFramework
# or if you cloned this repository
pip3 install .
如果发生pybind11包安装错误,大部分是因为没有提前用pip(国内源)进行安装导致的,提前pip install pybind11 就可以了。
如果出现其他跟cmake有关的问题,检查是否有安装,安装操作完之后千万要记得删除pyproject.toml文件。
安装PytorchNvCodec(可选)
pip install src/PytorchNvCodec # install Torch extension if needed (optional), requires "torch" to be installed before
-- Checking for modules 'libavfilter>=7.110.100;libavformat>=58.76.100;libavcodec>=58.134.100;libswresample>=3.9.100;libavutil>=56.70.100'
-- No package 'libavfilter' found
-- No package 'libavformat' found
-- No package 'libavcodec' found
-- No package 'libswresample' found
-- No package 'libavutil' found
- export PKG_CONFIG_PATH=/usr/local/ffmpeg/build_x64_release_shared/lib/pkgconfig
如果导入之后还是提示某些包找不到,问题解决不了,可以使用pip3 install .
进行安装。
测试安装是否成功:
cd ../samples
python SampleDecode.py -g 0 -e ../install/demo.mp4 -r ../install/demo_result.h264
-g 0:代表指定GPU设备编号为0运行程序;
-e:代表编码的文件;
-r: 代表解码后的文件
如出现问题:
ModuleNotFoundError: No module named 'PyNvCodec'
mv /usr/local/PyNvCodec/_PyNvCodec.cpython-38-x86_64-linux-gnu.so /usr/local/PyNvCodec/PyNvCodec.cpython-38-x86_64-linux-gnu.so
cp /usr/local/PyNvCodec/PyNvCodec.cpython-38-x86_64-linux-gnu.so /usr/local/lib/python3.8/dist-packages/
如出现问题:
ValueError: FFmpegDemuxer: no AVFormatContext provided.
解决方法:这是ffmpeg版本问题,修改命令如下:
cd src/TC/src
vim FFmpegDemuxer.cpp
找到第485行解注释:av_register_all();
如发现修改后编译报av_register_all();
的错,则说明不是该问题产生的错误,建议重新注释掉。
参考: https://github.com/NVIDIA/VideoProcessingFramework/issues/287
sudo ln -s 找到该库的路径/libnvcuvid.so /usr/lib/libnvcuvid.so
sudo ln -s 找到该库的路径/libnvcuvid.so.1 /usr/lib/libnvcuvid.so.1
ln -s xxx/libnvcxxx.so
ldconfig
如出现问题:
E: Failed to fetch https://developer.download.nvidia.cn/compute/cuda/repos/ubuntu1804/x86_64/./libnvjpeg-11-6_11.6.0.55-1_amd64.deb Hash Sum mismatch
解决方法:注释掉/etc/apt/sources.list.d/cuda.list文件中的内容
至此,CV-CUDA的整个依赖环境基本已经安装完毕。下一步就是编译并使用CV-CUDA。
[1] https://github.com/NVIDIA/VideoProcessingFramework/issues/287
[2] https://blog.csdn.net/abc1827085/article/details/129532576
[3] https://blog.csdn.net/weixin_41247701/article/details/113924476