pyCUDA with Flask gives pycuda._driver.LogicError: cuModuleLoadDataEx

pyCUDA with Flask gives pycuda._driver.LogicError: cuModuleLoadDataEx

我想 运行 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"

在 运行ning python cudaFlask.py 我得到了预期的输出 done 但是在启动服务器并在 website/bundlePOST 请求时我得到了Flask 控制台出现以下错误:

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

上线mod = SourceModule...

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

PyCUDA 可能与 WSGI 网络服务器上下文不兼容。 如果您使用某种消息队列(如 Celery),您可能会使其工作,其中 HTTP 请求将作业放在队列中,队列另一端的工作人员运行 CUDA 程序。

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

在网络请求中:

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

解决了 flask 中延迟加载和手动制作 context 的问题(即 PyCUDA 中没有 pycuda.autoinit

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"

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

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()

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

以非线程模式启动 Flask 应用程序:

app.run(host=HOST, port=PORT, debug=False,threaded=False)