在英特尔® 架构上训练和使用 TensorFlow* 模型

简介

TensorFlow* 是一款领先的深度学习和机器学习框架。截至 2017 年 5 月,该框架集成了面向英特尔® 至强® 处理器和英特尔® 至强融核™ 处理器的多项优化。本文是教程系列的第三部分,旨在提供相关信息帮助开发人员通过 GitHub* 存储库中可用的资源构建、安装和探索使用在英特尔® 架构上优化的 TensorFlow*。

本系列的第一篇教程在英特尔® 架构上构建和安装 TensorFlow* 展示了如何通过 GitHub* 存储库中的可用资源构建和安装在英特尔® 架构上优化的 TensorFlow。

本系列的第二篇教程在英特尔® 架构上构建和安装 TensorFlow Serving 介绍了如何构建和安装 TensorFlow Serving — 专为生产环境设计的高性能机器学习服务系统。

在本教程中,我们将训练和保存 TensorFlow 模型,构建 TensorFlow 模型服务器,并通过客户端应用测试该服务器。本教程基于 TensorFlow 网站提供的教程 面向 ML 新手的 MNIST 服务 TensorFlow 模型。建议大家在完全了解如何训练和保存 TensorFlow 模型之间,查看这些教程。

训练和保存 MNIST 模型

根据维基百科介绍,MNIST (Modified National Institute of Standards and Technology) 数据库包含 60,000 张训练图像和 10,000 张测试图像,用于机器学习领域的训练与测试。因为 MNIST 数据库相对比较简单,因此经常被用作演示机器学习框架的基础数据集。

首先打开终端,使用以下命令:

cd ~/serving
bazel build //tensorflow_serving/example:mnist_saved_model
rm -rf /tmp/mnist_model
bazel-bin/tensorflow_serving/example/mnist_saved_model /tmp/mnist_model

故障排除:编写时,TensorFlow Serving 存储库识别了一个记录为 “NotFoundError in mnist_export example #421” 的错误。如果使用上述命令后遇到该错误,可尝试以下解决方法:

  1. 打开 serving bazel-bin/tensorflow_serving/example/mnist_saved_model.runfiles/ org_tensorflow/tensorflow/contrib/image/__init__.py
  2. 添加注释 (#),如下所示:
    #from tensorflow.contrib.image.python.ops.single_image_random_dot_stereograms import single_image_random_dot_stereograms
  3. 保存并关闭 __init__.py
  4. 尝试重新发布命令:
    bazel-bin/tensorflow_serving/example/mnist_saved_model /tmp/mnist_model

由于运行 mnist_saved_model 时我们省略了 training_iterations 和 model_version command-line 参数,因此它们分别默认为 1000 和 1。因为我们为导出目录传递了 /tmp/mnist_model,因此训练的模型保存在 /tmp/mnist_model/1中。

根据 TensorFlow 教程文档中的解释,“1” 版子目录包含以下文件:

  • saved_model.pb 为序列化 tensorflow::SavedModel。它包含关于该模型的一个或多个图表定义,以及模型的元数据,比如签名。
  • variables 是保留序列化图表变量的文件。

故障排除:在部分实例中可能会遇到脚本运行下载的培训文件被破坏的问题。 该错误在 GitHub 上定义为 "Not a gzipped file #170"。如有必要,可通过 /tmp 目录中的以下命令,手动下载这些文件:

wget http://yann.lecun.com/exdb/mnist/train-images-idx3-ubyte.gz
wget http://yann.lecun.com/exdb/mnist/train-labels-idx1-ubyte.gz
wget http://yann.lecun.com/exdb/mnist/t10k-images-idx3-ubyte.gz
wget http://yann.lecun.com/exdb/mnist/t10k-labels-idx1-ubyte.gz

构建和启动 TensorFlow 模型服务器

使用以下命令,构建 TensorFlow 模型服务器:

bazel build //tensorflow_serving/model_servers:tensorflow_model_server

使用以下命令,启动 TensorFlow 模型服务器:

bazel-bin/tensorflow_serving/model_servers/tensorflow_model_server --port=9000 --model_name=mnist --model_base_path=/tmp/mnist_model/ &

测试 TensorFlow 模型服务器

最后一条命令开始在终端中运行 ModelServer。为了使用安装 TensorFlow Serving 中的 mnist_client 实用程序测试服务器,输入 /serving 目录中的以下命令:

bazel build //tensorflow_serving/example:mnist_client
bazel-bin/tensorflow_serving/example/mnist_client --num_tests=1000 --server=localhost:9000

如果一切运行良好,将出现如下图 1 所示的结果。

Screenshot of a command prompt window with client test results

图 1.TensorFlow 客户端测试结果。

故障排除:GitHub 上有一个定义为 “gRPC doesn't respect the no_proxy environment variable” 的错误,会导致客户端应用运行时出现 “Endpoint read failed” 错误。使用 env 命令查看是否设置了 http_proxy 环境变量。如果设置了,可通过以下命令暂时不设置:

unset http_proxy

总结

在本系列教程中,我们介绍了如何构建 TensorFlow 机器学习框架和 TensorFlow Serving — 专为生产环境设计的高性能机器学习服务系统。训练和保存基于 MNIST 数据集的简单模型,然后使用 TensorFlow 模型服务器部署该模型。最后,使用 GitHub 存储库中的 mnist_client 示例演示客户端应用如何运用 TensorFlow 模型服务器执行机器学习参考。

如欲了解更多有关该主题的信息,请访问TensorFlow 网站,它是了解该框架的主要资料来源。文章 TensorFlow 基于现代英特尔® 架构的优化 介绍了具体的图形优化、性能试验,以及借助 CPU 优化构建和安装 TensorFlow 的详细信息。

有关编译器优化的更完整信息,请参阅优化通知