上のエンドポイントをフラスコに要求間でグローバルな情報の共有:、この(以下簡体字)のように、私は単一のエンドポイントとのフラスコアプリケーションを持っているHerokuの
@app.route('/classify', methods=['POST'])
def classify():
p = g.model_loader.get_model()
json = request.get_json()
text = json['text']
return p.classify(text)
def main():
model_loader = ResourceLoader()
with app.app_context():
g.model_loader = model_loader
app.run()
if __name__ == '__main__':
main()
アプリケーションを一度メモリに機械学習モデルをロードする必要がありますmain
メソッドに入力し、そのモデルを使用してPOST経由で送信されているテキストをフラスコエンドポイントに分類します。私はローカルで動作するアプリケーションコンテキストを使ってこれをしようとしましたが、herokuでは動作しません。現在のところ、アプリケーションのコンテキストがワーカー間で共有されていないためです。モデルローダーへのエンドポイントアクセスをclassify
に与えるにはどうすればよいですか?
EDIT:最初の質問に正しく言わなかった。各作業員はmain()
を実行する必要があり、したがって、独自のアプリケーションコンテキストでmodel_loader
にアクセスする必要があります。しかし、私はこれを英雄で実行すると、AttributeError: '_AppCtxGlobals' object has no attribute 'model_loader'
が得られます。ヒーローでアプリケーションのコンテキストが異なりますか?
私は最初の質問に改めて言いました。私は労働者の間でモデルを共有する必要はありません。しかし、労働者は主人公の「メイン」にロードされた変数にアクセスできないように見える。 – LateCoder
ここからmainを呼び出していますか? –
私はこのようにスクリプトを実行するProcfileを持っています: 'web:gunicorn server:app'。スクリプトには、元の投稿に示されているように 'main()'の呼び出しが含まれています。 – LateCoder