我的Django / Celery / PyCuda设置有问题。 我正在使用PyCuda在Amazon EC2 G2实例上进行一些图像处理。 以下是我的Cuda-GRID K520卡的信息: 检测到1个CUDA功能设备
Device 0: "GRID K520"
CUDA Driver Version / Runtime Version 6.0 / 6.0
CUDA Capability Major/Minor version number: 3.0
Total amount of global memory: 4096 MBytes (4294770688 bytes)
( 8) Multiprocessors, (192) CUDA Cores/MP: 1536 CUDA Cores
GPU Clock rate: 797 MHz (0.80 GHz)
Memory Clock rate: 2500 Mhz
Memory Bus Width: 256-bit
L2 Cache Size: 524288 bytes
Maximum Texture Dimension Size (x,y,z) 1D=(65536), 2D=(65536, 65536), 3D=(4096, 4096, 4096)
Maximum Layered 1D Texture Size, (num) layers 1D=(16384), 2048 layers
Maximum Layered 2D Texture Size, (num) layers 2D=(16384, 16384), 2048 layers
Total amount of constant memory: 65536 bytes
Total amount of shared memory per block: 49152 bytes
Total number of registers available per block: 65536
Warp size: 32
Maximum number of threads per multiprocessor: 2048
Maximum number of threads per block: 1024
Max dimension size of a thread block (x,y,z): (1024, 1024, 64)
Max dimension size of a grid size (x,y,z): (2147483647, 65535, 65535)
Maximum memory pitch: 2147483647 bytes
Texture alignment: 512 bytes
Concurrent copy and kernel execution: Yes with 2 copy engine(s)
Run time limit on kernels: No
Integrated GPU sharing Host Memory: No
Support host page-locked memory mapping: Yes
Alignment requirement for Surfaces: Yes
Device has ECC support: Disabled
Device supports Unified Addressing (UVA): Yes
Device PCI Bus ID / PCI location ID: 0 / 3
Compute Mode:
< Default (multiple host threads can use ::cudaSetDevice() with device simultaneously) >
deviceQuery, CUDA Driver = CUDART, CUDA Driver Version = 6.0, CUDA Runtime Version = 6.0, NumDevs = 1, Device0 = GRID K520
Result = PASS
我正在使用一个非常开箱即用的芹菜配置。 我在utils / tasks.py中定义了一组任务,在尝试使用PyCuda之前进行了测试和工作。我通过pip安装了PyCuda。
在我遇到问题的文件顶部,我执行标准导入:
from celery import task
# other imports
import os
try:
import Image
except Exception:
from PIL import Image
import time
#Cuda imports
import pycuda.autoinit
import pycuda.driver as cuda
from pycuda.compiler import SourceModule
import numpy
远程服务器启动一项任务,该任务遵循以下基本工作流程:
@task()
def photo_function(photo_id,...):
print 'Got photo...'
... Do some stuff ...
result = do_photo_manipulation(photo_id)
return result
def do_photo_manipulation(photo_id):
im = Image.open(inPath)
px = numpy.array(im)
px = px.astype(numpy.float32)
d_px = cuda.mem_alloc(px.nbytes)
... (Do stuff with the pixel array) ...
return new_image
如果我在shell plus(即./manage.py shell_plus)中运行它,并且我将其作为独立的django-and-celery进程运行,则此方法有效。它只是在这种情况下失败,错误: cuMemAlloc失败:未初始化
我已经查看了其他解决方案一段时间了,并尝试将import语句用于在函数本身中进行初始化。我还插入了一个wait()语句,以确保它不是gpu准备好工作的问题。
这是一个答案,表明错误来自于我没有导入pycuda.autoinit:http://comments.gmane.org/gmane.comp.python.cuda/1975
任何帮助都将不胜感激!
如果我需要提供更多信息,请告诉我们!
编辑: 这是测试代码: def CudaImageShift(imageIn,mode =“luminosity”,log = 0):
if log == 1 :
print ("----------> CUDA CONVERSION")
# print "ENVIRON: "
# import os
# print os.environ
print 'AUTOINIT'
print pycuda.autoinit
print 'Making context...'
context = make_default_context()
print 'Context created.'
totalT0 = time.time()
print 'Doing test run...'
a = numpy.random.randn(4,4)
a = a.astype(numpy.float32)
print 'Test mem alloc'
a_gpu = cuda.mem_alloc(a.nbytes)
print 'MemAlloc complete, test mem copy'
cuda.memcpy_htod(a_gpu, a)
print 'memcopy complete'
[2014-07-15 14:52:20,469: WARNING/Worker-1] cuDeviceGetCount failed: not initialized
答案 0 :(得分:2)
我相信您遇到的问题与CUDA背景有关。从CUDA 4.0开始,每个进程和每个设备需要一个CUDA上下文。
在幕后,芹菜将为任务工作者产生进程。当进程/任务启动时,它将没有可用的上下文。在pyCUDA中,上下文创建发生在autoinit模块中。这就是为什么你的代码在独立运行时没有运行的原因(没有创建额外的进程且上下文有效),或者你将import autoinit
放在CUDA任务中(现在进程/任务将会有一个背景,我相信你已经尝试过了。)
如果您想避免导入,您可以使用make_default_context
中的pycuda.tools
,尽管我对pyCUDA及其处理上下文管理的方式不是很熟悉。
from pycuda.tools import make_default_context
@task()
def photo_function(photo_id,...):
ctx = make_default_context()
print 'Got photo...'
... Do some stuff ...
result = do_photo_manipulation(photo_id)
return result
请注意,上下文创建是一个昂贵的过程。 CUDA故意在前台加载大量工作,以避免以后出现非预期的延迟。这就是为什么你有一堆可以在主机线程之间推送/弹出的上下文(但不是在进程之间)。如果您的内核代码非常快,则可能会因为上下文创建/销毁过程而遇到延迟。