我想在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,但尚未得到答复。
答案 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()
它就像一个魅力。 非常感谢您分享您的解决方案,这真的让我开心!