加载S3桶中存储的TensorFlow预训练模型报OSError问题及正确加载方法咨询
错误原因排查
- 原生
tf.keras.models.load_model默认仅支持本地文件系统路径读取,无法直接解析s3://开头的对象存储路径,会直接把该路径当作本地文件路径尝试打开,因此返回「无效参数」的OSError。 - 你提前初始化的boto3客户端凭证和TensorFlow的文件读取逻辑不互通,即使后续配置了S3读取支持,也无法复用该boto3实例的权限配置。
最优加载方案
分两种场景可选:
方案1:直接读取S3路径(适合无本地磁盘、大模型场景)
需要先安装TensorFlow IO扩展,为TensorFlow增加S3文件系统支持,代码示例:
import os import tensorflow as tf import tensorflow_io as tfio # 配置AWS凭证(如果运行环境已经绑定AWS IAM角色可省略该步骤) os.environ['AWS_ACCESS_KEY_ID'] = '你的访问密钥ID' os.environ['AWS_SECRET_ACCESS_KEY'] = '你的秘密访问密钥' os.environ['AWS_REGION'] = '桶对应的区域编码' # 直接加载S3路径下的模型 s3_model_path = 's3://bucket/gaussian/gaussian_om.model' classifier = tf.keras.models.load_model(s3_model_path, custom_objects=None, compile=True)
该方案无需下载模型到本地,读写效率更高,适合在云服务环境中使用
方案2:下载到本地临时目录加载(兼容性最佳)
直接用boto3把整个模型目录下载到本地临时目录后加载,无需额外依赖,适配所有运行环境,代码示例:
import boto3 import tempfile import os import tensorflow as tf # 初始化boto3 s3 = boto3.resource( service_name='s3', region_name='XXX', aws_access_key_id='XXXX', aws_secret_access_key='XXXXXX' ) bucket_name = 'bucket' s3_model_prefix = 'gaussian/gaussian_om.model' # 创建自动清理的临时目录存储模型 with tempfile.TemporaryDirectory() as temp_local_dir: bucket = s3.Bucket(bucket_name) # 遍历下载模型目录下所有文件 for obj in bucket.objects.filter(Prefix=s3_model_prefix): # 生成本地存储路径 relative_path = obj.key[len(s3_model_prefix):].lstrip('/') local_file_path = os.path.join(temp_local_dir, relative_path) # 跳过目录对象,创建对应文件夹 if obj.key.endswith('/'): os.makedirs(local_file_path, exist_ok=True) continue os.makedirs(os.path.dirname(local_file_path), exist_ok=True) # 下载文件到本地 bucket.download_file(obj.key, local_file_path) # 加载本地模型 classifier = tf.keras.models.load_model(temp_local_dir, custom_objects=None, compile=True)
该方案兼容性最强,不会出现文件系统协议、权限适配的异常问题
内容的提问来源于stack exchange,提问作者gm tom
相关产品推荐
相关产品推荐

