将Python应用部署到Heroku时出现“Slug Size过大”问题

22

我希望将用Python编写的Streamlit应用程序部署到Heroku。我的整个目录大小为4.73 MB,其中4.68 MB是我的机器学习模型。我的requirements.txt文件如下:

absl-py==0.9.0
altair==4.0.1
astor==0.8.1
attrs==19.3.0
backcall==0.1.0
base58==2.0.0
bleach==3.1.3
blinker==1.4
boto3==1.12.29
botocore==1.15.29
cachetools==4.0.0
certifi==2019.11.28
chardet==3.0.4
click==7.1.1
colorama==0.4.3
cycler==0.10.0
decorator==4.4.2
defusedxml==0.6.0
docutils==0.15.2
entrypoints==0.3
enum-compat==0.0.3
future==0.18.2
gast==0.2.2
google-auth==1.11.3
google-auth-oauthlib==0.4.1
google-pasta==0.2.0
grpcio==1.27.2
h5py==2.10.0
idna==2.9
importlib-metadata==1.5.2
ipykernel==5.2.0
ipython==7.13.0
ipython-genutils==0.2.0
ipywidgets==7.5.1
jedi==0.16.0
Jinja2==2.11.1
jmespath==0.9.5
joblib==0.14.1
jsonschema==3.2.0
jupyter-client==6.1.1
jupyter-core==4.6.3
Keras-Applications==1.0.8
Keras-Preprocessing==1.1.0
kiwisolver==1.1.0
Markdown==3.2.1
MarkupSafe==1.1.1
matplotlib==3.2.1
mistune==0.8.4
nbconvert==5.6.1
nbformat==5.0.4
notebook==6.0.3
numpy==1.18.2
oauthlib==3.1.0
opencv-python==4.2.0.32
opt-einsum==3.2.0
pandas==1.0.3
pandocfilters==1.4.2
parso==0.6.2
pathtools==0.1.2
pickleshare==0.7.5
Pillow==7.0.0
prometheus-client==0.7.1
prompt-toolkit==3.0.4
protobuf==3.11.3
pyasn1==0.4.8
pyasn1-modules==0.2.8
pydeck==0.3.0b2
Pygments==2.6.1
pyparsing==2.4.6
pyrsistent==0.16.0
python-dateutil==2.8.0
pytz==2019.3
pywinpty==0.5.7
pyzmq==19.0.0
requests==2.23.0
requests-oauthlib==1.3.0
rsa==4.0
s3transfer==0.3.3
scikit-learn==0.22.2.post1
scipy==1.4.1
Send2Trash==1.5.0
six==1.14.0
sklearn==0.0
streamlit==0.56.0
tensorboard==2.1.1
tensorflow==2.1.0
tensorflow-estimator==2.1.0
termcolor==1.1.0
terminado==0.8.3
testpath==0.4.4
toml==0.10.0
toolz==0.10.0
tornado==5.1.1
traitlets==4.3.3
tzlocal==2.0.0
urllib3==1.25.8
validators==0.14.2
watchdog==0.10.2
wcwidth==0.1.9
webencodings==0.5.1
Werkzeug==1.0.0
widgetsnbextension==3.5.1
wincertstore==0.2
wrapt==1.12.1
zipp==3.1.0

当我将我的应用程序推送到Heroku时,会出现以下消息:

remote: -----> Discovering process types
remote:        Procfile declares types -> web
remote:
remote: -----> Compressing...
remote:  !     Compiled slug size: 623.5M is too large (max is 500M).
remote:  !     See: http://devcenter.heroku.com/articles/slug-size
remote:
remote:  !     Push failed

我的slug大小怎么可能太大?是因为要求的大小吗?那用tensorflow部署Python应用程序到Heroku怎么可能呢? 谢谢帮助!


Tensorflow可以在Heroku上运行。对于非常小的应用程序,这可能是可以的,但在运行时,您将遇到内存问题。您可以通过支付Heroku服务来解决内存问题,从而获得更多的RAM。生成的slug大小是正常的。机器学习很复杂,需要大量的代码。在运行时它变得更加庞大。 - Tin Nguyen
我建议检查你的构建脚本生成的Heroku Slug。可能会有一个意外留下的大文件/文件夹(例如,对于大型项目的.git文件夹)。 - JME
5个回答

60

我已经在这里回答过了。

事实证明,Tensorflow 2.0模块非常大(超过Heroku的500MB限制),因为它支持GPU。由于Heroku不支持GPU,安装带有GPU支持的模块是没有意义的。

解决方案:

只需在您的要求中用tensorflow-cpu替换tensorflow即可。

这对我很有效,希望对你也有用!


太好了。我已经花了几个小时来处理这个slug大小,但只需在要求中将“tensorflow”更改为“tensorflow-cpu”,md就减少了约200 md。谢谢你! - Aibloy
非常顺利!谢谢你的帮助。 - Sarthak Rana
1
这救了我的命。我之前使用的是Tensorflow 2.4.x,其大小接近500 MB。改用tensorflow-cpu后,它只有144 MB。 - Philip Purwoko
嗨,我只需要在requirements.txt中更新tensorflow吗?当我在本地安装tensorflow时,还有一些其他的像tensorboard、tensorboard-data-server、tensorboard-plugin-wit等自动安装的内容。 - anandhu
无论你梦想什么,它都应该成真。谢谢@SuryaChereddy - Blasanka

5
requirements.txt文件中,我将tensorflow==2.6.0替换为tensorflow-cpu==2.6.0,结果运行良好。

工作正常。它为我减少了近300MB,从680降至380。 - KasRoudra

2

只需执行以下操作,将您的TensorFlow版本替换为2.0.0:
tensorflow==2.0.0
它具有更轻的whl文件,并且适合您的内存限制。 此外,您还可以使用1.7.0或1.5.0版本。


我得到了"No matching distribution found for tensorflow==2.0.0"的错误信息。 - anandhu

1

只需使用 tensorflow 版本 1.14,因为它的大小几乎是 tf2.0+ 的一半,并且可以满足大多数需求。
在我的情况下,将 tf2.1(280MB) 替换为 tf1.14(580MB) 后,文件大小几乎减半。


-2

这意味着当下载所有需求时,它们总共达到了600MB,但你只有500MB的内存。


是的,我知道。但我想问一下,如果依赖项使 Slug 大小过大,是否有其他可能性在不支付费用的情况下将 Tensorflow 应用程序部署到 Heroku?但显然这并不是问题。 - Noltibus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接