使用 TensorFlow 构建机器学习项目中文版(三)
九、大规模运行模型 -- GPU 和服务
到目前为止,我们一直在运行在主机的主 CPU 上运行的代码。 这意味着最多使用所有不同的处理器内核(低端处理器使用 2 或 4 个内核,高级处理器使用多达 16 个内核)。
在过去的十年中,通用处理单元(GPU)已成为所有高表现计算设置中无处不在的部分。 它的大量固有并行度非常适合于高维矩阵乘法以及机器学习模型训练和运行所需的其他运算。
尽管如此,即使拥有真正强大的计算节点,也存在许多任务,即使是最强大的单个服务器也无法应对。
因此,必须开发一种训练和运行模型的分布式方法。 这是分布式 TensorFlow 的原始功能。
在本章中,您将:
- 了解如何发现 TensorFlow 可用的计算资源
- 了解如何将任务分配给计算节点中的任何不同计算单元
- 了解如何记录 GPU 操作
- 了解如何不仅在主主机中而且在许多分布式单元的集群中分布计算
TensorFlow 上的 GPU 支持
TensorFlow 对至少两种计算设备具有本机支持:CPU 和 GPU。 为此,它为支持的每种计算设备实现每个操作的一个版本:
记录设备的放置和设备能力
在尝试执行计算之前,TensorFlow 允许您记录所有可用资源。 这样,我们只能将操作应用于现有的计算类型。
查询计算能力
为了获取机器上计算元素的日志,我们可以在创建 TensorFlow 会话时使用log_device_placement标志,方法是:
python
>>>Import tensorflow as tf
>>>sess = tf.Session(config=tf.ConfigProto(log_device_placement=True))
这是命令的输出:
选择 GPU 来运行代码
此长输出主要显示了所需的不同CUDA库的加载,然后显示了名称(GRID K520)和 GPU 的计算能力。
选择用于计算的 CPU
如果我们有可用的 GPU,但仍想继续使用 CPU,则可以通过tf.Graph.device方法选择一个。
方法调用如下:
tf.Graph.device(device_name_or_function) :
该函数接收处理单元字符串,返回处理单元字符串的函数或不返回处理单元字符串,并返回分配了处理单元的上下文管理器。
如果参数是一个函数,则每个操作都将调用此函数来决定它将在哪个处理单元中执行,这是组合所有操作的有用元素。
设备命名
为了指定在指定设备时我们指的是哪个计算单元,TensorFlow 使用以下格式的简单方案:
设备 ID 格式
设备标识示例包括:
"/cpu:0":计算机的第一个 CPU"/gpu:0":您计算机的 GPU(如果有)"/gpu:1":计算机的第二个 GPU,依此类推
可用时,如果没有相反指示,则使用第一个 GPU 设备。
示例 1 -- 将操作分配给 GPU
在此示例中,我们将创建两个张量,将现有 GPU 定位为默认位置,并将在配置了 CUDA 环境的服务器上执行张量总和(您将在附录 A-库安装和其他中学习安装该张量) 提示)。
在这里,我们看到常量和求和操作都是在/gpu:0服务器上构建的。 这是因为 GPU 是可用时首选的计算设备类型。
示例 2 -- 并行计算 Pi
该示例将作为并行处理的介绍,实现 Pi 的蒙特卡洛近似。
蒙特卡洛(Monte Carlo)利用随机数序列执行近似。
为了解决这个问题,我们将抛出许多随机样本,因为我们知道圆内的样本与正方形上的样本之比与面积比相同。
随机区域计算技术
计算假设概率分布均匀,则分配的样本数与图形的面积成比例。
我们使用以下比例:
Pi 的面积比例
从上述比例,我们可以推断出圆中的样本数/正方形的样本数也是0.78。
另一个事实是,我们可以为计算生成的随机样本越多,答案就越近似。 这是在增加 GPU 数量时会给我们带来更多样本和准确率。
我们做的进一步减少是我们生成(X, Y)坐标,范围是(0..1),因此随机数生成更直接。 因此,我们需要确定样本是否属于圆的唯一标准是distance = d < 1.0(圆的半径)。
解决方案实现
该解决方案将基于 CPU。 它将管理服务器中拥有的 GPU 资源(在本例中为4),然后我们将接收结果,并进行最终的样本求和。
提示
注意:此方法的收敛速度非常慢,为O(n^1/2),但由于其简单性,将作为示例。
计算任务时间表
在上图中,我们看到了计算的并行行为,即样本生成和主要活动计数。
源代码
源代码如下:
import tensorflow as tf
import numpy as np
c = []
#Distribute the work between the GPUs
for d in ['/gpu:0', '/gpu:1', '/gpu:2', '/gpu:3']:
#Generate the random 2D samples
i=tf.constant(np.random.uniform(size=10000), shape=[5000,2])
with tf.Session() as sess:
tf.initialize_all_variables()
#Calculate the euclidean distance to the origin
distances=tf.reduce_sum(tf.pow(i,2),1)
#Sum the samples inside the circle
tempsum = sess.run(tf.reduce_sum(tf.cast(tf.greater_equal(tf.cast(1.0,tf.float64),distances),tf.float64)))
#append the current result to the results array
c.append( tempsum)
#Do the final ratio calculation on the CPU
with tf.device('/cpu:0'):
with tf.Session() as sess:
sum = tf.add_n(c)
print (sess.run(sum/20000.0)*4.0)
分布式 TensorFlow
分布式 TensorFlow 是一项补充技术,旨在轻松高效地创建计算节点集群,并以无缝方式在节点之间分配作业。
这是创建分布式计算环境以及大规模执行模型的训练和运行的标准方法,因此能够完成生产,大量数据设置中的主要任务非常重要。
技术组件
在本节中,我们将描述分布式 TensorFlow 计算设置上的所有组件,从最细粒度的任务元素到整个集群描述。
作业
作业定义了一组同类任务,通常针对解决问题领域的同一子集。
区分作业的示例有:
- 参数服务器作业,它将模型参数存储在一个单独的作业中,并负责将初始和当前参数值分配给所有分布式节点
- 工作器作业,在其中执行所有计算密集型任务
任务
任务是工作的细分,执行不同的步骤或并行的工作单元以解决其工作的问题区域,并且通常附加到单个过程中。
每个作业都有许多任务,它们由索引标识。 通常,索引为 0 的任务被视为主要任务或协调者任务。
服务器
服务器是代表专用于实现任务的一组物理设备的逻辑对象。 服务器将专门分配给一个任务。
组件概览
在下图中,我们将代表集群计算设置中的所有参与部分:
TensorFlow 集群设置元素
该图包含由ps和worker作业代表的两个作业,以及可以从客户端为其创建的 grpc 通讯通道(在附录 A 库安装和附加提示中介绍)。 对于每种作业类型,都有服务器执行不同的任务,从而解决了作业域问题的子集。
创建一个 TensorFlow 集群
分布式集群程序的第一个任务是定义和创建一个ClusterSpec对象,该对象包含真实服务器实例的地址和端口,它们将成为集群的一部分。
定义此ClusterSpec的两种主要方法是:
- 创建一个
tf.train.ClusterSpec对象,该对象指定所有群集任务 - 在创建
tf.train.Server时,传递上述ClusterSpec对象,并将本地任务与作业名称和任务索引相关联
ClusterSpec定义格式
ClusterSpec对象是使用协议缓冲区格式定义的,该格式是基于 JSON 的特殊格式。
格式如下:
{
"job1 name": [
"task0 server uri",
"task1 server uri"
...
]
...
"jobn name"[
"task0 server uri",
"task1 server uri"
]})
...
因此,这将是使用参数服务器任务服务器和三个工作者任务服务器创建集群的函数调用:
tf.train.ClusterSpec({
"worker": [
"wk0.example.com:2222",
"wk1.example.com:2222",
"wk2.example.com:2222"
],
"ps": [
"ps0.example.com:2222",
]})
创建tf.Train.Server
创建ClusterSpec之后,我们现在可以在运行时准确了解集群配置。 我们将继续创建本地服务器实例,并创建一个tf.train.Server实例:
这是一个示例服务器创建,它使用集群对象,作业名称和任务索引作为参数:
server = tf.train.Server(cluster, job_name="local", task_index=[Number of server])
集群操作 -- 将计算方法发送到任务
为了开始学习集群的操作,我们需要学习计算资源的寻址。
首先,我们假设我们已经创建了一个集群,它具有不同的作业和任务资源。 任何资源的 ID 字符串具有以下形式:
上下文管理器中资源的常规调用是with关键字,具有以下结构。
with tf.device("/job:ps/task:1"):
[Code Block]
with关键字指示在需要任务标识符时,将使用上下文管理器指令中指定的任务标识符。
下图说明了一个示例集群设置,其中包含设置的所有不同部分的地址名称:
服务器元素命名
分布式示例代码结构
此示例代码将向您显示解决集群中不同任务的程序的大致结构,特别是参数服务器和辅助作业:
#Address the Parameter Server task
with tf.device("/job:ps/task:1"):
weights = tf.Variable(...)
bias = tf.Variable(...)
#Address the Parameter Server task
with tf.device("/job:worker/task:1"):
#... Generate and train a model
layer_1 = tf.nn.relu(tf.matmul(input, weights_1) + biases_1)
logits = tf.nn.relu(tf.matmul(layer_1, weights_2) + biases_2)
train_op = ...
#Command the main task of the cluster
with tf.Session("grpc://worker1.cluster:2222") as sess:
for i in range(100):
sess.run(train_op)
示例 3 -- 分布式 Pi 计算
在此示例中,我们将更改视角,从一台具有多个计算资源的服务器变为一台具有多个资源的服务器集群。
分布式版本的执行将具有不同的设置,如下图所示:
分布式协调运行
服务器脚本
该脚本将在每个计算节点上执行,这将生成一批样本,并通过可用服务器的数量增加生成的随机数的数量。 在这种情况下,我们将使用两台服务器,并假设我们在本地主机中启动它们,并在命令行中指示索引号。 如果要在单独的节点中运行它们,则只需替换ClusterSpec定义中的本地主机地址(如果希望它更具代表性,则可以替换名称)。
该脚本的源代码如下:
import tensorflow as tf
tf.app.flags.DEFINE_string("index", "0","Server index")
FLAGS = tf.app.flags.FLAGS
print FLAGS.index
cluster = tf.train.ClusterSpec({"local": ["localhost:2222", "localhost:2223"]})
server = tf.train.Server(cluster, job_name="local", task_index=int(FLAGS.index))
server.join()
在localhost中执行此脚本的命令行如下:
python start_server.py -index=0 #Server task 0
python start_server.py -index=1 #Server task 1
这是其中一台服务器的预期输出:
单个服务器启动命令行
客户端脚本
然后,我们获得了客户端脚本,该脚本将向集群成员发送随机数创建任务,并将执行最终的 Pi 计算,几乎与 GPU 示例相同。
完整源代码
源代码如下:
import tensorflow as tf
import numpy as np
tf.app.flags.DEFINE_integer("numsamples", "100","Number of samples per server")
FLAGS = tf.app.flags.FLAGS
print ("Sample number per server: " + str(FLAGS.numsamples) )
cluster = tf.train.ClusterSpec({"local": ["localhost:2222", "localhost:2223"]})
#This is the list containing the sumation of samples on any node
c=[]
def generate_sum():
i=tf.constant(np.random.uniform(size=FLAGS.numsamples*2), shape=[FLAGS.numsamples,2])
distances=tf.reduce_sum(tf.pow(i,2),1)
return (tf.reduce_sum(tf.cast(tf.greater_equal(tf.cast(1.0,tf.float64),distances),tf.int32)))
with tf.device("/job:local/task:0"):
test1= generate_sum()
with tf.device("/job:local/task:1"):
test2= generate_sum()
#If your cluster is local, you must replace localhost by the address of the first node
with tf.Session("grpc://localhost:2222") as sess:
result = sess.run(tf.cast(test1 + test2,tf.float64)/FLAGS.numsamples*2.0)
print(result)
示例 4 -- 在集群中运行分布式模型
这个非常简单的示例将为我们提供分布式 TensorFlow 设置工作原理的示例。
在此示例中,我们将执行一个非常简单的任务,尽管如此,它仍将在机器学习过程中采取所有必需的步骤。
分布式训练集群设置
Ps Server将包含要求解的线性函数的不同参数(在本例中为x和b0),两个工作服务器将对变量进行训练,该变量将不断更新和改进。 最后一个,在协作模式下工作。
示例代码
示例代码如下:
import tensorflow as tf
import numpy as np
from sklearn.utils import shuffle
# Here we define our cluster setup via the command line
tf.app.flags.DEFINE_string("ps_hosts", "",
"Comma-separated list of hostname:port pairs")
tf.app.flags.DEFINE_string("worker_hosts", "",
"Comma-separated list of hostname:port pairs")
# Define the characteristics of the cluster node, and its task index
tf.app.flags.DEFINE_string("job_name", "", "One of 'ps', 'worker'")
tf.app.flags.DEFINE_integer("task_index", 0, "Index of task within the job")
FLAGS = tf.app.flags.FLAGS
def main(_):
ps_hosts = FLAGS.ps_hosts.split(",")
worker_hosts = FLAGS.worker_hosts.split(",")
# Create a cluster following the command line paramaters.
cluster = tf.train.ClusterSpec({"ps": ps_hosts, "worker": worker_hosts})
# Create the local task.
server = tf.train.Server(cluster,
job_name=FLAGS.job_name,
task_index=FLAGS.task_index)
if FLAGS.job_name == "ps":
server.join()
elif FLAGS.job_name == "worker":
# Assigns ops to the local worker by default.
with tf.device(tf.train.replica_device_setter(
worker_device="/job:worker/task:%d" % FLAGS.task_index,
cluster=cluster)):
#Define the training set, and the model parameters, loss function and training operation
trX = np.linspace(-1, 1, 101)
trY = 2 * trX + np.random.randn(*trX.shape) * 0.4 + 0.2 # create a y value
X = tf.placeholder("float", name="X") # create symbolic variables
Y = tf.placeholder("float", name = "Y")
def model(X, w, b):
return tf.mul(X, w) + b # We just define the line as X*w + b0
w = tf.Variable(-1.0, name="b0") # create a shared variable
b = tf.Variable(-2.0, name="b1") # create a shared variable
y_model = model(X, w, b)
loss = (tf.pow(Y-y_model, 2)) # use sqr error for cost function
global_step = tf.Variable(0)
train_op = tf.train.AdagradOptimizer(0.8).minimize(
loss, global_step=global_step)
#Create a saver, and a summary and init operation
saver = tf.train.Saver()
summary_op = tf.merge_all_summaries()
init_op = tf.initialize_all_variables()
# Create a "supervisor", which oversees the training process.
sv = tf.train.Supervisor(is_chief=(FLAGS.task_index == 0),
logdir="/tmp/train_logs",
init_op=init_op,
summary_op=summary_op,
saver=saver,
global_step=global_step,
save_model_secs=600)
# The supervisor takes care of session initialization, restoring from
# a checkpoint, and closing when done or an error occurs.
with sv.managed_session(server.target) as sess:
# Loop until the supervisor shuts down
step = 0
while not sv.should_stop() :
# Run a training step asynchronously.
# See `tf.train.SyncReplicasOptimizer` for additional details on how to
# perform *synchronous* training.
for i in range(100):
trX, trY = shuffle (trX, trY, random_state=0)
for (x, y) in zip(trX, trY):
_, step = sess.run([train_op, global_step],feed_dict={X: x, Y: y})
#Print the partial results, and the current node doing the calculation
print ("Partial result from node: " + str(FLAGS.task_index) + ", w: " + str(w.eval(session=sess))+ ", b0: " + str(b.eval(session=sess)))
# Ask for all the services to stop.
sv.stop()
if __name__ == "__main__":
tf.app.run()
在参数服务器当前主机中:
python trainer.py --ps_hosts=localhost:2222 --worker_hosts=localhost:2223,localhost:2224 --job_name=ps -task_index=0
he first
在工作器主机编号中:
python trainer.py --ps_hosts=localhost:2222 --worker_hosts=localhost:2223,localhost:2224 --job_name=worker -task_index=0
在第二个工作者主机中:
python trainer.py --ps_hosts=localhost:2222 --worker_hosts=localhost:2223,localhost:2224 --job_name=worker --task_index=1
总结
在本章中,我们回顾了 TensorFlow 工具箱中的两个主要元素,以在高表现环境中实现我们的模型,无论是在单服务器还是分布式集群环境中。
在下一章中,我们将查看有关如何在各种环境和工具下安装 TensorFlow 的详细说明。
十、库安装和其他提示
有多种安装 TensorFlow 的选项。 Google 已经为许多架构,操作系统和图形处理单元(GPU)准备了包。 尽管在 GPU 上机器学习任务的执行速度要快得多,但是两个安装选项都可用:
- CPU:它将在机器处理核心的所有处理单元中并行工作。
- GPU:此选项仅在使用多种架构之一的情况下才能使用,这些架构利用了非常强大的图形处理单元,即 NVIDIA 的 CUDA 架构。 还有许多其他架构/框架,例如 Vulkan,还没有达到成为标准的临界数量。
在本章中,您将学习:
- 如何在三种不同的操作系统(Linux,Windows 和 OSX)上安装 TensorFlow
- 如何测试安装以确保您能够运行示例,并从中开发自己的脚本
- 关于我们正在准备的其他资源,以简化您对机器学习解决方案进行编程的方式
Linux 安装
首先,我们应该放弃免责声明。 您可能知道,Linux 领域中有很多替代品,它们具有自己的特定包管理。 因此,我们选择使用 Ubuntu 16.04 发行版。 毫无疑问,它是最广泛的 Linux 发行版,此外,Ubuntu 16.04 是 LTS 版本或长期支持。 这意味着该发行版将对桌面版本提供三年的支持,对服务器版本提供五年的支持。 这意味着我们将在本书中运行的基本软件在 2021 年之前将获得支持!
注意
您可以在此链接上找到有关 LTS 含义的更多信息。
即使被认为是面向新手的发行版,Ubuntu 也为 TensorFlow 所需的所有技术提供了所有必要的支持,并且拥有最大的用户群。 因此,我们将解释该发行版所需的步骤,该步骤也将与其余基于 Debian 的发行版的发行版非常接近。
提示
在撰写本文时,TensorFlow 不支持 32 位 Linux,因此请确保以 64 位版本运行示例。
初始要求
对于 TensorFlow 的安装,您可以使用以下任一选项:
- 在云上运行的基于 AMD64 的映像
- 具有 AMD64 指令能力的计算机(通常称为 64 位处理器)
提示
在 AWS 上,非常适合的 AMI 映像是代码ami-cf68e0d8。 它可以在 CPU 上运行良好,如果需要,也可以在 GPU 图像上运行。
Ubuntu 准备(需要在任何方法之前应用)
在开发最近发布的 Ubuntu 16.04 时,我们将确保已更新到最新的包版本,并且安装了最小的 Python 环境。
让我们在命令行上执行以下指令:
$ sudo apt-get update
$ sudo apt-get upgrade -y
$ sudo apt-get install -y build-essential python-pip python-dev python-numpy swig python-dev default-jdk zip zlib1g-dev
PIP 安装方法
在本节中,我们将使用 PIP(PIP 安装包)包管理器来获取 TensorFlow 及其所有依赖项。
这是一种非常简单的方法,您只需要进行一些调整就可以正常运行 TensorFlow 安装。
CPU 版本
为了安装 TensorFlow 及其所有依赖项,我们只需要一个简单的命令行(只要我们已经实现了准备任务即可)。
因此,这是标准 Python 2.7 所需的命令行:
$ sudo pip install --upgrade https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.9.0-cp27-none-linux_x86_64.whl
然后,您将找到正在下载的不同从属包,如果未检测到问题,则会显示相应的消息:
点安装输出
测试您的安装
在安装步骤之后,我们可以做一个非常简单的测试,调用 Python 解释器,然后导入 TensorFlow 库,将两个数字定义为一个常量,并获得其总和:
$ python
>>> import tensorflow as tf
>>> a = tf.constant(2)
>>> b = tf.constant(20)
>>> print(sess.run(a + b))
GPU 支持
为了安装支持 GPU 的 TensorFlow 库,首先必须从源安装中执行 GPU 支持部分中的所有步骤。
然后您将调用:
$ sudo pip install -upgrade https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow-0.10.0rc0-cp27-none-linux_x86_64.whl
提示
预打包的 TensorFlow 有许多版本。
它们遵循以下形式:
https://storage.googleapis.com/tensorflow/linux/[processor type]/tensorflow-[version]-cp[python version]-none-linux_x86_64.whl
提示
其中[version]可以是cpu或gpu,[version]是 TensorFlow 版本(实际上是 0.11),而 Python 版本可以是 2.7、3.4 或 3.5。
Virtualenv 安装方法
在本节中,我们将使用 Virtualenv 工具说明 TensorFlow 的首选方法。
来自 Virtualenv 页面(virtualenv.pypa.io):
Virtualenv 是用于创建隔离的 Python 环境的工具。(...)它创建具有自己的安装目录的环境,该环境不与其他 Virtualenv 环境共享库(并且可以选择不访问全局安装的库) 。
通过此工具,我们将为 TensorFlow 安装简单地安装隔离的环境,而不会干扰所有其他系统库,这又不会影响我们的安装。
这些是我们将要执行的简单步骤(从 Linux 终端):
-
设置
LC_ALL变量:$ export LC_ALL=C -
从安装程序安装
virtualenvUbuntu 包:$ sudo apt-get install python-virtualenv -
安装
virtualenv包:virtualenv --system-site-packages ~/tensorflow -
然后,要使用新的 TensorFlow,您将始终需要记住激活 TensorFlow 环境:
source ~/tensorflow/bin/activate -
然后通过 PIP 安装
tensorflow包:pip install --upgrade https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.9.0-cp27-none-linux_x86_64.whl
您将能够安装在 PIP linux 安装方法中转录的所有替代官方tensorflow包。
环境测试
在这里,我们将对 TensorFlow 做一个最小的测试。
首先,我们将激活新创建的 TensorFlow 环境:
$ source ~/tensorflow/bin/activate
然后,提示将以(tensorflow)前缀更改,我们可以执行简单的代码来加载 TensorFlow,并对两个值求和:
(tensorflow) $ python
>>> import tensorflow as tf
>>> a = tf.constant(2)
>>> b = tf.constant(3)
>>> print(sess.run(a * b))
6
完成工作后,如果要返回到正常环境,可以简单地停用该环境:
(tensorflow)$ deactivate
Docker 安装方法
这种 TensorFlow 安装方法使用一种称为容器的最新操作技术。
容器在某些方面与 Virtualenv 的工作相关,在 Docker 中,您将拥有一个新的虚拟环境。 主要区别在于此虚拟化工作的级别。 它在简化的包中包含应用和所有依赖项,并且这些封装的容器可以在公共层 Docker 引擎上同时运行,而 Docker 引擎又在主机操作系统上运行。
Docker 主要架构(图片来源)
安装 Docker
首先,我们将通过apt包安装docker:
sudo apt-get install docker.io
允许 Docker 以普通用户身份运行
在此步骤中,我们创建一个 Docker 组以能够将 Docker 用作用户:
sudo groupadd docker
提示
您可能会得到错误; group 'docker' already exists。 您可以放心地忽略它。
然后,将当前用户添加到 Docker 组:
sudo usermod -aG docker [your user]
提示
此命令不应返回任何输出。
重新启动
完成此步骤后,需要重新启动才能应用更改。
测试 Docker 安装
重新启动后,您可以尝试使用命令行调用 HelloWorld Docker 示例:
$ docker run hello-world
Docker HelloWorld 容器
运行 TensorFlow 容器
然后,我们运行(如果之前未安装过,请安装)TensorFlow 二进制映像(在这种情况下为原始 CPU 二进制映像):
docker run -it -p 8888:8888 gcr.io/tensorflow/tensorflow
通过 PIP 安装 TensorFlow
安装完成后,您将看到最终的安装步骤,并且 Jupyter 笔记本开始:
注意
许多示例使用 Jupyter 笔记本格式。 为了执行和运行它们,您可以在其主页 jupyter.org 上找到有关许多架构的安装和使用的信息。
从源代码安装
现在我们来看看 TensorFlow 的最完整,对开发人员友好的安装方法。 从源代码安装将使您了解用于编译的不同工具。
安装 Git 源代码版本管理器
Git 是现有的最著名的源代码版本管理器之一,并且是 Google 选择的版本管理器,并将其代码发布在 GitHub 上。
为了下载 TensorFlow 的源代码,我们将首先安装 Git 源代码管理器:
在 Linux 中安装 Git(Ubuntu 16.04)
要在您的 Ubuntu 系统上安装 Git,请运行以下命令:
$ sudo apt-get install git
安装 Bazel 构建工具
Bazel(bazel.io)是一个构建工具,基于 Google 七年来一直使用的内部构建工具(称为 Blaze),并于 2015 年 9 月 9 日发布为 beta 版。
此外,它还用作 TensorFlow 中的主要构建工具,因此,要执行一些高级任务,需要对工具有最少的了解。
提示
与诸如 Gradle 之类的竞争项目相比,优点有所不同,主要优点是:
- 支持多种语言,例如 C++,Java,Python 等
- 支持创建 Android 和 iOS 应用,甚至 Docker 映像
- 支持使用来自许多不同来源的库,例如 GitHub,Maven 等
- 通过 API 可扩展以便添加自定义构建规则
添加 Bazel 发行版 URI 作为包源
首先,我们将 Bazel 仓库添加到可用仓库列表中,并将其各自的密钥添加到 APT 工具的配置中,该工具管理 Ubuntu 操作系统的依赖项。
$ echo "deb http://storage.googleapis.com/bazel-apt stable jdk1.8" | sudo tee /etc/apt/sources.list.d/bazel.list
$ curl https://storage.googleapis.com/bazel-apt/doc/apt-key.pub.gpg | sudo apt-key add -
挡板安装
更新和安装 Bazel
一旦安装了所有包源,就可以通过apt-get安装 Bazel:
$ sudo apt-get update && sudo apt-get install bazel
提示
此命令将安装 Java 和大量依赖项,因此可能需要一些时间来安装它。
安装 GPU 支持(可选)
本节将教我们如何在 Linux 设置中安装支持 GPU 所需的必需包。
实际上,获得 GPU 计算支持的唯一方法是通过 CUDA。
检查 nouveau NVIDIA 显卡驱动程序是否不存在。 要对此进行测试,请执行以下命令并检查是否有任何输出:
lsmod | grep nouveau
如果没有输出,请参阅安装 CUDA 系统包。如果没有输出,请执行以下命令:
$ echo -e "blacklist nouveau\nblacklist lbm-nouveau\noptions nouveau modeset=0\nalias nouveau off\nalias lbm-nouveau off\n" | sudo tee /etc/modprobe.d/blacklist-nouveau.conf
$ echo options nouveau modeset=0 | sudo tee -a /etc/modprobe.d/nouveau-kms.conf
$ sudo update-initramfs -u
$ sudo reboot (a reboot will occur)
安装 CUDA 系统包
第一步是从仓库中安装所需的包:
sudo apt-get install -y linux-source linux-headers-`uname -r`
nvidia-graphics-drivers-361
nvidia-cuda-dev
sudo apt install nvidia-cuda-toolkit
sudo apt-get install libcupti-dev
提示
如果要在云映像上安装 CUDA,则应在以下命令阻止之前运行此命令:
sudo apt-get install linux-image-extra-virtual
创建替代位置
当前的 TensorFlow 安装配置期望非常严格的结构,因此我们必须在文件系统上准备类似的结构。
这是我们将需要运行的命令:
sudo mkdir /usr/local/cuda
cd /usr/local/cuda
sudo ln -s /usr/lib/x86_64-linux-gnu/ lib64
sudo ln -s /usr/include/ include
sudo ln -s /usr/bin/ bin
sudo ln -s /usr/lib/x86_64-linux-gnu/ nvvm
sudo mkdir -p extras/CUPTI
cd extras/CUPTI
sudo ln -s /usr/lib/x86_64-linux-gnu/ lib64
sudo ln -s /usr/include/ include
sudo ln -s /usr/include/cuda.h /usr/local/cuda/include/cuda.h
sudo ln -s /usr/include/cublas.h /usr/local/cuda/include/cublas.h
sudo ln -s /usr/include/cudnn.h /usr/local/cuda/include/cudnn.h
sudo ln -s /usr/include/cupti.h /usr/local/cuda/extras/CUPTI/include/cupti.h
sudo ln -s /usr/lib/x86_64-linux-gnu/libcudart_static.a /usr/local/cuda/lib64/libcudart_static.a
sudo ln -s /usr/lib/x86_64-linux-gnu/libcublas.so /usr/local/cuda/lib64/libcublas.so
sudo ln -s /usr/lib/x86_64-linux-gnu/libcudart.so /usr/local/cuda/lib64/libcudart.so
sudo ln -s /usr/lib/x86_64-linux-gnu/libcudnn.so /usr/local/cuda/lib64/libcudnn.so
sudo ln -s /usr/lib/x86_64-linux-gnu/libcufft.so /usr/local/cuda/lib64/libcufft.so
sudo ln -s /usr/lib/x86_64-linux-gnu/libcupti.so /usr/local/cuda/extras/CUPTI/lib64/libcupti.so
安装 cuDNN
TensorFlow 使用附加的 cuDNN 包来加速深度神经网络操作。
然后,我们将下载cudnn包:
$ wget http://developer.download.nvidia.com/compute/redist/cudnn/v5/cudnn-7.5-linux-x64-v5.0-ga.tgz
然后,我们需要解压缩包并链接它们:
$ sudo cp cuda/lib64/libcudnn* /usr/local/cuda/lib64
$ sudo cp cuda/include/cudnn.h /usr/local/cuda/include/
克隆 TensorFlow 源
最后,我们完成了获取 TensorFlow 源代码的任务。
获得它就像执行以下命令一样容易:
$ git clone https://github.com/tensorflow/tensorflow
Git 安装
配置 TensorFlow 构建
然后我们访问tensorflow主目录:
$ cd tensorflow
然后我们只需运行configure脚本:
$ ./configure
在下图中,您可以看到大多数问题的答案(它们几乎都是输入的,是的)
CUDA 配置
因此,我们现在准备着手进行库的建设。
提示
如果要在 AWS 上安装它,则必须执行修改后的行:
TF_UNOFFICIAL_SETTING=1 ./configure
构建 TensorFlow
在完成所有准备步骤之后,我们将最终编译 TensorFlow。 以下几行可能引起您的注意,因为它涉及到教程。 我们构建示例的原因是它包含基础安装,并提供了一种测试安装是否有效的方法。
运行以下命令:
$ bazel build -c opt --config=cuda //tensorflow/cc:tutorials_example_trainer
测试安装
现在该测试安装了。 在主tensorflow安装目录中,只需执行以下命令:
$ bazel-bin/tensorflow/cc/tutorials_example_trainer --use_gpu
这是命令输出的示例表示:
TensorFlow GPU 测试
Windows 安装
现在轮到 Windows 操作系统了。 首先,我们必须说这不是 TensorFlow 生态系统的首选,但是我们绝对可以使用 Windows 操作系统进行开发。
经典 Docker 工具箱方法
此方法使用经典的工具箱方法,该方法可用于大多数最新的 Windows 版本(从 Windows 7 开始,始终使用 64 位操作系统)。
提示
为了使 Docker(特别是 VirtualBox)正常工作,您需要安装 VT-X 扩展。 这是您需要在 BIOS 级别执行的任务。
安装步骤
在这里,我们将列出在 Windows 中通过 Docker 安装tensorflow所需的不同步骤。
下载 Docker 工具箱安装程序
安装程序的当前 URL 位于此链接。
执行安装程序后,我们将看到第一个安装屏幕:
Docker 工具箱第一个安装屏幕
Docker 工具箱安装程序路径选择器
然后,选择安装中需要的所有组件:
Docker 工具箱包选择屏幕
完成各种安装操作后,我们的 Docker 安装将准备就绪:
Docker 工具箱安装最终屏幕
创建 Docker 机器
为了创建初始机器,我们将在 Docker 终端中执行以下命令:
docker-machine create vdocker -d virtualbox
Docker 初始映像安装
然后,在命令窗口中,键入以下内容:
FOR /f "tokens=*" %i IN ('docker-machine env --shell cmd vdocker') DO %i docker run -it b.gcr.io/tensorflow/tensorflow
这将打印并读取运行最近创建的虚拟机所需的许多变量。
最后,要安装tensorflow容器,请像在 Linux 控制台上一样从同一控制台进行操作:
docker run -it -p 8888:8888 gcr.io/tensorflow/tensorflow
提示
如果您不想执行 Jupyter,但想直接启动到控制台,则可以通过以下方式运行 Docker 映像:
run -it -p 8888:8888 gcr.io/tensorflow/tensorflow bash
MacOSX 安装
现在转到在 MacOSX 上进行安装。安装过程与 Linux 非常相似。 它们基于 OSX El Capitan 版本。 我们还将参考不支持 GPU 的 2.7 版 Python。
安装要求安装用户具有sudo特权。
安装 PIP
在此步骤中,我们将使用easy_install包管理器安装 PIP 包管理器,该包管理器包含在安装工具 Python 包中,并且默认情况下包含在操作系统中。
对于此安装,我们将在终端中执行以下操作:
$ sudo easy_install pip
然后,我们将安装六个模块,这是一个兼容性模块,可帮助 Python 2 程序支持 Python 3 编程:
要安装six,我们执行以下命令:
sudo easy_install --upgrade six
在安装six包之后,我们通过执行以下命令来继续安装tensorflow包:
sudo pip install -ignore-packages six https://storage.googleapis.com/tensorflow/mac/cpu/tensorflow-0.10.0-py2-none-any.whl
然后我们调整numpy包的路径,这在 El Capitan 中是必需的:
sudo easy_install numpy
现在我们准备导入tensorflow模块并运行一些简单的示例:
总结
在本章中,我们回顾了可以执行 TensorFlow 安装的一些主要方法。
即使可能性是有限的,每个月左右我们都会看到支持新的架构或处理器,因此我们只能期望该技术的应用领域越来越多。