Keras强制输出到sys.stderr
(对此修复未在GitHub上进行)。从Web App中的子进程写入系统输出似乎存在问题。这导致我的代码在导入Keras
时尝试对后端实现进行inform时抛出适当的错误。
AttributeError: 'NoneType' object has no attribute 'write'
在实例化Flask应用程序并以this启动之前,我尝试根据web.config
的答案将输出重定向到os.devnull
。但是,错误仍然存在。奇怪的是,在没有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
,就不会抛出如上的错误。就我的用例而言,目前可以接受。当然,这不是解决在子进程中写入输出问题的解决方案。
答案 0 :(得分:0)
我注意到您提到了Windows上Azure WebApp的web.config
文件。您需要了解有关Azure Web App sandbox
的限制。在根据您的情况进行审查后,我认为您的应用被某些限制所拒绝。根据我的经验,我认为训练模型的任务不适合在Azure WebApp上运行,特别是对于Windows实例,甚至不适合在基于CPU的沙箱上运行。
我的建议是将您的应用程序移至具有GPU的高性能Azure VM,例如https://azure.microsoft.com/en-us/pricing/details/virtual-machines/linux/上的NC-series
。
否则,您可能还有其他原因要对您的应用程序使用Azure WebApp,我建议您可以尝试基于Docker的Linux的Azure WebApp。
希望有帮助。