速查·1.X 环境与隔离基础 FAQ 补遗(一)


文档摘要

速查·1.X 环境与隔离基础 FAQ 补遗(一) 正文 1.4 已经扫清了入门七问。本条是环境与隔离基础的补充 FAQ:问题更碎、更接近日常使用时随口一问的粒度,按需取用。 Q1:容器里 nvidia-smi 显示的驱动版本,和宿主机是什么关系? 容器里不装驱动,显示的就是宿主机的驱动(由 NVIDIA Container Toolkit 注入)。容器里的 CUDA 版本来自镜像,它只受驱动支持能力的约束——驱动 535 可以跑 CUDA 12.2 及以下的镜像,跑不了 12.3。判断兼容性记住一条:容器内镜像的 CUDA 版本 ≤ 宿主机驱动支持的最高 CUDA 版本。 Q2:WSL2 里能跑这套吗?和原生 Linux 差在哪? 能跑。

速查·1.X 环境与隔离基础 FAQ 补遗(一)

正文 1.4 已经扫清了入门七问。本条是环境与隔离基础的补充 FAQ:问题更碎、更接近日常使用时随口一问的粒度,按需取用。

Q1:容器里 nvidia-smi 显示的驱动版本,和宿主机是什么关系?

容器里不装驱动,显示的就是宿主机的驱动(由 NVIDIA Container Toolkit 注入)。容器里的 CUDA 版本来自镜像,它只受驱动支持能力的约束——驱动 535 可以跑 CUDA 12.2 及以下的镜像,跑不了 12.3。判断兼容性记住一条:容器内镜像的 CUDA 版本 ≤ 宿主机驱动支持的最高 CUDA 版本。

Q2:WSL2 里能跑这套吗?和原生 Linux 差在哪?

能跑。WSL2 支持 GPU 直通,nvidia-smi 在 WSL2 内正常,Docker Desktop 或 WSL2 内原生安装的 Docker 都可以用 --gpus。差别有三点:① /mnt/c 下的文件 IO 慢一个量级,数据和代码应放在 WSL2 自己的文件系统(~/);② 部分 IPC 与共享内存行为有差异,跑多卡 NCCL 前建议先验证;③ 生产环境仍以原生 Linux 为准,WSL2 的定位是开发环境。

Q3:已经有 conda/venv 了,还要容器干嘛?

两者隔离的层次不同。conda/venv 只隔离 Python 包;容器隔离的是整个用户态——系统库(glibc、CUDA Toolkit、cuDNN 以及 apt 装的一切)+ 文件系统 + 运行环境。"torch 扩展在别人机器上装不上"这类崩溃,根因往往不在 pip,在系统库版本。conda 管 Python 层,容器管整层,二者不冲突(容器里照样可用 conda),但别指望 conda 替代容器。

Q4:容器能直接用宿主机上的数据集和权重吗?

能,用 bind mount:docker run -v /data/datasets:/datasets ...。注意两点:① 容器内进程默认以 root 跑,写入挂载目录的文件属主会变成 root,宿主机上反而"改不动"——用 --user $(id -u):$(id -g) 保持 UID 一致;② 挂载路径的性能取决于底层文件系统,原生 ext4 接近直读,NFS/网络盘要先测吞吐再上训练。

Q5:为什么文档里总见 --ipc=host 或 --shm-size=8g?

容器默认的共享内存(/dev/shm)只有 64MB。PyTorch DataLoader 的 worker 用共享内存传数据,NCCL 通信也依赖它——默认值一超,轻则报 "DataLoader worker exited unexpectedly",重则多卡训练直接 bus error。两条路:--shm-size=8g 只调大小;--ipc=host 直接共享宿主机 IPC,多卡训练常用。

Q6:套一层容器,GPU 性能会损失吗?

GPU 计算本身几乎零损耗——透传的是设备文件,不经过任何模拟。真正的开销在:① 文件 IO(尤其是挂载网络盘时);② 频繁的 docker exec、日志读写等辅助操作。同一任务容器内外跑 benchmark,吞吐差距通常在 1~3% 以内;如果差距大,先查挂载方式和数据加载,别急着怪容器。

Q7:想进容器调试,是不是得装 SSH?

不要。docker exec -it <容器> bash 就是容器内的"登录",在 Dockerfile 里装 sshd 只会平添攻击面。唯一例外是容器跑在远程机器上、需要他人从外部直接访问——那也应该走宿主机做跳板,而不是在容器里开 22 端口。

Q8:docker stop 之后显存会释放吗?

正常会:容器主进程退出,其占用的显存随之释放。例外是进程变成僵尸或驱动状态残留——nvidia-smi 里还能看到进程时,在宿主机上用 fuser -v /dev/nvidia* 找到 PID 杀掉即可。养成习惯:训练结束先确认 nvidia-smi 干净再收工。

详细原理见正文第一章 1.1~1.3 与第三章 3.1「NVIDIA Container Runtime 的调用链剖析」。


作者与出处
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 焊死在电路板上的小王的小龙虾 转发
评论区 (0)
U