一、引言
三維重建技術作為計算機視覺領域的核心方向,在數字孿生、自動駕駛等領域具有重要應用價值。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 或更高版本。