系列文章目录:

  • Tensorflow2.0 介绍

    • Tensorflow 常见基本概念

    • 从1.x 到2.0 的变化

    • Tensorflow2.0 的架构

  • Tensorflow2.0 的安装(CPU和GPU)

  • Tensorflow2.0 使用

    • “tf.data” API

    • “tf.keras”API

  • 使用GPU加速

    • 安装配置GPU环境

    • 使用Tensorflow-GPU

4 使用GPU加速

4.1 安装配置GPU环境

1. 安装GPU版TF

在2.2节中我们已经安装了CPU版的TensorFlow,为了使用GPU来加速计算,我们必须安装GPU版的TensorFlow。这里我们可以直接使用pip命令来安装:

apip install tensorflow-gpu==2.0.0-alpha0

安装完成后我们后我们可以查看一下当前可用的GPU:

from tensorflow.python.client import device_lib

def get_available_gpus():
local_device_protos = device_lib.list_local_devices()
return [x.name for x in local_device_protos if x.device_type == 'GPU']
print(get_available_gpus())

由于作者的机器上有两块GPU,所以输出两块GPU的编号:“[‘/device:GPU:0’, ‘/device:GPU:1’]”。

2. 安装显卡驱动

根据你的显卡型号到官网(https://www.nvidia.cn/Download/index.aspx?lang=cn)下载对应的驱动。我的服务器上有两块Tesla P100的显卡,如图1所示选择对应的驱动程序。这里一定要注意选择正确的版本,要和你的显卡版本、操作系统版本以及想要安装的CUDA版本一一对应(关于TensorFlow与CUDA的版本对应关系,在后面CUDA的安装部分有说明)。

图1 NVIDA驱动下载列表

点击搜索,如图2所示,点击下载即可。

图2 NVIDA驱动下载提示

安装完成之后可以使用“nvidia-smi”命令查看显卡,如图3所示是我的服务器上的两块显卡。

图3 作者机器上的两块显卡的信息

3. 安装CUDA

在安装CUDA之前,我们一定要先搞清楚TensorFlow各个版本与CUDA版本的对应关系。在TensorFlow官网有相似的说明(https://tensorflow.google.cn/install/source),其中Linux系统环境下TensorFlow GPU版本与CUDA版本的对应关系如图4所示。

图4 TensorFlow与CUDA的版本对应关系

作者在撰写本章内容时的时间是2019年的3月,TensorFlow2.0的Alpha版上周才发布,因此这里还没有显示出TensorFlow2.0-GPU的信息。不过TensorFlow的官网有说明,如图5所示。

图5 TensorFlow2.0 GPU版依赖的NVIDA软件包

TensorFlow-GPU的2.0.0-alpha版对应的NVIDA驱动版本、CUDA版本、cuDNN的版本号如图5所示。

(1)下载CUDA

首先我们到NVIDIA官网(https://developer.nvidia.com/cuda-toolkit)下载CUDA。作者在撰写本节内容时,CUDA的最新版本是10.1版本,这里再次提醒读者,一定要按照TensorFlow官网的说明下载10.0版本,否则安装好后TensorFlow是不能正常运行的。

图6 选择对应的CUDA版本

如图6所示,选择对应系统环境的CUDA版本,点击下载。

(2)安装CUDA

CUDA下载页面有安装指引,如图7所示。

图7 CUDA的安装步骤

第一步:执行安装命令

sudo dpkg -i cuda-repo-ubuntu1604-10-0-local-10.0.130-410.48_1.0-1_amd64.deb

第二步:添加kay

sudo apt-key add /var/cuda-repo-10-0-local-10.0.130-410.48/7fa2af80.pubupdate

第三步:依次执行

sudo apt-get update
sudo apt-get install cuda-10.0

安装完成后,在“/usr/local”目录下会生成“cuda”和“cuda-10.0”两个文件夹,如图8所示,我们可以使用命令“cat/usr/local/cuda/version.txt”查看CUDA版本。

注意不要使用“sudo apt-getinstall cuda”,这样默认安装的是最新版,所以一定要指定版本。

图8 查看CUDA版本

第四步:设置环境变量

打开“~/.bashrc”文件,在文件的最后最后添加如下内容:

export PATH=/usr/local/cuda-10.0/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda-10.0/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}

第五步:验证安装是否成功在终端执行命令“source ~/.bashrc”让环境变量生效。

1.进入目录“/usr/local/cuda-10.0/samples/1_Utilities/deviceQuery”中打开终端;

2.终端下执行编译命令:sudo make

3.然后执行命令:./deviceQuery,可以看到两块GPU的信息

如图9所示,检测到作者的两块显卡,图中是其中一块显卡的信息。到这里CUDA已经安装完成了。

图9 显卡的信息

4.安装cuDNN

(1)下载(https://developer.nvidia.com/rdp/cudnn-download)

这里一定要下载与CUDA10.0对应的版本。下载CNDNN需要登录NVIDIA账号,没有的话,可以按照提示创建一个账号。

图10 cuDNN与CUDA的版本对应关系

选择好cuDNN版本后,点击下载“cuDNN Library for Linux”,如图11所示。

图11 cuDNN下载列表

(2)安装

第一步:解压文件

使用“tar”命令解压文件:

tar zxvf cudnn-10.0-linux-x64-v7.5.0.56.tgz

第二步:拷贝文件,并修改文件权限

sudo cp cuda/include/cudnn.h /usr/local/cuda/include
sudo cp cuda/lib64/libcudnn* /usr/local/cuda/lib64
sudo chmod a+r /usr/local/cuda/include/cudnn.h /usr/local/cuda/lib64/libcudnn*

到这里TensorFlow2.0的GPU版就安装配置完成了。

4.2 使用TensorFlow-GPU

如果我们的机器上安装配置好了GPU版的TensorFlow,那么运行的时候TensorFlow会自行去选择可用的GPU。我们也可以通过“os.environ["CUDA_VISIBLE_DEVICES"]”来选择我们要使用的GPU:

import tensorflow as tf
import os
# 选择编号为0的GPU
os.environ["CUDA_VISIBLE_DEVICES"] = "0"
# 创建模型
model = tf.keras.Sequential()
model.add(layers.Dense(16, activation='relu', input_shape=(10,)))
model.add(layers.Dense(1, activation='sigmoid'))
# 设置目标函数和学习率
optimizer = tf.keras.optimizers.SGD(0.2)
# 编译模型
model.compile(loss='binary_crossentropy', optimizer=optimizer)
# 输出模型概况
model.summary()

代码中我们选择了编号为“0”的这个GPU,执行完上面的这段代码后我们使用命令“nvidia-smi”来查看一下GPU的占用情况,如图12所示,编号为“0”的GPU正在被占用。我们可以将代码中的“0”改为“1”来使用另一个GPU。

图12 查看GPU占用情况

如果我们希望使用多块GPU,例如同时使用“0”、“1”两块GPU,可以设置“os.environ["CUDA_VISIBLE_DEVICES"]= "0,1"”,除此之外我们还可以使用TensorFlow为“tf.keras”提供的分布式训练策略“tf.distribute.MirroredStrategy”来实现单机环境下的多GPU训练:

import tensorflow as tf
from tensorflow.keras import layers strategy = tf.distribute.MirroredStrategy() # 优化器以及模型的构建和编译必须嵌套在“scope()”中
with strategy.scope():
model = tf.keras.Sequential()
model.add(layers.Dense(16, activation='relu', input_shape=(10,)))
model.add(layers.Dense(1, activation='sigmoid')) optimizer = tf.keras.optimizers.SGD(0.2)
model.compile(loss='binary_crossentropy', optimizer=optimizer) model.summary()

小结

在本章中我们介绍了TensorFlow的一些基本概念以及基本的使用方法,本章内容旨在帮助读者快速的入门TensorFlow。后面章节的内容会围绕着深度神经网络展开,通过一些实战项目我们会加深对TensorFlow的了解和掌握,并能够使用TensorFlow搭建相应的神经网络模型,解决实际的问题。

欢迎关注磐创博客资源汇总站:

http://docs.panchuang.net/

欢迎关注PyTorch官方中文教程站:

http://pytorch.panchuang.net/

一文上手Tensorflow2.0(四)的更多相关文章

  1. 一文上手TensorFlow2.0(一)

    目录: Tensorflow2.0 介绍 Tensorflow 常见基本概念 从1.x 到2.0 的变化 Tensorflow2.0 的架构 Tensorflow2.0 的安装(CPU和GPU) Te ...

  2. 一文上手Tensorflow2.0之tf.keras(三)

    系列文章目录: Tensorflow2.0 介绍 Tensorflow 常见基本概念 从1.x 到2.0 的变化 Tensorflow2.0 的架构 Tensorflow2.0 的安装(CPU和GPU ...

  3. 『TensorFlow2.0正式版』TF2.0+Keras速成教程·零:开篇简介与环境准备

    此篇教程参考自TensorFlow 2.0 + Keras Crash Course,在原文的基础上进行了适当的总结与改编,以适应于国内开发者的理解与使用,水平有限,如果写的不对的地方欢迎大家评论指出 ...

  4. IdentityServer4实现Oauth2.0四种模式之隐藏模式

      接上一篇:IdentityServer4实现OAuth2.0四种模式之密码模式,密码模式将用户的密码暴露给了客户端,这无疑是不安全的,隐藏模式可以解决这个问题,由用户自己在IdentityServ ...

  5. IdentityServer4实现OAuth2.0四种模式之授权码模式

    接上一篇:IdentityServer4实现OAuth2.0四种模式之隐藏模式 授权码模式隐藏码模式最大不同是授权码模式不直接返回token,而是先返回一个授权码,然后再根据这个授权码去请求token ...

  6. 【tensorflow2.0】处理时间序列数据

    国内的新冠肺炎疫情从发现至今已经持续3个多月了,这场起源于吃野味的灾难给大家的生活造成了诸多方面的影响. 有的同学是收入上的,有的同学是感情上的,有的同学是心理上的,还有的同学是体重上的. 那么国内的 ...

  7. _00024 尼娜抹微笑伊拉克_云计算ClouderaManager以及CHD5.1.0群集部署安装文档V1.0

    笔者博文:妳那伊抹微笑 itdog8 地址链接 : http://www.itdog8.com(个人链接) 博客地址:http://blog.csdn.net/u012185296 博文标题:_000 ...

  8. 基于tensorflow2.0 使用tf.keras实现Fashion MNIST

    本次使用的是2.0测试版,正式版估计会很快就上线了 tf2好像更新了蛮多东西 虽然教程不多 还是找了个试试 的确简单不少,但是还是比较喜欢现在这种写法 老样子先导入库 import tensorflo ...

  9. Google工程师亲授 Tensorflow2.0-入门到进阶

    第1章 Tensorfow简介与环境搭建 本门课程的入门章节,简要介绍了tensorflow是什么,详细介绍了Tensorflow历史版本变迁以及tensorflow的架构和强大特性.并在Tensor ...

随机推荐

  1. 最近做的一个Spring Boot小项目,欢迎大家访问 http://39.97.115.152/

    最近做的一个Spring Boot小项目,欢迎大家访问 http://39.97.115.152/,帮忙找找bug,网站里有源码地址 网站说明 甲壳虫社区(Beetle Community) 一个开源 ...

  2. Python神经网络编程笔记

    神经元 想一想便知道,当一个人捏你一下以至于你会痛得叫起来的力度便是神经元的阈值,而我们构建的时候也是把这种现象抽象成一个函数,叫作激活函数. 而这里便是我们使用sigmoid函数的原因,它是一个很简 ...

  3. CSS单位计算总结

    CSS单位总结 公共部分css body { background-color: #000; color: skyblue; margin: 0; padding: 0; } body>div& ...

  4. 处理公共CDN突然失效的情况

    公共CDN的使用 刚开始开发我的博客时,使用的bootcdn,发现他们被黑过,虽然想骂那些“黑客”,但是我们也没办法去防范,只能从自己的网站上入手解决. 那时我还没技术解决这个问题,网上搜过,大都只提 ...

  5. 整合Kafka+Flink 实例(第二部分 设计思路)

    前     言 拖了蛮久了,一直说要接着上一部分写设计思路以及代码,因为自己技术底子薄弱,加上人又懒,所以一直没能继续,今天补上设计思路及部分代码,后面有时间我会再补充一些应用性的功能,的确有些忙,希 ...

  6. 1构建个人博客--使用Hugo快速成型

    概述 人在武汉,病毒肆虐. 隔离久了,有点闷,闲余时间找点事情做. 建个博客吧, 内容不重要,写不写也不那么要紧,目前水平也写不出什么有深度的东西. 但是这个姿势一定要优美, 过程一定要折腾. OK, ...

  7. 五分钟学Java:如何才能学好Java Web里这么多的技术

    原创声明 本文作者:黄小斜 转载请务必在文章开头注明出处和作者. 系列文章介绍 本文是<五分钟学Java>系列文章的一篇 本系列文章主要围绕Java程序员必须掌握的核心技能,结合我个人三年 ...

  8. 初识JVM:(二)Java的垃圾回收机制详解

    声明:本文主要参考https://www.cnblogs.com/codeobj/p/12021041.html 仅供个人学习.研究之用,请勿用于商业用途,如涉及侵权,请及时反馈,立刻删除. 一.Ja ...

  9. 使用AJAX实现用户名的唯一性校验(注册界面)-JAVA(新手)

    (1)实现用户名的唯一性校验 所需要准备的: Servlet 注册界面的JSP 接口和实现类 所需要的接口和实现类: 接口: /* * 用户注册 * 账号的唯一性校验,需要传参(username) * ...

  10. 普通人学习rust——从零到放弃 变量、不可变量、常量

    普通人学习rust--从零到放弃 变量.不可变量.常量 环境 本文章内容基于如下环境,如若出入请参考当前环境. rustc 1.42.0 (b8cedc004 2020-03-09) cargo 1. ...