在AWS Lambda部署含TensorFlow的微服务遇阻求助
解决AWS Lambda部署TensorFlow微服务的体积过大与依赖缺失问题
我太懂这种卡在部署环节的挫败感了——TensorFlow本身体积就不小,和Serverless+Lambda搭配确实容易踩坑。结合你的情况,我给你几个可行的解决方案,一步步来:
问题根源先理清楚
- 依赖缺失错误:AWS Lambda不会自动帮你从
requirements.txt安装依赖,必须把代码和依赖打包在一起,或者用Lambda Layer单独托管依赖。 - 体积过大失败:完整版TensorFlow解压后体积远超Lambda的250MB限制,直接打包肯定会失败。
方案一:用Serverless Python Requirements插件(最省心)
这个插件专门解决Python Serverless项目的依赖打包问题,能自动剔除冗余文件、将依赖打包成Lambda Layer,完美适配你的场景。
步骤:
- 安装插件(需要先有Node.js环境):
npm install serverless-python-requirements --save-dev
- 修改你的
serverless.yml,添加插件和优化配置:
service: numpy-new-test provider: name: aws runtime: python3.6 # 注意:AWS已停止维护Python3.6,建议升级到3.9/3.10 profile: nsp role: arn:aws:iam::xxxxxxxxxxx7:role/AdminRole plugins: - serverless-python-requirements custom: pythonRequirements: slim: true # 自动剔除TensorFlow里的文档、测试文件,大幅减小体积 layer: true # 将依赖打包成Lambda Layer,不占用函数包体积 functions: numpy: handler: handler.main events: - http: path: test method: get
- 修改
requirements.txt,改用CPU版本的TensorFlow(Lambda是CPU环境,不需要GPU版,体积小很多):
numpy tensorflow-cpu==2.6.0 # 2.6是最后支持Python3.6的版本,升级Python后可以用更高版本
- 重新部署:
serverless deploy
方案二:手动创建Lambda Layer(适合需要精细控制的场景)
如果你不想用插件,可以手动把依赖打包成Layer:
步骤:
- 创建如下目录结构:
layers/ └── python/ └── lib/ └── python3.6/ └── site-packages/
- 在
layers/python/lib/python3.6/site-packages/目录下安装依赖:
pip install numpy tensorflow-cpu==2.6.0 -t ./layers/python/lib/python3.6/site-packages/
- 进入
layers/目录,打包成zip:
cd layers zip -r tensorflow-layer.zip python/
- 在AWS Lambda控制台上传这个zip包创建Layer,记录Layer的ARN。
- 修改
serverless.yml,在函数中引用这个Layer:
functions: numpy: handler: handler.main layers: - arn:aws:lambda:你的AWS区域:你的账号ID:layer:tensorflow-layer:1 # 替换成你的Layer ARN events: - http: path: test method: get
- 部署函数即可,此时你的函数包只有
handler.py,体积很小。
额外提醒
- Python版本升级:AWS Lambda已经不再支持Python3.6,建议把runtime改成
python3.9或python3.10,这样可以使用更新的TensorFlow版本(比如2.15.x),也能获得更好的性能和安全性。 - 测试本地依赖:可以用
serverless invoke local命令在本地测试函数,确保依赖没问题再部署。
内容的提问来源于stack exchange,提问作者Edward Jill
相关产品推荐
相关产品推荐

