首页 > 解决方案 > 我可以通过编程来避免 GPU 内存错误吗?像 cuMemAlloc 导致 CUDA_ERROR_LAUNCH_FAILED

问题描述

我正在对我的 GPU Nvidia 视频卡进行一些有趣的测试。设置一个在英特尔 CPU 上执行操作的好程序,然后通过在 GPU 上对它们进行矢量化来执行它们。这很酷,因为当我使用 GPU 时,我的速度提高了大约 80 倍。然而,通过一些简单的程序,我已经能够打破内存限制,而我的一个程序破坏了内核。

import tensorflow as tf
import numpy as np
from timeit import default_timer as timer
from numba import vectorize
import gc
@vectorize(['float32(float32, float32)'], target='cuda')
def loopGPU(vStart, vEnd):
    vPosition=vStart
    vOriginal=vStart
    for vStart in range(vEnd):
        vPosition=vPosition+1
    print('Counted from: ', vOriginal, ' to: ', vEnd, ' by: 1 ' )
    return(vPosition)
def loop2aTrillion(vStart, vEnd):
    start = timer()
    vNewStart=loopGPU(vStart, vEnd)
    duration = timer() - start
    print('GPU Loop Time',duration)

loop2aTrillion(1,100000000) 从:1.000000 计数到:100000000.000000 由:1 GPU 循环时间 3.7991681657728336

所以它对 1 亿左右的效果很好。但是如果我达到 10 亿甚至 5 亿 .. 我从 CUDA 得到这个惊人的错误

看我的尝试,看看断点在哪里..

LOOP2ATRILLIL(1,100)从:1.000000到:100.000000 by:1 GPU LOOP时间0.10281342493556167 LOOP2ATRILL(1,1000000)从:1.0000000000000000000000000000000000000000000000000000000000000000000000000000000000千万(1,1000000)计数:1 GPU LOOP TIME TIME TIME TIME TIME TIME TIME TIME TIME TIME TIME TIME TIME TIME TIME TIME TIME TIME TIME TIMET 100000000.000000 bou:1 GPU循环时间3.7804056272377693 LOOP2ATRILLIN(1,100000000000000000000000000000000000000000000000000000000000000000000000000来体计数)从:1.000000到:100000000.000000 by:1 GPU Loop Time 3.797257584627573 loop loop loop loop loop loop loop loop loop loop loop loop loop(10000 000 000 000,000,000,000,00000000000000000000000000000000文件“”,第 3 行,在 loop2aTrillion 文件“D:\Anaconda\envs\tensorflow\lib\site-packages\numba\cuda\dispatcher.py”,第 88 行,调用中 返回 CUDAUFuncMechanism.call(self.functions, args, kws) 文件“D:\Anaconda\envs\tensorflow\lib\site-packages\numba\npyufunc\deviceufunc.py”,第 311 行,在调用中返回 devout.copy_to_host() .reshape(outshape) 文件 "D:\Anaconda\envs\tensorflow\lib\site-packages\numba\cuda\cudadrv\devices.py",第 212 行,在 _require_cuda_context return fn(*args, **kws) 文件" D:\Anaconda\envs\tensorflow\lib\site-packages\numba\cuda\cudadrv\devicearray.py”,第 252 行,在 copy_to_host _driver.device_to_host(hostary, self, self.alloc_size, stream=stream) 文件“D :\Anaconda\envs\tensorflow\lib\site-packages\numba\cuda\cudadrv\driver.py”,第 1776 行,在 device_to_host fn(host_pointer(dst), device_pointer(src), size, *varargs) 文件“D :\Anaconda\envs\tensorflow\lib\site-packages\numba\cuda\cudadrv\driver.py”,第 288 行,在 safe_cuda_api_call self._check_error(fname, retcode) 文件“D:\Anaconda\envs\tensorflow\lib\ site-packages\numba\cuda\cudadrv\driver.py",第 323 行,在 _check_error 中引发 CudaAPIError(retcode, msg) numba.cuda.cudadrv.driver.CudaAPIError: [719] 调用 cuMemcpyDtoH 导致 CUDA_ERROR_LAUNCH_FAILED

这个错误的有趣之处在于内核是垃圾,我必须重新开始......“它必须被摧毁”爱它!!!!

CUDA_ERROR_LAUNCH_FAILED 执行内核时设备发生异常。常见原因包括取消引用无效的设备指针和访问越界共享内存。上下文不能被使用,所以它必须被销毁(并且应该创建一个新的)。此上下文中的所有现有设备内存分配都是无效的,如果程序要继续使用 CUDA,则必须重新构建。

好的,现在你知道我的背景了。这是我的问题。1.我现在怎么办多少太多了(离线)?是否有某种类型的 python 数学或库可以很好地了解我在交互时的记忆力?

  1. 我可以“在线”检查这种情况吗?因此,在我调用矢量化函数之前,如果我要炸毁内存并破坏我的内核,我可以估计实时吗?或者我可以在向量化过程中执行它并对内存分配有更多的控制或洞察力吗?

  2. Try / Exception 块会救我吗?或者是 CUDA 中的内存分配太深,一旦爆炸,它就消失了,pythong 包装器无法保存内核..“它必须被销毁”......

谢谢,正如您所看到的,只是试图推动我可以在这些 GPU 上运行多少计算..

标签: pythontensorflowmemory-managementcudaanaconda

解决方案


推荐阅读