1. tensorflow简介
tensorflow 在新款 nvidia pascal gpu 上的运行速度可提升高达 50%,并且能够顺利跨 gpu 进行扩展。 如今,训练模型的时间可以从几天缩短到几小时
tensorflow 使用优化的 c++ 和 nvidia® cuda® 工具包编写,使模型能够在训练和推理时在 gpu 上运行,从而大幅提速
tensorflow gpu 支持需要多个驱动和库。为简化安装并避免库冲突,建议利用 gpu 支持的 tensorflow docker 镜像。此设置仅需要 nvidia gpu 驱动并且安装 nvidia docker。用户可以从预配置了预训练模型和 tensorflow 库支持的 ngc (nvidia gpu cloud) 中提取容器
cpu擅长逻辑控制、串行计算,而gpu擅长高强度计算、并行计算。cuda是nvidia推出用于自家gpu的并行计算框架,cudnn & tensorflow是一系列机器学习,深度学习库,用于训练机器学习、深度学习模型
2. 依赖环境准备
选取centos7.3作为基础操作系统镜像,选取适配驱动:nvidia
gpu部署预装机器
深度学习框架:cuda、cudnn、tensorflow
由于cuda、cudnn、tensorflow等机器学习、深度学习框架,依赖python3,需要在centos7.3操作系统中集成python3
3. 测试环境
server os:centos7
linux kernel:linux 3.10.0 x86_64
docker version:1.13.1
docker image:nvcr.io/nvidia/tensorflow:
23.03-tf1-py3 (v1.15版本)
cpu cores:2
docker os:ubuntu 20.04.5 lts
docker compose version:v2.20.2
nvidia gpu version:nvidia-smi 470.161.03
gpu:a10-2q
cuda version: 12.1
tensorflow version:1.15.1
python version:3.8.10
查看cpu内核数
cat /proc/cpuinfo |grep 'cpu cores'|uniq
4. centos7安装docker详细教程
当基于nvidia gpu开发的docker镜像在实际部署时,需要先安装nvidia docker。安装nvidia docker前需要先安装原生docker compose
安装docker
1. docker 要求 centos 系统的内核版本高于 3.10 ,查看本页面的前提条件来验证你的centos 版本是否支持 docker 。
通过 uname -r 命令查看你当前的内核版本
uname -r
[root@gputest ~]# uname -a
linux gputest 3.10.0-1160.90.1.el7.x86_64 #1 smp thu may 4 15:21:22 utc 2023 x86_64 x86_64 x86_64 gnu/linux
[root@gputest ~]# uname -r
3.10.0-1160.90.1.el7.x86_64
2. 使用 root 权限登录 centos 确保 yum 包更新到最新
sudo yum update
3. 卸载旧版本(如果安装过旧版本的话)
yum remove docker
docker-client
docker-client-latest
docker-common
docker-latest
docker-latest-logrotate
docker-logrotate
docker-selinux
docker-engine-selinux
docker-engine
4. 安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的
yum install -y yum-utils device-mapper-persistent-data lvm2
5. 设置yum源
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
6. 可以查看所有仓库中所有docker版本,并选择特定版本安装
yum list docker-ce --showduplicates | sort -r
7. 安装docker,版本号自选
yum install docker-ce-17.12.0.ce
8. 启动并加入开机启动
systemctl start docker
systemctl status docker
systemctl enable docker
9. 验证安装是否成功(有client和service两部分表示docker安装启动都成功了)
docker version
5. centos7安装docker compose
一个使用docker容器的应用,通常由多个容器组成。使用docker compose不再需要使用shell脚本来启动容器。compose 通过一个配置文件来管理多个docker容器,在配置文件中,所有的容器通过services来定义,然后使用docker-compose脚本来启动,停止和重启应用,和应用中的服务以及所有依赖服务的容器,非常适合组合使用多个容器进行开发的场景
1. 卸载旧版本docker compose
如果之前安装过docker compose的旧版本,可以先卸载它们:
sudo rm /usr/local/bin/docker-compose
2. 下载docker compose最新版
从docker官方网站下载docker compose最新版本的二进制文件:
sudo curl -l "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
3. 授权docker compose二进制文
授予docker compose二进制文件执行权限
sudo chmod +x /usr/local/bin/docker-compose
4. 检查docker compose版本
docker-compose --version
安装版本为
docker compose version v2.20.2
6. centos7安装nvidia-docker
依赖条件
如果使用的 tensorflow 版本大于 1.4.0,要求 cuda 9.0 以上版本
基于docker的测试环境的建立
测试环境基于docker构建,需要nvidia gpu驱动的支持(不需要安装cuda),安装好gpu驱动和docker以后,下载最新的包含tensorflow,cuda,cudnn等的image,然后就可以运行tf_cnn_benchmark了
1. 下载nvidia-docker安装包
$ wget https://github.com/nvidia/nvidia-docker/releases/download/v1.0.1/nvidia-docker-1.0.1-1.x86_64.rpm
2. 安装nvidia-docker
$ rpm -ivh nvidia-docker-1.0.1-1.x86_64.rpm
3. 启动 nvidia-docker 服务
$ sudo systemctl restart nvidia-docker
4. 执行以下命令,若结果显示 active(running) 则说明启动成功
$ systemctl status nvidia-docker.service
active: active (running) since fri 2023-07-21 11:15:45 cst; 1min ago5. 使用 nvidia-docker查看 gpu 信息
$ nvidia-docker run --rm nvidia/cuda nvidia-smi
7. 基于nvidia-docker安装tensorflow1.15版本
4.1 查看下载的镜像
[root@gputest gpu]# docker image ls
4.2 下载tensorflow v1.15.5版本的镜像
[root@gputest gpu]# docker pull nvcr.io/nvidia/tensorflow:23.03-tf1-py3 大概1.5小时
安装testflow1.0版本(向下兼容)
4.3 再次查看下载的镜像
[root@gputest gpu]# docker image ls
image id = fc14c7fdf361为上述安装的tensorflow1.15版本容器
4.4 进入tensorflow容器
nvidia-docker run --rm -it nvcr.io/nvidia/tensorflow:18.03-py3 (清除镜像)
[root@gputest ~]# nvidia-docker run -it nvcr.io/nvidia/tensorflow:23.03-tf1-py3
格式:nvidia-docker run -it {repository容器名称:tag号}
root@818d19092cdc:/gpu# pip list|grep tensor
jupyter-tensorboard 0.2.0
tensorboard 1.15.0
tensorflow 1.15.5+nv23.3
tensorflow-estimator 1.15.1
tensorrt 8.5.3.1
测试脚本:
import os
os.environ['tf_cpp_min_log_level'] = '2'
import tensorflow as tf
hello = tf.constant('--------hello, tensorflow!----------')
sess = tf.session()
sess.run(hello)
输出日志太多,可以看到上面的图有i w 分别代表info warning
设置tf_cpp_min_log_level的日志级别
机器学习,每次运行代码都会出一堆successfully opened dynamic library,还有显示各种提示,还有显卡计算信息,于是上网查了很多方法,都不行,最后发现是犯了个错。。如下,要写在import tensorflow前面
import os
os.environ['tf_cpp_min_log_level'] = '2'
import tensorflow as tf
只要写在前面就行了。。。顺序不能错 不能在 import tensorflow as tf 后面
查看云容器的操作系统
在container os中使用命令cat /proc/driver/nvidia/version或nvcc --version可正常显示显卡驱动版本及cuda版本
8. 配置git
1. 在本机生成公私钥ssh-keygen -t rsa -b 4096 -c "xx@xx.com" 默认生成的公私钥 ~/.ssh/
id_rsa.pub
id_rsa
-b 4096:b是bit的缩写
-b 指定密钥长度。对于rsa密钥,最小要求768位,默认是2048位。命令中的4096指的是rsa密钥长度为4096位。
dsa密钥必须恰好是1024位(fips 186-2 标准的要求)
generating public/private rsa key pair.
enter file in which to save the key (/users/qa/.ssh/id_rsa): yes
enter passphrase (empty for no passphrase):
enter same passphrase again:
your identification has been saved in yes.
your public key has been saved in yes.pub.
the key fingerprint is:
sha256:mgbv/xx/xx lishan12@xx.com
the key's randomart image is:
+---[rsa 4096]----+
| ...obb=eo|
| . .o+oo=o=|
| = .o*+b *o.|
| o o o+b =.. |
| s.+o . |
| . o |
| . . |
| . . |
| . |
+----[sha256]-----+
2. 配置登录git的username email。为公司给你分配的用户名 密码
第一步:
git config --global user.name 'username'
git config --global user.email 'username@xx.com'
第二步:设置永久保存
git config --global credential.helper store 复制代码
第三步:手动输入一次用户名和密码,git会自动保存密码,下次无须再次输入
git pull
3. 初始化仓库 git init
4. 拉取代码 git clone git@gitlab.xx.com:xx/xx.git
cloning into 'xx-xx'...
git@gitlab.xx.com's password:
permission denied, please try again.
git@gitlab.xx.com's password:
遇到的问题:没有出username 和 password成对的输入项 ,而是出了password输入项
都不知道密码是啥,跟登录git库的密码不一样。
然后使用http的方式,报一个错误:
use:~/ecox # git clone https://vcs.in.ww-it.cn/ecox/ecox.git
正克隆到 'ecox'...
fatal: unable to access 'https://vcs.in.ww-it.cn/ecox/ecox.git/': ssl certificate problem: unable to get local issuer certificate
提示ssl证书错误。发现说这个错误并不重要是系统证书的问题,系统判断到这个行为会造成不良影响,所以进行了阻止,只要设置跳过ssl证书验证就可以了,那么用命令 :
git config --global http.sslverify false
9. 下载benchmarks源码
从 tensorflow 的 github 仓库上下载 tensorflow benchmarks,可以通过以下命令来下载
https://github.com/tensorflow/benchmarks
我的 - settings -ssh and gpg keys 添加公钥id_rsa.pub
拉取代码 git clone git@github.com:tensorflow/benchmarks.git
git同步远程分支到本地,拉取tensorflow对应版本的分支
git fetch origin 远程分支名xxx:本地分支名xxx
使用这种方式会在本地仓库新建分支xxx,但是并不会自动切换到新建的分支xxx,需要手动checkout,当然了远程分支xxx的代码也拉取到了本地分支xxx中。采用这种方法建立的本地分支不会和远程分支建立映射关系
root@818d19092cdc:/gpu/benchmarks# git checkout -b tf1.15 origin/cnn_tf_v1.15_compatible
10. 运行不同模型
root@818d19092cdc:/gpu/benchmarks/scripts/tf_cnn_benchmarks# pwd
/gpu/benchmarks/scripts/tf_cnn_benchmarks
root@818d19092cdc:/gpu/benchmarks/scripts/tf_cnn_benchmarks# python3 tf_cnn_benchmarks.py
真实操作:
[root@gputest ~]# docker ps
进入container id containerid
[root@gputest ~]# nvidia-docker exec -it 818d19092cdc /bin/bash
新开窗口
[root@gputest ~]# nvidia-smi -l 3
该命令将3秒钟输出一次gpu的状态和性能,可以通过查看输出结果来得出gpu的性能指标
一、resnet50模型
python3 tf_cnn_benchmarks.py --num_gpus=1 --batch_size=2 --model=resnet50 --variable_update=parameter_server
running warm up
2023-07-21 09:50:55.398126: i tensorflow/stream_executor/platform/default/dso_loader.cc:50] successfully opened dynamic library libcublas.so.12
2023-07-21 09:50:55.533068: i tensorflow/stream_executor/platform/default/dso_loader.cc:50] successfully opened dynamic library libcudnn.so.8
done warm up
step img/sec total_loss
1 images/sec: 10.1 +/- 0.0 (jitter = 0.0) 7.695
10 images/sec: 10.7 +/- 0.1 (jitter = 0.1) 8.022
20 images/sec: 10.7 +/- 0.1 (jitter = 0.2) 7.269
30 images/sec: 10.7 +/- 0.1 (jitter = 0.2) 7.889
40 images/sec: 10.7 +/- 0.1 (jitter = 0.2) 8.842
50 images/sec: 10.6 +/- 0.1 (jitter = 0.2) 6.973
60 images/sec: 10.6 +/- 0.1 (jitter = 0.2) 8.124
70 images/sec: 10.6 +/- 0.0 (jitter = 0.2) 7.644
80 images/sec: 10.6 +/- 0.0 (jitter = 0.2) 7.866
90 images/sec: 10.6 +/- 0.0 (jitter = 0.3) 7.687
100 images/sec: 10.6 +/- 0.0 (jitter = 0.3) 8.779
----------------------------------------------------------------
total images/sec: 10.63
二、vgg16模型
python3 tf_cnn_benchmarks.py --num_gpus=1 --batch_size=2 --model=vgg16 --variable_update=parameter_server
由于阿里云服务器申请的是2个g显存,所以只能跑size=1 2 和 4 ,超出会吐核
已放弃(吐核)--linux 已放弃(吐核) (core dumped) 问题分析
出现这种问题一般是下面这几种情况:
1.内存越界
2.使用了非线程安全的函数
3.全局数据未加锁保护
4.非法指针
5.堆栈溢出
也就是需要检查访问的内存、资源。
可以使用 strace 命令来进行分析
在程序的运行命令前加上 strace,在程序出现:已放弃(吐核),终止运行后,就可以通过 strace 打印在控制台的跟踪信息进行分析和定位问题
方法2:docker启动普通镜像的tensorflow
$ docker pull tensorflow/tensorflow:1.8.0-gpu-py3
$ docker tag tensorflow/tensorflow:1.8.0-gpu-py3 tensorflow:1.8.0-gpu
# nvidia-docker run -it -p 8888:8888 tensorflow:1.8.0-gpu
$ nvidia-docker run -it -p 8033:8033 tensorflow:1.8.0-gpu
浏览器进入指定 url(见启动终端回显) 就可以利用 ipython notebook 使用 tensorflow
评测指标
-
训练时间:在指定数据集上训练模型达到指定精度目标所需的时间
-
吞吐:单位时间内训练的样本数
-
加速效率:加速比/设备数*100%。其中,加速比定义为多设备吞吐数较单设备的倍数
-
成本:在指定数据集上训练模型达到指定精度目标所需的价格
-
功耗:在指定数据集上训练模型达到指定精度目标所需的功耗
在初版评测指标设计中,我们重点关注训练时间、吞吐和加速效率三项
11. 保存镜像的修改
执行以下命令,保存tensorflow镜像的修改
docker commit -m "commit docker" container_id nvcr.io/nvidia/tensorflow:18.03-py3
# container_id可通过docker ps命令查看。
[root@gputest ~]# docker commit -m "commit docker" 818d19092cdc nvcr.io/nvidia/tensorflow:23.03-tf1-py3
sha256:fc14c7fdf361308817161d5d0cc018832575e7f2def99fe49876d2a41391c52c
查看docker进程
[root@gputest ~]# docker ps
进入container id containerid
[root@gputest ~]# nvidia-docker exec -it 818d19092cdc /bin/bash
12. tensorflow支持的所有参数
参数名称 | 描述 | 备注 |
--help | 查看帮助信息 |
|
--backend | 使用的框架名称,如tensorflow,pytorch等,必须指定 | 当前只支持tensorflow,后续会增加对pytorch的支持 |
--model | 使用的模型名称,如alexnet、resnet50等,必须指定 | 请查阅所有支持的模型 |
--batch_size | batch size大小 | 默认值为32 |
--num_epochs | epoch的数量 | 默认值为1 |
--num_gpus | 使用的gpu数量。设置为0时,仅使用cpu。
|
|
--data_dir | 输入数据的目录,对于cv任务,当前仅支持imagenet数据集;如果没有指定,表明使用合成数据 |
|
--do_train | 执行训练过程 | 这三个选项必须指定其中的至少一个,可以同时指定多个选项。 |
--do_eval | 执行evaluation过程 | |
--do_predict | 执行预测过程 | |
--data_format | 使用的数据格式,nchw或nhwc,默认为nchw。
|
|
--optimizer | 所使用的优化器,当前支持sgd、adam和momentum,默认为sgd |
|
--init_learning_rate | 使用的初始learning rate的值 |
|
--num_epochs_per_decay | learning rate decay的epoch间隔 | 如果设置,这两项必须同时指定 |
--learning_rate_decay_factor | 每次learning rate执行decay的因子 | |
--minimum_learning_rate | 最小的learning rate值 | 如果设置,需要同时指定面的两项 |
--momentum | momentum参数的值 | 用于设置momentum optimizer |
--adam_beta1 | adam_beta1参数的值 | 用于设置adam |
--adam_beta2 | adam_beta2参数的值 | |
--adam_epsilon | adam_epsilon参数的值 | |
--use_fp16 | 是否设置tensor的数据类型为float16 |
|
--fp16_vars | 是否将变量的数据类型设置为float16。如果没有设置,变量存储为float32类型,并在使用时转换为fp16格式。 建议:不要设置 | 必须同时设置--use_fp16 |
--all_reduce_spec | 使用的allreduce方式 |
|
--save_checkpoints_steps | 间隔多少step存储一次checkpoint |
|
--max_chkpts_to_keep | 保存的checkpoint的最大数量 |
|
--ip_list | 集群中所有机器的ip地址,以逗号分隔 | 用于多机分布式训练 |
--job_name | 任务名称,如‘ps'、’worker‘ | |
--job_index | 任务的索引,如0,1等 | |
--model_dir | checkpoint的存储目录 |
|
--init_checkpoint | 初始模型checkpoint的路径,用于在训练前加载该checkpoint,进行finetune等 |
|
--vocab_file | vocabulary文件 | 用于nlp |
--max_seq_length | 输入训练的最大长度 | 用于nlp |
--param_set | 创建和训练模型时使用的参数集。 | 用于transformer |
--blue_source | 包含text translate的源文件,用于计算bleu分数 | |
--blue_ref | 包含text translate的源文件,用于计算bleu分数 | |
--task_name | 任务的名称,如mrpc,cola等 | 用于bert |
--do_lower_case | 是否为输入文本使用小写 | |
--train_file | 训练使用的squad文件,如train-v1.1.json | 用于bert模型,运行squad, --run_squad必须指定 |
--predict_file | 预测所使用的squad文件,如dev-v1.1.json或test-v1.1.json | |
--doc_stride | 当将长文档切分为块时,块之间取的间距大小 | |
--max_query_length | 问题包含的最大token数。当问题长度超过该值时,问题将被截断到这一长度。 | |
--n_best_size | nbest_predictions.json输出文件中生成的n-best预测的总数 | |
--max_answer_length | 生成的回答的最大长度 | |
--version_2_with_negative | 如果为true,表明squad样本中含有没有答案(answer)的问题 | |
--run_squad | 如果为true,运行squad任务,否则,运行sequence (sequence-pair)分类任务 |
13. gpu机器学习调研tensorflow
1. 如何在tensorflow中指定使用gpu资源
在配置好gpu环境的tensorflow中 ,如果操作没有明确地指定运行设备,那么tensorflow会优先选择gpu。在默认情况下,tensorflow只会将运算优先放到/gpu:0上。如果需要将某些运算放到不同的gpu或者cpu上,就需要通过tf.device来手工指定
import tensorflow as tf
# 通过tf.device将运算指定到特定的设备上。
with tf.device('/cpu:0'):
a = tf.constant([1.0, 2.0, 3.0], shape=[3], name='a')
b = tf.constant([1.0, 2.0, 3.0], shape=[3], name='b')
with tf.device('/gpu:1'):
c = a + b
sess = tf.session(config=tf.configproto(log_device_placement=true))
print sess.run(c)
2. 虚拟化使用gpu的方案
通过kvm虚拟化实例使用cpu和内存等资源,gpu不参与虚拟化。不同容器共享使用物理gpu资源
3. 分布式tensorflow
#coding=utf-8
#多台机器,每台机器有一个显卡、或者多个显卡,这种训练叫做分布式训练
import tensorflow as tf
#现在假设我们有a、b、c、d四台机器,首先需要在各台机器上写一份代码,并跑起来,各机器上的代码内容大部分相同
# ,除了开始定义的时候,需要各自指定该台机器的task之外。以机器a为例子,a机器上的代码如下:
cluster=tf.train.clusterspec({
"worker": [
"a_ip:2222",#格式 ip地址:端口号,第一台机器a的ip地址 ,在代码中需要用这台机器计算的时候,就要定义:/job:worker/task:0
"b_ip:1234"#第二台机器的ip地址 /job:worker/task:1
"c_ip:2222"#第三台机器的ip地址 /job:worker/task:2
],
"ps": [
"d_ip:2222",#第四台机器的ip地址 对应到代码块:/job:ps/task:0
]})
使用分布式的tensorflow比较容易。只需在集群服务器中为 worker 节点分配带名字的ip。 然后 就可以手动或者自动为 worker 节点分配操作任务
14. gpu 显存资源监控
一个server端的外挂模块,提供任务特征到资源特征的映射数据集,方便后续预测模型构建以及对芯片资源能力的定义
利用 with tf.device("{device-name}")
这种写法,可以将with statement代码块中的变量或者op指定分配到该设备上。 在上面例子中,变量 w
和 b
就被分配到 /cpu:0
这个设备上。注意,如果一个变量被分配到一个设备上,读取这个变量也就要从这个设备读取,写入这个变量也将会写入到这个设备。 而 output
(也就是一个 tf.matmul
矩阵乘法的计算操作,跟着一个tensor的加法的计算操作),以及后面的 loss
的计算(即对 output
调用了 f
这个函数,该函数中可能还有很多逻辑,涉及很多tensor运算的op),分配给了 /gpu:0
这个设备。
基本原则:变量放到cpu,计算放到gpu。
这时,tensorflow实际上会将代码中定义的graph(计算图)分割,根据指定的device placement将图的不同部分分配到不同的设备上,并且在设备间建立通信(如dma,direct memory access)。这些都不需要在应用代码层面操作。
单机多卡
当我们在一台机器上有多个gpu可用时,要利用多个gpu,代码编写方式的示意如下:
# calculate the gradients for each model tower.
tower_grads = []
with tf.variable_scope(tf.get_variable_scope()):
for i in xrange(flags.num_gpus):
with tf.device('/gpu:%d' % i):
with tf.name_scope('%s_%d' % (cifar10.tower_name, i)) as scope:
# dequeues one batch for the gpu
image_batch, label_batch = batch_queue.dequeue()
# calculate the loss for one tower of the cifar model. this function
# constructs the entire cifar model but shares the variables across
# all towers.
loss = tower_loss(scope, image_batch, label_batch)
# reuse variables for the next tower.
tf.get_variable_scope().reuse_variables()
# retain the summaries from the final tower.
summaries = tf.get_collection(tf.graphkeys.summaries, scope)
# calculate the gradients for the batch of data on this cifar tower.
grads = opt.compute_gradients(loss)
# keep track of the gradients across all towers.
tower_grads.append(grads)
# we must calculate the mean of each gradient. note that this is the
# synchronization point across all towers.
grads = average_gradients(tower_grads)
本质上分配设备的方式和单机单卡的情况是一样的,使用同样的语法。 在上例中,假设我们有2个gpu,则代码会按照相同的逻辑定义两套操作,先后分配给名为 /gpu:0
和 /gpu:1
的两个设备。
注意:
-
tensorflow的代码中cpu和gpu的设备编号默认从0开始
-
比如我们在机器上看到有两块gpu,通过
cuda_visible_devices
环境变量进行控制,起了一个进程,只让0号gpu对其可见,再起一个进程,只让1号gpu对其可见,在两个进程的tensorflow代码中,都是通过/gpu:0
来分别指代它们可用的gpu。 -
上例属于in-graph,从tensorboard绘制的计算图中可以明显看出来(下文会有对比展示)
-
上例属于数据并行
-
上例属于同步更新
下面展示一些示例,运行的代码是以tensorflow官网指南(https://www.tensorflow.org/guide/using_gpu )为基础的,在单机2gpu的环境以multi-tower方式运行。运行过程中记录了tensorboard使用的summary
可以看到,cpu, gpu:0, gpu:1分别用三种颜色进行了标记。
100. 参考资料
如何在gpu实例上部署ngc环境?_gpu云服务器-阿里云帮助中心
搭建深度学习docker容器(2)- centos7安装nvidia-docker | luck_zy
centos7安装nvidia-docker - codeantenna
os.environ['tf_cpp_min_log_level']无效_os.environ['tf_cpp_min_log_level'] = '2'无效_yulanf的博客-csdn博客
用尽每一寸gpu,阿里云cgpu容器技术白皮书重磅发布!-阿里云开发者社区
李沐论文精读系列一: resnet、transformer、gan、bert_神洛华的博客-csdn博客
从源代码构建 | tensorflowhttps://blog.51cto.com/u_16175443/6729104
如何查看docker容器的操作系统_mob649e8156b567的技术博客_51cto博客
重要参考资料
本文大部分内容都是看了自以下几个资料再进行试验总结出来的:
-
distributed tensorflow (tensorflow官网): https://www.tensorflow.org/deploy/distributed
-
distributed tensorflow (tensorflow dev summit 2017): https://www.youtube.com/watch?v=la_m6bcv91m&index=11&list=plou2xlyxmsikgc_nboihtn2qhraji53cv
-
distributed tensorflow (tensorflow dev summit 2018): https://www.youtube.com/watch?v=-h0cwbiq8s8 (本文没有包括dev summit 2018这个talk的内容,这里面除了基本原理之外,只讲了tensorflow如何支持all reduce,但是只适用于单机多卡,并且是high level api。多机多卡的方面演讲者也只推荐了horovod这种方式。)
-
另外还有官网关于使用gpu的指南: https://www.tensorflow.org/guide/using_gpu
网上搜到有点用的博客文章很多也是这样,强烈推荐观看这段视频。
发表评论