[英]Writing output in a sub-process leads to error
Keras强制输出到sys.stderr
( GitHub上的修复被拒绝)。 从Web应用程序中的子进程写入系统输出似乎存在问题。 这导致我的代码在导入Keras
时尝试通知后端实现时抛出了相应的错误。
AttributeError: 'NoneType' object has no attribute 'write'
在实例化Flask应用程序并使用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
,不会抛出上述错误。 对于我的用例,这是可以接受的。 当然,它不是解决在子进程中编写输出的问题。
我注意到您在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的Azure WebApp for Linux。
希望能帮助到你。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.