HYWorld2 Train 3DGS
The slow road to a beautiful splat — training 3D Gaussian Splatting
- gs_data
- ply_path
- camera_poses
- camera_intrinsics
- train_dir
- info
Everything before this node produced geometry fast. HYWorld2 Train 3DGS is where the pack switches from feed-forward reconstruction to actual optimization - training a proper 3D Gaussian Splat over thousands of steps until the scene looks good from every angle. It's the difference between a splat that's fine in a viewer and one you'd actually ship. It's also the node that will own your GPU for a while, because 3DGS training is exactly as expensive as it sounds.
It consumes the gs_data dataset from HYWorld2 GS Data and wraps the native HY-World world_gs_trainer.py. This is the payoff of the whole gaussian half of the pack - and per the KB's framing on 3D generation, gaussian splatting is the right output when your destination is a viewer or a rendered shot of a whole scene. Keep that in mind: a splat isn't mesh geometry, so don't force it into a game engine expecting to collide with things.
How it works
The node exposes the trainer's full control surface, grouped into things you'll touch and things you won't:
- Scheduling:
max_steps(default 8000), with comma-separatedsave_steps,eval_steps,ply_stepsstrings (default "8000"). - Data:
train_sampling_preset(standard / half-pano / random-pano variants),batch_size,patch_size(Full down to 256 - patch training fits smaller VRAM),downsample_pts_num(1M default). - Losses & quality:
depth_loss,normal_loss,sky_depth_from_pcd,use_scale_regularization,use_mask_gaussian,mask_export_stochastic,use_anchor_protection,antialiased,normalize_world_space- all default on, and they're the fork-specific features the vendored gsplat exists for.do_prune(off by default) plusprune_opacity_thresholdcleans floaters when you turn it on. - Refinement strategy: the
strategy_refine_*/strategy_reset_every/strategy_grow_grad2d/strategy_prune_scale3dcluster are the density-control schedules. Leave them unless you're chasing specific artifacts. - Output:
save_ply,disable_video,disable_viewer(both disable defaults - good, because the built-in viewer/nerfview stack is extra VRAM you don't need in a headless run),export_mesh(exports a mesh alongside the splat - on by default).
The inputs that matter
gs_data- required.max_steps- the big dial. 8000 is a decent default; push toward 20k+ for quality, and watchsave_stepsto get intermediate PLYs.patch_sizeanddownsample_pts_num- the VRAM valves when you OOM.
Outputs
ply_path- the trained splat. This is your deliverable.train_dir,info- where everything was written and status.camera_poses,camera_intrinsics- exposed for feeding a preview node.
Install & troubleshooting
Shared install: ComfyUI Manager (search HY-World 2.0) or clone + pip install -r requirements.txt + python install.py. The gsplat_maskgaussian fork built by install.py is non-negotiable here - the trainer calls gsplat.rendering.rasterization with distloss=True and gauss_masks, which upstream gsplat doesn't support. If you see an argument error around distloss or gauss_masks, you've got the wrong gsplat installed.
Also note the trainer stack adds tyro, viser, nerfview, tensorboard, torchmetrics, and friends to your environment - a chunky install. VRAM is the practical limit: on 16 GB, use patch_size below Full and keep downsample_pts_num at 1M. And remember the author's honest framing: multi-camera scene assembly is where this pipeline is still rough, so a trained splat from a clean single-image or panorama input will look far better than one stitched from awkward multi-view captures.
Inputs (33)
| Name | Type | Default | Description |
|---|---|---|---|
| gs_data | HYWORLD2_GS_DATA | — | |
| train_sampling_presetopt | COMBO | standard | 3 options: standard, half_pano_per_epoch, random_pano_50_per_epoch |
| batch_sizeopt | INT | 11–16 | — |
| patch_sizeopt | COMBO | Full | 4 options: Full, 712, 512, 256 |
| max_stepsopt | INT | 80001–100000 | — |
| save_stepsopt | STRING | 8000 | — |
| eval_stepsopt | STRING | 8000 | — |
| ply_stepsopt | STRING | 8000 | — |
| downsample_pts_numopt | INT | 10000001–50000000 | — |
| save_plyopt | BOOLEAN | true | — |
| disable_videoopt | BOOLEAN | true | — |
| disable_vieweropt | BOOLEAN | true | — |
| depth_lossopt | BOOLEAN | true | — |
| normal_lossopt | BOOLEAN | true | — |
| sky_depth_from_pcdopt | BOOLEAN | true | — |
| use_scale_regularizationopt | BOOLEAN | true | — |
| use_mask_gaussianopt | BOOLEAN | true | — |
| mask_export_stochasticopt | BOOLEAN | true | — |
| mask_export_anchor_protectionopt | BOOLEAN | false | — |
| use_anchor_protectionopt | BOOLEAN | true | — |
| do_pruneopt | BOOLEAN | false | — |
| prune_opacity_thresholdopt | FLOAT | 0.0100–1 | — |
| antialiasedopt | BOOLEAN | true | — |
| normalize_world_spaceopt | BOOLEAN | true | — |
| export_meshopt | BOOLEAN | true | — |
| strategy_refine_start_iteropt | INT | 1500–100000 | — |
| strategy_refine_stop_iteropt | INT | 7500–100000 | — |
| strategy_refine_everyopt | INT | 1001–100000 | — |
| strategy_refine_scale2d_stop_iteropt | INT | 7500–100000 | — |
| strategy_reset_everyopt | INT | 999901–1000000 | — |
| strategy_grow_grad2dopt | FLOAT | 0.00010–1 | — |
| strategy_prune_scale3dopt | FLOAT | 0.100–100 | — |
| convert_ply_to_worldmirror_preview_basisopt | BOOLEAN | false | — |
Outputs (5)
| Name | Type | Description |
|---|---|---|
| ply_path | STRING | — |
| camera_poses | TENSOR | — |
| camera_intrinsics | TENSOR | — |
| train_dir | STRING | — |
| info | STRING | — |