SageMaker部署PyTorch模型时inference.py找不到与model_fn未识别问题
错误根源
- 压缩包目录层级错误:你大概率是直接对外层
my_model文件夹执行的压缩操作,导致tar.gz解压后第一层目录为my_model,SageMaker默认从压缩包根目录检索code文件夹和模型文件,找不到对应路径自然报inference.py不存在。 - 参数配置逻辑错误:
- 未指定
source_dir时,SageMaker默认从model_data对应压缩包根目录的code文件夹下查找entry_point指定的文件,打包层级错误会直接触发文件找不到的报错。 - 你后续将
source_dir设为模型tar包的S3路径时,SageMaker会将该压缩包单独作为代码目录解压,此时你写的model_fn无法被识别,是因为inference.py存放在压缩包的code子目录下,entry_point='inference.py'的配置无法检索到子目录内的文件,自然识别不到你定义的函数。
正确的模型制品打包规则
特别注意:不要在打包时包含外层的my_model目录,这是90%以上同类部署问题的诱因
打包时需要进入my_model文件夹内部执行压缩命令,确保压缩包解压后根目录直接存在model.pth和code文件夹,正确解压后的目录结构如下:
. ├── model.pth └── code ├── inference.py └── requirements.txt
Linux/macOS下打包命令示例:
cd my_model tar -czvf my-model.tar.gz *
将生成的my-model.tar.gz上传到S3即可。
正确的参数配置方案
根据代码存储方式不同,分为两种常用配置方案:
场景1:代码和模型一起打包在model.tar.gz中(你的场景)
无需额外指定source_dir参数,SageMaker会自动读取压缩包根目录下code文件夹内的入口文件,配置如下:
pytorch_model = PyTorchModel( model_data='s3://{bucket_name}/my_path/my-model.tar.gz', framework_version="1.8.1", py_version="py3", role=role, entry_point='inference.py' )
该配置下你在inference.py中定义的model_fn会被正常识别加载。
场景2:推理代码与模型文件分开存储
如果你的推理代码没有和模型打包在一起,才需要指定source_dir参数:
- 若
source_dir为本地代码目录路径:直接填写本地code文件夹的相对/绝对路径,entry_point='inference.py'即可,SDK会自动将代码目录打包上传到S3。 - 若
source_dir为S3上的代码压缩包路径:entry_point需要填写压缩包内inference.py的相对路径,比如inference.py在压缩包的code子目录下,就配置为entry_point='code/inference.py'。
内容的提问来源于stack exchange,提问作者payonear
相关产品推荐
相关产品推荐

