Запись вывода в подпроцесс приводит к ошибке - PullRequest
0 голосов
/ 20 мая 2019

Keras принудительно выводит на sys.stderr (для которого исправление было отклонено на GitHub ).Кажется, существует проблема записи в системные выходные данные дочернего процесса в веб-приложении.Это приводит к тому, что мой код выдает соответствующую ошибку при попытке сообщить о реализации бэкэнда при импорте Keras.

AttributeError: 'NoneType' object has no attribute 'write'

Я пытался перенаправить вывод на os.devnull в соответствии с этим ответом до создания экземпляра приложения Flask и запуска его с web.config.Однако ошибка сохранилась.Любопытно, что запись без multiprocessing работала просто отлично.

import sys
from flask import Flask
import keras

app = Flask(__name__)


@app.route('/')
def main():
    print('Hello!')
    sys.stdout.write('test\n')
    sys.stderr.write('emsg\n')
    return 'OK.', 200

Даже from keras import backend as k работает.Это утверждение, которое изначально произвело ошибку.Это оставило меня в замешательстве. В чем может быть дело?

Минимальный пример

В моем приложении для процессов обучения создается подпроцесс.При попытке записать вывод в multiprocessing.Process выдается ошибка.Вот некоторый код для воспроизведения ситуации.

import sys
from flask import Flask
from multiprocessing import Process


def write_output():
    sys.stdout.write('hello\n')


def create_app():
    apl = Flask(__name__)
    Process(target=write_output).start()

    @apl.route('/')
    def main():
        return 'OK.', 200

    return apl

Это приложение затем создается в другом файле и вызывается из web.config.Базовое ведение журнала подтвердило, что ошибка все еще генерируется.


Почти исправление

Хотя это и не исправление, система работала с использованием threading.Простое переключение multiprocessing.Queue and Process на queue.Queue и threading.Thread не приводит к возникновению ошибок, подобных описанным выше.Для моего варианта использования это приемлемо на данный момент.Конечно, это не решение проблемы записи вывода в дочернем процессе.

1 Ответ

0 голосов
/ 27 мая 2019

Я заметил, что вы упомянули файл web.config для Azure WebApp в Windows.И есть ограничение на Azure Web App sandbox, которое вам нужно знать.После того, как я рассмотрел его по вашему сценарию, я думаю, что ваше приложение было отклонено с некоторыми ограничениями.Исходя из своего опыта, я думаю, что задача обучения модели не подходит для запуска в Azure WebApp, особенно для экземпляра Windows, даже только в изолированной программной среде на базе процессора.

Я предлагаю переместить ваше приложение навысокопроизводительная виртуальная машина Azure с графическим процессором, например NC-series, которую можно увидеть по https://azure.microsoft.com/en-us/pricing/details/virtual-machines/linux/.

enter image description here

В противном случае у вас может быть другая причина для использованияAzure WebApp для вашего приложения. Я рекомендовал вам попробовать Azure WebApp для Linux на основе Docker.

Надеюсь, это поможет.

...