如何减小Heroku Slug大小 解决ML应用部署超500M上限报错
Heroku Slug体积超500M上限缩减方案
问题背景
部署机器学习应用时触发构建报错:
remote: ! Compiled slug size: 534M is too large (max is 500M).
涉及项目的文件结构如下:
app.py chatbot.h5 classes.pkl words.pkl data.json preprocessor.py Procfile requirements.txt runtime.txt wsgi.py
当前依赖配置(requirements.txt):
Flask==2.0.3 Jinja2==3.0.3 keras==2.6.0 nltk==3.6.7 numpy==1.19.5 tensorflow==2.6.2
构建产出的Slug体积为534M,超出Heroku平台500M的限制,以下是经过实际验证的可落地缩减方案:
可操作缩减方案
- 替换全量TensorFlow为CPU专属版本
完整TensorFlow包内置了CUDA、cuDNN等GPU运行依赖,单包体积超过420M,是Slug体积超标的核心原因。直接将requirements.txt中的tensorflow==2.6.2替换为tensorflow-cpu==2.6.2,推理接口、功能完全一致,仅移除了Heroku环境(无GPU资源)完全用不到的GPU组件,单这一项就能减少110M左右的体积,基本可以直接把Slug大小压到限制线内。 - 移除重复的Keras依赖
TensorFlow 2.6版本已经内置了对应版本的Keras模块,不需要单独安装keras==2.6.0,直接从requirements.txt里删掉这一行,能减少15M左右的冗余占用,同时避免潜在的版本冲突问题。 - 新增.slugignore过滤非运行必需文件
在项目根目录创建.slugignore文件,语法和.gitignore一致,把部署运行时不需要的文件、目录加入过滤规则,Heroku打包Slug时会自动跳过这些内容。常见可过滤的内容包括:本地训练用的notebook文件、原始训练数据集、__pycache__缓存目录、本地测试脚本、README等说明文档、.git版本目录。 - 精简NLTK安装内容
NLTK首次运行默认会下载全量语料包,体积接近30M,实际聊天机器人场景只需要用到分词、停用词等少量语料,可以在构建流程里指定仅下载需要的语料包,不要全量安装,能省出20M左右空间。 - 轻量化压缩模型文件
现有chatbot.h5如果是全精度训练保存的模型,可以在本地做训练后量化,将权重从32位浮点数压缩到16位浮点数或者8位整数,推理精度损失基本可以忽略,模型体积能缩小40%-60%,给后续依赖更新留足冗余空间。 - 确认runtime使用官方稳定版Python
不要使用自定义编译、带调试符号的Python版本,直接使用Heroku官方buildpack支持的稳定版Python,避免打包多余的调试组件、冗余依赖。
内容的提问来源于stack exchange,提问作者Veera Silamban
相关产品推荐
相关产品推荐

