真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

TensorFlow如何使用

這篇文章主要講解了“TensorFlow如何使用”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“TensorFlow如何使用”吧!

創(chuàng)新互聯(lián)公司是一家集網(wǎng)站建設(shè),西平企業(yè)網(wǎng)站建設(shè),西平品牌網(wǎng)站建設(shè),網(wǎng)站定制,西平網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營(yíng)銷,網(wǎng)絡(luò)優(yōu)化,西平網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競(jìng)爭(zhēng)力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長(zhǎng)自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。

Distributed TensorFlow

2016年4月TensorFlow發(fā)布了0.8版本宣布支持分布式計(jì)算,這個(gè)特性,我們稱之為Distributed TensorFlow。

這是非常重要的一個(gè)特性,因?yàn)樵贏I的世界里,訓(xùn)練數(shù)據(jù)的size通常會(huì)大到讓人瞠目結(jié)舌。比如Google Brain實(shí)驗(yàn)室今年發(fā)表的論文OUTRAGEOUSLY LARGE NEURAL NETWORKS: THE SPARSELY-GATED MIXTURE-OF-EXPERTS LAYER中提到,下圖中MOE Layer Model可以達(dá)到680億個(gè)Parameters的規(guī)模,如此復(fù)雜的模型,如果只能單機(jī)訓(xùn)練,那耗時(shí)難于接受。通過(guò)Distributed TensorFlow,可以利用眾多服務(wù)器構(gòu)建TensorFlow Cluster來(lái)提高訓(xùn)練效率。

TensorFlow如何使用

關(guān)于Distributed TensorFlow的更多內(nèi)容,請(qǐng)參考官方內(nèi)容www.tensorflow.org/deplopy/distributed,這里給出Distributed TensorFlow結(jié)構(gòu)圖:

TensorFlow如何使用

Why TensorFlow on Kubernetes

Distributed TensorFlow雖然提供了分布式能力,可以利用服務(wù)器集群加快訓(xùn)練,但是還有許多缺點(diǎn),比如資源無(wú)法隔離、PS進(jìn)程遺留問(wèn)題等等,而這些正是Kubernetes所擅長(zhǎng)的地方。下圖是總結(jié)的你需要將TensorFlow運(yùn)行在Kubernetes上的理由:

TensorFlow如何使用

對(duì)于我們來(lái)說(shuō),前期最大的用戶痛點(diǎn)就是算法團(tuán)隊(duì)使用的HDFS Read性能不及預(yù)期,經(jīng)過(guò)網(wǎng)上查找資料及我們自己簡(jiǎn)單的對(duì)比測(cè)試,發(fā)現(xiàn)GlusterFS可能是最適合我們的分布式存儲(chǔ)了。因此在我們的TensorFlow on Kubernetes項(xiàng)目中使用GlusterFS來(lái)存放訓(xùn)練數(shù)據(jù),worker將從GlusterFS中讀取訓(xùn)練數(shù)據(jù)進(jìn)行計(jì)算。

Integrated Architecture

TensorFlow如何使用

說(shuō)明:

  • 支持Between-Graph和In-Graph兩種replication場(chǎng)景;

  • PS Task通過(guò)Kubernetes Deployment來(lái)部署,Worker Task通過(guò)Kubernetes Job來(lái)部署,由Kubernetes service和KubeDNS來(lái)提供服務(wù)發(fā)現(xiàn);

  • 每個(gè)TensorFlow Cluster都會(huì)通過(guò)StorageClass來(lái)Dynamic Provision PV,事先會(huì)先創(chuàng)建好通過(guò)Heketi對(duì)接Gluster集群的StorageClass;

  • GlusterFS集群通過(guò)Heketi來(lái)暴露rest api與Kubernetes進(jìn)行交互,關(guān)于Heketi的部署,請(qǐng)參考官方文檔;

  • 每個(gè)TensorFlow Cluster會(huì)最終創(chuàng)建兩個(gè)PV,一個(gè)用來(lái)存放訓(xùn)練數(shù)據(jù)(掛載到容器內(nèi)/data,對(duì)應(yīng)TensorFlow --data_dir配置),一個(gè)用來(lái)存儲(chǔ)訓(xùn)練日志(掛載到容器內(nèi)/log,對(duì)應(yīng)TensorFlow --log_path配置);

  • 每個(gè)用戶會(huì)對(duì)應(yīng)在Kubernetes中創(chuàng)建一個(gè)namespace;

  • 會(huì)給每個(gè)用戶部署一個(gè)Jupyter Notebook Deployment和Service,Service通過(guò)NodePort暴露到集群外;

  • 有一個(gè)節(jié)點(diǎn)比較特殊,我們稱之為User Node,這個(gè)節(jié)點(diǎn)通過(guò)Taint方式,保證會(huì)運(yùn)行Pod,但是會(huì)通過(guò)kube-proxy來(lái)暴露集群內(nèi)的service,比如上面的Jupyter Notebook service將只允許在這個(gè)節(jié)點(diǎn)暴露出去;

  • User Node節(jié)點(diǎn)存放著用戶寫的python算法,并可以通過(guò)http查看和下載這些算法文件,Between-Graph場(chǎng)景下,容器啟動(dòng)后將通過(guò)curl下載這些算法文件;

  • 會(huì)給沒(méi)用用戶創(chuàng)建一個(gè)Tensorboard Deployment和Service,Serivce通過(guò)NodePort暴露到集群外(同樣只能在User Node暴露),Tensorboard Pod會(huì)掛著log PV,這樣就能得到TensorFlow Graph。

Deploy Architecture

TensorFlow如何使用

整個(gè)系統(tǒng)涉及以下核心Components:

  • TensorFlow: 1.3.0

  • Kubernetes: 1.7.4

  • Docker: 1.12.6

  • Harbor: 1.1.2

  • Contiv netplugin: 0.1-12-23-2016.19-44-42.UTC

  • Keepalived: 1.3.5

  • Haproxy:1.7.8

  • Etcd2: 2.3.7

  • Etcd3: 3.2.1

  • Glusterfs: 3.10.5

網(wǎng)絡(luò)方案:contiv netplugin + ovs + vlan.
日志方案:fluentd + Kafka + ES + Kibana.
監(jiān)控方案:cadvisor + prometheus + Grafana.

CaaS的細(xì)節(jié)不在這里討論,其實(shí)也是大家非常熟悉的方案了。

Demo

這個(gè)Demo,我改成NodePort方式暴露Jupyter Nodebook,登錄時(shí)輸入正確的token即可:

TensorFlow如何使用

這是一個(gè)In-Graph集群,點(diǎn)擊master_client.ipynb,可以看到具體的訓(xùn)練算法內(nèi)容:

TensorFlow如何使用

點(diǎn)擊執(zhí)行,可以在下面看到輸出:

TensorFlow如何使用

這只是個(gè)簡(jiǎn)單的Demo,實(shí)際使用上,自動(dòng)化生成各個(gè)ps, worker, pvc對(duì)應(yīng)的kubernetes yaml,使用域名進(jìn)行服務(wù)發(fā)現(xiàn),不然如果你使用IP的話,可能就需要利用Pod的ProStart Hook來(lái)反饋各個(gè)Task的IP了,這將比較麻煩。

Thinking

  • Q: PS進(jìn)程遺留問(wèn)題,在社區(qū)討論比較多(issue 4173),結(jié)合Kubernetes,我們可以比較簡(jiǎn)單的來(lái)做到回收PS進(jìn)程的目的。 A:在DevOps的TaaS模塊中,針對(duì)每個(gè)TensorFlow Cluster都啟動(dòng)一個(gè)協(xié)程,檢查計(jì)數(shù)器是否達(dá)到worker數(shù)量(worker是job運(yùn)行的,down了以后,watch到j(luò)ob successed,則計(jì)數(shù)器加1),如果等于worker數(shù),則表明訓(xùn)練結(jié)束,等待30s后,調(diào)用kubernetes apiserver接口將ps deployment/service刪除,達(dá)到自動(dòng)回收ps的效果;

  • Qworker是無(wú)狀態(tài)的,ps是有狀態(tài)的,而ps是無(wú)法進(jìn)行checkpoint的,如何進(jìn)行訓(xùn)練save和restore呢?
    A:worker雖然是無(wú)狀態(tài)的,但是tf.train.Saver提供能力在worker上進(jìn)行checkpoint,大概原理就是逐個(gè)從PS task中g(shù)et Parameters,并進(jìn)行save持久化。

  • Q怎么讓用戶指定ps和worker個(gè)數(shù)等少量參數(shù),自動(dòng)生成kubernetes yaml?
    A: 因?yàn)楫?dāng)前我們還沒(méi)有針對(duì)TaaS做前端Portal,所以目前是通過(guò)jinja template來(lái)自動(dòng)生成的,用戶只要指定少量參數(shù)即可生成ps和worker需要的kubernetes yaml。
    比如下面是我的一個(gè)jinja template tfcluster_template.yaml.jinja,

    	{%- set name = "imagenet" -%}
    	{%- set worker_replicas = 3 -%}
    	{%- set ps_replicas = 2 -%}
    	{%- set script = "http://xxx.xx.xx.xxx:80/imagenet/imagenet.py" -%}
    
    	{%- set image = "tensorflow/tensorflow:1.3.0" -%}
    	{%- set data_dir = "/data" -%}
    	{%- set log_dir = "/log" -%}
    	{%- set port = 2222 -%}
    	{%- set replicas = {"worker": worker_replicas, "ps": ps_replicas} -%}
    
    	{%- macro worker_hosts() -%}
    	  {%- for i in range(worker_replicas) -%}
    	    {%- if not loop.first -%},{%- endif -%}
    	    {{ name }}-worker-{{ i }}:{{ port }}
    	  {%- endfor -%}
    	{%- endmacro -%}
    
    	{%- macro ps_hosts() -%}
    	  {%- for i in range(ps_replicas) -%}
    	    {%- if not loop.first -%},{%- endif -%}
    	    {{ name }}-ps-{{ i }}:{{ port }}
    	  {%- endfor -%}
    	{%- endmacro -%}
    
    
    	{%- for job in ["worker", "ps"] -%}
    	{%- for i in range(replicas[job]) -%}
    	kind: Service
    	apiVersion: v1
    	metadata:
    	  name: {{ name }}-{{ job }}-{{ i }}
    	spec:
    	  selector:
    	    name: {{ name }}
    	    job: {{ job }}
    	    task: "{{ i }}"
    	  ports:
    	  - port: {{ port }}
    	    targetPort: 2222
    	{% if job == "worker" %}
    	---
    	kind: Job
    	apiVersion: batch/v1
    	metadata:
    	  name: {{ name }}-{{ job }}-{{ i }}
    	spec:
    	  replicas: 1
    	  template:
    	    metadata:
    	      labels:
    	        name: {{ name }}
    	        job: {{ job }}
    	        task: "{{ i }}"
    	    spec:
    	      containers:
    	      - name: {{ name }}-{{ job }}-{{ i }}
    	        image: {{ image }}
    	        ports:
    	        - containerPort: 2222
    	        command: ["/bin/sh", "-c"]
    	        args:["
    	            curl {{ script }} -o /opt/{{ name }}.py;
    	            python /opt/{{ name }}.py \
    	                   --ps_hosts={{ ps_hosts() }} \
    	                   --worker_hosts={{ worker_hosts() }} \
    	                   --job_name={{ job }} \
    	                   --task_index={{ i }} \
    	                   --log_path={{ log_dir }} \
    	                   --data_dir={{ data_dir }} ;"]
    	        volumeMounts: 
    	        - name: data
    	          mountPath: {{ data_dir }}
    	        - name: log
    	          mountPath: {{ log_dir }}
    	      restartPolicy: Never
    	      volumes:
    	        - name: data
    	          persistentVolumeClaim:
    	            claimName: {{ name }}-data-pvc
    	        - name: log
    	          persistentVolumeClaim:
    	            claimName: {{ name }}-log-pvc 
    	{% endif %}
    	{% if job == "ps" %}
    	---
    	kind: Deployment
    	apiVersion: extensions/v1beta1
    	metadata:
    	  name: {{ name }}-{{ job }}-{{ i }}
    	spec:
    	  replicas: 1
    	  template:
    	    metadata:
    	      labels:
    	        name: {{ name }}
    	        job: {{ job }}
    	        task: "{{ i }}"
    	    spec:
    	      containers:
    	      - name: {{ name }}-{{ job }}-{{ i }}
    	        image: {{ image }}
    	        ports:
    	        - containerPort: 2222
    	        command: ["/bin/sh", "-c"]
    	        args:["
    	            curl {{ script }} -o /opt/{{ name }}.py;
    	            python /opt/{{ name }}.py \
    	                   --ps_hosts={{ ps_hosts() }} \
    	                   --worker_hosts={{ worker_hosts() }} \
    	                   --job_name={{ job }} \
    	                   --task_index={{ i }} \
    	                   --log_path={{ log_dir }} ;"]
    	        volumeMounts: 
    	        - name: log
    	          mountPath: {{ log_dir }}
    	      restartPolicy: Never
    	      volumes:
    	        - name: log
    	          persistentVolumeClaim:
    	            claimName: {{ name }}-log-pvc
    	{% endif %}
    	---
    	{% endfor %}
    	{%- endfor -%}
    
    	apiVersion: v1
    	kind: PersistentVolumeClaim
    	metadata:
    	 name: {{ name }}-log-pvc
    	 annotations:
    	   volume.beta.kubernetes.io/storage-class: glusterfs
    	spec:
    	 accessModes:
    	  - ReadWriteMany
    	 resources:
    	   requests:
    	     storage: 10Gi
    	---
    	apiVersion: v1
    	kind: PersistentVolumeClaim
    	metadata:
    	 name: {{ name }}-data-pvc
    	 annotations:
    	   volume.beta.kubernetes.io/storage-class: glusterfs
    	spec:
    	 accessModes:
    	  - ReadWriteMany
    	 resources:
    	   requests:
    	     storage: 10Gi
    	---

    然后執(zhí)行python render_template.py tfcluster_template.yaml.jinja | kubectl apply -f -完成對(duì)應(yīng)的Between-Graph TensorFlow Cluster的創(chuàng)建和啟動(dòng)。

感謝各位的閱讀,以上就是“TensorFlow如何使用”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)TensorFlow如何使用這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!


分享題目:TensorFlow如何使用
URL分享:http://weahome.cn/article/goicdd.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部