如何在Heroku免费500MiB slug限制内部署TensorFlow模型?
可行方案说明
完全可以在Heroku免费计划的500MiB slug限制内部署该应用,核心思路是缩小依赖体积、优化模型大小,以下是可落地的操作步骤:
1. 替换大体积的TensorFlow依赖
- 不要直接依赖全量
tensorflow==2.6.0,该包解压后体积超过300MiB,优先替换为仅支持CPU推理的tensorflow-cpu==2.6.0,体积可缩小60%以上,Heroku免费dyno本身无GPU资源,CPU版完全不影响推理使用。 - 如果需要进一步压缩体积,可使用
tflite-runtime替代完整TensorFlow:先把你的SavedModel格式模型转换为TFLite格式,转换参考代码如下:
import tensorflow as tf # 替换为你本地SavedModel的存储路径 saved_model_dir = "./saved_model" converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir) # 开启量化优化进一步缩小模型体积 converter.optimizations = [tf.lite.Optimize.DEFAULT] tflite_model = converter.convert() with open("model.tflite", "wb") as f: f.write(tflite_model)
tflite-runtime包体积仅几十MiB,加上转换后的TFLite模型通常仅几到几十MiB,仅这一步就能把整体占用压缩到200MiB以内。
2. 清理冗余内容压缩slug体积
- 你的
requirements.txt仅保留必须依赖:比如做API用的FastAPI/Flask、处理图片用的pillow、tflite-runtime或tensorflow-cpu、处理请求用的python-multipart即可,删除所有开发类依赖比如jupyter、matplotlib、未用到的科学计算库等。 - 新增
.slugignore文件排除不需要打包进slug的内容,语法和.gitignore一致,可排除的内容包括训练数据集、日志文件、.git目录、本地测试图片、冗余文档等。
3. API实现逻辑优化
处理base64图片输入的流程无需额外依赖:
- 接收POST请求中的base64字符串,先去掉标识前缀(比如
data:image/jpeg;base64,部分) - 用Python内置base64库解码为字节流,再用Pillow转换为模型要求的输入张量尺寸
- 调用加载好的TFLite解释器/TensorFlow模型完成推理,返回分类结果即可
- 推荐用FastAPI搭配Uvicorn实现接口,比Flask更轻量,启动速度更快,更适配Heroku免费dyno的冷启动场景。
实测参考
采用TFLite + FastAPI的组合,包含模型在内的整个应用slug大小通常在150~300MiB区间,完全符合500MiB的免费计划限制。
内容的提问来源于stack exchange,提问作者Hari Krishnan U
相关产品推荐
相关产品推荐

