TensorFlow 基础

1.1 Tensorflow 概要

1.2 Tensorflow 编程模型简介

1.2.1 核心概念

计算图: 每一个运算操作 (operation) 作为一个节点 (node)

1
2
3
4
5
6
7
8
9
10
11
import tensorflow as tf
b = tf.Variable(tf.zeros([100]))
W = tf.Variable(tf.random_uniform([784, 100], -1, 1))
x = tf.placeholder(name='x')
relu = tf.nn.relu(tf.matmul(W, x) + b)
C = [...] # 根据 ReLU 函数结果计算 Cost
s = tf.Session()
for step in range(0, 10):
input = ...construct 100-D input array...
result = s.run(C, feed_dict={x: input})
print(step, result)

1.2.2 实现原理

单机: client, master, worker 在一台机器同一进程中

分布式: client, master, worker 在不同机器的不同进程中

从一块 GPU 训练到多块 GPU 训练只需要添加一行代码 with tf.device('/gpu:%d' % d):

1
2
3
4
5
6
7
for i in range(8):
for d in range(4):
with tf.device('/gpu:%d' % d):
input = x[i] if d is 0 else m[d-1]
m[d], c[d] = LSTMCell(input, mprev[d], cprev[d])
mprev[d] = m[d]
cprev[d] = c[d]

1.2.3 拓展功能

  • 支持自动求导: tensor $C$ 在计算图中有依赖的 tensor {$X_k$}, 则自动求出$dC/dX_k$
    [db, dW, dx] = tf.gradients(C, [b, W, x])

  • 支持单独执行子图. Tensorflow 用节点名加 port 的形式指定数据: bar:0. 调用 Session 的 Run 方法执行子图, 可以选择输入数据的映射: name:port -> tensor; 同时用户必须指定一组输出数据: name[:port]. 计算图根据输入输出调整. 下图只需要执行 a, c, f

  • 支持计算图的控制流: if-condition, while-loop
    Switch, Merge 可根据布尔值跳过某子图然后再合并结果, 实现 if-else 的功能
    Enter, Leave, NextIteration 实现循环和迭代

  • 队列 (queue) 让计算图不同节点异步地执行, 例如提前从磁盘读取下一 batch 数据, 异步计算梯度

  • 容器 (Container) 是管理长期变量的机制, 允许不同计算图不同 Session 共享值

1.2.4 性能优化

  1. 数据并行: 将 mini-batch 数据放在不同设备计算实现梯度计算并行化

  2. 模型并行: 将计算图不同部分放在不同设备上计算

  3. 流水线并行: 同一设备上并行

分享到