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'])