pyCUDA с флягой дает pycuda._driver.LogicError: cuModuleLoadDataEx
Я хочу, чтобы запустить код PyCuda на flask
сервере. Файл работает правильно, используя 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...
Где я иду не так? Аналогичный вопрос есть, но ответа еще не получено.
Ответы
Ответ 1
Решил проблему с ленивой загрузкой в flask
и pycuda.autoinit
context
вручную (т. pycuda.autoinit
Без pycuda.autoinit
в PyCUDA
.
См. Это для ленивой загрузки в flask
.
Мой файл 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"
Ответ 2
PyCUDA может быть несовместима с контекстами веб-сервера WSGI. Вы могли бы заставить его работать, если вы используете какую-то очередь сообщений, например, Celery, где HTTP-запрос помещает задание в очередь, а рабочий на другой стороне очереди запускает программу CUDA.
Изменение: быстрый и простой способ заключается в использовании функции проверки подлинности подпроцесса Python
В веб-запросе:
subprocess.check_output(['python', 'cudaFlask.py'])