【问题标题】:pytorch recover from RuntimeError: CUDA error: device-side assert triggered without restarting scriptpytorch 从 RuntimeError 恢复:CUDA 错误:设备端断言触发而无需重新启动脚本
【发布时间】:2020-03-27 09:48:00
【问题描述】:

我想每个使用过 Pytorch 的人都知道这个错误
RuntimeError: CUDA error: device-side assert triggered
在某种程度上。
我在脚本中使用 GPU 代码生成了大量数据(200k+ 长向量),所以需要一段时间。 我通过生成器分批执行此操作,因为我没有内存来一次将所有向量存储在我的 GPU 中。生成器的结构如下:

    for i in range(0, len(inputs), batch_size):
        try:
            <generate the vectors>
            yield 1, <the vectors>  # Here it was successful
        except RuntimeError:
            print(f'could not generate vectors {index} to {index + batch_size}')
            yield 0, (i, i+ batch_size)  # Here the input was malformed

我知道某些输入格式错误,以至于从中生成向量会失败并出现运行时错误,这很好,它甚至不到我数据集的 1%。我想获取索引并稍后处理它。

这是我的问题
一旦向量创建失败,GPU 基本上就会被阻塞,并将响应所有带有上述错误的请求。预先验证所有输入会很麻烦而且很慢。我不想这样做。我想滚动所有格式错误的输入并稍后处理。

我的问题是
如何尽可能轻松快速地从这种砖块状态中恢复 GPU?到目前为止,我发现的所有问题都涉及修复潜在错误,我不需要这样做。我只想继续从我的数据集中生成向量。

【问题讨论】:

    标签: python pytorch


    【解决方案1】:

    一种方法可能是通过生成的输入向量记录您的进度,并在 GPU 变砖时重新启动进程/机器。如果错误输入的百分比足够小,那么重置 GPU/机器的成本可能可以忽略不计。你可以有一个定期的工作来检查你是否完成了工作,如果没有完成就重新开始。这是解决此问题的一种粗略方法,但它应该可以工作。

    例如:

    for i in range(0, len(inputs), batch_size):
        try:
            exist = check_if_current_index_has_succeded_or_failed()
            if exist:
                continue
            else:
                log_current_index()
            <generate the vectors>
            log_success()
            yield 1, <the vectors>  # Here it was successful
        except RuntimeError:
            log_failure()
            print(f'could not generate vectors {index} to {index + batch_size}')
            yield 0, (i, i+ batch_size)  # Here the input was malformed
    

    【讨论】:

    • 嗨。由于我无法为手头的问题找到更好的解决方案,因此我最终做了类似的事情。在使用 GPU 时遇到错误后,我的脚本将保存其当前状态并在正确的位置重新启动。这是一种解决方法,没有解决方案,但至少它是有效的。
    猜你喜欢
    • 1970-01-01
    • 2019-04-15
    • 2021-09-10
    • 2019-01-12
    • 2020-02-03
    • 2019-09-10
    • 2021-10-14
    • 1970-01-01
    • 2020-04-07
    相关资源
    最近更新 更多