Not working
I had downloaded a colmap dataset and tried to use it in gui function. But it seems to be working but the CUDA is always says out of memory. I have tested on 2 separate gpus gtx1650 and rtx 3080ti.
What is the resolution of images in your dataset?
You may need to pass scale parameter that is multiple of 2 to fit into your GPU (which will use downscaled versions of images).
E.g.:
julia> GaussianSplatting.gui("<path-to-dataset>"; scale=4)
resolutions were 4000 by 3000.
I tried using scale parameter to 2 and (my images were 4000 by 3000)
and got this error:
ERROR: Out of dynamic GPU memory (trying to allocate 16 bytes)
ERROR: Out of dynamic GPU memory (trying to allocate 16 bytes)
ERROR: Out of dynamic GPU memory (trying to allocate 16 bytes)
ERROR: Out of dynamic GPU memory (trying to allocate 16 bytes)
ERROR: Out of dynamic GPU memory (trying to allocate 16 bytes)
ERROR: Out of dynamic GPU memory (trying to allocate 16 bytes)
┌ Error: Error in render loop!
│ exception = KernelException: exception thrown during kernel execution on device NVIDIA GeForce GTX 1650
└ @ NeuralGraphicsGL ~/.julia/packages/NeuralGraphicsGL/DcF5O/src/NeuralGraphicsGL.jl:294
Stacktrace:
[1] check_exceptions()
@ CUDA ~/.julia/packages/CUDA/oymHm/src/compiler/exceptions.jl:39
[2] device_synchronize(; blocking::Bool, spin::Bool)
@ CUDA ~/.julia/packages/CUDA/oymHm/lib/cudadrv/synchronization.jl:191
[3] device_synchronize
@ ~/.julia/packages/CUDA/oymHm/lib/cudadrv/synchronization.jl:178 [inlined]
[4] checked_cuModuleLoadDataEx(_module::Base.RefValue{Ptr{CUDA.CUmod_st}}, image::Ptr{UInt8}, numOptions::Int64, options::Vector{CUDA.CUjit_option_enum}, optionValues::Vector{Ptr{Nothing}})
@ CUDA ~/.julia/packages/CUDA/oymHm/lib/cudadrv/module.jl:18
[5] CuModule(data::Vector{UInt8}, options::Dict{CUDA.CUjit_option_enum, Any})
@ CUDA ~/.julia/packages/CUDA/oymHm/lib/cudadrv/module.jl:60
[6] CuModule
@ ~/.julia/packages/CUDA/oymHm/lib/cudadrv/module.jl:49 [inlined]
[7] link(job::GPUCompiler.CompilerJob, compiled::@NamedTuple{image::Vector{UInt8}, entry::String})
@ CUDA ~/.julia/packages/CUDA/oymHm/src/compiler/compilation.jl:414
[8] actual_compilation(cache::Dict{Any, CuFunction}, src::Core.MethodInstance, world::UInt64, cfg::GPUCompiler.CompilerConfig{GPUCompiler.PTXCompilerTarget, CUDA.CUDACompilerParams}, compiler::typeof(CUDA.compile), linker::typeof(CUDA.link))
@ GPUCompiler ~/.julia/packages/GPUCompiler/1cGqD/src/execution.jl:270
[9] cached_compilation(cache::Dict{Any, CuFunction}, src::Core.MethodInstance, cfg::GPUCompiler.CompilerConfig{GPUCompiler.PTXCompilerTarget, CUDA.CUDACompilerParams}, compiler::Function, linker::Function)
@ GPUCompiler ~/.julia/packages/GPUCompiler/1cGqD/src/execution.jl:159
[10] macro expansion
@ ~/.julia/packages/CUDA/oymHm/src/compiler/execution.jl:373 [inlined]
[11] macro expansion
@ ./lock.jl:267 [inlined]
[12] cufunction(f::GPUArrays.var"#gpu_broadcast_kernel_cartesian#41", tt::Type{Tuple{KernelAbstractions.CompilerMetadata{KernelAbstractions.NDIteration.DynamicSize, KernelAbstractions.NDIteration.DynamicCheck, Nothing, CartesianIndices{3, Tuple{Base.OneTo{Int64}, Base.OneTo{Int64}, Base.OneTo{Int64}}}, KernelAbstractions.NDIteration.NDRange{3, KernelAbstractions.NDIteration.DynamicSize, KernelAbstractions.NDIteration.DynamicSize, CartesianIndices{3, Tuple{Base.OneTo{Int64}, Base.OneTo{Int64}, Base.OneTo{Int64}}}, CartesianIndices{3, Tuple{Base.OneTo{Int64}, Base.OneTo{Int64}, Base.OneTo{Int64}}}}}, CuDeviceArray{Float32, 3, 1}, Base.Broadcast.Broadcasted{CUDA.CuArrayStyle{3, CUDA.UnifiedMemory}, Tuple{Base.OneTo{Int64}, Base.OneTo{Int64}, Base.OneTo{Int64}}, typeof(identity), Tuple{Base.Broadcast.Extruded{SubArray{Float32, 3, CuDeviceArray{Float32, 3, 1}, Tuple{UnitRange{Int64}, Base.Slice{Base.OneTo{Int64}}, Base.Slice{Base.OneTo{Int64}}}, false}, Tuple{Bool, Bool, Bool}, Tuple{Int64, Int64, Int64}}}}}}; kwargs::@Kwargs{always_inline::Bool, maxthreads::Nothing})
@ CUDA ~/.julia/packages/CUDA/oymHm/src/compiler/execution.jl:368
[13] macro expansion
@ ~/.julia/packages/CUDA/oymHm/src/compiler/execution.jl:112 [inlined]
[14] (::KernelAbstractions.Kernel{CUDABackend, KernelAbstractions.NDIteration.DynamicSize, KernelAbstractions.NDIteration.DynamicSize, GPUArrays.var"#gpu_broadcast_kernel_cartesian#41"})(::CuArray{Float32, 3, CUDA.HostMemory}, ::Vararg{Any}; ndrange::Tuple{Int64, Int64, Int64}, workgroupsize::Nothing)
@ CUDA.CUDAKernels ~/.julia/packages/CUDA/oymHm/src/CUDAKernels.jl:106
[15] _copyto!
@ ~/.julia/packages/GPUArrays/uiVyU/src/host/broadcast.jl:71 [inlined]
[16] materialize!
@ ~/.julia/packages/GPUArrays/uiVyU/src/host/broadcast.jl:38 [inlined]
[17] materialize!
@ ./broadcast.jl:911 [inlined]
[18] gl_texture(r::GaussianSplatting.GaussianRasterizer{GaussianSplatting.ImageState{CuArray{UInt32, 2, CUDA.DeviceMemory}, CuArray{Float32, 2, CUDA.DeviceMemory}}, GaussianSplatting.GeometryState{CuArray{Float32, 1, CUDA.DeviceMemory}, CuArray{StaticArraysCore.SVector{2, Float32}, 1, CUDA.DeviceMemory}, CuArray{StaticArraysCore.SVector{3, Float32}, 1, CUDA.DeviceMemory}, CuArray{StaticArraysCore.SVector{3, Bool}, 1, CUDA.DeviceMemory}, CuArray{Int32, 1, CUDA.DeviceMemory}, CuArray{StaticArraysCore.SVector{3, Float32}, 1, CUDA.DeviceMemory}, CuArray{Int32, 1, CUDA.DeviceMemory}, CuArray{Float32, 2, CUDA.DeviceMemory}}, GaussianSplatting.BinningState{CuArray{UInt32, 1, CUDA.DeviceMemory}, CuArray{UInt64, 1, CUDA.DeviceMemory}, CuArray{UInt32, 1, CUDA.DeviceMemory}}, CuArray{Float32, 3, CUDA.DeviceMemory}, CuArray{Float32, 3, CUDA.HostMemory}, CuArray{Float32, 2, CUDA.DeviceMemory}})
@ GaussianSplatting ~/.julia/packages/GaussianSplatting/Va6dc/src/rasterization/rasterizer.jl:93
[19] render!(gui::GaussianSplatting.GSGUI{GaussianSplatting.GaussianModel{CuArray{Float32, 2, CUDA.DeviceMemory}, CuArray{Int32, 1, CUDA.DeviceMemory}, CuArray{Float32, 3, CUDA.DeviceMemory}, CuArray{Float32, 1, CUDA.DeviceMemory}, Nothing}, GaussianSplatting.Trainer{GaussianSplatting.GaussianRasterizer{GaussianSplatting.ImageState{CuArray{UInt32, 2, CUDA.DeviceMemory}, CuArray{Float32, 2, CUDA.DeviceMemory}}, GaussianSplatting.GeometryState{CuArray{Float32, 1, CUDA.DeviceMemory}, CuArray{StaticArraysCore.SVector{2, Float32}, 1, CUDA.DeviceMemory}, CuArray{StaticArraysCore.SVector{3, Float32}, 1, CUDA.DeviceMemory}, CuArray{StaticArraysCore.SVector{3, Bool}, 1, CUDA.DeviceMemory}, CuArray{Int32, 1, CUDA.DeviceMemory}, CuArray{StaticArraysCore.SVector{3, Float32}, 1, CUDA.DeviceMemory}, CuArray{Int32, 1, CUDA.DeviceMemory}, Nothing}, GaussianSplatting.BinningState{CuArray{UInt32, 1, CUDA.DeviceMemory}, CuArray{UInt64, 1, CUDA.DeviceMemory}, CuArray{UInt32, 1, CUDA.DeviceMemory}}, CuArray{Float32, 3, CUDA.DeviceMemory}, CuArray{Float32, 3, CUDA.HostMemory}, CuArray{Float32, 2, CUDA.DeviceMemory}}, GaussianSplatting.GaussianModel{CuArray{Float32, 2, CUDA.DeviceMemory}, CuArray{Int32, 1, CUDA.DeviceMemory}, CuArray{Float32, 3, CUDA.DeviceMemory}, CuArray{Float32, 1, CUDA.DeviceMemory}, Nothing}, GaussianSplatting.ColmapDataset{CuArray{Float32, 2, CUDA.DeviceMemory}, CuArray{Float32, 2, CUDA.DeviceMemory}, Array{UInt8, 4}}, GaussianSplatting.SSIM{Conv{2, 2, typeof(identity), CuArray{Float32, 4, CUDA.DeviceMemory}, Bool}}, GPUArrays.AllocCache, GaussianSplatting.var"#_scheduler#2"{Float32, Float32, Int64}, @NamedTuple{points::NerfUtils.Adam{CuArray{Float32, 1, CUDA.DeviceMemory}}, features_dc::NerfUtils.Adam{CuArray{Float32, 1, CUDA.DeviceMemory}}, features_rest::NerfUtils.Adam{CuArray{Float32, 1, CUDA.DeviceMemory}}, opacities::NerfUtils.Adam{CuArray{Float32, 1, CUDA.DeviceMemory}}, scales::NerfUtils.Adam{CuArray{Float32, 1, CUDA.DeviceMemory}}, rotations::NerfUtils.Adam{CuArray{Float32, 1, CUDA.DeviceMemory}}}}, GaussianSplatting.GaussianRasterizer{GaussianSplatting.ImageState{CuArray{UInt32, 2, CUDA.DeviceMemory}, CuArray{Float32, 2, CUDA.DeviceMemory}}, GaussianSplatting.GeometryState{CuArray{Float32, 1, CUDA.DeviceMemory}, CuArray{StaticArraysCore.SVector{2, Float32}, 1, CUDA.DeviceMemory}, CuArray{StaticArraysCore.SVector{3, Float32}, 1, CUDA.DeviceMemory}, CuArray{StaticArraysCore.SVector{3, Bool}, 1, CUDA.DeviceMemory}, CuArray{Int32, 1, CUDA.DeviceMemory}, CuArray{StaticArraysCore.SVector{3, Float32}, 1, CUDA.DeviceMemory}, CuArray{Int32, 1, CUDA.DeviceMemory}, CuArray{Float32, 2, CUDA.DeviceMemory}}, GaussianSplatting.BinningState{CuArray{UInt32, 1, CUDA.DeviceMemory}, CuArray{UInt64, 1, CUDA.DeviceMemory}, CuArray{UInt32, 1, CUDA.DeviceMemory}}, CuArray{Float32, 3, CUDA.DeviceMemory}, CuArray{Float32, 3, CUDA.HostMemory}, CuArray{Float32, 2, CUDA.DeviceMemory}}})
@ GaussianSplatting ~/.julia/packages/GaussianSplatting/Va6dc/src/gui/gui.jl:433
[20] loop!(gui::GaussianSplatting.GSGUI{GaussianSplatting.GaussianModel{CuArray{Float32, 2, CUDA.DeviceMemory}, CuArray{Int32, 1, CUDA.DeviceMemory}, CuArray{Float32, 3, CUDA.DeviceMemory}, CuArray{Float32, 1, CUDA.DeviceMemory}, Nothing}, GaussianSplatting.Trainer{GaussianSplatting.GaussianRasterizer{GaussianSplatting.ImageState{CuArray{UInt32, 2, CUDA.DeviceMemory}, CuArray{Float32, 2, CUDA.DeviceMemory}}, GaussianSplatting.GeometryState{CuArray{Float32, 1, CUDA.DeviceMemory}, CuArray{StaticArraysCore.SVector{2, Float32}, 1, CUDA.DeviceMemory}, CuArray{StaticArraysCore.SVector{3, Float32}, 1, CUDA.DeviceMemory}, CuArray{StaticArraysCore.SVector{3, Bool}, 1, CUDA.DeviceMemory}, CuArray{Int32, 1, CUDA.DeviceMemory}, CuArray{StaticArraysCore.SVector{3, Float32}, 1, CUDA.DeviceMemory}, CuArray{Int32, 1, CUDA.DeviceMemory}, Nothing}, GaussianSplatting.BinningState{CuArray{UInt32, 1, CUDA.DeviceMemory}, CuArray{UInt64, 1, CUDA.DeviceMemory}, CuArray{UInt32, 1, CUDA.DeviceMemory}}, CuArray{Float32, 3, CUDA.DeviceMemory}, CuArray{Float32, 3, CUDA.HostMemory}, CuArray{Float32, 2, CUDA.DeviceMemory}}, GaussianSplatting.GaussianModel{CuArray{Float32, 2, CUDA.DeviceMemory}, CuArray{Int32, 1, CUDA.DeviceMemory}, CuArray{Float32, 3, CUDA.DeviceMemory}, CuArray{Float32, 1, CUDA.DeviceMemory}, Nothing}, GaussianSplatting.ColmapDataset{CuArray{Float32, 2, CUDA.DeviceMemory}, CuArray{Float32, 2, CUDA.DeviceMemory}, Array{UInt8, 4}}, GaussianSplatting.SSIM{Conv{2, 2, typeof(identity), CuArray{Float32, 4, CUDA.DeviceMemory}, Bool}}, GPUArrays.AllocCache, GaussianSplatting.var"#_scheduler#2"{Float32, Float32, Int64}, @NamedTuple{points::NerfUtils.Adam{CuArray{Float32, 1, CUDA.DeviceMemory}}, features_dc::NerfUtils.Adam{CuArray{Float32, 1, CUDA.DeviceMemory}}, features_rest::NerfUtils.Adam{CuArray{Float32, 1, CUDA.DeviceMemory}}, opacities::NerfUtils.Adam{CuArray{Float32, 1, CUDA.DeviceMemory}}, scales::NerfUtils.Adam{CuArray{Float32, 1, CUDA.DeviceMemory}}, rotations::NerfUtils.Adam{CuArray{Float32, 1, CUDA.DeviceMemory}}}}, GaussianSplatting.GaussianRasterizer{GaussianSplatting.ImageState{CuArray{UInt32, 2, CUDA.DeviceMemory}, CuArray{Float32, 2, CUDA.DeviceMemory}}, GaussianSplatting.GeometryState{CuArray{Float32, 1, CUDA.DeviceMemory}, CuArray{StaticArraysCore.SVector{2, Float32}, 1, CUDA.DeviceMemory}, CuArray{StaticArraysCore.SVector{3, Float32}, 1, CUDA.DeviceMemory}, CuArray{StaticArraysCore.SVector{3, Bool}, 1, CUDA.DeviceMemory}, CuArray{Int32, 1, CUDA.DeviceMemory}, CuArray{StaticArraysCore.SVector{3, Float32}, 1, CUDA.DeviceMemory}, CuArray{Int32, 1, CUDA.DeviceMemory}, CuArray{Float32, 2, CUDA.DeviceMemory}}, GaussianSplatting.BinningState{CuArray{UInt32, 1, CUDA.DeviceMemory}, CuArray{UInt64, 1, CUDA.DeviceMemory}, CuArray{UInt32, 1, CUDA.DeviceMemory}}, CuArray{Float32, 3, CUDA.DeviceMemory}, CuArray{Float32, 3, CUDA.HostMemory}, CuArray{Float32, 2, CUDA.DeviceMemory}}})
@ GaussianSplatting ~/.julia/packages/GaussianSplatting/Va6dc/src/gui/gui.jl:232
[21] #93
@ ~/.julia/packages/GaussianSplatting/Va6dc/src/gui/gui.jl:196 [inlined]
[22] render_loop(draw_function::GaussianSplatting.var"#93#94"{GaussianSplatting.GSGUI{GaussianSplatting.GaussianModel{CuArray{Float32, 2, CUDA.DeviceMemory}, CuArray{Int32, 1, CUDA.DeviceMemory}, CuArray{Float32, 3, CUDA.DeviceMemory}, CuArray{Float32, 1, CUDA.DeviceMemory}, Nothing}, GaussianSplatting.Trainer{GaussianSplatting.GaussianRasterizer{GaussianSplatting.ImageState{CuArray{UInt32, 2, CUDA.DeviceMemory}, CuArray{Float32, 2, CUDA.DeviceMemory}}, GaussianSplatting.GeometryState{CuArray{Float32, 1, CUDA.DeviceMemory}, CuArray{StaticArraysCore.SVector{2, Float32}, 1, CUDA.DeviceMemory}, CuArray{StaticArraysCore.SVector{3, Float32}, 1, CUDA.DeviceMemory}, CuArray{StaticArraysCore.SVector{3, Bool}, 1, CUDA.DeviceMemory}, CuArray{Int32, 1, CUDA.DeviceMemory}, CuArray{StaticArraysCore.SVector{3, Float32}, 1, CUDA.DeviceMemory}, CuArray{Int32, 1, CUDA.DeviceMemory}, Nothing}, GaussianSplatting.BinningState{CuArray{UInt32, 1, CUDA.DeviceMemory}, CuArray{UInt64, 1, CUDA.DeviceMemory}, CuArray{UInt32, 1, CUDA.DeviceMemory}}, CuArray{Float32, 3, CUDA.DeviceMemory}, CuArray{Float32, 3, CUDA.HostMemory}, CuArray{Float32, 2, CUDA.DeviceMemory}}, GaussianSplatting.GaussianModel{CuArray{Float32, 2, CUDA.DeviceMemory}, CuArray{Int32, 1, CUDA.DeviceMemory}, CuArray{Float32, 3, CUDA.DeviceMemory}, CuArray{Float32, 1, CUDA.DeviceMemory}, Nothing}, GaussianSplatting.ColmapDataset{CuArray{Float32, 2, CUDA.DeviceMemory}, CuArray{Float32, 2, CUDA.DeviceMemory}, Array{UInt8, 4}}, GaussianSplatting.SSIM{Conv{2, 2, typeof(identity), CuArray{Float32, 4, CUDA.DeviceMemory}, Bool}}, GPUArrays.AllocCache, GaussianSplatting.var"#_scheduler#2"{Float32, Float32, Int64}, @NamedTuple{points::NerfUtils.Adam{CuArray{Float32, 1, CUDA.DeviceMemory}}, features_dc::NerfUtils.Adam{CuArray{Float32, 1, CUDA.DeviceMemory}}, features_rest::NerfUtils.Adam{CuArray{Float32, 1, CUDA.DeviceMemory}}, opacities::NerfUtils.Adam{CuArray{Float32, 1, CUDA.DeviceMemory}}, scales::NerfUtils.Adam{CuArray{Float32, 1, CUDA.DeviceMemory}}, rotations::NerfUtils.Adam{CuArray{Float32, 1, CUDA.DeviceMemory}}}}, GaussianSplatting.GaussianRasterizer{GaussianSplatting.ImageState{CuArray{UInt32, 2, CUDA.DeviceMemory}, CuArray{Float32, 2, CUDA.DeviceMemory}}, GaussianSplatting.GeometryState{CuArray{Float32, 1, CUDA.DeviceMemory}, CuArray{StaticArraysCore.SVector{2, Float32}, 1, CUDA.DeviceMemory}, CuArray{StaticArraysCore.SVector{3, Float32}, 1, CUDA.DeviceMemory}, CuArray{StaticArraysCore.SVector{3, Bool}, 1, CUDA.DeviceMemory}, CuArray{Int32, 1, CUDA.DeviceMemory}, CuArray{StaticArraysCore.SVector{3, Float32}, 1, CUDA.DeviceMemory}, CuArray{Int32, 1, CUDA.DeviceMemory}, CuArray{Float32, 2, CUDA.DeviceMemory}}, GaussianSplatting.BinningState{CuArray{UInt32, 1, CUDA.DeviceMemory}, CuArray{UInt64, 1, CUDA.DeviceMemory}, CuArray{UInt32, 1, CUDA.DeviceMemory}}, CuArray{Float32, 3, CUDA.DeviceMemory}, CuArray{Float32, 3, CUDA.HostMemory}, CuArray{Float32, 2, CUDA.DeviceMemory}}}}, c::NeuralGraphicsGL.Context; destroy_context::Bool)
@ NeuralGraphicsGL ~/.julia/packages/NeuralGraphicsGL/DcF5O/src/NeuralGraphicsGL.jl:290
[23] render_loop(draw_function::Function, c::NeuralGraphicsGL.Context)
@ NeuralGraphicsGL ~/.julia/packages/NeuralGraphicsGL/DcF5O/src/NeuralGraphicsGL.jl:287
[24] launch!
@ ~/.julia/packages/GaussianSplatting/Va6dc/src/gui/gui.jl:194 [inlined]
[25] |>
@ ./operators.jl:917 [inlined]
[26] gui(path::String; scale::Int64, fullscreen::Bool)
@ GaussianSplatting ~/.julia/packages/GaussianSplatting/Va6dc/src/GaussianSplatting.jl:178
[27] top-level scope
@ ~/Projects/GaussianSplat/demo.jl:4
[28] include(fname::String)
@ Base.MainInclude ./client.jl:494
[29] top-level scope
@ REPL[2]:1
[30] eval
@ ./boot.jl:385 [inlined]
[31] eval_user_input(ast::Any, backend::REPL.REPLBackend, mod::Module)
@ REPL ~/.julia/juliaup/julia-1.10.9+0.x64.linux.gnu/share/julia/stdlib/v1.10/REPL/src/REPL.jl:150
[32] repl_backend_loop(backend::REPL.REPLBackend, get_module::Function)
@ REPL ~/.julia/juliaup/julia-1.10.9+0.x64.linux.gnu/share/julia/stdlib/v1.10/REPL/src/REPL.jl:246
[33] start_repl_backend(backend::REPL.REPLBackend, consumer::Any; get_module::Function)
@ REPL ~/.julia/juliaup/julia-1.10.9+0.x64.linux.gnu/share/julia/stdlib/v1.10/REPL/src/REPL.jl:231
[34] run_repl(repl::REPL.AbstractREPL, consumer::Any; backend_on_current_task::Bool, backend::Any)
@ REPL ~/.julia/juliaup/julia-1.10.9+0.x64.linux.gnu/share/julia/stdlib/v1.10/REPL/src/REPL.jl:389
[35] run_repl(repl::REPL.AbstractREPL, consumer::Any)
@ REPL ~/.julia/juliaup/julia-1.10.9+0.x64.linux.gnu/share/julia/stdlib/v1.10/REPL/src/REPL.jl:375
[36] (::Base.var"#1014#1016"{Bool, Bool, Bool})(REPL::Module)
@ Base ./client.jl:437
[37] #invokelatest#2
@ ./essentials.jl:892 [inlined]
[38] invokelatest
@ ./essentials.jl:889 [inlined]
[39] run_main_repl(interactive::Bool, quiet::Bool, banner::Bool, history_file::Bool, color_set::Bool)
@ Base ./client.jl:421
[40] exec_options(opts::Base.JLOptions)
@ Base ./client.jl:338
[41] _start()
@ Base ./client.jl:557
I used documentation as reference.
Try version 1.0.1 (just tagged a new release) or main branch (]add https://github.com/JuliaNeuralGraphics/GaussianSplatting.jl.git), the issue was fixed some time ago.
Now I got to this screen. But screen is black and nothing showing up.
Ah the steps and Loss are changing tho.
I'm able to get it working. Thanks for your attention. Gaussian splatting is indeed very powerful, eventhough my gpu struggled a lot rendering xD.
Glad to hear it! I get good performance on RTX3060M with ~1080p resolution images and disabling training when moving camera around and limiting number of gaussians to <= 1 million.