在不同机器上训练后,使用Docker部署tensorflow/serving时遇到的问题和解决方案

87次阅读
没有评论

问题描述

正在遵循Coursera上的《TensorFlow Serving with Docker for Model Deployment》课程,该课程要求首先训练一个简单的Tensorflow模型,并将其导出为Protobuf格式。接着,使用Docker和tensorflow/serving镜像进行部署,具体命令如下:

docker run -p 8500:8500 \
  -p 8501:8501 \
  --mount type=bind,\
  source=/path/amazon_review/,\
  target=/models/amazon_review \
  -e MODEL_NAME=amazon_review \
  -t tensorflow/serving

在训练和部署在同一台机器上时一切运行正常。然而,当用户在课程的机器上训练模型,然后尝试在自己的Amazon EC2实例上部署时,部署失败并出现以下错误。完整的错误信息可以在这里找到。

2021-09-22 18:58:19.959241: E tensorflow_serving/util/retrier.cc:37] Loading servable: {name: amazon_review version: 1631554979} failed: Data loss: file is too short to be an sstable         [[{{node RestoreV2}}]]

需要注意的是,这个错误与部署本身无关,而是与加载保存的模型有关。

解决方案

请注意以下操作注意版本差异及修改前做好备份。

更新模型文件

首先,尝试将训练好的模型重新导出为Protobuf格式。确保导出的模型文件在EC2实例上可访问。

检查模型文件完整性

出现“Data loss: file is too short to be an sstable”的错误可能是由于模型文件损坏或不完整引起的。在将模型文件传输到EC2实例之前,可以通过检查模型文件的完整性来避免此问题。

文件权限和路径检查

确保在EC2实例上指定的模型路径和文件具有正确的权限和路径。如果模型文件在部署容器内挂载的目录中,容器需要有足够的权限来读取这些文件。同时,也要确保路径的大小写匹配,以免出现路径错误的问题。

配置EC2实例网络

如果EC2实例位于私有子网中,确保网络配置正确,以允许容器访问外部网络资源(如Docker Hub镜像)。如果需要,可以调整网络配置以允许容器访问所需的资源。

检查TensorFlow版本

确保在训练和部署时使用相同版本的TensorFlow。TensorFlow版本不一致可能导致加载模型时的问题。可以使用以下命令检查TensorFlow版本:

import tensorflow as tf
print(tf.__version__)

使用迁移学习

如果以上方法仍然无法解决问题,可以考虑使用迁移学习的方法。在本地机器上训练模型,然后将训练好的模型文件迁移到EC2实例进行部署。

启动日志和排查

尝试获取更多详细的错误信息,以帮助确定问题的根本原因。可以查看Docker容器的启动日志以及TensorFlow的详细日志,以便更好地排查问题。

请根据实际情况逐步尝试上述解决方案,以解决部署过程中遇到的问题。如果问题仍然存在,您还可以在相关的社区论坛或技术支持平台上寻求帮助,以获取更多专业意见。

正文完