基于NVIDIA RTX 4090的COLMAP 3.7安装指南:Ubuntu 20.04 + CUDA 11.8环境配置【2025最新版!!】

一、引言

三维重建技术作为计算机视觉领域的核心方向,在数字孪生、自动驾驶等领域具有重要应用价值。COLMAP作为开源的SfM(Structure-from-Motion)工具,其GPU加速特性可显著提升重建效率。由于最新研究三维重建的需要(3DGS、NeRF等),模型的输出需要COLMAP进行预处理。
本文针对NVIDIA新一代Ada Lovelace架构的RTX 4090显卡,结合CUDA 11.8环境,详细讲解Ubuntu 20.04系统下COLMAP 3.7的编译安装全流程,并针对可能出现的兼容性问题提供有效的解决方案。

二、环境准备

2.1 系统更新

sudo apt update && sudo apt upgrade -y
sudo apt install build-essential cmake git libboost-all-dev \libeigen3-dev libfreeimage-dev libgflags-dev libglew-dev \libgoogle-glog-dev libsuitesparse-dev libceres-dev \libqt5opengl5-dev libsqlite3-dev libcgal-dev \libcgal-qt5-dev libatlas-base-dev

2.2 CUDA11.8安装

可以登录英伟达官方网站下载符合要求的CUDA(11.8为例)
https://developer.nvidia.com/cuda-toolkit-archive
在这里插入图片描述
在这里插入图片描述
推荐用runfile安装
也可也命令行执行:

wget https://developer.download.nvidia.com/compute/cuda/11.8.0/local_installers/cuda_11.8.0_520.61.05_linux.run
sudo sh cuda_11.8.0_520.61.05_linux.run

配置环境变量:

echo 'export PATH=/usr/local/cuda-11.8/bin:$PATH' >> ~/.bashrc
echo 'export LD_LIBRARY_PATH=/usr/local/cuda-11.8/lib64:$LD_LIBRARY_PATH' >> ~/.bashrc
source ~/.bashrc

2.3 cudnn安装

cuDNN比较容易安装,下载对应版本的压缩包,拷贝到指定文件目录,给予权限就好了

官网下载地址:(需要注册)
https://developer.nvidia.com/rdp/cudnn-archive
在这里插入图片描述
选择对应的11.x的版本
特别注意拷贝的路径一定是上面指定的环境变量路径!
安装步骤如下:

# 解压下载的tar包(版本号可能不同)
tar -xzvf cudnn-11.8-linux-x64-v8.6.0.163.tgz# 复制文件到CUDA目录
sudo cp cuda/include/cudnn*.h /usr/local/cuda-11.8/include
sudo cp cuda/lib64/libcudnn* /usr/local/cuda-11.8/lib64# 设置权限
sudo chmod a+r /usr/local/cuda-11.8/include/cudnn*.h
sudo chmod a+r /usr/local/cuda-11.8/lib64/libcudnn*# 创建软链接(重要!)
cd /usr/local/cuda-11.8/lib64
sudo ln -sf libcudnn.so.8.6.0 libcudnn.so.8
sudo ln -sf libcudnn.so.8 libcudnn.so
sudo ldconfig# 检查cuDNN版本
cat /usr/local/cuda/include/cudnn_version.h | grep CUDNN_MAJOR -A 2
# 应输出类似:
# #define CUDNN_MAJOR 8
# #define CUDNN_MINOR 6
# #define CUDNN_PATCHLEVEL 0

2.4 驱动兼容性验证

在这里插入图片描述

2.5 确认 Compute Capability

nvidia-smi --query-gpu=compute_cap --format=csv,noheader
# 应返回 8.9
这就表示 RTX 4090 对应的 Compute Capability 是 8.9

在这里插入图片描述

为什么要关心? 后面 CMake 需要明确告诉编译器 “我就是 8.9”,否则会报 compute_native 不支持的错

三、COLMAP 3.7源码编译

3.1 源码获取

可以从官网直接下载对应的版本
https://github.com/colmap/colmap
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
比如3.7版本 下载对应的压缩文件,然后解压
或者可以直接使用git 命令进行clone :

git clone https://github.com/colmap/colmap.git
cd colmap
git checkout 3.7
git submodule update --init --recursive

3.2 安装配置

#安装依赖
sudo apt-get install git cmake ninja-build build-essential libboost-program-options-dev libboost-filesystem-dev libboost-graph-dev libboost-system-dev libeigen3-dev libflann-dev libfreeimage-dev libmetis-dev libgoogle-glog-dev libgtest-dev libsqlite3-dev libglew-dev qtbase5-dev libqt5opengl5-dev libcgal-dev libceres-dev#进入文件夹
cd colmap#创建并进入build文件夹
mkdir build
cd build#构建安装
cmake .. -GNinja #CMake预处理,生成Ninja构建系统所需的文件
ninja #默认使用系统最大可用cpu核心数进行编译,如果系统cpu有32个核,等效与ninja -j32
sudo ninja install

四、 COLMAP编译过程中可能会遇到如下问题:

[2/260] Building NVCC (Device) object lib/SiftGPU/CMakeFiles/sift_gpu.dir/sift_gpu_generated_ProgramCU.cu.o
FAILED: lib/SiftGPU/CMakeFiles/sift_gpu.dir/sift_gpu_generated_ProgramCU.cu.o 
cd /root/autodl-tmp/gaussian-splatting/submodules/colmap-3.7/build/lib/SiftGPU/CMakeFiles/sift_gpu.dir && /usr/bin/cmake -E make_directory /root/autodl-tmp/gaussian-splatting/submodules/colmap-3.7/build/lib/SiftGPU/CMakeFiles/sift_gpu.dir//. && /usr/bin/cmake -D verbose:BOOL=OFF -D build_configuration:STRING=Release -D generated_file:STRING=/root/autodl-tmp/gaussian-splatting/submodules/colmap-3.7/build/lib/SiftGPU/CMakeFiles/sift_gpu.dir//./sift_gpu_generated_ProgramCU.cu.o -D generated_cubin_file:STRING=/root/autodl-tmp/gaussian-splatting/submodules/colmap-3.7/build/lib/SiftGPU/CMakeFiles/sift_gpu.dir//./sift_gpu_generated_ProgramCU.cu.o.cubin.txt -P /root/autodl-tmp/gaussian-splatting/submodules/colmap-3.7/build/lib/SiftGPU/CMakeFiles/sift_gpu.dir//sift_gpu_generated_ProgramCU.cu.o.Release.cmake
nvcc fatal   : Unsupported gpu architecture 'compute_89'

4.1、原因分析

此错误的核心在于 CUDA 版本与 GPU 架构的兼容性问题。具体来说:

  • 架构检测机制:COLMAP 的 CMake 构建系统默认使用 Auto 选项来自动检测当前 GPU 的计算能力。
  • RTX 4090 的架构:RTX 4090 基于 NVIDIA 的 Ada Lovelace 架构,对应的计算能力是 8.9(在 CUDA 代码中表示为 compute_89)。
  • CUDA 11.8 的支持范围:CUDA 11.8 最高支持到 Ampere 架构(计算能力 8.6),不支持更新的 Ada Lovelace 架构(8.9)。
  • 错误触发:当构建系统检测到 RTX 4090 并尝试为其生成优化代码时,NVCC 编译器发现自己不支持目标架构,因此抛出 Unsupported gpu architecture ‘compute_89’ 错误

4.2、解决方案

方案一、命令行指定 CUDA 架构

最直接的解决方法是在运行 CMake 时通过命令行参数指定兼容的 CUDA 架构:

sudo apt install ninja-build
cd /root/autodl-tmp/gaussian-splatting/submodules/colmap-3.7/
rm -rf build
mkdir build
cd build
cmake .. -GNinja -DCMAKE_BUILD_TYPE=Release -DCUDA_ARCHS="Ampere"
ninja

这里我们使用 Ampere 作为架构名称,它对应计算能力 8.0 和 8.6,这是 CUDA 11.8 支持的最高架构级别。

方案二、使用特定计算能力列表

cmake .. -DCUDA_ARCHS="8.0;8.6"

这种格式使用分号分隔的列表来指定所有目标计算能力。

方案三、修改 CMakeLists.txt

如果前两种方法不成功,或者希望长期修改配置,可以直接编辑 COLMAP 的 CMakeLists.txt 文件:

打开主配置文件:
bashnano /root/autodl-tmp/gaussian-splatting/submodules/colmap-3.7/CMakeLists.txt找到并修改 CUDA_ARCHS 的设置(大约在第 53 行):
cmakeset(CUDA_ARCHS "Ampere" CACHE STRING "List of CUDA architectures for which to \
generate code, e.g., Auto, All, Maxwell, Pascal, ...")保存文件后按常规方式构建:
cmake ..
ninja

架构兼容性注意事项

值得注意的是,虽然 RTX 4090 的原生计算能力是 8.9,但它完全向后兼容较低计算能力的代码。当我们指定为 Ampere 架构(8.6)构建代码时:

  • 功能兼容性:所有功能将正常工作,不会有功能缺失。
  • 性能影响:可能会错过一些针对 8.9 架构的特定优化,但这种性能差异通常很小,对大多数应用场景几乎不会有明显影响。
  • 灵活性:这种方法让我们可以继续使用现有的 CUDA 11.8 环境,无需升级到 CUDA 12 或更高版本。

4.3 常见问题解答

Q1:为什么直接指定 “86” 作为架构会失败?

A1:COLMAP 的构建系统使用了特殊的 CUDA 架构选择脚本,它期望架构以特定格式提供,如官方架构名称(“Ampere”)或带小数点的计算能力版本号(“8.6”)。直接使用 “86” 会导致脚本无法识别。

Q2:使用这种解决方案会影响 COLMAP 的性能吗?

A2:虽然理论上可能会略微影响性能,但实际使用中差异微乎其微。大多数 CUDA 核心功能和优化在 8.6 和 8.9 架构之间变化不大。

Q3:是否有可能在不修改配置的情况下使用 RTX 4090?

A3:不行。由于 CUDA 版本对架构支持的限制,必须进行一些配置修改。如果坚持使用自动检测,唯一的解决方案是升级到 CUDA 12 或更高版本。

五、总结

在使用新一代 GPU 如 RTX 4090 搭配较老版本 CUDA 环境编译 COLMAP 时,架构兼容性问题是一个常见障碍。本文详细解析了问题原因,并提供了多种不同层次的解决方案,从简单的命令行参数到深入修改配置文件。这些方法使用户能够在不升级 CUDA 版本的情况下,充分利用 GPU 加速的 COLMAP 功能,为计算机视觉和三维重建项目提供高效处理能力。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/77528.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring Boot 依赖管理: `spring-boot-starter-parent` 与 `spring-boot-dependencies`

前言 在 Spring Boot 的开发实践中,依赖管理是构建高质量应用的基础。spring-boot-starter-parent 和 spring-boot-dependencies 是 Spring Boot 提供的两大核心依赖管理工具,它们在简化依赖版本控制、统一配置等方面发挥着关键作用。 一、核心概念解析…

【MySQL】基本查询

目录 增加 查询 基本查询 where子句 结果排序 筛选分页结果 修改(更新) 删除 普通删除 截断表 插入查询结果 聚合函数 分组查询 这一节的内容是对表内容的增删查改,其中重点是表的查询 增加 语法: INSERT [INTO] table_name [(column [, …

【C++详解】C++入门(二)引用、内联函数、nullptr宏

文章目录 一、引用引用的概念和定义引用的功能引用的特性const引用const用法回顾权限的放大缩小const引用的功能 指针和引用的关系 二、内联函数三、nullptr补充结构体指针变量类型重定义 一、引用 引用的概念和定义 C祖师爷为了优化在部分场景中使用指针会出现的效率较低和比…

毕业设计-基于深度学习的实时网络入侵检测系统

项目技术说明 深度学习实时网络入侵检测系统是一种利用深度学习技术对网络流量进行实时分析,以识别和阻止潜在网络攻击的安全解决方案。相比传统基于规则的入侵检测系统(IDS),这种系统能够通过学习网络流量的正常模式和异常模式,更有效地检测…

中药企业数字化转型:从传统制造到智能制药的跨越

在当今数字化浪潮下,中药企业正积极拥抱变革,努力实现从传统制造向智能制药的跨越,以适应市场竞争和满足人们对中药质量与效率的更高要求。 在原料管理环节,企业通过采用物联网技术,对中药材种植、采集过程进行全程监…

Vue 2 的响应式 API 和 Vue 3 的组合式 API 的详细对比,从核心机制、使用方式、代码示例及优缺点展开

以下是 Vue 2 的响应式 API 和 Vue 3 的组合式 API 的详细对比,从核心机制、使用方式、代码示例及优缺点展开: 1. Vue 2 的响应式 API 核心机制 基于 Object.defineProperty: 通过劫持对象的 getter 和 setter 实现数据变化追踪。限制&…

“八股训练营”学习总结

在参加为期 40 天的八股训练营的这段时间里,我收获满满,不仅在知识技能上得到了提升,更在学习习惯和自我认知方面有了很大的进步。 在知识层面,训练营涵盖了网络、数据库、缓存以及python测试开发等多方面的知识点。 网络方面&a…

Python对比两张CAD图并标记差异的解决方案

以下是使用Python对比两张CAD图并标记差异的解决方案,结合图像处理和CAD结构分析: 一、环境准备与库选择 图像处理库:使用OpenCV进行图像差异检测、颜色空间转换和轮廓分析。CAD解析库:若为DXF格式,使用ezdxf解析实体…

记录学习记录学习《手动学习深度学习》这本书的笔记(九)

马不停蹄地来到了第十二章:计算性能…… 感觉应该是讲并行计算方面的,比如GPU、CPU、CUDA那些。 第十二章:计算性能 12.1 编译器和解释器 这里先提出了命令式编程和符号式编程的概念。 命令式编程VS符号式编程 目前为止,本书…

模板引擎语法-过滤器

模板引擎语法-过滤器 文章目录 模板引擎语法-过滤器[toc]1.default过滤器2.default_if_none过滤器3.length过滤器4.addslashes过滤器5.capfirst过滤器6.cut过滤器7.date过滤器8.dictsort过滤器 1.default过滤器 default过滤器用于设置默认值。default过滤器对于变量的作用&…

make学习三:书写规则

系列文章目录 Make学习一:make初探 Make学习二:makefile组成要素 文章目录 系列文章目录前言默认目标规则语法order-only prerequisites文件名中的通配符伪目标 Phony Targets没有 Prerequisites 和 recipe内建特殊目标名一个目标多条规则或多个目标共…

网络安全技能大赛B模块赛题解析Server12环境

已知靶机存在⽹站系统,使⽤Nmap⼯具扫描靶机端⼝,并将⽹站服务的端⼝号作为Flag (形式:Flag字符串)值提交 使用nmap扫描目标靶机网站服务的端口号为8089 Falg:8089 访问⽹站/admin/pinglun.asp⻚⾯&#…

1、Linux操作系统下,ubuntu22.04版本切换中英文界面

切换中英文界面的方法很多,我也是按照一个能用的方法弄过来并且记录, 1.如果刚开始使用Ubuntu环境,桌面的语言环境为英文,需要安装中文简体的字体包 打开桌面终端,输入 sudo apt install language-pack-zh-hans lan…

SmolVLM2: The Smollest Video Model Ever(六)

继续微调 微调视频的代码如下: # 此Python文件用于对SmolVLM2进行视频字幕任务的微调 # 导入所需的库 import os os.environ["CUDA_VISIBLE_DEVICES"] "1" import torch from peft import LoraConfig, prepare_model_for_kbit_training, get…

Spring Boot安装指南

🔖 Spring Boot安装指南 🌱 Spring Boot支持两种使用方式: 1️⃣ 可作为常规Java开发工具使用 2️⃣ 可作为命令行工具安装 ⚠️ 安装前提: 📌 系统需安装 Java SDK 17 或更高版本 🔍 建议先运行检查命令…

数据结构(七)---链式栈

#### 链式栈实现 ##### linkstack.h #ifndef _LINKSTACK_H #define _LINKSTACK_H // 引入相关的库文件 #include <stdio.h> #include <stdlib.h> #include <string.h> // 定义元素类型的别名 typedef int DATA; //定义链式栈节点 typedef struct node { …

【Spring Boot】Maven中引入 springboot 相关依赖的方式

文章目录 Maven中引入 springboot 相关依赖的方式1. 不使用版本管理&#xff08;不推荐&#xff09;2、使用版本管理&#xff08;推荐&#xff09;2.1 继承 spring-boot-starter-parent2.2 使用 spring-boot-dependencies 自定义父工程2.3引入 spring-framework-bom Maven中引…

DataStreamAPI实践原理——快速上手

引入 通过编程模型&#xff0c;我们知道Flink的编程模型提供了多层级的抽象&#xff0c;越上层的API&#xff0c;其描述性和可阅读性越强&#xff0c;越下层API&#xff0c;其灵活度高、表达力越强&#xff0c;多数时候上层API能做到的事情&#xff0c;下层API也能做到&#x…

WPF 图片文本按钮 自定义按钮

效果 上面图片,下面文本 样式 <!-- 图片文本按钮样式 --> <Style x:Key="ImageTextButtonStyle" TargetType="Button"><Setter Property="Background" Value="Transparent"/><Setter Property="BorderTh…

驱动开发硬核特训 · Day 22(上篇): 电源管理体系完整梳理:I2C、Regulator、PMIC与Power-Domain框架

&#x1f4d8; 一、电源子系统总览 在现代Linux内核中&#xff0c;电源管理不仅是系统稳定性的保障&#xff0c;也是实现高效能与低功耗运行的核心机制。 系统中涉及电源管理的关键子系统包括&#xff1a; I2C子系统&#xff1a;硬件通信基础Regulator子系统&#xff1a;电源…