为您的项目提供 GPU · 无 KYC 的加密货币支付 如何租用
简体中文
打开控制台
实用指南 / KERNODECK

进程结束并不等于结果被接受。

在长时间处理之前,先确定其输入、目标位置、进度事件和成功标准。如果你有远程 shell,请将连接会话与计算进程分离。结束时,先检查返回码,再检查结果本身:一条没有报错的命令既不能证明所有数据都已处理,也不能证明输出可用。

2 分钟阅读 · 开发者指南

1. 区分屏幕混淆的四种状态

一个已打开的连接只能证明你还能与机器通信。一个可见的终端可能承载着一个计算早已结束的 shell。反过来,连接断开也不能断定进程已经停止。因此,首先要为这次运行以及在哪里能找到它的记录起一个名字。

分别跟踪进程是否存在、它的业务进展以及结果是否被接受。日志中的行数并不等于成功数据的计数器:程序可能重复输出同一条警告。部分输出可能可读,但并不完整。

此方法假定您已收到并验证了所需的访问方式。它既不承诺特定的访问协议,也不承诺自动保留文件。可用工具和目标必须在实际提供的环境中确认。

左右滚动表格即可查看所有列。
每种观察回答的是不同的问题。
观察它所表明的它无法证明的
连接处于活动状态通道有响应。计算有进展。
进程存在仍有执行实例存在。它处理正确的元素。
计数器已验证上升计划单元已完成。整个语料库已完成。
返回码等于零程序声明正常终止。结果符合您的合约约定。
受控且可回收的输出所选标准均已验证。质量超出这些标准。

2. 在脱离运行前准备一次可识别的执行

掌控数据、实际配置以及应用的首次短程运行。GPU 诊断回答的是另一个问题:后端能否执行计算?它不会验证整个语料库是否完整加载,也不验证你程序的逻辑。在启动长时间运行之前,请先完成这些检查。

选择一个运行标识符和一个全新的文件夹。保留不含密钥的命令、代码版本、输入的身份信息以及预期结果。预先确定日志写入位置和文件取回位置。两次启动不得同时写入同一个文件夹。

对于拆分为独立分区的工作,要明确一个分区何时算完成:计算结束、文件关闭、内容已校验且状态已记录。正在写入的文件不应与被接受的结果具有相同含义。出发前还要核实实际可用的空间。

3. 在上下文允许时保持终端可找回

如果环境提供 Unix shell 和 tmux,这个多路复用器可以让你分离终端,并在重新连接后恢复它。它保护这一过程免受连接客户端丢失的影响;但它不是机器重启或进程被销毁后的恢复机制。

以下命令仅用于教学,不会被执行。它们假设你使用 Bash、tmux 和你自己的程序 traitement.py,并使用所示的选项;该文件不是随附资源。请先确认它的简短命令,并使用不同的会话名称,以免混淆两个计算任务。

创建会话,然后在其中运行第二个代码块。如果目录已存在,创建会失败,从而避免在不知不觉中复用它已有的日志。如果 shell 执行到写入步骤,返回码会被保留;突然终止可能导致该文件无法创建。因此,返回码缺失并不等于隐含成功。

使用默认快捷键时,按 Ctrl-b 再按 d 进行分离。重新连接后,列出所有会话,然后重新连接到正确的那个。程序已经结束时,shell 可能仍然可见:请查看日志和已保存的返回码。不要因为旧终端消失了就立刻启动第二份副本。

创建会话 — 教学命令
tmux new -s campagne-a
会话内 — 示例,需自行调整,不执行
mkdir -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-a

4. 统计已接受的工作量,而不仅仅是活动

Python 的 -u 选项会取消标准输出和标准错误缓冲。它有助于看到已发出的消息,但不会在应用中创建进度事件。某个库或某个静默步骤可能仍需要专门观测。

定义清晰的阶段:读取、准备、计算、写入、校验。添加一个单位稳定的计数器,并在已知总量时一并给出。如果你统计的是已接受的分区,就不要在日志中途换成统计已读行数,除非同时更名。

下面的教学示例涉及八个分区、每个五百个元素,共四千个元素。在所示时刻,只有五个分区被接受。第六个是部分完成的,不应计入总数。这些数字仅说明计数规则;它们不描述任何 Kernodeck 的实际运行。

左右滚动表格即可查看所有列。
未执行的教学快照:八个分区中有五个已接受。
分区状态计为已接受的元素决定
1 至 5已校验2 500保留它们的标识和结果。
6写入不完整0不要宣布该分区已完成。
7 和 8待处理0保留在工作列表中。
整体不完整4000 中的 2500不要接受最终结果集。

5. 检查静默或中断情况,且不创建重复项

当没有任何计数器变化时,确定最后已知的阶段及其最后完成的单位。检查进程是否仍存在、是否出现错误消息,以及目标位置是否仍可用。模型启动缓慢和循环卡死可能呈现同样的静止画面;具体情境决定下一步该检查什么。

在你的应用中准备好主动停止:请求停止、完成一个安全的单位、保存状态,然后退出。信号和中断取决于系统。Python 无法拦截 SIGKILL,而 Python 处理函数可能要先等一个长时间的原生调用结束才会执行。因此,停止时保存并不能替代定期保存。

连接丢失后,先找回已有的会话和运行。确认停止后,判断哪些是完整的、哪些是部分的。对于训练,恢复需要模型和优化器的详细状态;专门的指南会在新进程中验证这种情况。

6. 只恢复合约允许的部分

在我们的示例中,按分区重试假设每个分区都是独立的,并且输入、代码和配置保持不变。它可以保留五个已验证的结果,并在继续处理之后的两个分区之前,完全重新计算第六个分区。如果这些假设不成立,这种捷径就缺乏依据。

不要只是把新行追加到部分文件中。否则你可能产生重复项,或把两种配置混在一起。请使用预期的标识符来区分完整、不完整和缺失。将旧状态作为说明材料保留,并为新的尝试设置单独的目标位置。

在依赖某种策略处理大型任务之前,先通过一次受控中断来验证它。判断标准是按你的约定,有用的输出是否等价,而不是进度消息是否完全一致。训练、带外部副作用的计算以及分布式处理,需要比这个独立分区示例更强的保证。

7. 在结束工作之前接收并取回结果

先从返回码入手,再将输出与输入清单进行核对。对于我们的示例,应等待预期的八个分区和四千个标识符,既不缺失也不重复。检查格式、维度和相关取值;能读出一个文件并不证明它包含正确的结果。

取回已接受的输出、已授权的配置、各版本以及校验报告。比较文件大小,必要时比较源与副本之间的哈希值。哈希值相同有助于验证字节传输是否完整;但它既不能证明模型质量,也不能证明文件来源合法。

最后,用将要使用该结果的工具,从其保存目标位置打开一个结果。请在你对计算资源的访问结束之前安排这一步。工作完成于受检结果可被取回并可被解读之时,而不是最后一个百分比达到一百之时。

您的疑问

关闭远程连接是否总会停止计算?

不一定:这取决于进程是以何种方式启动的。如果可用,tmux 会话可以让进程与客户端终端分离。重新连接后,应先查找已有的执行实例,再启动新的执行。

返回码等于零就足以验证我的结果吗?

不能。它只表示程序宣称正常终止。你还需要检查标识符是否齐全、格式以及预期的业务标准。程序可能在处理了一个错误的子集之后仍然正常终止。

日志长时间不动,是否意味着 GPU 卡住了?

不一定。程序可能正在准备数据、等待写入,或根本不输出进度信息。在做决定停止之前,先确认阶段和进程状态。一个明确的业务计数器比仅仅有日志消息更有用。