带Flask的pyCUDA给出了pycuda._driver.LogicError:cuModuleLoadDataEx

时间:2018-05-30 09:24:55

标签: python flask pycuda

我想在flask服务器上运行pyCUDA代码。该文件使用python3直接正确运行,但在使用flask调用相应函数时失败。

以下是相关代码:

cudaFlask.py:

import pycuda.autoinit
import pycuda.driver as drv
import numpy

from pycuda.compiler import SourceModule

def cudaTest():
    mod = SourceModule("""
        int x = 4;
    """)

    print ("done")
    return

if __name__ == "__main__":
    cudaTest()

server.py(只调用该函数的部分):

@app.route('/bundle', methods=['POST'])
def bundle_edges():
    cudaTest()
    return "success"

在运行python cudaFlask.py时,我按预期获得输出done,但在启动服务器并在POST处执行website/bundle请求时,我在烧瓶控制台上收到以下错误:

pycuda._driver.LogicError: cuModuleLoadDataEx failed: invalid device context - 

mod = SourceModule...

我哪里错了? 那里有一个similar question,但尚未得到答复。

3 个答案:

答案 0 :(得分:4)

解决了flask中的延迟加载问题并手动设置context(即pycuda.autoinit中没有PyCUDA

flask中提及this延迟加载。

我的views.py文件:

import numpy as np
import pycuda.driver as cuda
from pycuda.compiler import SourceModule

def index():
    cuda.init()
    device = cuda.Device(0) # enter your gpu id here
    ctx = device.make_context()

    mod = SourceModule("""
        int x = 4;
    """)

    ctx.pop() # very important

    print ("done")
    return "success"

答案 1 :(得分:0)

PyCUDA可能与WSGI Web服务器上下文不兼容。 如果你使用像Celery这样的消息队列,你可以使它工作,HTTP请求在队列上放置一个作业,队列另一端的worker运行CUDA程序。

编辑:快速简便的方法是使用Python Subprocess check_output function

在网络请求中:

subprocess.check_output(['python', 'cudaFlask.py'])

答案 2 :(得分:0)

根据您的解决方案,我更改了代码

def print_device_info(): 
    (free,total)=drv.mem_get_info()
    print("Global memory occupancy:%f%% free"%(free*100/total))

    for devicenum in range(cuda.Device.count()):
        device=drv.Device(devicenum)
        attrs=device.get_attributes()

        #Beyond this point is just pretty printing
        print("\n===Attributes for device %d"%devicenum)
        for (key,value) in attrs.iteritems():
            print("%s:%s"%(str(key),str(value)))

def print_device_info(): 
    drv.init()
    device = drv.Device(0) # enter your gpu id here
    ctx = device.make_context()

    (free,total)=drv.mem_get_info()
     print("Global memory occupancy:%f%% free"%(free*100/total))
     attrs=device.get_attributes()

     #Beyond this point is just pretty printing
     print("\n===Attributes for device %d"%0)
     for (key,value) in attrs.items():
        print("%s:%s"%(str(key),str(value)))
     ctx.pop()

它就像一个魅力。 非常感谢您分享您的解决方案,这真的让我开心!