🧠 第二章 能力培养
📄 一句话概括

训练一个模型,桌面上要摆四样东西:数据、代码、产物、日志。 Demo 在本机真建了这四个目录,真写了一个 45 字节的模型文件,真起了子进程,还量了磁盘: 剩余 247.1 GB(共 322.1 GB)。

📝 本节和前面几节的关系

第一章说这个岗位动的是「数据、指标、验收标准」。 这一节从最基础的那一层开始:这些东西到底放在哪。

一、四样东西,不是四种习惯

data 放原始数据与标注,code 放训练脚本,out 放模型与结果,log 放运行记录。 四个目录分开,是为了能复现。 出问题时按这四个方向查:数据是不是这一版、代码是不是这个人改的、产物落在哪、这次跑的日志在哪。 缺一样,排查就变成猜。 Demo 在本机的临时目录里真建了这四个目录,往 out 里写了一个 JSON:里面有模型名、参数量 171、 准确率 0.833,一共 45 字节。 45 字节当然不是真模型,但它演示了一件重要的事:产物的体积是可以量的。 真模型动辄几百 MB,磁盘和传输都要提前算。

二、环境和路径

这台机器的解释器是 Python 3.13.14, 装在虚拟环境里(sys.prefix 和 sys.base_prefix 不一样)。 PATH 有 27 条,sys.path 只有 11 条——两者不是一个东西: 前者管「敲命令时去哪找可执行文件」,后者管「import 时去哪找模块」。 PATH 的第一条是 'D',看起来像某个环境变量被截断了。 这种事在别人的机器上很常见,也是「在我这儿能跑」的典型原因。 所以接手项目第一件事不是看代码,是看环境:Python 版本多少、包装在哪、 PATH 里有没有奇怪的东西。这三样对不上,代码再对也跑不起来。

三、还要会起子进程

训练脚本很少单独跑:要调数据预处理、要起评估、要并行跑多组参数。这些都靠「起一个子进程」。 Demo 真起了一个子进程算 6×7,拿回 42 和返回码 0。 看着没用,但它是自动化的最小单元——所有批量跑参数的东西都建在这上面。 这一节的内容看着琐碎,但它是后面所有章节的前提:不会建目录、不会看环境、不会起进程, 后面每一个 Demo 都跑不起来。

四、动手 Demo:真建四个目录,真写一个模型文件

读本机的解释器版本、PATH 与 sys.path 的条目数、包装在哪、是不是虚拟环境; 然后在临时目录里真建四个目录、写一个 JSON、量磁盘剩余,最后起一个子进程算一道算术题。

four = [(u'data', u'原始数据与标注'), (u'code', u'训练脚本'),
        (u'out', u'模型与日志'), (u'log', u'运行记录')]
for name, why in four:
    os.makedirs(os.path.join(root, name), exist_ok=True)

r = subprocess.run([sys.executable, u'-c', u'print(6*7)'],
                   capture_output=True, text=True)

实跑输出:

--------------------------------------------------------------------
训练一个模型,桌面上要摆四样东西
--------------------------------------------------------------------
  解释器                   3.13.14  C:\Users\admin\.workbuddy\binaries\python\envs\default\Scripts\python.exe
  平台                     win32
  PATH 条目数              27 条
  前三条约多少字           124 字(第一条是 'D',看着像被截断的环境变量)
  sys.path 条数            11 条(比 PATH 少,因为它只管模块)
  装包的位置               C:\Users\admin\.workbuddy\binaries\python\envs\default\Lib\site-packages
  在虚拟环境里吗           是

  /data                    原始数据与标注,已建,写入 0 字节
  /code                    训练脚本,已建,写入 0 字节
  /out                     模型与日志,已建,写入 45 字节
  /log                     运行记录,已建,写入 0 字节

  四样东西之外还要什么     一个能复现的环境(Python 版本 + 包版本)
  这次写出的模型文件       45 字节
  磁盘剩余                 247.1 GB(共 322.1 GB)

  起子进程算 6×7           42(返回码 0)

  这四样东西不是为了整齐,是为了「能复现」:
  数据在哪、代码是哪一版、模型存哪儿、这次跑的日志在哪。缺一样,出问题就查不动。
  训练师接手别人的项目,第一件事就是把这四个目录对上号。

输出里 PATH 27 条、sys.path 11 条。 差这么多是因为 PATH 里还有一堆可执行文件目录,它们跟 import 无关。 PATH 第一条是 'D'——这不是我写错,是本机环境里真的有一个这样的条目。 它说明「环境变量被谁改坏了」这种事很常见,而且不容易发现。 四个目录都建成功了,/out 写进 45 字节。磁盘剩余 247.1 GB,共 322.1 GB。 子进程那一步返回 42、返回码 0。真实训练里这个位置换成一个跑 8 小时的训练脚本,用法一模一样。

30 秒实验

  1. 在你自己的电脑上找出 PATH 里最长的那一条,看它指向什么。
  2. 在项目里建这四个目录,把一次跑的结果按四类放进去。
  3. 想一想:为什么日志要单独一个目录,不跟模型放一起?

常见误区

  1. 「代码能跑就行,目录无所谓」——出问题时找不到日志,等于没有日志。
  2. 「我电脑上能跑」——PATH 和包版本一变就跑不了。
  3. 「模型文件不大,随便放」——真模型几百 MB,磁盘和传输都要提前算。
自测三问(点开对答案) 1. 训练项目要摆哪四样东西? —— 数据、代码、产物、日志,分四个目录放。 2. `PATH` 和 `sys.path` 的区别是什么? —— 前者找可执行文件,后者找 import 的模块。 3. 为什么接手项目先看环境? —— 版本、包位置、PATH 对不上,代码再对也跑不起来。

环境准备好,下一步是数学——先从最常用的一步「拟合一条直线」开始。

相关笔记