1. 区分屏幕混淆的四种状态
一个已打开的连接只能证明你还能与机器通信。一个可见的终端可能承载着一个计算早已结束的 shell。反过来,连接断开也不能断定进程已经停止。因此,首先要为这次运行以及在哪里能找到它的记录起一个名字。
分别跟踪进程是否存在、它的业务进展以及结果是否被接受。日志中的行数并不等于成功数据的计数器:程序可能重复输出同一条警告。部分输出可能可读,但并不完整。
此方法假定您已收到并验证了所需的访问方式。它既不承诺特定的访问协议,也不承诺自动保留文件。可用工具和目标必须在实际提供的环境中确认。
左右滚动表格即可查看所有列。| 观察 | 它所表明的 | 它无法证明的 |
|---|---|---|
| 连接处于活动状态 | 通道有响应。 | 计算有进展。 |
| 进程存在 | 仍有执行实例存在。 | 它处理正确的元素。 |
| 计数器已验证上升 | 计划单元已完成。 | 整个语料库已完成。 |
| 返回码等于零 | 程序声明正常终止。 | 结果符合您的合约约定。 |
| 受控且可回收的输出 | 所选标准均已验证。 | 质量超出这些标准。 |
2. 在脱离运行前准备一次可识别的执行
掌控数据、实际配置以及应用的首次短程运行。GPU 诊断回答的是另一个问题:后端能否执行计算?它不会验证整个语料库是否完整加载,也不验证你程序的逻辑。在启动长时间运行之前,请先完成这些检查。
选择一个运行标识符和一个全新的文件夹。保留不含密钥的命令、代码版本、输入的身份信息以及预期结果。预先确定日志写入位置和文件取回位置。两次启动不得同时写入同一个文件夹。
对于拆分为独立分区的工作,要明确一个分区何时算完成:计算结束、文件关闭、内容已校验且状态已记录。正在写入的文件不应与被接受的结果具有相同含义。出发前还要核实实际可用的空间。
3. 在上下文允许时保持终端可找回
如果环境提供 Unix shell 和 tmux,这个多路复用器可以让你分离终端,并在重新连接后恢复它。它保护这一过程免受连接客户端丢失的影响;但它不是机器重启或进程被销毁后的恢复机制。
以下命令仅用于教学,不会被执行。它们假设你使用 Bash、tmux 和你自己的程序 traitement.py,并使用所示的选项;该文件不是随附资源。请先确认它的简短命令,并使用不同的会话名称,以免混淆两个计算任务。
创建会话,然后在其中运行第二个代码块。如果目录已存在,创建会失败,从而避免在不知不觉中复用它已有的日志。如果 shell 执行到写入步骤,返回码会被保留;突然终止可能导致该文件无法创建。因此,返回码缺失并不等于隐含成功。
使用默认快捷键时,按 Ctrl-b 再按 d 进行分离。重新连接后,列出所有会话,然后重新连接到正确的那个。程序已经结束时,shell 可能仍然可见:请查看日志和已保存的返回码。不要因为旧终端消失了就立刻启动第二份副本。
tmux new -s campagne-amkdir -p runs
mkdir runs/campagne-a && (
code_retour=0
python -u traitement.py --config config.toml --output runs/campagne-a \
> runs/campagne-a/execution.log 2>&1 || code_retour=$?
printf '%s\n' "$code_retour" > runs/campagne-a/exit-code.txt
exit "$code_retour"
)tmux ls
tmux attach -t campagne-a4. 统计已接受的工作量,而不仅仅是活动
Python 的 -u 选项会取消标准输出和标准错误缓冲。它有助于看到已发出的消息,但不会在应用中创建进度事件。某个库或某个静默步骤可能仍需要专门观测。
定义清晰的阶段:读取、准备、计算、写入、校验。添加一个单位稳定的计数器,并在已知总量时一并给出。如果你统计的是已接受的分区,就不要在日志中途换成统计已读行数,除非同时更名。
下面的教学示例涉及八个分区、每个五百个元素,共四千个元素。在所示时刻,只有五个分区被接受。第六个是部分完成的,不应计入总数。这些数字仅说明计数规则;它们不描述任何 Kernodeck 的实际运行。
左右滚动表格即可查看所有列。| 分区 | 状态 | 计为已接受的元素 | 决定 |
|---|---|---|---|
| 1 至 5 | 已校验 | 2 500 | 保留它们的标识和结果。 |
| 6 | 写入不完整 | 0 | 不要宣布该分区已完成。 |
| 7 和 8 | 待处理 | 0 | 保留在工作列表中。 |
| 整体 | 不完整 | 4000 中的 2500 | 不要接受最终结果集。 |
5. 检查静默或中断情况,且不创建重复项
当没有任何计数器变化时,确定最后已知的阶段及其最后完成的单位。检查进程是否仍存在、是否出现错误消息,以及目标位置是否仍可用。模型启动缓慢和循环卡死可能呈现同样的静止画面;具体情境决定下一步该检查什么。
在你的应用中准备好主动停止:请求停止、完成一个安全的单位、保存状态,然后退出。信号和中断取决于系统。Python 无法拦截 SIGKILL,而 Python 处理函数可能要先等一个长时间的原生调用结束才会执行。因此,停止时保存并不能替代定期保存。
连接丢失后,先找回已有的会话和运行。确认停止后,判断哪些是完整的、哪些是部分的。对于训练,恢复需要模型和优化器的详细状态;专门的指南会在新进程中验证这种情况。
6. 只恢复合约允许的部分
在我们的示例中,按分区重试假设每个分区都是独立的,并且输入、代码和配置保持不变。它可以保留五个已验证的结果,并在继续处理之后的两个分区之前,完全重新计算第六个分区。如果这些假设不成立,这种捷径就缺乏依据。
不要只是把新行追加到部分文件中。否则你可能产生重复项,或把两种配置混在一起。请使用预期的标识符来区分完整、不完整和缺失。将旧状态作为说明材料保留,并为新的尝试设置单独的目标位置。
在依赖某种策略处理大型任务之前,先通过一次受控中断来验证它。判断标准是按你的约定,有用的输出是否等价,而不是进度消息是否完全一致。训练、带外部副作用的计算以及分布式处理,需要比这个独立分区示例更强的保证。
7. 在结束工作之前接收并取回结果
先从返回码入手,再将输出与输入清单进行核对。对于我们的示例,应等待预期的八个分区和四千个标识符,既不缺失也不重复。检查格式、维度和相关取值;能读出一个文件并不证明它包含正确的结果。
取回已接受的输出、已授权的配置、各版本以及校验报告。比较文件大小,必要时比较源与副本之间的哈希值。哈希值相同有助于验证字节传输是否完整;但它既不能证明模型质量,也不能证明文件来源合法。
最后,用将要使用该结果的工具,从其保存目标位置打开一个结果。请在你对计算资源的访问结束之前安排这一步。工作完成于受检结果可被取回并可被解读之时,而不是最后一个百分比达到一百之时。