使用Flask

时间:2018-04-01 05:45:37

标签: python image-processing flask server pycuda

我正在使用PyCUDA来实现smooth_local_affine,如here所示。当我在linux上运行程序时,它运行良好。但是当我尝试在Flask上下文中导入它时:

from smooth_local_affine import smooth_local_affine
from flask import Flask
app = Flask(_name_)
...

发生以下错误:

-------------------------------------------------------------------  
PyCUDA ERROR: The context stack was not empty upon module cleanup.
-------------------------------------------------------------------   
A context was still active when the context stack was being cleaned up.  
At this point in our execution, CUDA may already have been deinitialized, 
so there is no way we can finish cleanly. The program will be aborted now. 
Use Context.pop() to avoid this problem.

然后我尝试添加context.pop(),然后发生另一个错误;

  

atexit._run_exitfuncs中的错误:Traceback(最近一次呼叫最后一次):
  文件   “/home/yifang/anaconda3/envs/python3/lib/python3.6/site-packages/pycuda-2017.1-py3.6-linux-x86_64.egg/pycuda/autoinit.py”   第14行,在_finish_up       context.pop()pycuda._driver.LogicError:context :: pop failed:无效的设备上下文 - 无法弹出非当前上下文

任何人都知道如何在Flask环境中运行PyCuda?或者也许我可以使用这个smooth_local_affine功能而不使用PyCuda的其他方法吗?

1 个答案:

答案 0 :(得分:1)

让我在这里介绍一个解决方案,因为我已经尝试了很多解决方案但仍然无效。幸运的是,我找到了一个正确答案。

一些解决方案,例如

import pycuda.autoinit

cuda.init 
device = cuda.Device(0) 
ctx = device.make_context() 
inputs, outputs, bindings, stream = allocate_buffer() 
ctx.pop()

如果您将脚本作为简单程序运行,这些可能会起作用,但如果您使用 Flask 或其他 Web 服务器运行,则会引发上下文错误。根据我的搜索,原因可能是flask服务器在请求进来时会产生新线程。

在这种情况下的真正解决方案非常简单,您只需添加如下代码:

with engine.create_execution_context() as context:
    ctx = cuda.Context.attach()
    inputs, outputs, bindings, stream = allocate_buffer()
    ctx.detach()

这对我有用