三维重建【4-C】3D Gaussian Splatting:代码调试
前言
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权限,无法进行后面部分的展示。
