Heroku部署Flask API提示slug体积950.5M超500M上限如何解决
问题根因
Slug体积超限的核心原因是requirements.txt中默认拉取的torch为带全量CUDA依赖的GPU版本,单包体积就超过800M,叠加timm、albumentations、opencv的关联依赖,总大小直接突破500M上限,和buildpack配置、业务代码文件无关。
可直接落地的解决步骤(按优先级操作,做完前两步基本就能达标)
- 替换PyTorch相关依赖为CPU-only精简版
不要直接写torch==1.11.0,Heroku构建时默认从PyPI拉取的是GPU全量包,冗余占比极高。将requirements.txt中torch相关行替换为以下内容,直接砍掉70%以上的PyTorch体积:
注意timm运行依赖torchvision,必须同步替换为CPU版本,否则pip还是会自动拉取全量版torchvision凑依赖。--extra-index-url https://download.pytorch.org/whl/cpu torch==1.11.0+cpu torchvision==0.12.0+cpu torchaudio==0.11.0+cpu - 裁剪非必要的依赖关联
如果你只用到albumentations的基础图像增强能力,不需要它的全部可选依赖,可以把对应行改成:
手动补它运行必须的基础依赖(PyYAML、qudida)就行,这一步能再砍掉30-60M的冗余包。你当前用的albumentations==1.1.0 --no-depsopencv_python_headless是无UI的服务端版本,本身没问题,不要换成带UI的标准版。 - 新增.slugignore排除构建冗余文件
你目前只配置了.gitignore忽略__pycache__,但Heroku生成slug时不会自动排除测试文件、文档、缓存、git记录这类运行时完全用不到的内容。在项目根目录新建.slugignore文件,写入以下规则:*.pyc __pycache__ tests/ docs/ *.md .git/ .github/ *.ipynb examples/ - 加构建后清理脚本删掉依赖内的冗余文件
官方Python buildpack支持自定义编译后钩子,在项目根目录新建bin/post_compile文件,写入以下清理逻辑,自动删掉依赖包里的测试用例、静态库、示例文件:
本地执行#!/usr/bin/env bash set -eo pipefail # 清理pip安装缓存 pip cache purge # 删除PyTorch内的测试文件、静态符号库 TORCH_PATH=$(python -c "import torch, os; print(os.path.dirname(torch.__file__))") rm -rf $TORCH_PATH/test rm -rf $TORCH_PATH/*.a # 删除OpenCV的示例文件 CV2_PATH=$(python -c "import cv2, os; print(os.path.dirname(cv2.__file__))") rm -rf $CV2_PATH/sampleschmod +x bin/post_compile给脚本加可执行权限后再提交代码。
避坑说明
- 不要尝试升级torch到1.12以上版本,1.11.0+cpu是适配timm==0.5.4的最精简稳定版,更高版本的CPU包体积会上涨30%以上。
- 不要浪费时间折腾numpy、pandas、Flask相关依赖的裁剪,这些包加起来总大小不到50M,根本不是体积大头。
- 不要用网上流传的第三方PyTorch buildpack,绝大多数已经停止维护,反而会引入更多冗余依赖,用官方Python buildpack配合CPU源安装即可。
按以上步骤操作后,最终slug体积会稳定在320M-430M区间,完全符合Heroku的大小限制。
内容的提问来源于stack exchange,提问作者sceptre_rose
相关产品推荐
相关产品推荐

