Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Deploy python app to Heroku "Slug Size too large"

I'm trying to deploy a Streamlit app written in python to Heroku. My whole directory is 4.73 MB, where 4.68 MB is my ML model. My requirements.txt looks like this:

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

When I push my app to Heroku, the message is:

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

How can my slug size be too large? Is it the size of the requirements? Then how is it possible to deploy a python app using tensorflow to Heroku after all? Thanks for the help!

like image 848
Noltibus Avatar asked Apr 06 '20 14:04

Noltibus


People also ask

How do I reduce Heroku slug size?

The easiest is to add a . slugignore file to your application to tell the slug compiler to ignore any unnecessary files in your application, such as static assets. This can be helpful in determining where large files are. You may also find that clearing the build cache helps reduce the size of the slug.

How do I know my Heroku slug size?

Your slug size is displayed at the end of a successful compile after the Compressing message. The maximum allowed slug size (after compression) is 500 MB. You can inspect the extracted contents of your slug with heroku run bash and by using commands such as ls and du .

Can I deploy Python script to Heroku?

Install app dependencies locally txt in the root directory is one way for Heroku to recognize your Python app. The requirements. txt file lists the app dependencies together. When an app is deployed, Heroku reads this file and installs the appropriate Python dependencies using the pip install -r command.


3 Answers

I have already answered this here.

Turns out the Tensorflow 2.0 module is very large (more than 500MB, the limit for Heroku) because of its GPU support. Since Heroku doesn't support GPU, it doesn't make sense to install the module with GPU support.

Solution:

Simply replace tensorflow with tensorflow-cpu in your requirements.

This worked for me, hope it works for you too!

like image 80
Surya Chereddy Avatar answered Oct 06 '22 13:10

Surya Chereddy


In requirements.txt file, I replaced tensorflow==2.6.0 to tensorflow-cpu==2.6.0 and it worked perfectly

like image 27
Vaibhav Taneja Avatar answered Oct 06 '22 13:10

Vaibhav Taneja


Just replace your TensorFlow version to 2.0.0 by doing:
tensorflow==2.0.0
It has a much lighter whl file and will fit your memory limit. Also, you can use 1.7.0 or 1.5.0 versions.

like image 40
Googr Avatar answered Oct 06 '22 14:10

Googr