ADR-0014 CUDA MPS CLI Lifecycle Owner¶
语言: 简体中文
Status: Proposed
Date: 2026-10-08
Owners: UniLab training runtime maintainers
Supersedes: ADR-0013(仅 daemon 生命周期管理边界)
Superseded by: None
Context¶
ADR-0013 把 CUDA MPS 定义为训练 owner 的显式 execution-sharing mode,并保持训练进程 只验证、不管理 daemon。该边界避免了训练进程误拥有共享 host 服务,但部署者仍需要手写 pipe/log 目录、daemon 启停、权限和 stale 进程处理脚本,且无法用结构化方式表达未来 multi-GPU 拓扑。
Issue #2079 要求提供一个显式、用户拥有的 CLI 生命周期面,同时不弱化训练路径的 fail-closed probe,也不提前声明 DP 或 task-per-GPU 支持。
Decision¶
新增顶层
uni-cumps命令,owner module 为src/unilab/training/cuda_mps_cli.py。初始命令为
status、doctor、start、stop、env:status/doctor是只读诊断;start只启动显式请求的 user-owned daemon;stop只允许停止 UniLab record 证明拥有的 daemon;env输出 launcher 环境而不修改当前 shell。
单 GPU 单 daemon 是默认路径:未传
--gpus时选择唯一可见物理 GPU;未传--name时使用gpu-<full-uuid>;未传 pipe/log 路径时使用/tmp/uni-cumps/<name>(mode0700);env/stop未传--name时选择唯一 live record。多 GPU 或多 daemon 歧义必须 显式指定,不自动选择。Daemon record 以
(UID, host, name)为 scope,持久化 canonical GPU UUID、绝对 pipe/log 路径、control PID 与 Linux/proc/<pid>/statstart-time。PID 单独不可作为 stop authority。GPU selector 必须解析为物理 GPU UUID;MIG 显式拒绝。多 GPU selector 解析为
single_task_multi_gpu未来形状但当前 fail closed,all解析为task_per_gpu诊断形状但同样不能启动。拓扑模型必须保留
single_gpu、single_task_multi_gpu、task_per_gpu三个模式; 当前只允许single_gpu执行。训练路径继续通过
training.cuda_process_sharing: mps显式请求,不引入auto, 不隐式选择 daemon,不修改父 shell 环境。CLI 可与训练独立使用。
Stable Contracts¶
CLI entrypoint:
pyproject.toml的uni-cumps = "unilab.training.cuda_mps_cli:main"。生命周期 owner:
src/unilab/training/cuda_mps_cli.py。训练 probe contract:
src/unilab/training/cuda_process_sharing.py保持不变。Shell completion:
src/unilab/cli_completion.py提供cuda/mps与子命令补全。测试:
tests/training/test_cuda_mps_cli.py使用 fake nvidia-smi、control daemon、 process table 与 record 目录覆盖权限、stale、并发和 fail-closed 场景。
Alternatives Considered¶
继续要求用户手写 shell 生命周期:无法统一安全 stop authority 和 future topology。
由 trainer 自动启动/停止 daemon:维持 ADR-0013 拒绝理由,训练进程无法安全拥有 shared host service,并被并发/多用户运行放大。
引入
cuda_process_sharing: auto:没有可靠 host policy,且会破坏显式请求与 fail-closed 语义。
Consequences¶
CLI 可以启动/停止 daemon,但这是显式用户操作,不是训练请求的隐式副作用。
没有 record、record scope 不匹配、或 PID/start-time 不再匹配时不能 stop。
stale record 会被 quarantine/清理,但不能仅凭 pipe 路径 attach 到 unmanaged daemon。
single_task_multi_gpu与task_per_gpu只是 contract 形状,不构成支持声明; 相关启用继续由 discussion #2063、roadmap #1672 与后续 lease/DP gate 决策。该 CLI 不修改 SM percentage、OS affinity 或 memory limit,也不声明 multi-node 支持。
Evidence In Repo¶
pyproject.tomlsrc/unilab/training/cuda_mps_cli.pysrc/unilab/training/cuda_process_sharing.pysrc/unilab/cli_completion.pytests/training/test_cuda_mps_cli.pytests/test_completion.pydocs/sphinx/source/en/2-user_guide/1-training/7-tensor_runtime_production.mddocs/sphinx/source/zh_CN/2-user_guide/1-training/7-tensor_runtime_production.md