Google Cloud部署Flask项目加载h5模型报SavedModel不存在的OSError求助
Flask部署TF模型加载OSError的排查解决方案
该报错本质是load_model未将目标路径识别为合法的h5单文件,转而按照SavedModel目录格式校验时找不到对应配置文件触发的,按以下顺序排查即可解决:
- 第一步:确认模型文件是否真实存在于部署的运行环境中
优先在加载模型的代码前插入打印逻辑,从GCP控制台的服务日志核对输出:
如果日志中没有看到目标h5文件,检查以下配置:import os print("Current cwd:", os.getcwd()) model_path = os.path.join(os.getcwd(), 'app', 'trained_model.h5') print("Target path exists:", os.path.exists(model_path)) print("Path type:", "file" if os.path.isfile(model_path) else "directory" if os.path.isdir(model_path) else "missing") app_dir = os.path.join(os.getcwd(), 'app') if os.path.exists(app_dir): print("Files in app dir:", os.listdir(app_dir))- 项目根目录的
.gcloudignore、.dockerignore文件,是否存在误排除*.h5格式文件的规则 - Docker部署Cloud Run时,检查Dockerfile的
COPY指令,是否漏写了将h5模型文件复制到容器对应路径的规则 - App Engine部署时,检查
app.yaml配置,是否误将app目录设为静态目录导致运行时无法读取目录内的模型文件,同时确认部署日志没有出现大文件跳过上传的提示 - 如果日志显示路径类型为目录,说明本地训练保存时生成的
trained_model.h5本身就是SavedModel格式文件夹(TF新版本保存时未指定save_format='h5'很容易触发这个问题),要么重新保存为标准h5单文件,要么直接将该文件夹路径传给load_model即可。
- 项目根目录的
- 第二步:替换依赖
os.getcwd()的路径生成逻辑
GCP服务的运行启动目录经常和本地开发环境不一致,os.getcwd()获取的路径容易出现偏差,换成基于当前代码文件位置的锚定逻辑,可靠性更高:current_code_dir = os.path.dirname(os.path.abspath(__file__)) # 模型与加载代码同目录时直接拼接 model_path = os.path.join(current_code_dir, 'trained_model.h5') # 模型在app根目录、加载代码在app子目录时,向上回溯一级拼接 # model_path = os.path.join(current_code_dir, '../trained_model.h5') - 第三步:解决依赖与版本兼容问题
该报错的高频触发原因是部署环境缺少h5解析依赖,导致load_model无法识别h5格式,直接走SavedModel的校验逻辑:- 检查项目的
requirements.txt,明确添加与TensorFlow版本兼容的h5py依赖,不要依赖tensorflow包的内置传递依赖(很多GCP官方基础镜像不会预装对应版本的h5py) - 加载模型时补充参数,跳过不必要的编译校验:
model = load_model( model_path, custom_objects={'AttentionLayer' : attn_layer}, compile=False ) - 若使用TensorFlow 2.16+、Keras 3以上版本,确认模型保存时的TF版本与部署环境的版本差不超过2个大版本,跨版本差过大的h5文件可能无法被正确识别。
- 检查项目的
- 第四步:校验h5文件本身的完整性
上传过程中可能出现文件损坏、传输不完整的问题,在加载前增加文件头校验:# 标准h5文件的固定文件头为\x89HDF\r\n\x1a\n with open(model_path, 'rb') as f: file_header = f.read(8) if file_header != b'\x89HDF\r\n\x1a\n': raise ValueError("模型文件损坏,请重新上传") - 大体积模型的适配方案
如果模型文件超过100M,不建议直接打包在代码目录中部署,可将模型上传到GCS存储桶,给服务账号授予对应桶的读权限,直接从GCS路径加载模型,规避部署时的文件大小限制。
内容的提问来源于stack exchange,提问作者Nipun Ravisara
相关产品推荐
相关产品推荐

