1. 项目概述与核心痛点
在Ubuntu 20.04上为C++项目部署PyTorch(LibTorch)、OpenCV和FFmpeg,这听起来像是一个标准的开发环境搭建流程,但实际操作过的人都知道,这绝对是一个“坑”密度极高的任务。我最近为了一个需要集成深度学习推理、图像处理和视频编解码的C++服务端项目,就完整地走了一遍这个流程。整个过程下来,最大的感受就是:官方文档往往只告诉你“理想路径”,而现实中的各种版本冲突、依赖缺失、编译选项的细微差别,才是真正耗费时间的地方。这篇文章,就是把我踩过的坑、验证过的有效方案,以及一些能显著提升效率的配置技巧,系统地整理出来。
这个组合部署的核心价值在于,它构建了一个高性能、本地化的AI视觉处理基础环境。LibTorch让你能在C++中直接调用训练好的PyTorch模型,避免了Python环境在部署时的臃肿和性能开销;OpenCV提供了强大且稳定的图像处理基础库;FFmpeg则是处理视频流、图像序列的瑞士军刀。三者结合,非常适合开发视频分析、实时监控、工业质检等需要高吞吐、低延迟的C++应用程序。然而,它们的安装方式各异:LibTorch推荐下载预编译包但需注意CUDA/cuDNN版本对齐;OpenCV在Ubuntu 20.04的默认仓库版本太旧,通常需要从源码编译以启用完整功能;FFmpeg虽然可以通过apt安装,但默认配置可能缺少某些关键编码器。更棘手的是,三者之间以及它们与系统其他库(如GTK、V4L2、NVIDIA驱动)可能存在的隐性依赖冲突。接下来,我将分步拆解,告诉你如何避开这些暗礁,搭建一个稳定、高效且功能完整的开发环境。
2. 环境准备与基础依赖安装
在开始安装三个核心库之前,我们必须为Ubuntu 20.04系统打好基础。一个干净、一致的起点能避免大量后续问题。
2.1 系统更新与基础编译环境
首先,确保你的系统是最新的,并安装必要的编译工具链和基础库。打开终端,执行以下命令:
sudo apt update sudo apt upgrade -y sudo apt install -y build-essential cmake git pkg-configbuild-essential提供了GCC、G++、make等核心编译工具。cmake是现代C++项目,尤其是LibTorch和OpenCV编译的标配构建工具。pkg-config能帮助我们在编译时自动查找库文件和头文件路径。
接下来,安装一些通用的多媒体和I/O依赖库,这些是OpenCV和FFmpeg的常见前置依赖:
sudo apt install -y libjpeg-dev libpng-dev libtiff-dev sudo apt install -y libavcodec-dev libavformat-dev libswscale-dev libavutil-dev sudo apt install -y libgstreamer-plugins-base1.0-dev libgstreamer1.0-dev sudo apt install -y libgtk-3-dev libcanberra-gtk3-module sudo apt install -y libv4l-dev v4l-utils sudo apt install -y libxvidcore-dev libx264-dev关键点解析:
libjpeg-dev,libpng-dev,libtiff-dev:用于处理JPEG、PNG、TIFF等静态图像格式,是OpenCVimread/imwrite功能的基础。libavcodec-dev等(前缀为libav):这是FFmpeg库的开发文件。即使你打算自己编译FFmpeg,先安装这些可以解决一部分基础依赖,但要注意,后面自己编译的FFmpeg可能会与系统安装的版本产生冲突。一个更干净的做法是先不安装这些,但我们这里为了最大化兼容性并简化流程,先安装它们。如果后续自编译FFmpeg出现问题,可以考虑卸载这些系统包(sudo apt remove libavcodec-dev...)。libgtk-3-dev:GTK图形工具包开发文件。如果你需要OpenCV的imshow等高阶GUI功能,或者你的应用有图形界面,这个就是必须的。如果你的应用是纯服务器(headless)环境,可以不加这个,但安装了也无妨。libv4l-dev:Video4Linux开发库,用于摄像头采集。如果你的应用涉及USB摄像头或CSI摄像头,这个依赖至关重要。
2.2 CUDA与cuDNN的预先部署(GPU环境)
如果你的部署目标机器带有NVIDIA GPU,并且希望利用LibTorch进行GPU加速推理,那么必须在安装LibTorch之前,正确安装CUDA Toolkit和cuDNN。版本对齐是这里最大的坑。
检查GPU驱动:首先确保系统已安装合适的NVIDIA驱动。
nvidia-smi这条命令会输出驱动版本和最高支持的CUDA版本(例如“CUDA Version: 11.4”)。记下这个CUDA版本。
安装CUDA Toolkit:前往NVIDIA官网,根据你的驱动版本和系统架构,下载对应版本的CUDA Toolkit安装包(推荐使用
runfile本地安装方式,对网络依赖小)。例如,对于CUDA 11.3:wget https://developer.download.nvidia.com/compute/cuda/11.3.0/local_installers/cuda_11.3.0_465.19.01_linux.run sudo sh cuda_11.3.0_465.19.01_linux.run在安装过程中,务必取消勾选驱动安装(Driver),因为你已经安装了驱动。只安装CUDA Toolkit。
安装cuDNN:同样在NVIDIA官网,下载与CUDA版本匹配的cuDNN Library for Linux。通常是一个压缩包,解压后将其中的库文件和头文件复制到CUDA安装目录即可。
tar -xzvf cudnn-11.3-linux-x64-v8.2.1.32.tgz sudo cp cuda/include/cudnn*.h /usr/local/cuda-11.3/include/ sudo cp cuda/lib64/libcudnn* /usr/local/cuda-11.3/lib64/ sudo chmod a+r /usr/local/cuda-11.3/include/cudnn*.h /usr/local/cuda-11.3/lib64/libcudnn*配置环境变量:将CUDA路径加入系统环境。编辑
~/.bashrc文件,在末尾添加:export PATH=/usr/local/cuda-11.3/bin${PATH:+:${PATH}} export LD_LIBRARY_PATH=/usr/local/cuda-11.3/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}然后执行
source ~/.bashrc使其生效。使用nvcc --version验证CUDA安装。
重要避坑提示:LibTorch的预编译版本会绑定特定的CUDA和cuDNN版本。你必须下载与本地CUDA环境版本匹配的LibTorch。例如,你系统是CUDA 11.3,就下载标注为CUDA 11.3的LibTorch。混用版本会导致运行时链接失败,错误信息可能晦涩难懂。
3. 核心库避坑安装详解
基础环境就绪后,我们开始安装三个主角。顺序我建议是:FFmpeg -> OpenCV -> LibTorch。因为OpenCV的VideoIO模块可以依赖FFmpeg,而LibTorch通常独立。
3.1 FFmpeg:源码编译以获得完整控制
虽然sudo apt install ffmpeg最简单,但默认安装的版本可能缺少如libx264(H.264编码)、libfdk-aac(高质量AAC音频)等非自由编解码器,功能受限。对于生产环境,源码编译是更可靠的选择。
安装编译依赖:
sudo apt install -y nasm yasm sudo apt install -y libx264-dev libx265-dev libvpx-dev libmp3lame-dev libopus-dev libfdk-aac-devnasm和yasm是汇编优化编译器,对x264等编码器性能提升关键。后面那些libxxx-dev就是你需要的编码器开发库。下载源码并编译:
git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg-src cd ffmpeg-src ./configure --prefix=/usr/local \ --enable-gpl \ --enable-nonfree \ --enable-libx264 \ --enable-libx265 \ --enable-libvpx \ --enable-libmp3lame \ --enable-libopus \ --enable-libfdk-aac \ --enable-shared make -j$(nproc) # 使用所有CPU核心并行编译 sudo make install sudo ldconfig # 更新动态链接库缓存验证安装:
ffmpeg -version查看输出中是否包含
--enable-libx264、--enable-libfdk-aac等配置项,确认所需功能已启用。
实操心得:
configure步骤如果报错缺少某个库,通常是对应的libxxx-dev包没装。根据错误信息安装即可。--enable-shared生成动态链接库,方便其他程序(如OpenCV)链接。编译过程较久,-j$(nproc)能充分利用多核CPU大幅缩短时间。
3.2 OpenCV:源码编译与关键模块配置
Ubuntu 20.04仓库中的OpenCV版本是4.2,较旧。我们编译最新的稳定版(如4.8.x),并精确控制模块。
下载源码:我们同时下载OpenCV和其扩展模块opencv_contrib,后者包含了许多有用的算法(如SIFT、DNN模块的一些新层支持)。
git clone https://github.com/opencv/opencv.git git clone https://github.com/opencv/opencv_contrib.git cd opencv mkdir build && cd buildCMake配置:这是最核心也最容易出错的步骤。执行前,请确保你已安装FFmpeg(上一步)。
cmake -D CMAKE_BUILD_TYPE=RELEASE \ -D CMAKE_INSTALL_PREFIX=/usr/local \ -D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib/modules \ -D WITH_FFMPEG=ON \ -D WITH_GTK=ON \ -D WITH_OPENGL=ON \ -D OPENCV_ENABLE_NONFREE=ON \ -D BUILD_EXAMPLES=OFF \ -D BUILD_opencv_python2=OFF \ -D BUILD_opencv_python3=OFF \ -D BUILD_DOCS=OFF \ -D BUILD_TESTS=OFF \ -D BUILD_PERF_TESTS=OFF \ -D WITH_CUDA=OFF \ # 除非你需要OpenCV的CUDA模块,否则先关掉,避免和LibTorch的CUDA冲突 ..关键参数解读:
OPENCV_EXTRA_MODULES_PATH:指向contrib模块路径,启用额外功能。WITH_FFMPEG=ON:必须开启,否则OpenCV的VideoCapture无法处理大多数视频文件。OPENCV_ENABLE_NONFREE=ON:启用SIFT、SURF等专利算法(研究和学习用途)。BUILD_opencv_python3=OFF:如果你只用C++,关掉可以极大缩短编译时间。WITH_CUDA=OFF:这是一个重要的避坑点。OpenCV有自己的CUDA加速模块,但它需要特定版本的CUDA,且可能与LibTorch的CUDA环境产生复杂交互。对于主要使用LibTorch做深度学习推理的项目,我建议先关闭OpenCV的CUDA支持,让图形处理运行在CPU上,简化部署。除非你的图像预处理(如resize、crop)非常繁重且确定要使用OpenCV CUDA。
编译与安装:
make -j$(nproc) sudo make install sudo ldconfig验证安装:编写一个简单的C++程序
test_opencv.cpp:#include <opencv2/opencv.hpp> #include <iostream> int main() { std::cout << "OpenCV version: " << CV_VERSION << std::endl; cv::Mat img = cv::Mat::zeros(100, 100, CV_8UC3); std::cout << "Image created successfully." << std::endl; return 0; }编译并运行:
g++ test_opencv.cpp -o test_opencv `pkg-config --cflags --libs opencv4` ./test_opencv能正确输出版本信息即表示安装成功。
3.3 LibTorch:预编译库部署与链接陷阱
LibTorch是PyTorch的C++前端,官方提供了预编译包,这是最推荐的方式,避免数小时的源码编译。
选择并下载正确的版本:前往 PyTorch官网 的“Previous Versions of PyTorch”或直接查看 下载索引 。选择与你的PyTorch训练环境匹配的版本,以及对应的CUDA版本(或CPU版本)。例如,对于CUDA 11.3:
wget https://download.pytorch.org/libtorch/cu113/libtorch-cxx11-abi-shared-with-deps-1.12.1%2Bcu113.zip unzip libtorch-cxx11-abi-shared-with-deps-1.12.1+cu113.zip注意:有两个ABI版本:
cxx11-abi和pre-cxx11-abi。除非你有明确的兼容性要求(如与其他使用旧GCC ABI的库链接),否则选择cxx11-abi(通常文件名中带有cxx11)。shared-with-deps包含了必要的依赖项(如Protobuf),更方便。环境变量设置:将LibTorch的库路径加入环境变量,方便CMake查找。
export LIBTORCH_HOME=/path/to/your/libtorch # 替换为你的解压路径 export LD_LIBRARY_PATH=$LIBTORCH_HOME/lib:$LD_LIBRARY_PATH同样,将这两行加入
~/.bashrc永久生效。验证安装:创建一个简单的测试程序
test_libtorch.cpp:#include <torch/torch.h> #include <iostream> int main() { torch::Tensor tensor = torch::rand({2, 3}); std::cout << "LibTorch test tensor:\n" << tensor << std::endl; std::cout << "CUDA available: " << torch::cuda::is_available() << std::endl; return 0; }编写CMakeLists.txt进行编译:这是链接LibTorch的关键。创建一个
CMakeLists.txt文件:cmake_minimum_required(VERSION 3.16) project(test_libtorch) set(CMAKE_CXX_STANDARD 14) # 关键:设置LibTorch_DIR,指向libtorch/share/cmake/Torch set(LibTorch_DIR "$ENV{LIBTORCH_HOME}/share/cmake/Torch") find_package(Torch REQUIRED) add_executable(test_libtorch test_libtorch.cpp) target_link_libraries(test_libtorch "${TORCH_LIBRARIES}") # 设置编译属性,避免某些警告或错误 set_property(TARGET test_libtorch PROPERTY CXX_STANDARD 14)然后编译运行:
mkdir build && cd build cmake .. make ./test_libtorch如果输出一个随机矩阵和“CUDA available: 1”(如果使用GPU版本),则说明LibTorch安装成功。
核心避坑指南:
- 版本一致性:训练模型的PyTorch版本、部署的LibTorch版本、CUDA版本、cuDNN版本,四者必须严格匹配。一个小版本号的不同都可能导致模型加载失败或运行时错误。
- ABI兼容性:如果你使用的其他C++库(如某些特定的Boost版本)是使用旧GCC ABI编译的,而LibTorch使用了新的C++11 ABI,可能会产生链接错误。此时需要统一编译环境或寻找ABI兼容的库版本。
- CMake Find_Package:确保
find_package(Torch REQUIRED)能正确找到路径。手动设置LibTorch_DIR是最可靠的方法。
4. 集成测试与项目配置实战
单独安装成功只是第一步,让三者在一个C++项目中协同工作才是最终目标。这里我们创建一个简单的示例项目,实现:用OpenCV读取视频帧,用LibTorch运行一个简单的Tensor操作(模拟模型推理),再用FFmpeg(通过OpenCV)保存处理后的视频。
4.1 项目结构与CMake集成
假设项目目录结构如下:
my_project/ ├── CMakeLists.txt ├── include/ ├── src/ │ └── main.cpp └── models/ (存放PyTorch模型文件,可选)核心在于编写一个能够正确找到并链接三个库的CMakeLists.txt。
cmake_minimum_required(VERSION 3.16) project(OpenCV_Torch_Demo) set(CMAKE_CXX_STANDARD 14) set(CMAKE_CXX_STANDARD_REQUIRED ON) # 1. 寻找OpenCV (假设安装到/usr/local) find_package(OpenCV REQUIRED) include_directories(${OpenCV_INCLUDE_DIRS}) # 2. 寻找LibTorch (通过环境变量) set(Torch_DIR "$ENV{LIBTORCH_HOME}/share/cmake/Torch") find_package(Torch REQUIRED) # 注意:Torch会自带一些如ATen、c10的库,TORCH_LIBRARIES已包含 # 3. 寻找FFmpeg (通常通过pkg-config,但OpenCV已链接其部分。如需直接调用FFmpeg API,可额外查找) # find_package(FFmpeg REQUIRED) # 非标准,较复杂。本例中我们通过OpenCV间接使用。 # 4. 添加可执行文件 add_executable(demo src/main.cpp) # 5. 链接库 target_link_libraries(demo ${OpenCV_LIBS} ${TORCH_LIBRARIES}) # 如果直接使用FFmpeg API,还需链接 avcodec, avformat等 # target_link_libraries(demo ${OpenCV_LIBS} ${TORCH_LIBRARIES} avcodec avformat avutil) # 6. 设置目标属性,解决可能的编译/链接问题 target_compile_options(demo PRIVATE -Wall -Wextra) # 对于LibTorch,可能需要禁用某些警告 target_compile_definitions(demo PRIVATE _GLIBCXX_USE_CXX11_ABI=1) # 强制使用C++11 ABI,与cxx11-abi的LibTorch匹配 # 7. 设置运行时库路径(可选,便于部署) set_target_properties(demo PROPERTIES INSTALL_RPATH "$ORIGIN/../lib" BUILD_WITH_INSTALL_RPATH TRUE )4.2 示例代码:视频处理流水线
下面是一个简化的src/main.cpp,演示了基本的数据流:
#include <opencv2/opencv.hpp> #include <torch/torch.h> #include <torch/script.h> // 用于加载TorchScript模型 #include <iostream> int main() { // 1. 使用OpenCV打开视频文件 cv::VideoCapture cap("input.mp4"); if (!cap.isOpened()) { std::cerr << "Error opening video file." << std::endl; return -1; } // 获取视频属性,用于创建输出视频 int frame_width = static_cast<int>(cap.get(cv::CAP_PROP_FRAME_WIDTH)); int frame_height = static_cast<int>(cap.get(cv::CAP_PROP_FRAME_HEIGHT)); double fps = cap.get(cv::CAP_PROP_FPS); cv::VideoWriter writer("output.avi", cv::VideoWriter::fourcc('M','J','P','G'), fps, cv::Size(frame_width, frame_height)); // 2. (模拟) 加载LibTorch模型 // torch::jit::script::Module module; // try { // module = torch::jit::load("model.pt"); // module.eval(); // } catch (const c10::Error& e) { // std::cerr << "Error loading model: " << e.what() << std::endl; // return -1; // } cv::Mat frame; while (cap.read(frame)) { // 3. 将OpenCV Mat转换为LibTorch Tensor // OpenCV默认是BGR,uint8。转换为RGB,float32,并归一化。 cv::cvtColor(frame, frame, cv::COLOR_BGR2RGB); frame.convertTo(frame, CV_32FC3, 1.0 / 255.0); auto input_tensor = torch::from_blob(frame.data, {1, frame_height, frame_width, 3}, torch::kFloat32); // 调整维度顺序为NCHW (Batch, Channel, Height, Width) input_tensor = input_tensor.permute({0, 3, 1, 2}); // 4. (模拟) 使用LibTorch进行推理 // auto output_tensor = module.forward({input_tensor}).toTensor(); // 这里我们用一个简单的操作代替:给所有像素值加0.1 auto output_tensor = input_tensor + 0.1; // 5. 将LibTorch Tensor转换回OpenCV Mat output_tensor = output_tensor.permute({0, 2, 3, 1}).contiguous(); // 转回NHWC output_tensor = output_tensor.squeeze().detach().cpu(); // 去掉batch维度,分离计算图,转到CPU cv::Mat output_frame(frame_height, frame_width, CV_32FC3, output_tensor.data_ptr<float>()); output_frame.convertTo(output_frame, CV_8UC3, 255.0); // 转回uint8 cv::cvtColor(output_frame, output_frame, cv::COLOR_RGB2BGR); // 转回BGR // 6. 用OpenCV写入输出视频(底层会调用FFmpeg) writer.write(output_frame); // 显示处理帧(可选) cv::imshow("Processing", output_frame); if (cv::waitKey(1) == 'q') break; } cap.release(); writer.release(); cv::destroyAllWindows(); std::cout << "Processing finished." << std::endl; return 0; }4.3 编译与运行
在项目根目录my_project/下:
mkdir build && cd build cmake .. make -j$(nproc)运行前,确保input.mp4文件存在于可执行文件同级目录或指定路径下。
./demo如果一切顺利,你将看到视频被逐帧处理并保存为output.avi。
5. 常见问题与深度排查指南
即使按照步骤操作,你也可能会遇到各种问题。下面是我在多次部署中总结的常见错误及其解决方法。
5.1 编译阶段问题
问题1:CMake找不到OpenCV。
- 现象:
find_package(OpenCV REQUIRED)失败。 - 排查:
- 确认OpenCV已安装到
/usr/local或自定义路径。 - 如果安装到自定义路径,需要在CMake中指定路径:
set(OpenCV_DIR "/path/to/opencv/build")。 - 检查是否执行了
sudo ldconfig。
- 确认OpenCV已安装到
问题2:链接LibTorch时出现未定义引用错误。
- 现象:编译通过,链接阶段报错,如
undefined reference toc10::Error::Error(...)`。 - 排查:
- ABI不匹配:这是最常见原因。确保你的GCC版本和LibTorch的ABI匹配。使用
gcc --version查看。如果LibTorch是cxx11-abi,而你的项目或其他依赖库是用旧ABI编译的,就会冲突。在CMake中强制定义_GLIBCXX_USE_CXX11_ABI=1(如前面CMakeLists所示)。 - 链接顺序:确保
target_link_libraries中${TORCH_LIBRARIES}放在所有依赖它库的后面。 - 库路径:确保
LD_LIBRARY_PATH包含了LibTorch的lib目录,或者使用set(CMAKE_INSTALL_RPATH ...)。
- ABI不匹配:这是最常见原因。确保你的GCC版本和LibTorch的ABI匹配。使用
问题3:OpenCV编译时FFmpeg相关功能未开启。
- 现象:CMake输出中
FFMPEG显示为NO,后续无法读取视频。 - 排查:
- 运行
cmake时,检查终端输出,看FFmpeg的各个组件(libavcodec,libavformat等)是否被找到。如果显示NO,通常是开发包未安装。 - 确保已安装
libavcodec-dev,libavformat-dev等包。 - 如果系统安装了多个FFmpeg(如自编译的和apt的),可能导致CMake找到错误的版本。可以尝试临时卸载系统FFmpeg开发包,或者使用
-D WITH_FFMPEG=ON -D FFMPEG_ROOT=/usr/local明确指定路径。
- 运行
5.2 运行时问题
问题4:运行程序时提示error while loading shared libraries: libtorch_cuda.so: cannot open shared object file。
- 现象:编译成功,运行时报动态库找不到。
- 解决:
- 永久方案:将LibTorch的lib路径加入
/etc/ld.so.conf或创建conf文件到/etc/ld.so.conf.d/,然后运行sudo ldconfig。 - 临时方案:在运行前设置
export LD_LIBRARY_PATH=/path/to/libtorch/lib:$LD_LIBRARY_PATH。 - 部署方案:在CMake中设置
INSTALL_RPATH,将依赖库复制到可执行文件附近的lib目录。
- 永久方案:将LibTorch的lib路径加入
问题5:OpenCV能读图片但不能读视频。
- 现象:
VideoCapture打开视频失败,但imread正常。 - 排查:
- 检查OpenCV编译时的FFmpeg支持:写个程序调用
cv::getBuildInformation(),搜索FFMPEG,确认其为YES。 - 检查视频文件路径和格式是否正确。
- 尝试安装
gstreamer相关开发包并重新编译OpenCV(开启WITH_GSTREAMER),作为FFmpeg的备选后端。
- 检查OpenCV编译时的FFmpeg支持:写个程序调用
问题6:LibTorch加载模型失败。
- 现象:
torch::jit::load抛出异常。 - 排查:
- 版本不匹配:这是首要怀疑对象。用Python检查生成
.pt模型的PyTorch版本、CUDA版本,必须与部署的LibTorch完全一致。 - 模型路径:确保路径正确,且程序有读取权限。
- 模型格式:确保保存的是TorchScript模型(
torch.jit.script或torch.jit.trace),而不是普通的PyTorch state_dict。 - 操作符缺失:如果模型使用了自定义操作符,需要在C++端注册。确保导出的模型包含了所有必要的操作。
- 版本不匹配:这是首要怀疑对象。用Python检查生成
5.3 性能与优化问题
问题7:视频处理速度慢。
- 现象:处理帧率远低于视频原始FPS。
- 优化方向:
- 流水线并行:将视频解码(OpenCV)、模型推理(LibTorch)、后处理/编码(OpenCV)放在不同的线程中,利用生产者-消费者模型提高吞吐。
- 批处理:如果模型支持,将多帧组合成一个batch进行推理,能显著提升GPU利用率。
- 硬件解码:如果使用GPU,研究OpenCV的
cudacodec模块或直接使用FFmpeg的CUDA硬件解码器。 - 推理引擎优化:使用LibTorch的
torch::jit::optimize_for_inference对脚本模型进行优化。对于固定尺寸输入,启用torch::jit::FreezeModule。
问题8:内存占用过高。
- 现象:处理长时间视频时内存持续增长。
- 排查:
- 及时释放:确保每一帧处理完后,相关的
cv::Mat和torch::Tensor能及时离开作用域被销毁。对于循环内的临时变量要特别注意。 - Tensor内存管理:
torch::from_blob创建的Tensor并不拥有数据,要确保底层cv::Mat在Tensor使用期间有效。如果需要复制数据,使用.clone()。 - CUDA内存:监控
nvidia-smi。确保在不再需要时,将GPU Tensor移回CPU(.cpu())或直接释放。可以使用torch::cuda::empty_cache()手动清空CUDA缓存,但需谨慎,可能影响性能。
- 及时释放:确保每一帧处理完后,相关的
整个部署过程,本质上是一个系统性的依赖管理和环境配置工程。最深刻的体会是,记录下每一个环节的版本号(系统GCC、CUDA、cuDNN、OpenCV commit、LibTorch版本、PyTorch训练版本)至关重要。当出现问题需要回滚或复现时,这份记录就是你的救命稻草。另外,在Docker容器中完成一次成功的部署后,将整个Dockerfile保存下来,是保证环境可复现、可迁移的最佳实践,这远比写一份文档要可靠得多。