使用 tmux 在云服务器上稳定运行多场景 3DGS 训练任务摘要在云服务器上进行 3D Gaussian Splatting、LGDU-Splatting、Mip-Splatting 等三维重建模型训练时训练过程通常耗时较长。如果仅通过普通 SSH 终端直接运行python train.py一旦本地终端关闭或 SSH 连接中断训练进程可能随之终止。为解决这一问题本文介绍如何使用tmux管理长时间训练任务并结合多场景并行训练、GPU 状态检查、日志保存与会话恢复等操作构建一套适用于 3DGS 类任务的稳定训练流程。1. 问题背景在进行 3DGS 相关实验时常见的训练启动方式如下sshx3d-servercdCYN conda activate conda_envs/lgdu_mip_splatting/cdLGDU-splatting-lgdu-mip/ python train.py...这种方式虽然简单直接但存在一个明显问题训练进程依赖当前 SSH 会话。当本地终端被关闭、网络断开或者 SSH 会话异常退出时训练进程可能会收到终端挂断信号从而被系统终止。对于耗时较长的 3DGS 类训练任务而言这会造成训练中断、计算资源浪费以及实验结果不完整等问题。因此需要一种能够让训练进程脱离本地 SSH 终端生命周期的方式。tmux正是解决此类问题的常用工具。2. tmux 的作用tmux是一个终端复用工具可以理解为运行在服务器上的“持久终端”。普通 SSH 终端的生命周期如下本地终端关闭 → SSH 会话断开 → 训练进程可能终止使用tmux后训练进程的生命周期变为训练运行在服务器 tmux 会话中 本地终端关闭 → SSH 会话断开 → tmux 会话仍然存在 → 训练继续运行因此使用tmux后即使本地关闭终端或网络临时中断只要服务器本身没有关机、训练进程没有异常退出任务通常可以继续执行直到结束。3. 基本训练流程3.1 登录服务器首先通过 SSH 登录云服务器sshx3d-server其中x3d-server可以是用户在本地 SSH 配置文件中定义的服务器别名。例如也可以写成sshx3d10.123.1.1393.2 新建 tmux 会话为每个训练任务创建一个独立的 tmux 会话tmux new-strain_XXXX其中train_XXXX是 tmux 会话名称建议根据训练场景命名。例如tmux new-strain_kitchen或tmux new-strain_playroom这样在同时训练多个场景时可以通过会话名快速区分不同任务。3.3 进入项目目录并激活环境进入 tmux 会话后切换到实验目录并激活 conda 环境cdCYN conda activate conda_envs/lgdu_mip_splatting/cdLGDU-splatting-lgdu-mip/这里需要注意tmux本身是系统级终端工具而 conda 环境是 Python 运行环境。二者并不冲突。实际训练时是在 tmux 提供的持久终端中激活 conda 环境然后再运行 Python 训练脚本。如果在 tmux 中出现conda activate无法使用的情况可以先手动加载 conda 初始化脚本source/data1/x3d/miniconda3/etc/profile.d/conda.sh conda activate conda_envs/lgdu_mip_splatting/具体路径应根据服务器上的 conda 安装位置调整。4. 训练前查看 GPU 状态在启动训练前建议先检查 GPU 使用情况避免多个任务抢占同一张显卡导致显存不足或训练效率下降。可以使用如下命令输出格式化的 GPU 状态表nvidia-smi --query-gpuindex,name,memory.used,memory.total,memory.free,utilization.gpu,temperature.gpu,power.draw\--formatcsv,noheader,nounits|\awk-F, BEGIN { printf %-5s %-28s %-12s %-12s %-12s %-10s %-8s %-10s\n, \ GPU, Name, Used(MB), Total(MB), Free(MB), GPU-Util, Temp, Power printf %-5s %-28s %-12s %-12s %-12s %-10s %-8s %-10s\n, \ ---, ----, --------, ---------, --------, --------, ----, ----- } { printf %-5s %-28s %-12s %-12s %-12s %-10s %-8s %-10s\n, \ $1, $2, $3, $4, $5, $6%, $7℃, $8W }该命令会显示 GPU 编号、显卡名称、已用显存、总显存、空闲显存、GPU 利用率、温度和功耗等信息。相比直接查看nvidia-smi这种表格化输出更加适合在多卡服务器上快速判断当前资源状态。5. 使用指定 GPU 启动训练在多 GPU 服务器上建议使用CUDA_VISIBLE_DEVICES为每个训练任务指定独立显卡。例如将当前任务绑定到 GPU 1CUDA_VISIBLE_DEVICES1PYTORCH_CUDA_ALLOC_CONFmax_split_size_mb:128 python train.py\--source_path/data1/x3d/CYN/scenes/360_v2/kitchen\--model_path/data1/x3d/CYN/LGDU-splatting-lgdu-mip/output/kitchen/kitchen_eval_lgdu_smip_nv6_res1\--eval\--disable_viewer\--data_devicecpu\--resolution1\--test_iterations-1\--checkpoint_iterations70001500030000\--densify_max_points_per_stage0\--line_tracks_path/data1/x3d/CYN/lines_file/kitchen/kitchen_nv6/alltracks.txt\--line_min_visible_views6\--line_confidence_modevisibility\--line_confidence_power1.0\--line_confidence_min0.05\--line_multiview_edge_support_enable\--line_multiview_edge_max_views32\--line_multiview_edge_min_views2\--line_confidence_percentile70\--line_edge_sigma_px2.0\--line_edge_sample_count16\--line_edge_min_valid_ratio0.5\--line_edge_min_projected_length4.0\--line_photo_reweight_enable\--line_photo_lambda_adaptive\--line_photo_lambda_target_ratio0.03\--line_photo_lambda_adaptive_min0.0\--line_photo_lambda_adaptive_max0.02\--line_photo_start_iter3000\--line_photo_end_iter15000\--line_photo_sample_count32\--line_photo_mask_dilation_px2\--line_photo_min_valid_ratio0.5\--line_photo_min_projected_length4.0\--line_photo_charbonnier_eps0.001\--line_densify_modescore\--line_densify_start_iter500\--line_densify_end_iter15000\--line_densify_score_boost0.5\--line_densify_confidence_power1.0\--line_densify_confidence_max3.0\--line_densify_low_alpha_boost0.5\--line_unpool_enable\--line_unpool_start_iter3000\--line_unpool_end_iter12000\--line_unpool_interval500\--line_unpool_samples_per_line2\--line_unpool_max_points512\--line_unpool_candidate_factor4\--line_unpool_score_threshold0.10\--line_unpool_opacity_init0.04\--line_unpool_scale_factor0.6\--line_unpool_alpha_target0.08\--line_unpool_low_alpha_boost0.5\--mip_filter_enable\--mip_filter_scale0.4472135955\--mip_filter_margin0.15\--mip_filter_update_interval100\--smip_enable\--smip_filter_base_weight0.0\--smip_filter_gain1.2\--smip_filter_max_weight2.0\--smip_opacity_compensation0.25\--smip_low_alpha_boost0.5\--smip_alpha_target0.08\21|teetrain_kitchen.log该命令中有几个关键点CUDA_VISIBLE_DEVICES1表示当前训练只使用物理编号为 1 的 GPU。PYTORCH_CUDA_ALLOC_CONFmax_split_size_mb:128用于调整 PyTorch CUDA 显存分配策略在一定程度上缓解显存碎片问题。--model_path指定训练结果输出目录。--disable_viewer禁用可视化 viewer有助于避免端口或图形界面相关问题。21 | tee train_kitchen.log表示同时将标准输出和标准错误输出写入日志文件并在终端实时显示。6. 日志记录与查看训练命令末尾使用21|teetrain_kitchen.log可以将训练过程中的输出保存到日志文件中。这样即使后续不进入 tmux 会话也可以直接通过日志查看训练进度。查看日志时应使用tail-ftrain_kitchen.log而不是直接使用teetrain_kitchen.log需要注意tee的主要作用是在训练运行时将输出写入日志文件而查看日志应使用cat、less、tail等命令。对于正在持续写入的训练日志推荐使用tail-ftrain_kitchen.log退出日志查看时按Ctrl C此处的Ctrl C只会退出tail -f不会终止 tmux 中正在运行的训练进程。7. 从 tmux 中安全退出训练启动后不应直接关闭 SSH 终端也不应按Ctrl C。如果希望离开当前 tmux 会话但保持训练继续运行应使用 detach 操作。标准操作为Ctrl B松开后再按D即Ctrl B然后 D执行成功后会返回普通 SSH 终端并看到类似信息[detached from train_kitchen]此时训练任务仍然在服务器 tmux 会话中继续运行。随后可以安全退出 SSHexit或者直接关闭本地终端。8. 当 CtrlB 不起作用时的处理方法在实际使用中可能会遇到CtrlB没有明显反应的情况。首先需要明确CtrlB本身不会在屏幕上显示任何内容它只是 tmux 的前缀键。正确操作是先按CtrlB松开后再按D。如果仍然无法 detach可以新开一个本地终端再次 SSH 登录服务器sshx3d-server查看当前 tmux 会话tmuxls例如输出train_kitchen: 1 windows train_playroom: 1 windows然后通过命令强制 detach 指定会话tmux detach-client-strain_kitchen如果会话名为train_XXXX则执行tmux detach-client-strain_XXXX这种方式适用于当前 tmux 终端被训练输出占据、快捷键无法正常响应或者本地终端输入异常的情况。9. 查看已有训练会话可以使用以下命令查看当前服务器上属于当前用户的 tmux 会话tmuxls示例输出train_playroom: 1 windows (created Wed Jun 24 07:39:17 2026) [124x23]这说明当前存在一个名为train_playroom的 tmux 会话。重新进入该训练会话tmux attach-ttrain_playroom或使用简写tmux a-ttrain_playroom查看完训练情况后如果不想终止任务应继续使用 detach 操作退出Ctrl B然后 D10. 多场景并行训练在 3DGS 类实验中常常需要同时训练多个场景例如kitchen、playroom、garden、bicycle等。使用 tmux 时推荐采用“一个场景一个 tmux 会话”的方式管理训练任务。例如tmux new-strain_kitchen启动kitchen场景训练后 detach。然后新开另一个终端或在普通 SSH 终端中继续创建新会话tmux new-strain_playroom再启动playroom场景训练。对于多个任务应注意以下几点10.1 每个任务使用不同的 tmux 会话名推荐命名方式train_kitchen train_playroom train_garden train_bicycle这样便于通过tmux ls查看和管理。10.2 每个任务使用不同的输出目录不同训练任务的--model_path必须不同。例如--model_path/data1/x3d/CYN/LGDU-splatting-lgdu-mip/output/kitchen/kitchen_eval_lgdu_smip_nv6_res1和--model_path/data1/x3d/CYN/LGDU-splatting-lgdu-mip/output/playroom/playroom_eval_lgdu_smip_nv6_res1如果多个任务写入同一个输出目录可能导致 checkpoint、point cloud、配置文件或日志互相覆盖进而影响实验结果的可靠性。10.3 每个任务使用不同的日志文件推荐日志命名方式train_kitchen.log train_playroom.log train_garden.log避免多个任务写入同一个日志文件导致日志内容混乱。10.4 多 GPU 环境下合理分配显卡如果服务器有多张 GPU可以为不同任务指定不同 GPUCUDA_VISIBLE_DEVICES0python train.py...CUDA_VISIBLE_DEVICES1python train.py...CUDA_VISIBLE_DEVICES2python train.py...启动任务前应使用前文中的 GPU 状态检查命令或直接执行nvidia-smi确认目标 GPU 的显存和利用率。11. 停止某个训练任务如果需要停止某个训练任务推荐先进入对应 tmux 会话tmux a-ttrain_kitchen确认当前界面确实是目标训练任务后再按Ctrl C这样可以终止当前训练进程。如果需要直接关闭整个 tmux 会话可以执行tmux kill-session-ttrain_kitchen需要注意tmux kill-session会直接关闭指定会话其中正在运行的训练进程也会被终止。因此该命令应谨慎使用。12. 推荐的标准化操作流程综合上述内容推荐形成如下标准工作流。12.1 启动训练sshx3d-server tmux new-strain_kitchencdCYN conda activate conda_envs/lgdu_mip_splatting/cdLGDU-splatting-lgdu-mip/ nvidia-smiCUDA_VISIBLE_DEVICES1PYTORCH_CUDA_ALLOC_CONFmax_split_size_mb:128 python train.py\--source_path/data1/x3d/CYN/scenes/360_v2/kitchen\--model_path/data1/x3d/CYN/LGDU-splatting-lgdu-mip/output/kitchen/kitchen_eval_lgdu_smip_nv6_res1\--eval\--disable_viewer\--data_devicecpu\--resolution1\--test_iterations-1\--checkpoint_iterations70001500030000\--densify_max_points_per_stage0\--line_tracks_path/data1/x3d/CYN/lines_file/kitchen/kitchen_nv6/alltracks.txt\--line_min_visible_views6\--line_confidence_modevisibility\--line_confidence_power1.0\--line_confidence_min0.05\--line_multiview_edge_support_enable\--line_multiview_edge_max_views32\--line_multiview_edge_min_views2\--line_confidence_percentile70\--line_edge_sigma_px2.0\--line_edge_sample_count16\--line_edge_min_valid_ratio0.5\--line_edge_min_projected_length4.0\--line_photo_reweight_enable\--line_photo_lambda_adaptive\--line_photo_lambda_target_ratio0.03\--line_photo_lambda_adaptive_min0.0\--line_photo_lambda_adaptive_max0.02\--line_photo_start_iter3000\--line_photo_end_iter15000\--line_photo_sample_count32\--line_photo_mask_dilation_px2\--line_photo_min_valid_ratio0.5\--line_photo_min_projected_length4.0\--line_photo_charbonnier_eps0.001\--line_densify_modescore\--line_densify_start_iter500\--line_densify_end_iter15000\--line_densify_score_boost0.5\--line_densify_confidence_power1.0\--line_densify_confidence_max3.0\--line_densify_low_alpha_boost0.5\--line_unpool_enable\--line_unpool_start_iter3000\--line_unpool_end_iter12000\--line_unpool_interval500\--line_unpool_samples_per_line2\--line_unpool_max_points512\--line_unpool_candidate_factor4\--line_unpool_score_threshold0.10\--line_unpool_opacity_init0.04\--line_unpool_scale_factor0.6\--line_unpool_alpha_target0.08\--line_unpool_low_alpha_boost0.5\--mip_filter_enable\--mip_filter_scale0.4472135955\--mip_filter_margin0.15\--mip_filter_update_interval100\--smip_enable\--smip_filter_base_weight0.0\--smip_filter_gain1.2\--smip_filter_max_weight2.0\--smip_opacity_compensation0.25\--smip_low_alpha_boost0.5\--smip_alpha_target0.08\21|teetrain_kitchen.log12.2 离开 tmux 但保持训练运行Ctrl B然后 D12.3 查看已有 tmux 会话tmuxls12.4 重新进入训练会话tmux a-ttrain_kitchen12.5 查看日志tail-ftrain_kitchen.log12.6 从另一个终端 detach 指定会话tmux detach-client-strain_kitchen13. 总结在云服务器上运行 3DGS 类训练任务时直接依赖普通 SSH 终端存在训练中断风险。通过tmux可以将训练任务放入服务器端持久会话中使训练过程不再依赖本地终端的连接状态。在实际实验中推荐采用以下规范每个训练场景创建一个独立的 tmux 会话每个任务使用独立的输出目录每个任务使用独立日志文件多 GPU 环境下使用CUDA_VISIBLE_DEVICES指定显卡训练启动前使用nvidia-smi检查 GPU 状态使用tee保存训练日志使用tail -f查看训练日志离开训练界面时使用CtrlB后接D而不是关闭终端或按CtrlC。通过上述流程可以较为稳定地管理多个 3DGS 训练任务提高服务器资源利用率并降低因 SSH 断开导致训练中断的风险。