说点题外话,为啥我在看到这里的时候特别激动呢,笔者之前在开展团队内部的分布式训练平台时就遇到这个问题,我们在测试AlexNet模型时,发现多个ps上的带宽占用差别极大,原因在与AlexNet模型的最后三个全连接参数太多,造成了ps的不均衡。 上面说了下Distributed TensorFlow我特别激动的东西,之后talk的就是比较简单的了,如果在TensorFlow做分布式的job,文档里面都有,很简单,这里不提了不对,这里还必须说下TensorFlow对于容灾的一个支持。 下图是几种分布式下机器挂掉的情况:
多麻烦是吧,但是没有关系,在TensorFlow下能够自动对这些进行一个快速的恢复,只需要更改一行代码: 将模型布入生产环境 如何把训练好的模型快速部署在生产环境提供可用的服务,TensorFlow Serving就是专注在这块,我这里简单介绍下吧: 把训练好的模型提供生产环境可用的服务,通常有以下几个需求: 长期稳定服务,低时延 支持多个模型服务 支持同一模型多版本 保证计算时耗尽量小以保证一些实时性需求 mini-batching的支持,以提高效率 TensorFlow Serving的设计就是为了解决这些需求,而且TensorFlow基于gRPC,支持多种语言。 TensorFlow生态 这部分讲了如果利用TensorFlow生态结合一些流程的框架比如Spark、Hadoop等等来更好地使用TensorFlow。 1. 数据准备工作 支持的数据读取方法,从快到慢依次是: tf.Example, tf.SequenceExample对象; 原生的读取CSV,JSON的OP; 直接从Python feed数据(最简单)。 如何在其他如Hadoop, Spark上支持TFRecords(Beam原生支持) 见(github.com/tensorflow/ecosystem) 2. 集群的管理 TensorFlow支持以下多种框架: 3. 分布式存储 4. 容器支持 5. 模型导出 SavedModel: 1,TensorFlow模型的标准保存格式;2,包括以下必须的assets,比如vocabularies(不太会翻,啥意思); GraphDef: 通常在移动设备的模型保存比较通用。 移动端以及嵌入式应用 Mobile and Embedded TensorFlow Pete Warden介绍了怎么在移动设备比如安卓、IOS设备、树莓派上面怎么使用TensorFlow来做一些开发,具体的可能对移动设备程序开发的小伙伴们比较有用,有兴趣的可以去看看https://www.youtube.com/watch?v=0r9w3V923rk&index=9&list=PLOU2XLYxmsIKGc_NBoIhTn2Qhraji53cv Hands On TensorBoard 这个talk主要是介绍了TensorBoard的一些应用,很多用法以前都没有尝试过,听演讲者描述之后受益匪浅。 # Define a simple convolutional layer def conv_layer(input, channels_in, channels_out): w = tf.Variable(tf.zeros([5, 5, channels_in, channels_out])) b = tf.Variable(tf.zeros([channels_out])) conv = tf.nn.conv2d(input, w, strides=[1, 1, 1, 1], padding="SAME") act = tf.nn.relu(conv + b) return act# And a fully connected layer def fc_layer(input, channels_in, channels_out): w = tf.Variable(tf.zeros([channels_in, channels_out])) b = tf.Variable(tf.zeros([channels_out])) act = tf.nn.relu(tf.matmul(input, w) + b) return act# Setup placeholders, and reshape the data x = tf.placeholder(tf.float32, shape=[None, 784]) y = tf.placeholder(tf.float32, shape=[None, 10]) x_image = tf.reshape(x, [-1, 28, 28, 1])# Create the network conv1 = conv_layer(x_image, 1, 32) pool1 = tf.nn.max_pool(conv1, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding="SAME")conv2 = conv_layer(pooled, 32, 64) pool2 = tf.nn.max_pool(conv2, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding="SAME") flattened = tf.reshape(pool2, [-1, 7 * 7 * 64])fc1 = fc_layer(flattened, 7 * 7 * 64, 1024) logits = fc_layer(fc1, 1024, 10)# Compute cross entropy as our loss function cross_entropy = tf.reduce_mean( tf.nn.softmax_cross_entropy_with_logits(logits=logits, labels=y))# Use an AdamOptimizer to train the network train_step = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy)# compute the accuracy correct_prediction = tf.equal(tf.argmax(logits, 1), tf.argmax(y, 1)) accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))# Initialize all the variables sess.run(tf.global_variables_initializer())# Train for 2000 steps for i in range(2000): batch = mnist.train.next_batch(100)# Occasionally report accuracy if i % 500 == 0: [train_accuracy] = sess.run([accuracy], feed_dict={x: batch[0], y: batch[1]}) print("step %d, training accuracy %g" % (i, train_accuracy))# Run the training step sess.run(train_step, feed_dict={x: batch[0], y_true: batch[1]}) 很多小伙伴都写过类似的代码,构造网络,然后设定训练方式,最后输出一些基本的结果信息,如下: step 0, training accuracy 10% step 500, training accuracy 12% step 1500, training accuracy 9% step 2000, training accuracy 13% (责任编辑:本港台直播) |