tensorflow是谷歌基于DistBelief进行研发的第二代人工智能学习系统,其命名来源于本身的运行原理。Tensor(张量)意味着N维数组,Flow(流)意味着基于数据流图的计算,TensorFlow为张量从图象的一端流动到另一端计算过程。TensorFlow是将复杂的数据结构传输至人工智能神经网中进行分析和处理过程的系统。
tensorflow可在小到一部智能手机、大到数千台数据中心服务器的各种设备上运行。本文主要探讨的是tensorflow在大规模容器上运行的一种方案。
tensorflow作为深度学习的框架,其对于数据的处理可以分为训练、验证、测试、服务几种。一般来说,训练是用指来训练模型,验证主要用以检验所训练出来的模型的正确性和是否过拟合。测试是计算黑盒数据对于训练的模型进行测试,从而评判模型的准确率。服务是指利用已经完成的训练模型提供服务。这里为了简化,将处理分为了训练和服务两种。
训练主要是指从给定训练的程序和训练数据集,用以生成训练的模型。训练完成的模型可以通过存储形成为checkpoints文件。
验证、测试、服务统统归一到服务,其主要流程是使用已有的模型,对于数据集进行处理。
tensorflow训练 in kubernetes对于tensorflow训练的支持,kubernetes可以通过创立多个pod来进行支持。tensorflow分布式可以通过制定parameters服务器(ps参数服务器)和worker服务器进行。
首先ps是整个训练集群的参数服务器,保存模型的Variable,worker是计算模型梯度的节点,得到的梯度向量会交付给ps更新模型。in-graph与between-graph对应,但两者都可以实现同步训练和异步训练,in-graph指整个集群由一个client来构建graph,并且由这个client来提交graph到集群中,其他worker只负责处理梯度计算的任务,而between-graph指的是一个集群中多个worker可以创建多个graph,但由于worker运行的代码相同因此构建的graph也相同,并且参数都保存到相同的ps中保证训练同一个模型,这样多个worker都可以构建graph和读取训练数据,适合大数据场景。同步训练和异步训练差异在于,同步训练每次更新梯度需要阻塞等待所有worker的结果,而异步训练不会有阻塞,训练的效率更高,在大数据和分布式的场景下一般使用异步训练。----TensorFlow深度学习
我使用rc创建多个ps和worker服务器。
gcr.io/tensorflow/tensorflow:latest镜像是,使用CPU进行计算。使用GPU计算的版本下文再行介绍。
[root@A01-R06-I184-22 yaml]# cat ps.yaml apiVersion: v1 kind: ReplicationController metadata: name: tensorflow-ps-rc spec: replicas: 2 selector: name: tensorflow-ps template: metadata: labels: name: tensorflow-ps role: ps spec: containers: - name: ps image: gcr.io/tensorflow/tensorflow:latest ports: - containerPort: 2222 [root@A01-R06-I184-22 yaml]# cat worker.yaml apiVersion: v1 kind: ReplicationController metadata: name: tensorflow-worker-rc spec: replicas: 2 selector: name: tensorflow-worker template: metadata: labels: name: tensorflow-worker role: worker spec: containers: - name: worker image: gcr.io/tensorflow/tensorflow:latest ports: - containerPort: 2222之后为ps和worker分别创建服务。
[root@A01-R06-I184-22 yaml]# cat ps-srv.yaml apiVersion: v1 kind: Service metadata: labels: name: tensorflow-ps role: service name: tensorflow-ps-service spec: ports: - port: 2222 targetPort: 2222 selector: name: tensorflow-ps [root@A01-R06-I184-22 yaml]# cat worker-srv.yaml apiVersion: v1 kind: Service metadata: labels: name: tensorflow-worker role: service name: tensorflow-wk-service spec: ports: - port: 2222 targetPort: 2222 selector: name: tensorflow-worker