AWS SAM部署PyTorch模型时无法导入models模块问题如何解决
问题根因
你遇到的导入报错核心是Dockerfile中复制本地目录的指令不符合Docker路径规则,导致models、utils的目录结构没有被保留到Lambda容器的工作目录中。
当COPY/ADD指令指定多个源路径时,如果目标路径不以/结尾,Docker会直接把所有源路径下的文件平铺拷贝到目标路径下,不会保留原目录结构。你当前的写法会把models、utils目录内的所有文件直接放到Lambda工作目录/var/task下,不会生成models、utils两个子目录,因此app.py导入模块时会找不到对应包。
解决方案
按以下步骤排查修正即可:
- 首先修正Dockerfile的复制指令,明确保留目录结构
将原Dockerfile中复制目录的语句:
替换为明确的目录复制规则:ADD models utils ./COPY models ./models COPY utils ./utils - 检查
models、utils目录下是否存在__init__.py文件
Python需要目录中存在__init__.py才会将其识别为可导入的包,你当前贴出的目录结构中只有根目录存在该文件,需要在models、utils目录下各新增一个空的__init__.py文件。 - 本地验证目录结构是否正确
修正后可本地构建镜像验证结构,执行以下命令:
确认输出中存在# 构建镜像 docker build -t test-lambda . # 查看工作目录结构 docker run --rm --entrypoint ls test-lambda -R /var/taskmodels、utils两个子目录,且子目录下的文件完整即可重新部署。
注:你之前将
ADD替换为COPY没有生效,是因为问题出在路径规则上,本地文件复制场景下ADD和COPY的行为完全一致,和指令本身无关。
内容的提问来源于stack exchange,提问作者spadel
相关产品推荐
相关产品推荐

