我使用Flask开发了一个rest API来公开Python Keras深度学习模型(用于文本分类的CNN)。我有一个非常简单的脚本,它将模型加载到内存中并输出给定文本输入的类概率。 API在本地完美运行。
然而,当我git push heroku master
时,我得到Compiled slug size: 588.2M is too large (max is 500M)
。该模型的大小为83MB,对于深度学习模型来说这是非常小的。值得注意的依赖包括Keras及其tensorflow后端。
我知道你可以在Heroku上使用GB的RAM和磁盘空间。但瓶颈似乎是段塞尺寸。有没有办法规避这个?或者Heroku不是用于部署深度学习模型的正确工具?
答案 0 :(得分:2)
根据其他人的建议,我要检查的第一件事是找出为什么你的回购是如此之大,因为模型尺寸只有83MB。
鉴于你无法减小尺寸,可以选择卸载部分回购,但要做到这一点,你仍然需要知道哪些文件占用了空间。在heroku文档中建议卸载。 Slug大小限制为500MB,如下所述:https://devcenter.heroku.com/articles/slug-compiler#slug-size我认为这与在需要更改资源时启动新实例所需的时间有关。但是,如果您有特别大的文件,则可以使用卸载。有关卸载的更多信息:https://devcenter.heroku.com/articles/s3
答案 1 :(得分:2)
许多这样的答案对于减小子弹大小非常有用,但是如果仍然有人在将深度学习模型部署到heroku时遇到问题,请务必注意,无论出于何种原因,tensorflow 2.0的大小约为500MB,而早期版本的大小则小得多。使用早期版本的tensorflow可以大大减小子弹大小。
答案 2 :(得分:2)
您可以减小模型大小并使用更小的 tensorflow-cpu(Python 3.8 为 144MB)
pip install tensorflow-cpu
答案 3 :(得分:1)
此答案假设您的模型仅为83MB,并且您的存储库目录的总大小(可能小得多)小于500MB。
可能存在一些问题,但您需要做的就是将git存储库减少到500MB以下。
首先,尝试使用以下命令减少回购的大小(请参阅this blog post以供参考):
heroku plugins:install heroku-repo
heroku repo:gc --app your-app-name
heroku repo:purge_cache --app your-app-name
这些可能会解决您的问题。
另一个潜在的问题是,您在某个时候提交了另一个(大型)模型,并在后续提交中将其从您的仓库中删除。 git repo现在在.git文件夹和git历史记录中包含该模型的一个版本。对此有一些修复,但如果您不需要提交历史记录,则可以将repo复制到另一个文件夹并使用git init
创建一个新的git仓库。用“"初始提交"然后尝试只用一次提交到Heroku来推送这个repo。可能这将是一个小得多的回购规模。
答案 4 :(得分:0)
作为资源,您可以访问Heroku Slug Compiler帮助页面。
拥有83MB的型号并不意味着它一直是83MB。由于软件包在被推送到Heroku时正在编译,这显然会占用更多的slug空间,因此应用程序可以使用这些软件包。最好的解决方案可能是将大型资产放入像AWS S3这样的容器或其他任何好的容器中。或者最糟糕的是使用不同的云服务。
答案 5 :(得分:0)
我想说Heroku不是部署深度学习模型本身的正确工具。为此,您可以考虑使用专用于深度学习的平台即服务,例如Floydhub。 您也可以在Floydhub上部署Flask REST API。
答案 6 :(得分:0)
Heroku 是一个非常好的云平台来部署您的应用程序,但如果您有一个深度学习模型,即需要使用大型 CNN/深度学习模型进行预测的应用程序,那么该云平台不适合。您可以尝试其他云平台,例如 AWS、Amazon Sagemaker、MS Azure、IBM Watson。
我遇到了同样的问题,花了几天后我才知道是 tensorflow 库导致了这个 slug 开销。
我使用 requirements.txt 文件中的 1 行解决了这个问题:
tensorflow-cpu==2.5.0
代替
tensorflow==2.5.0
您可以使用任何更新的 tensorflow 库版本。详细了解 tensorflow-cpu here