我想创建一个API,让用户输入一些数据,API(Flask应用)将通过机器学习(线性回归、K聚类)提供预测结果。
在预测结果之前,需要先训练数据。我的数据集非常大(约50GB)。这是否意味着每次用户输入数据时,应用都需要重新训练数据?这会花很长时间,对吗?
如何使用Flask处理大数据集进行机器学习,以便预测速度更快?这是最佳方法吗?使用机器学习进行Web应用开发?我对此很新手,所以任何帮助都将不胜感激。
谢谢!
回答:
除了您主要提出的问题外,还有一些其他问题,所以我也会尝试帮助解答这些。在回答您主要问题之前,让我们先看看一些建议。
只是为了确保您不是在重复造轮子:
- 检查是否有现成的服务可以完成此特定任务:
- 在AWS上进行机器学习 https://aws.amazon.com/machine-learning/
- 在Azure上进行机器学习 https://azure.microsoft.com/en-in/services/machine-learning/
- 在GCloud上进行AI/ML https://cloud.google.com/products/ai/
- 检查是否有现成的框架可以将模型部署到生产环境
- Tensorflow Serving https://www.tensorflow.org/tfx/tutorials/serving/rest_simple
- Kubeflow https://www.kubeflow.org/docs/about/kubeflow/
如果您对自己的机器学习逻辑非常有信心,并且希望继续自己的道路,将其部署到生产环境,那么还有其他需要考虑的问题。我从自己的经验出发,我曾经尝试过类似的事情,但没有使用如此大的数据集。
您如何存储数据集,放在哪里?这看似简单,但实际上并不简单。假设您运行某种虚拟机来读取数据集,它需要靠近数据集。将数据集放在与机器学习代码相同的虚拟机上似乎不是解决问题的好方法(紧耦合,难以快速启动/克隆这样的虚拟机),但将其放在同一网络上的另一个容器中,如S3存储桶或另一个单独的虚拟机上,听起来是可行的——低延迟,简单拓扑,易于对外隐藏。
接下来是执行长时间运行任务(训练)的机器学习,并且它不适合放在实时服务器上,因为没有人会等到它处理完50GB的数据。我认为它也应该在单独的虚拟机上,这样可以按需扩展,即您可以为每个训练请求启动一个虚拟机。
那么现在的问题是如何协调这一切?如果没有某种异步消息传递能力,这将非常困难(除了调度之外)。我的意思是,API服务器通过类似Redis发布/订阅或通过AWS SNS发送请求会更容易,而您的机器学习虚拟机可以在后台逐个处理这些请求。
Flask API或任何其他API服务器只是处于中间位置,并将暴露触发器来进行机器学习和/或执行机器学习任务。
我认为对您的问题没有简单的答案,但您可以查看我关于通过Node.js(与Flask类似)暴露简单Tensorflow脚本、训练和执行的方法,这可能会以某种方式帮助您: