私はプロダクションMLベースのアプリケーション用のツールを評価しています。オプションの1つはSpark= MLlibです。
たとえば、Azure MLでは、トレーニングが完了すると、モデルは任意のアプリケーションから使用できるWebサービスとして公開されます。これは、Amazon MLの場合と同様です。
ApacheでMLモデルをどのように提供/デプロイしますかSpark?
一方では、spark=で構築された機械学習モデルは、従来の方法でAzure MLまたはAmazon MLで提供する方法では提供できません。
Databricksは、ノートブックを使用してモデルを展開できると主張していますが、実際にはまだ試していません。
一方、次の3つの方法でモデルを使用できます。
MLWriter
を実装している場合はモデルをトレーニングして保存し、アプリケーションまたはノートブックにロードしてデータに対して実行します。これらは3つの可能な方法です。
もちろん、RESTfulサービスを備えたアーキテクチャを考えることができます。その背後には、例に従ってspark-jobserverを使用して構築し、トレーニングとデプロイを行いますが、開発が必要です。すぐに使えるソリューションではありません。
Oryx 2などのプロジェクトを使用して、完全なラムダアーキテクチャを作成し、モデルをトレーニング、展開、および提供することもできます。
残念ながら、上記の各ソリューションを説明することは非常に広く、SOの範囲に収まりません。
1つのオプションは、 MLeap を使用してSpark PipelineModelをオンラインでSpark/SparkContextに依存しないとすることです。SparkContextを使用する必要はありません単一レコードのスコアリング時間を〜100msから1桁のマイクロ秒に落とすため、重要です。
それを使用するには、以下を行う必要があります。
MLeapは、Spark MLlib(この記事の執筆時点でのLDAを除く)で使用可能なすべてのパイプラインステージと統合されています。ただし、カスタムを使用している場合は、少し複雑になります推定器/変圧器。
カスタムトランスフォーマー/推定器、パフォーマンス、統合の詳細については、 MLeap FAQ をご覧ください。
2つのかなり異なるものを比較しています。 Apache Sparkは計算エンジンですが、AmazonとMicrosoftのソリューションはサービスを提供しています。これらのサービスには、背後にMLlibがあるSparkがあります。 Webサービスを自分で構築する手間を省きますが、追加料金がかかります。
Domino Data Lab、Cloudera、IBMなどの多くの企業が、独自に展開できる製品を提供しています。Spark=クラスターで、さまざまな柔軟性を備えたモデルを中心にサービスを簡単に構築できます。
当然、さまざまなオープンソースツールを使用して自分でサービスを構築します。具体的には?それはすべてあなたが何を求めているかにかかっています。ユーザーはどのようにモデルを操作する必要がありますか?何らかの種類のUIまたはjest a REST API?モデルまたはモデル自体のパラメーターを変更する必要がありますか?ジョブはバッチまたはリアルタイムの性質ですか?当然、オールインワンソリューションを構築できますが、それは多大な労力を費やすことになります。
私の個人的な推奨事項は、可能であれば、Amazon、Google、Microsoft、その他のサービスを利用することです。オンプレミス展開が必要ですか? Domino Data Labを確認してください。製品は成熟しており、モデルの構築(展開から展開まで)を簡単に行うことができます。 Clouderaはクラスターコンピューティング(Sparkを含む)に重点を置いていますが、成熟するまでにはしばらく時間がかかります。
[編集] Apache PredictionIO 、オープンソースの機械学習サーバーをご覧になることをお勧めします-多くの可能性を持つ素晴らしいプロジェクト。
これを機能させることができました。注意事項:Python 3.6 + Spark= ML API(MLLIBではないが、同じように動作するはずです)
基本的に、 MSFTのAzureML github で提供されているこの例に従ってください。
警告の言葉:コードはそのまま提供されますが、最後の例のrun()
メソッドにエラーがあります:
#Get each scored result
preds = [str(x['prediction']) for x in predictions]
result = ",".join(preds)
# you can return any data type as long as it is JSON-serializable
return result.tolist()
する必要があります:
#Get each scored result
preds = [str(x['prediction']) for x in predictions]
#result = ",".join(preds)
# you can return any data type as long as it is JSON-serializable
output = dict()
output['predictions'] = preds
return json.dumps(output)
また、MLeap評価の回答に完全に同意します。これにより、プロセスの実行速度が速くなりますが、具体的には質問に答えると思います