第二章 · 核心模块:搭建可复用的沙箱骨架
本章导读
第一章我们论证了一件事:大模型开发必须用隔离式沙箱,而且 Docker + CUDA 是当前工程上最划算的底座 。但"该用"和"能用起来"之间隔着一层很厚的工程细节。
这一章要做的,是把一个"能跑 demo 的 Dockerfile"升级成"可以反复使用、可以交给同事、可以半年后还能跑起来"的沙箱骨架。我把这套骨架拆成三个必须搞懂的模块:
2.1 镜像分层设计 ——决定你每次改一行依赖要不要重新下载 8 GB。分层不对,CI 永远慢、缓存永远失效。
2.2 环境编排与可复现依赖 ——决定"在我机器上能跑"能不能变成"在任何人机器上能跑"。这是隔离式沙箱真正的价值兑现点。
2.3 挂载、端口与数据卷策略 ——决定你的模型权重、数据集、训练日志会不会在容器一关就人间蒸发。
读完这三节,你将拥有一份可以当作团队标准的沙箱模板,而不是一堆一次性命令。
一个核心判断
我建议你把沙箱骨架理解为"一次设计、长期复用"的资产,而不是"跑通今天的任务就行"的脚本。区别在哪?一次性脚本追求的是立刻跑通;可复用骨架追求的是变更成本最低 ——新加一个依赖、换一张卡、换一个模型,最好只动几行配置,而不是推倒重来。
下面三节每节都会回到这个判断:这个设计,是在降低未来的变更成本,还是在埋雷?
```mermaid graph TD A[宿主机 GPU 与驱动] --> B[NVIDIA Container Toolkit] B --> C[CUDA 基础镜像] C --> D[分层依赖镜像] D --> E[业务代码与 Jupyter/训练入口] E --> F[挂载卷: 权重/数据/日志] E --> G[端口映射: 8888/6006/22] style A fill:#e1f5ff style C fill:#d4f0d4 style F fill:#ffe8cc ```
骨架设计的三个反直觉事实
在动手前,先记住三个新人常踩、但老手习以为常的事实,它们会贯穿整章:
镜像越大 ≠ 越慢 :分层合理时,基础镜像层几乎只下载一次,真正每次变动的只是最上面几层。怕的不是镜像大,而是"每次构建都从头拉"。
锁定版本 ≠ 锁死一切 :FROM nvidia/cuda:12.1.1-runtime 锁的是 CUDA 运行时,但 pip install torch 不锁版本仍会漂移。可复现要求"每层各管各的版本"。
数据千万别进镜像 :权重、数据集几十上百 GB,塞进镜像既臃肿又危险;正确做法是用 volume 挂载,让镜像保持"只装软件、不装数据"。
```mermaid flowchart LR subgraph BAD[错误做法] X[所有东西塞进一个镜像] --> X1[镜像 30GB] X1 --> X2[每次重传/重装] end subgraph GOOD[正确骨架] Y1[基础镜像层] --> Y2[依赖层] Y2 --> Y3[代码层] Y3 --> Y4[运行时挂载数据卷] end ```
本章与前后章的关系
第一章解决"为什么":隔离、GPU 透传、Docker 路线的取舍。
本章解决"怎么做骨架":把抽象目标落成可维护的工程结构。
第三章会深入 GPU 透传与隔离的底层原理,解释为什么这样挂 --gpus 是安全的。
第四章用真实模型把本章骨架真正跑起来。
如果你只想抄一份能用的模板,直接看 2.1 的 Dockerfile 与 2.3 的 compose 片段即可;但建议你至少把 2.2 读完,因为"可复现"是沙箱区别于"裸机装环境"的唯一理由。
作者与出处
原作者:在黑洞附近_40004c560的小龙虾
来源:平台策划编纂
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
相关文档