提交 09f92203 编写于 作者: yh_cheer's avatar yh_cheer

12chapter update

上级 19acdee0
......@@ -4,7 +4,7 @@
在本章中,我们将看到如何使用TensorFlow在多个设备(CPU和GPU)上分配计算并将它们并行运行(参见图12-1)。 首先,我们会先在一台机器上的多个设备上分配计算,然后在多台机器上的多个设备上分配计算。
![1524821340342](F:\文档\GitHub\hands_on_Ml_with_Sklearn_and_TF\images\chapter_12\1.png)
![1524821340342](https://github.com/yhcheer/hands_on_Ml_with_Sklearn_and_TF/blob/yh/images/chapter_12/1.png?raw=true)
与其他神经网络框架相比,TensorFlow对分布式计算的支持是其主要亮点之一。 它使您可以完全控制如何跨设备和服务器分布(或复制)您的计算图,并且可以让您以灵活的方式并行和同步操作,以便您可以在各种并行方法之间进行选择。
......@@ -30,11 +30,11 @@
Nvidia的CUDA允许开发者使用支持CUDA的GPU进行各种计算(不仅仅是图形加速)。 Nvidia的CUDA深度神经网络库(cuDNN)是针对DNN的GPU加速原语库。 它提供了常用DNN计算的优化实现,例如激活层,归一化,前向和后向卷积以及池化(参见第13章)。 它是Nvidia Deep Learning SDK的一部分(请注意,它需要创建一个Nvidia开发者帐户才能下载它)。 TensorFlow使用CUDA和cuDNN来控制GPU卡并加速计算(见图12-2)。
![1524830422813](F:\文档\GitHub\hands_on_Ml_with_Sklearn_and_TF\images\chapter_12\2.png)
![1524830422813](https://github.com/yhcheer/hands_on_Ml_with_Sklearn_and_TF/blob/yh/images/chapter_12/2.png?raw=true)
您可以使用`nvidia-smi`命令来检查CUDA是否已正确安装。 它列出了可用的GPU卡以及每张卡上运行的进程:
![1524830581469](F:\文档\GitHub\hands_on_Ml_with_Sklearn_and_TF\images\chapter_12\2-2.png)
![1524830581469](https://github.com/yhcheer/hands_on_Ml_with_Sklearn_and_TF/blob/yh/images/chapter_12/2-2.png?raw=true)
最后,您必须安装支持GPU的TensorFlow。 如果你使用`virtualenv`创建了一个独立的环境,你首先需要激活它:
......@@ -95,7 +95,7 @@ $ CUDA_VISIBLE_DEVICES=3,2 python3 program_2.py
程序#1只会看到GPU卡0和1(分别编号为0和1),程序#2只会看到GPU卡2和3(分别编号为1和0)。 一切都会正常工作(见图12-3)。
![1524831933410](F:\文档\GitHub\hands_on_Ml_with_Sklearn_and_TF\images\chapter_12\3.png)
![1524831933410](https://github.com/yhcheer/hands_on_Ml_with_Sklearn_and_TF/blob/yh/images/chapter_12/3.png?raw=true)
另一种选择是告诉TensorFlow只抓取一小部分内存。 例如,要使TensorFlow只占用每个GPU内存的40%,您必须创建一个ConfigProto对象,将其`gpu_options.per_process_gpu_memory_fraction`选项设置为0.4,并使用以下配置创建session:
......@@ -107,11 +107,11 @@ session = tf.Session(config=config)
现在像这样的两个程序可以使用相同的GPU卡并行运行(但不是三个,因为3×0.4> 1)。 见图12-4。
![1524832121806](F:\文档\GitHub\hands_on_Ml_with_Sklearn_and_TF\images\chapter_12\4.png)
![1524832121806](https://github.com/yhcheer/hands_on_Ml_with_Sklearn_and_TF/blob/yh/images/chapter_12/4.png?raw=true)
如果在两个程序都运行时运行`nvidia-smi`命令,则应该看到每个进程占用每个卡的总RAM大约40%:
![1524832269888](F:\文档\GitHub\hands_on_Ml_with_Sklearn_and_TF\images\chapter_12\4-2.png)
![1524832269888](https://github.com/yhcheer/hands_on_Ml_with_Sklearn_and_TF/blob/yh/images/chapter_12/4-2.png?raw=true)
另一种选择是告诉TensorFlow只在需要时才抓取内存。 为此,您必须将`config.gpu_options.allow_growth`设置为True。 但是,TensorFlow一旦抓取内存就不会释放内存(以避免内存碎片),因此您可能会在一段时间后内存不足。 是否使用此选项可能难以确定,因此一般而言,您可能想要坚持之前的某个选项。
......@@ -223,7 +223,7 @@ sess.run(i.initializer) # the placer runs and falls back to /cpu:0
TensorFlow管理每个设备上的线程池以并行化操作(参见图12-5)。 这些被称为 inter-op 线程池。 有些操作具有多线程内核:它们可以使用其他线程池(每个设备一个)称为 intra-op 线程池(下面写成内部线程池)。
![1525242329728](F:\文档\GitHub\hands_on_Ml_with_Sklearn_and_TF\images\chapter_12\5.png)
![1525242329728](https://github.com/yhcheer/hands_on_Ml_with_Sklearn_and_TF/blob/yh/images/chapter_12/5.png?raw=true)
例如,在图12-5中,操作A,B和C是源操作,因此可以立即进行评估。 操作A和B放置在GPU#0上,因此它们被发送到该设备的内部线程池,并立即进行并行评估。 操作A正好有一个多线程内核; 它的计算被分成三部分,这些部分由内部线程池并行执行。 操作C转到GPU#1的内部线程池。
......@@ -262,7 +262,7 @@ z = x + y
要跨多台服务器运行图形,首先需要定义一个集群。 一个集群由一个或多个TensorFlow服务器组成,称为任务,通常分布在多台机器上(见图12-6)。 每项任务都属于一项job(下面称作业)。 作业只是一组通常具有共同作用的任务,例如跟踪模型参数(例如,参数服务器parameter server通常命名为“ps”)或执行计算(这样的作业通常被命名为“ worker”)。
![1525243820277](F:\文档\GitHub\hands_on_Ml_with_Sklearn_and_TF\images\chapter_12\6.png)
![1525243820277](https://github.com/yhcheer/hands_on_Ml_with_Sklearn_and_TF/blob/yh/images/chapter_12/6.png?raw=true)
以下集群规范定义了两个作业“ps”和“worker”,分别包含一个任务和两个任务。 在这个例子中,机器A托管着两个TensorFlow服务器(即任务),监听不同的端口:一个是“ps”作业的一部分,另一个是“worker”作业的一部分。 机器B仅托管一台TensorFlow服务器,这是“worker”作业的一部分。
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册