三维重建【4-C】3D Gaussian Splatting:代码调试方法

三维重建【4-C】3D Gaussian Splatting:代码调试

  • 前言
  • 调试步骤
    • [1. 调试前准备](#1. 调试前准备)
    • [2. 开始调试](#2. 开始调试)

前言

3DGS是用Python和CUDA写的,主流程用Python语言,核心的前向传播和反向传播用CUDA代码。在实际调试时,需要联合调试Python和CUDA代码。

调试步骤

1. 调试前准备

1)安装ptvsd

python 复制代码
pip install ptvsd

2)新增参数 --ptvsd

python 复制代码
parser.add_argument('--ip', type=str, default="127.0.0.1")
parser.add_argument('--port', type=int, default=6009)
parser.add_argument('--debug_from', type=int, default=-1)
parser.add_argument('--detect_anomaly', action='store_true', default=False)
parser.add_argument("--test_iterations", nargs="+", type=int, default=[7_000, 30_000])
parser.add_argument("--save_iterations", nargs="+", type=int, default=[7_000, 30_000])
parser.add_argument("--quiet", action="store_true")
parser.add_argument('--disable_viewer', action='store_true', default=False)
parser.add_argument("--checkpoint_iterations", nargs="+", type=int, default=[])
parser.add_argument("--start_checkpoint", type=str, default = None)

# 新增:命令行参数:用于控制是否进行调试
parser.add_argument("--ptvsd", action="store_true", help="是否启动ptvsd调试。")

args = parser.parse_args(sys.argv[1:])

# 新增的代码:如果启用了ptvsd调试,等待调试器连接
if args.ptvsd:    
    ptvsd.enable_attach(address =('127.0.0.1', 10010), redirect_output=True)
    ptvsd.wait_for_attach()

3)编译dubug版本的CUDA算子

对nvcc和cxx编译命令加上调试参数,以submoudles/diff-gaussian-rasterization为例:

首先修改其setup.py文件:

python 复制代码
setup(
    name="diff_gaussian_rasterization",
    packages=['diff_gaussian_rasterization'],
    ext_modules=[
        CUDAExtension(
            name="diff_gaussian_rasterization._C",
            sources=[
            "cuda_rasterizer/rasterizer_impl.cu",
            "cuda_rasterizer/forward.cu",
            "cuda_rasterizer/backward.cu",
            "rasterize_points.cu",
            "ext.cpp"],
            extra_compile_args={"nvcc": ["-I" + os.path.join(os.path.dirname(os.path.abspath(__file__)), "third_party/glm/"),
                                        "-G",
                                        "-g" 
                                        ],
                                        "cxx":["-g"]
                                        })
        ],
    cmdclass={
        'build_ext': BuildExtension
    }
)

然后进行编译安装:

python 复制代码
python setup.py install

编译之后会生成.so文件的路径,建议保存下来,后续会用到。

2. 开始调试

首先通过终端执行命令启动程序,程序会停留在ptvsd处:

python 复制代码
python ./train_org.py -s datasets_path -m output_path --ptvsd

然后启动vscode调试,会提示创建launch.json文件,该文件内容如下:

javascript 复制代码
{
  "version": "0.2.0",
  "configurations": [
    {
      "name": "PythonAttach",
      "type": "debugpy",
      "request": "attach",
      "pathMappings": [
        {
            "localRoot": "${workspaceFolder}", // You may also manually specify the directory containing your source code.
            "remoteRoot": "${workspaceFolder}", // Linux example; adjust as necessary for your OS and situation.
        }
      ],
      "port": 10011,
      "host": "localhost"
    },
    {
      "name": "CUDA",
      "type": "cppdbg",
      "request": "attach",
      "processId": "${command:pickProcess}",
      "program": "/home/ubuntu/anaconda3/bin/python3.11",   // 注意这里你自己的python位置
      "additionalSOLibSearchPath": "/home/ubuntu/anaconda3/envs/3dgs/lib/python3.8/site-packages/diff_gaussian_rasterization-0.0.0-py3.8-linux-x86_64.egg/diff_gaussian_rasterization/", //.so文件的路径
      "sourceFileMap": {"/build/glibc-S9d2JN": "/usr/src/glibc"}, 
      "miDebuggerPath": "/usr/local/cuda-11.8/bin/cuda-gdb"
    }
  ],
  "sudo": true,  
  "compounds": [
    {
        "name": "Python + CUDA",
        "configurations": [
            "Python",
            "CUDA"
        ]
    }
  ]
}

启动pythonAttach调试:

启动CUDA调试会让选择attach的进程,选择你所执行的train文件即可,这一步会需要sudo权限,我这里因为是远程服务器,没有root权限,无法进行后面部分的展示。

相关推荐
乐观勇敢坚强的老彭3 分钟前
信奥C++一维数组笔记
开发语言·c++·笔记
这就是佬们吗11 分钟前
Python入门⑤-异常处理、文件操作与实战项目
开发语言·数据库·python·算法·pycharm
asdzx6722 分钟前
Python PDF 拆分实战指南:单页拆分与按需页码范围拆分
开发语言·python·pdf
C++ 老炮儿的技术栈26 分钟前
基于MFC+原生GDI手动自绘仪表盘控件
c语言·c++·visual studio·控件·工业控制·gdi·自绘
孬甭_33 分钟前
C++ vector
开发语言·c++
小肝一下39 分钟前
3. 单链表
c语言·数据结构·c++·算法·leetcode·链表·dijkstra
AOwhisky1 小时前
Python 学习笔记(第五期)——组合数据类型:列表、元组、集合与字典精讲——核心知识点自测与详解
开发语言·笔记·python·学习·云计算
炸膛坦客10 小时前
单片机/C/C++八股:(二十六)IIC 专题(I²C)---- 上集
c语言·c++·单片机
灯澜忆梦10 小时前
GO_并发编程---定时器
开发语言·后端·golang
-银雾鸢尾-10 小时前
C#中的StringBuilder相关方法
开发语言·c#