You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Google Cloud部署Flask项目加载h5模型报SavedModel不存在的OSError求助

Flask部署TF模型加载OSError的排查解决方案

该报错本质是load_model未将目标路径识别为合法的h5单文件,转而按照SavedModel目录格式校验时找不到对应配置文件触发的,按以下顺序排查即可解决:

  • 第一步:确认模型文件是否真实存在于部署的运行环境中
    优先在加载模型的代码前插入打印逻辑,从GCP控制台的服务日志核对输出:
    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))
    
    如果日志中没有看到目标h5文件,检查以下配置:
    • 项目根目录的.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.22 17:45:04