如何在AWS Lambda无服务器函数中安装Ultralytics仅YOLO检测核心组件?
解决方案
完全可以通过ultralytics[detect]这种方式缩小安装范围,结合以下优化手段,能大幅降低部署包体积和安装耗时:
1. 精简依赖清单
修改你的requirements.txt,用ultralytics[detect]替代完整的ultralytics包,这样只会安装目标检测相关的必要依赖,排除训练、分割等你不需要的模块。同时针对Lambda的CPU环境,改用onnxruntime-cpu替代通用的onnxruntime,进一步减少冗余:
boto3 ultralytics[detect] onnx onnxruntime-cpu
2. 优化Docker安装步骤
在pip安装时添加--no-cache-dir参数避免缓存占用空间,安装完成后清理pip缓存,进一步压缩镜像体积:
FROM public.ecr.aws/lambda/python:3.12 # 复制依赖清单 COPY requirements.txt ${LAMBDA_TASK_ROOT} # 安装依赖并清理缓存 RUN pip install --no-cache-dir -r requirements.txt && \ rm -rf /root/.cache/pip # 复制函数代码和模型文件 COPY lambda.py best.onnx ${LAMBDA_TASK_ROOT} CMD [ "lambda.handler" ]
3. 进阶优化:多阶段构建镜像
如果想进一步减小最终镜像的体积,可以采用Docker多阶段构建,只在最终镜像中保留运行必需的文件,剥离构建过程中的临时文件:
# 第一阶段:构建依赖环境 FROM public.ecr.aws/lambda/python:3.12 AS builder COPY requirements.txt . # 将依赖安装到指定目录 RUN pip install --no-cache-dir -r requirements.txt -t /lambda-deps # 第二阶段:生成最终运行镜像 FROM public.ecr.aws/lambda/python:3.12 # 从构建阶段复制已安装的依赖 COPY --from=builder /lambda-deps ${LAMBDA_TASK_ROOT} # 复制业务代码和模型 COPY lambda.py best.onnx ${LAMBDA_TASK_ROOT} CMD [ "lambda.handler" ]
额外注意事项
- 确认你的
lambda.py中只导入了推理相关的模块,比如from ultralytics import YOLO,不要导入训练、验证等无关模块,避免触发不必要的依赖加载 - 可以尝试指定依赖的具体版本,避免安装最新版本可能带来的冗余,比如
ultralytics[detect]==8.2.87
内容的提问来源于stack exchange,提问作者Enkh-Amar Ganbat
相关产品推荐
相关产品推荐

