pyCUDA с Flask дает pycuda._driver.LogicError: cuModuleLoadDataEx - PullRequest
0 голосов
/ 30 мая 2018

Я хочу запустить код 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...

Где я иду не так?Существует аналогичный вопрос , но на него еще не ответили.

Ответы [ 2 ]

0 голосов
/ 19 июня 2018

Решена проблема с ленивой загрузкой в ​​flask и выполнением context вручную (т.е. без 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"
0 голосов
/ 07 июня 2018

PyCUDA может быть несовместимо с контекстами веб-сервера WSGI.Вы могли бы заставить это работать, если бы вы использовали какую-то очередь сообщений, такую ​​как Celery, где HTTP-запрос помещает задание в очередь, а рабочий на другой стороне очереди запускает программу CUDA.

Редактировать:Быстрый и простой способ - использовать Python-подпроцесс с функцией check_output

В веб-запросе:

subprocess.check_output(['python', 'cudaFlask.py'])

...