三维重建【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权限,无法进行后面部分的展示。

相关推荐
额呃呃1 天前
operator new/delete
开发语言·c++·算法
superman超哥1 天前
Rust `‘static` 生命周期:从字面意义到深层语义
开发语言·后端·rust·生命周期·编程语言·rust static·深层语义
平生不喜凡桃李1 天前
Google C++ Style Guide : 变量与函数名
开发语言·c++·google c++
yaoxin5211231 天前
285. Java Stream API - 通过 Supplier 创建 Stream
java·开发语言
搂着猫睡的小鱼鱼1 天前
基于Python的淘宝评论爬虫
开发语言·爬虫·python
这里是彪彪1 天前
Java多线程中的单例模式
java·开发语言·单例模式
linzihahaha1 天前
C++ 单例模式总结
开发语言·c++·单例模式
Lancer-311 天前
打开JAVA控制台(Java control panel )
java·开发语言
Hcoco_me1 天前
大模型面试题46:在训练7B LLM时,如果使用AdamW优化器,那么它需要的峰值显存是多少?
开发语言·人工智能·深度学习·transformer·word2vec