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/bundle
做 POST
请求时我得到了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)
我想 运行 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/bundle
做 POST
请求时我得到了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)