TensorFlow检查点无法保存至Amazon SageMaker Notebook实例求助
解决Amazon SageMaker中TensorFlow模型检查点保存失败的问题
我一眼就发现问题所在了——你直接把S3桶名当作本地文件路径来使用了!SageMaker Notebook的本地文件系统和AWS S3是完全独立的,os.path这类本地文件操作函数根本没法直接读写S3上的内容,这就是为什么你看到打印的路径正常,但实际找不到检查点文件的核心原因。
下面是具体的修复步骤和细节解释:
1. 先将检查点保存到本地临时路径
SageMaker Notebook实例有自己的本地磁盘空间(推荐用/tmp目录,或者你的工作目录),先把检查点存到本地,之后再上传到S3。修改你的路径相关代码:
# 创建本地临时存储目录 local_out_dir = os.path.abspath(os.path.join("/tmp", "runs", timestamp)) local_checkpoint_dir = os.path.abspath(os.path.join(local_out_dir, "checkpoints")) local_checkpoint_prefix = os.path.join(local_checkpoint_dir, "model") # 确保目录存在,避免创建失败 os.makedirs(local_checkpoint_dir, exist_ok=True) # 先保存到本地文件系统 path = saver.save(sess, local_checkpoint_prefix, global_step=current_step) print("Saved model checkpoint to local path: {}\n".format(path))
2. 将本地检查点上传到S3
接下来需要把本地的检查点文件手动上传到你的S3桶里,这里提供两种常用方法:
方法一:使用SageMaker SDK(更简洁)
import sagemaker sagemaker_session = sagemaker.Session() # 把整个检查点目录上传到S3指定路径 sagemaker_session.upload_data( path=local_checkpoint_dir, bucket=bucket, key_prefix=os.path.join(prefix, "runs", timestamp, "checkpoints") ) print("Uploaded checkpoints to S3: s3://{}/{}\n".format(bucket, os.path.join(prefix, "runs", timestamp, "checkpoints")))
方法二:使用boto3(更灵活,适合自定义上传逻辑)
import boto3 s3 = boto3.client('s3') # 遍历本地检查点目录下的所有文件,逐个上传到S3 for root, dirs, files in os.walk(local_checkpoint_dir): for file in files: local_file_path = os.path.join(root, file) # 计算文件在S3中的相对路径 s3_key = os.path.join(prefix, "runs", timestamp, "checkpoints", os.path.relpath(local_file_path, local_checkpoint_dir)) s3.upload_file(local_file_path, bucket, s3_key) print("All checkpoint files uploaded to S3 successfully\n")
额外注意事项
- 如果你是在SageMaker训练任务(Training Jobs)中运行代码,可以直接用
/opt/ml/checkpoints/路径,SageMaker会自动把这个目录下的内容同步到指定的S3输出路径,但Notebook实例没有这个自动同步机制,必须手动上传。 - 确认你的Notebook实例绑定的IAM角色拥有目标S3桶的
PutObject权限,虽然你提到常规存储操作正常,但还是可以检查一下权限范围是否覆盖了当前的上传路径。
内容的提问来源于stack exchange,提问作者user1058210
相关产品推荐
相关产品推荐

