Docker 环境下 3D Guassian Splatting 的编译和配置

Title: Docker 环境下 3D Guassian Splatting 的编译和配置


文章目录

  • 前言
  • I. 宿主系统上的安装配置
    • 1. 安装 nvidia driver
    • 2. 安装 docker
    • 3. 安装 nvidia-container-toolkit
  • II. Docker 容器安装配置
    • 1. 拉取 ubuntu 22.04
    • 2. 创建容器
    • 3. 进入容器
    • 4. 容器中安装 cuda SDK
    • 5. 容器中安装 miniforge 3
    • 6. 安装 cmake
  • III. 编译与测试 GS
    • 1. 虚拟环境配置
    • 2. 训练与评估
    • 3. 编译安装 SIBR_gaussianViewer
  • 小结


前言

3D Guassian Splatting 很火, 也想看一下.

下面简单记录一下 Docker 环境下编译和配置 3D Guassian Splatting (下面简称 GS) 的过程.

GS 开源代码地址 https://github.com/graphdeco-inria/gaussian-splatting?tab=readme-ov-file.


I. 宿主系统上的安装配置

宿主系统 (主机系统) :

~$ lsb_release -a
No LSB modules are available.
Distributor ID:	Ubuntu
Description:	Ubuntu 20.04.6 LTS
Release:	20.04
Codename:	focal

显卡:

~$ lspci|grep -i vga
0000:73:00.0 VGA compatible controller: NVIDIA Corporation Device 2204 (rev a1)
0000:d5:00.0 VGA compatible controller: NVIDIA Corporation Device 2204 (rev a1)

宿主系统上安装 nvidia 驱动等主要是以下三步, 我在其他代码安装时已经处理好了 (没有记录). 网友分享非常多, 参照各类博文步骤处理就行.

1. 安装 nvidia driver

2. 安装 docker

3. 安装 nvidia-container-toolkit

sudo apt-get install nvidia-container-toolkit

II. Docker 容器安装配置

1. 拉取 ubuntu 22.04

docker pull ubuntu:jammy

2. 创建容器

docker run -it  -d -p 8888:8888 -p 6006:6006 -p 8022:22 \--gpus all \--ipc=host \--name gaussian_splatting -v /home/robot/working_space/python/pytorch:/workspace \--workdir=/workspace \-e DISPLAY=unix$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix:rw -e NVIDIA_DRIVER_CAPABILITIES=all\ubuntu:jammy  /bin/bash

其中

-i , --interactive —— Keep STDIN open even if not attached.

-t, --tty —— Allocate a pseudo-TTY.

-it 表示创建一个交互式的容器 -i, 并绑定一个伪终端 -t.

-d —— Run container in background and print container ID.

-p —— Publish a container’s port(s) to the host.

将容器内部的端口映射到宿主机的端口上, 从而使得外部网络可以通过宿主主机的 IP 地址和端口访问容器内的应用程序. 映射规则由两个端口号组成, 中间用冒号分隔,[第一个端口号是宿主主机的端口号:第二个端口号是容器内部的端口号]. 这三个端口映射配置并非安装 GS 所必须, 这里配置是为了容器中运行 jupyter 设置的 (其他目的, 故可按照需求删除 -p 8888:8888 -p 6006:6006 -p 8022:22).

--gpus 安装 nvidia-container-toolkit 引入的配置参数, 将 GPU 设备分配给容器, 使容器能使用 GPU 进行计算, all 参数将所有 GPU 设备分配给容器.

-ipc —— IPC mode to use.

默认情况下容器使用相互隔离的进程间通讯, 而参数 host 使得容器可以与主机上的进程直接进行进程间通信.

--name string —— Assign a name to the container.

-v —— Bind mount a volume, 将主机系统上的 /home/robot/working_space/python/pytorch 路径 (改成自己的路径) 挂载到容器的 /workspace 路径 (改成自己的路径), 方便容器和主机之间共享数据.

--workdir string —— Working directory inside the container.

-e, --env list —— Set environment variables.

-e DISPLAY=unix$DISPLAY 修改环境变量 DISPLAY.

-v /tmp/.X11-unix:/tmp/.X11-unix:rw 表示共享本地unix端口, docker 可以知道本地宿主机上安装的 X11 界面服务.

Unix/Linux 的主流图形界面服务为 X11, 该图形显示方式实际上是一种 client/server 模式, 在服务端和客户端之间 X11通过 DISPLAY 环境变量来指定将图形显示到何处. 后面的参数就是将主机上 X11的 unix 套接字共享到了容器里面, 每个 unix 套接字实际上就是系统 /tmp/.X11-unix 目录下面的一个特殊文件.

-e NVIDIA_DRIVER_CAPABILITIES=all 设置显示环境变量. The NVIDIA_DRIVER_CAPABILITIES controls which driver libraries/binaries will be mounted inside the container. The possible values of the NVIDIA_DRIVER_CAPABILITIES variable are: compute, video, graphics, utility, or all. 其中 all 参数enable all available driver capabilities. 也就是说, --gpus 是分配哪几块 GPU 给容器, 而 NVIDIA_DRIVER_CAPABILITIES 是分配到的 GPU 发挥哪些能力. (详细信息 NVIDIA Container Toolkit User Guide 或 Specialized Configurations with Docker)

ubuntu:jammy 为 IMAGE 镜像.

/bin/bash 表示载入容器后运行 bash, docker 中必须要保持一个进程的运行, 不然容器启动后马上 “执行完毕后容器被终止”.

(可参考docker run的配置参数详解、Docker 环境下运行 Fast_LIO 进行三维建模的前/后处理设置)

3. 进入容器

A. 进入容器

docker ps -a
docker start gaussian_splatting
docker attach gaussian_splatting

B. 查看容器中操作系统的版本

/workspace# cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=22.04
DISTRIB_CODENAME=jammy
DISTRIB_DESCRIPTION="Ubuntu 22.04.4 LTS"

C. 查看容器中 nvidia driver, 确认容器中能够访问 nvidia 驱动

fig1-nvidia-smi

D. 容器中系统更换国内源, 比如 sources.list 中增加对应ubuntu版本的清华源、阿里源、中科大源等

E. 容器中测试一下 X11 Display, 为后面 SIBR_gaussianViewer 的运行做准备

apt-get install x11-apps
xclock
fig2-xclock

4. 容器中安装 cuda SDK

之前安装 nvidia 驱动已经包含了 cuda driver. 但这不是完整的开发环境, 没有包含编译器等工具. 我们参考 Docker 镜像 中 Cuda 安装 来进行下面步骤.

A. 下载 CUDA Toolkit 11.8

地址: https://developer.nvidia.com/cuda-toolkit-archive

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

B. 安装依赖

apt-get install gcc g++ freeglut3-dev build-essential libx11-dev libxmu-dev libxi-dev libglu1-mesa libglu1-mesa-dev

C. 安装 cuda

sh cuda_11.8.0_520.61.05_linux.run
fig3-cuda-sdk

D. 容器中设置环境变量

在 /root/.bashrc 文件尾添加:

export PATH=/usr/local/cuda-11.8/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda-11.8/lib64:$LD_LIBRARY_PATH

E. 启用新环境

source ~/.bashrc

F. 安装验证

/workspace# nvcc -V
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2022 NVIDIA Corporation
Built on Wed_Sep_21_10:33:58_PDT_2022
Cuda compilation tools, release 11.8, V11.8.89
Build cuda_11.8.r11.8/compiler.31833905_0

5. 容器中安装 miniforge 3

A. 下载

https://conda-forge.org/download/

B. 安装

bash Miniforge3-Linux-x86_64.sh

在安装中间步骤中修改了安装位置 /workspace/miniforge3 (改或不改都可).

C. 在 .bashrc 中添加系统环境变量

export PATH=/workspace/miniforge3/bin:$PATH
source ~/.bashrc

E. 激活默认 conda 虚拟环境

conda init bash
source ~/.bashrc

6. 安装 cmake

A. 下载 cmake 源码

从 https://cmake.org/download/#older 下载 cmake-3.28.5.tar.gz

B. 安装依赖

apt-get install libssl-dev

C. 运行构建工具

使用 tar -zxvf 解压后运行

cd cmake-3.28.5
./bootstrap

D. 编译和安装

make install -j2

III. 编译与测试 GS

1. 虚拟环境配置

A. 源代码 Clone

git clone https://github.com/graphdeco-inria/gaussian-splatting --recursive

B. 创建 GS 的虚拟环境

cd /workspace/gaussian-splatting/
conda env create --file environment.yml
conda activate gaussian_splatting

C. 查看 conda 虚拟环境

/workspace/gaussian-splatting# conda info --envs
# conda environments:
#
base                     /workspace/miniforge3
gaussian_splatting    *  /workspace/miniforge3/envs/gaussian_splatting

D. 设置容器开机默认虚拟环境

将 GS 的虚拟环境设置为该容器开机默认进入的 conda 虚拟环境, 需在 ~/.bashrc 中设置

conda activate gaussian_splatting
source ~/.bashrc

2. 训练与评估

A. 训练测试

python train.py -s ../GaussianSplatting_dataset/tandt_db/tandt/truck/ -m ../GaussianSplatting_dataset/truck/output/
train

B. 评估测试

python train.py -s ../GaussianSplatting_dataset/tandt_db/tandt/truck/ --eval
# Output folder: ./output/bba0c333-0
python render.py -m ./output/bba0c333-0/
python metrics.py -m ./output/bba0c333-0/
fig5-evaluate

C. 问题处理

运行 metrics.py 时遇到 “Unable to compute metrics for model” 错误, 需要安装依赖 torchmetrics

(参考 https://github.com/graphdeco-inria/gaussian-splatting/issues/481)

conda install torchmetrics

如果还是有问题, 请检查网络, 因为第一次运行时需要下载 vgg.pth.

Downloading: "https://raw.githubusercontent.com/richzhang/PerceptualSimilarity/master/lpips/weights/v0.1/vgg.pth" to /root/.cache/torch/hub/checkpoints/vgg.pth

3. 编译安装 SIBR_gaussianViewer

A. 安装依赖

apt install libglew-dev libassimp-dev libboost-all-dev libgtk-3-dev libopencv-dev libglfw3-dev libavdevice-dev libavcodec-dev libeigen3-dev libxxf86vm-dev libembree-dev
apt install git

B. 编译 Viewer

cmake -Bbuild . -DCMAKE_BUILD_TYPE=Release
cmake --build build -j2 --target install

C. 测试 Viewer

cd ./install/bin
./SIBR_gaussianViewer_app -m /workspace/GaussianSplatting_dataset/truck/output/
rendering

小结

这样安装配置完毕了.

注意一下网络是否通畅, 因为要自动下载好多依赖库.

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

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

相关文章

详解和实现数据表格中的行数据合并功能

theme: smartblue 前言 需求场景: 在提供了数据查看和修改的表格视图中(如table、a-table等…),允许用户自行选择多行数据,依据当前状态进行特定列数据的合并操作。选中的数据将统一显示为选中组的首条数据值。同时,页面会即时反…

FASTGPT:可视化开发、运营和使用的AI原生应用

近年来,随着人工智能(AI)技术的迅猛发展,AI的应用逐渐渗透到各行各业。作为一种全新的开发模式,AI原生应用正逐步成为行业的焦点。在这方面,FASTGPT无疑是一款颇具代表性的产品。本文将详细介绍FASTGPT的设…

使用compile_commands.json配置includePath环境,解决vscode中引入头文件处有波浪线的问题

通过编译时生成的 compile_commands.json 文件自动完成对 vscode 中头文件路径的配置,实现 vscode 中的代码的自动跳转。完成头文件路径配置后,可以避免代码头部导入头文件部分出现波浪线,警告说无法正确找到头文件。 步骤 需要在 vscode 中…

k8s怎么监听资源的变更

监听k8s所有的 Deployment 资源 package mainimport ("context""fmt"v1 "k8s.io/api/apps/v1""k8s.io/apimachinery/pkg/util/json""k8s.io/client-go/informers""k8s.io/client-go/kubernetes""k8s.io/cli…

顺序表的讲解与实现

顺序表的讲解与实现 一、顺序表的概念及结构二、顺序表分类(C语言实现)顺序表和数组的区别顺序表分类静态顺序表动态顺序表 三、动态顺序表的实现(使用VS2022)1.初始化、销毁、打印内容2.检查扩容3.尾部插入、尾部删除、头部插入、头部删除尾部插入尾部删除头部插入头部删除 4.…

【AIoT-Robot】3d hand pose

手语是聋哑人士的主要沟通工具,它是利用手部和身体的动作来传达意义。虽然手语帮助它的使用者之间互相沟通,但聋哑人士与一般人的沟通却十分困难,这个沟通障碍是源于大部分人不懂得手语。 1. 手势&&手语 手势:手的姿势 ,通常称作手势。它指的是人在运用手臂时,所…

Monaco Editor系列(六)Range详解、Uri 自动匹配语言模型、缩略图 miniMap 配置

前情回顾: 一鼓作气,再鼓,再鼓!!哈哈哈。争取早日占领 Monaco 领地。 上一篇文章讲到的三个功能分别是 Position 类型、设置 markers、指定位置插入或替换内容 涉及到的知识点: ⛈️ 获取光标位置&#x…

有哪些好用的ai工具,可以提升科研、学习、办公等效率?

最近,Sora的诞生为AI再添了一把火。 据介绍,这款“文生视频”的Sora可以直接输出长达60秒的视频,并且包含高度细致的背景、复杂的多角度镜头,以及富有情感的多个角色。 不仅能准确呈现细节,还能理解物体在物理世界中…

threadX 消息队列

1、 使用消息列的目的 在ThreadX操作系统下使用消息队列的目的主要有以下几点: 提高CPU利用率: 消息队列是RTOS(实时操作系统)中常用的一种数据通信方式,常用于任务与任务之间或是中断与任务之间的数据传递。相比裸机…

Centos 报错 One of the configured repositories failed

目录预览 一、问题描述二、原因分析三、解决方案四、参考链接 一、问题描述 使用yum update更新命令就出现下面问题,系统是刚安装的,然后修改了一下IP变成手动。(排查问题前,先回顾自己做了哪些操作,方便进一步排错&a…

PX4 ROS2 真机

如果仿真跑通了。 真机遇到问题,可参考此文章。 ubuntu22 px4 1.14.3 ros2 humble 硬件接线。 先找两个usb - ttl串口,分别接到两台主机上,保证串口通信正常。 图中是个六合一的。浪费一天时间,发现是串口设置错误&#xff…

小红书前端2轮面试期望22K,全程问低代码设计

一面(通过) 1、好,那我们开始把,先简单介绍一下自己的一个经历,以及自己有亮点的项目?balabala 2、你可以这样介绍:在这里边主要负责哪几个项目,哪些项目是比较有亮点的&#xff0…

如何让Google收录网站?

Google收录网站的前提条件是确保网站可以公开访问,并且页面加载速度需要快,这样Google爬虫才可以访问到你的网站,并且索引你网站中的内容。实现了上面的前提条件,可以通过优化数据结构、创建站点地图、使用Google Search Console、…

Apache Doris 基础 -- 数据表设计(表索引)

1、索引概述 索引用于帮助快速过滤或搜索数据。目前,Doris支持两种类型的索引:内置智能索引和用户创建的二级索引。 内置智能索引 排序键和前缀索引:Apache Doris基于排序键以有序的方式存储数据。它为每1024行数据创建一个前缀索引。索引中的键是当前1024行组的…

Go微服务: 封装nacos-sdk-go的v2版本与应用

概述 基于前文:https://active.blog.csdn.net/article/details/139213323我们基于此SDK提供的API封装一个公共方法来用于生产环境 封装 nacos-sdk-go 我们封装一个 nacos.go 文件, 这个是通用的工具库 package commonimport ("fmt""github.com/nac…

Linux下的Git应用及配置

1、卸载 2、安装 3、创建并初始化 4、配置 (附加删除语句) 5、查看(tree .git/) 6、增加和提交 7、打印日志 8、验证已操作工作

【机器学习】朴素贝叶斯算法及其应用探索

🌈个人主页: 鑫宝Code 🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础 ​💫个人格言: "如无必要,勿增实体" 文章目录 朴素贝叶斯算法及其应用探索引言1. 朴素贝叶斯基本概念1.1 贝叶斯定理回顾1.2 朴…

面试题:说一下 http 报文都有哪些东西?

面试题:说一下 http 报文都有哪些东西? HTTP 是传输超文本(实际上除了 HTML,可以传输任何类型的文件,如视频、音频、文本等)的协议,是一组用于浏览器-服务器之间数据传输的规则。 HTTP 位于 OS…

量化投资分析平台 迅投 QMT(二)

量化投资分析平台 迅投 QMT [迅投 QMT](https://www.xuntou.net/?user_code7NYs7O)我目前在使用如何获取数据上代码历史帖子 迅投 QMT 我目前在使用 两个月前(2024年4月)迅投和CQF有一个互动的活动,进行了平台的一个网上路演,刚…

简单小游戏制作

控制台基础设置 //隐藏光标 Console.CursorVisible false; //通过两个变量来存储舞台的大小 int w 50; int h 30; //设置舞台(控制台)的大小 Console.SetWindowSize(w, h); Console.SetBufferSize(w, h);多个场景 int nowSceneID 1; while (true) …