(详细步骤和代码)利用A100 GPU加速Tensorflow

2023-11-19

利用A100 GPU加速Tensorflow

在这里插入图片描述

NVIDIA A100 基于 NVIDIA Ampere GPU 架构,提供一系列令人兴奋的新功能:第三代张量核心、多实例 GPU (MIG) 和第三代 NVLink。

Ampere Tensor Cores 引入了一种专门用于 AI 训练的新型数学模式:TensorFloat-32 (TF32)。 TF32 旨在加速 DL 工作负载中常用的 FP32 数据类型的处理。在 NVIDIA A100 Tensor Cores 上,以 TF32 格式运行的数学运算的吞吐量是在之前的 Volta 代 V100 GPU 上运行的 FP32 的 10 倍以上,从而使 DL 工作负载的性能提高了 5.7 倍。

每个月,NVIDIA 都会在 NVIDIA NGC 上发布用于 DL 框架的容器,所有容器都针对 NVIDIA GPU 进行了优化:TensorFlow 1、TensorFlow 2、PyTorch 和 MXNet。从 20.06 版本开始,在所有深度学习框架容器中添加了对新 NVIDIA A100 功能、新 CUDA 11 和 cuDNN 8 库的支持。

在这篇文章中,我将重点介绍支持 NVIDIA GPU(包括 A100)的基于 TensorFlow 1.15 的容器和pip wheels。

20.06 版本的 NVIDIA TensorFlow 1.15.2 基于上游 TensorFlow 版本 1.15.2。在此版本中,为 NVIDIA Ampere 架构 GPU 上的 TF32 提供了开箱即用的支持,同时还增强了对上一代 GPU(例如 Volta 和 Turing)的支持。此版本允许您在 NVIDIA Ampere 架构 GPU 上实现 TF32 的速度优势,而无需更改 DL 工作负载的代码。此版本还包括对自动混合精度 (AMP)、XLA 和 TensorFlow-TensorRT 集成的重要更新。

NVIDIA A100 支持的数值精度

深度神经网络 (DNN) 通常可以使用混合精度策略进行训练,主要使用 FP16,但在必要时也使用 FP32 精度。这种策略导致计算、内存和内存带宽需求显着降低,同时通常收敛到相似的最终精度。

NVIDIA Tensor Cores是 NVIDIA Volta 和新一代 GPU 上的专用算术单元。它们可以在单个时钟周期内执行完整的矩阵乘法和累加运算 (MMA)。在 Volta 和 Turing 上,输入是 FP16 格式的两个大小为 4×4 的矩阵,而累加器是 FP32 格式。

Ampere 上的第三代Tensor Cores支持一种新颖的数学模式:TF32。 TF32 是一种混合格式,旨在更高效地处理 FP32 的工作。具体来说,TF32 使用与 FP16 相同的 10 位尾数来确保准确性,同时具有与 FP32 相同的范围,这要归功于使用 8 位指数。

更广泛的可表示范围匹配 FP32 消除了使用 TF32 时对损失缩放操作的需要,从而简化了混合精度训练工作流程。下图 显示了各种数字格式之间的比较。

在这里插入图片描述

在 Ampere Tensor Cores 上,TF32 是 DL 工作负载的默认数学模式,与 Volta/Turing GPU 上的 FP32 不同。 在内部,当在 TF32 模式下运行时,Ampere Tensor Cores 接受两个 FP32 矩阵作为输入,但在内部以 TF32 格式执行矩阵乘法。 结果在 FP32 矩阵中累加。

在 FP16/BF16 模式下运行时,Ampere Tensor Cores 接受 FP16/BF16 矩阵,并在 FP32 矩阵中累加。 与 TF32 相比,Ampere 上的 FP16/BF16 模式提供 2 倍的吞吐量。 下图显示了这些操作模式。

在这里插入图片描述

TF32 旨在将 NVIDIA Tensor Cores 技术的处理能力带入所有 DL 工作负载,而无需任何必要的代码更改。 对于希望解锁最高吞吐量的更精明的开发人员来说,使用 FP16 进行 AMP 训练仍然是性能最高的选项,而且无需更改代码(使用 NVIDIA NGC TensorFlow 容器时)或只需一行额外代码即可轻松启用。

我们对各种网络架构的广泛实验表明,任何可以成功训练以与 FP16/BF16 上的 AMP 收敛的网络也可以训练以与 TF32 收敛。 在这种情况下,最终 TF32 训练的模型精度与 FP32 训练的模型精度相当。

TensorFlow 1.15.2 的增强功能

TensorFlow 1.15.2 提供以下增强功能:

  • TF32 support
  • AMP
  • XLA
  • TensorFlow-TensorRT 集成

TF32 支持

20.06 版的 NVIDIA TensorFlow 1.15.2 使用开箱即用的 Ampere TF32 功能来加速所有 DL 训练工作负载。 这是默认选项,不需要开发人员更改代码。 在 pre-Ampere GPU 架构上,FP32 仍然是默认精度。

您还可以通过设置环境变量将 Ampere GPU 上的默认数学模式更改为 FP32:

export NVIDIA_TF32_OVERRIDE=0

不推荐使用此选项。 主要用于调试目的。

自动混合精度训练

使用 FP16 进行 AMP 训练仍然是 DL 训练的最佳性能选项。 对于 TensorFlow,AMP 训练是在 TensorFlow 1.14 之后集成的,使从业者可以通过编程方式或通过设置环境变量轻松地进行混合精度训练。

使用单个 API 调用来包装优化器:

opt = tf.train.experimental.enable_mixed_precision_graph_rewrite(opt)

此更改将自动损失缩放应用于您的模型,并启用自动转换为半精度。

使用以下命令在 NVIDIA NGC TensorFlow 1 容器中启用环境变量:

export TF_ENABLE_AUTO_MIXED_PRECISION=1

这会自动将混合精度训练应用于所有 TensorFlow 工作负载。

XLA

XLA 是 TensorFlow 的 DL 图编译器。 在原生 TensorFlow 中,网络的每一层都是独立处理的。 相比之下,XLA 可以将网络的部分聚类成可以优化和编译的“子图”。 这以一些编译开销为代价提供了性能优势。 下图 显示了 XLA 的工作流程。

在这里插入图片描述

在 GPU 上执行时,XLA 会进行如下优化:

  • 内核融合:具有消费者/生产者关系的带宽绑定内核垂直和水平融合到单个 CUDA 内核中。这通过减少对全局内存的访问来提高性能,并提供观察到的大部分性能优势。
  • 调用优化的库内核:XLA-GPU 以高度优化和性能调整的 cuDNN/cuBLAS 内核为目标,并将多个运算符组合成一个优化的 cuDNN/cuBLAS 内核。

TensorFlow-TensorRT 集成

NVIDIA TensorRT 是一个用于高性能深度学习推理的 SDK。它包括一个 DL 推理优化器和运行时,可为 DL 推理应用程序提供低延迟和高吞吐量。

TensorRT 紧密集成到 TensorFlow 1 中。我们称之为 TensorFlow-TensorRT 集成 (TF-TRT)。在 TF 版本 1.15 中,它是 tensorflow.python.compiler 包的一部分。一个经过训练的神经网络可以通过简单的 API 调用轻松转换为 TF-TRT 模型,如以下代码块所示。

from tensorflow.python.compiler.tensorrt import trt_convert as trt
converter = trt.TrtGraphConverter(
input_saved_model_dir=input_saved_model_dir,
precision_mode=trt.TrtPrecisionMode.
)
converter.convert()
converter.save(output_saved_model_dir)

TF-TRT 可以将模型转换为不同的精度:FP32、FP16 和 INT8。 在 INT8 的情况下,需要通过网络馈送小型校准数据集以确定最佳量化参数。 当您将模型从 FP32 转换为 INT8 时,TF-TRT 在图灵一代 T4 GPU 上提供高达 11 倍的推理加速。

当您在 Ampere 上将模型转换为 FP32 时,TF-TRT 采用的内部数学模式是 TF32,不需要任何代码干预。

TensorFlow 1.15.2 入门

来自 20.06 版本的 NVIDIA TensorFlow 1.15.2 可作为 NGC Docker 映像或通过 pip wheel 包提供。

拉取 NGC Docker 镜像
可以通过拉取 NGC Docker 容器映像轻松访问 NVIDIA TensorFlow 版本。 使用以下命令:

docker pull nvcr.io/nvidia/tensorflow:20.06-tf1-py3

此 Docker 容器映像包含所有必需的 TensorFlow-GPU 依赖项,例如 CUDA、CuDNN 和 TensorRT。 它还包括用于多 GPU 和多节点训练的 NCCL 和 Horovod 库,以及用于加速数据预处理和加载的 NVIDIA DALI。

安装 pip wheels

来自 20.06 版本的 NVIDIA TensorFlow 1.15.2 也可以通过 wheel 包安装。 当您使用这种安装方式时,NVIDIA TensorFlow 只需要一个带有 Ubuntu 的裸机环境,例如 Ubuntu 18.04,或者一个最小的 Docker 容器,例如 ubuntu:18.04。 此外,NVIDIA 显卡驱动程序也必须可用,并且您应该可以调用 nvidia-smi 来检查 GPU 状态。 从 20.06 版本开始,NVIDIA TensorFlow 1.15.2 所需的所有其他依赖项均由 wheel 包安装。

要安装的基本软件

无论您是在裸机上还是在容器中,您都可能需要执行以下操作:

apt update
apt install -y python3-dev python3-pip git
pip3 install --upgrade pip setuptools requests

虚拟环境

有些人使用虚拟环境将 pip 包与冲突隔离开来。 从概念上讲,它类似于 Docker 映像,但它本质上是一个带有目标搜索路径的单独安装目录。

要设置虚拟环境:

pip install -U virtualenv
virtualenv --system-site-packages -p python3 /venv

启动虚拟环境:

source /venv/bin/activate

为 TensorFlow pip安装索引

需要安装此索引,以便 pip 知道去 NVIDIA 网站获取wheel。 否则,pip 默认为 PyPI.org。 使用以下命令:

pip install nvidia-pyindex

安装 TensorFlow wheel

使用以下命令:

pip install nvidia-tensorflow[horovod]

验证是否安装了软件包:

pip list | grep nvidia

输出应如下所示:

nvidia-cublas 11.1.0.213
nvidia-cuda-cupti 11.0.167
nvidia-cuda-nvcc 11.0.167
nvidia-cuda-nvrtc 11.0.167
nvidia-cuda-runtime 11.0.167
nvidia-cudnn 8.0.1.13
nvidia-cufft 10.1.3.191
nvidia-curand 10.2.0.191
nvidia-cusolver 10.4.0.191
nvidia-cusparse 11.0.0.191
nvidia-dali 0.22.0
nvidia-dali-tf-plugin 0.22.0
nvidia-horovod 0.19.1
nvidia-nccl 2.7.5
nvidia-pyindex 1.0.0
nvidia-tensorflow 1.15.2+nv20.6
nvidia-tensorrt 7.1.2.8

验证 TensorFlow 是否加载:

python -c 'import tensorflow as tf; print(tf.__version__)'

输出

1.15.2

验证 GPU 是否被 TensorFlow 使用:

python -c "import tensorflow as tf; print('Num GPUs Available: ', len(tf.config.experimental.list_physical_devices('GPU')))"

输出应该类似于以下内容:

2020-05-16 22:03:35.428277: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1639] Found device 0 with properties:
name: Tesla V100-SXM2-16GB major: 7 minor: 0 memoryClockRate(GHz): 1.53

性能测试

在本文中,我们将讨论在 NVIDIA TensorFlow 1.15.2 NGC 容器中运行时,与 FP32 和使用 AMP 的混合精度训练相比,NVIDIA A100 上的 TF32 的准确性和性能。

TF32 精度

TF32 匹配任何使用 FP16 或 BF16 混合精度成功训练的网络的 FP32 结果。 我们已经对大量的网络架构进行了试验,但还没有发现例外。

下图 显示了使用 TF32、FP32 和 AMP 训练时 ResNet50、SSD 和 Transformer-XL 的训练损失曲线。 TF32 在稳定性和最终准确度方面产生了可比较的训练曲线。 这些结果可以使用 NVIDIA 深度学习示例中的模型脚本来重现。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

(详细步骤和代码)利用A100 GPU加速Tensorflow 的相关文章

随机推荐

  • 关于wav文件读取的一个小问题(librosa和soundfile)

    今天在跑melgan时候 发现GPU使用率低的感人 原本以为是pytorch的dataloader的问题 之后把num worker改为0 用主进程进行读取数据 发现主要卡在了librosa的load上 from librosa core
  • Docker 之Harbor 初步使用

    1 命令行登陆 harbar 镜像仓库 root node1 harbor docker login 192 168 27 134 9901 Username admin Password WARNING Your password wil
  • LSM详解

    关于LSM结构的相关介绍 这篇文章比较好 特此纪录一下https yq aliyun com articles 767772
  • python服务器开发debug_如何使用PyCharm开发和调试服务器上的代码

    0x00 前言 之前调试Python程序的时候一直都使用的是pdb 一个Python内置的调试模块 然后拿本地的源码进行比对 偶然听 周佩雨 ph师傅提到可以使用PyCharm对远端服务器上的代码进行调试 同时还可以对多进程类程序进行调试
  • 蓝牙打开流程

    通常两种打开方式 一个是在菜单Setting上打开 一种就是自动打开 default on 两种都是最终调用IBluetooth enable 来打开的 启动蓝牙BluetoothService frameworks base servic
  • osg orbitManipulator拖拽位置不精确的问题解决。

    实际上 就是个焦距和视距的问题 摄像机在不同的位置 远近切面会改变 但是fovy和aspectRatio不改变 这样 也会导致近切面的宽高发生改变 就类似于一个无限延伸的视锥体滑梯 远近切面就在这滑梯上滑动 由于最终物体要投影到近切面 而近
  • Ubuntu安装g++

    在编译之前我们需要在系统里安装G GCC 它们就是Linux下的C C的编译器 代码如下 代码 sudo apt get install build essential 好 现在我们在文本编辑器里写一个C的简单的程序 好像所有学习C或者C
  • MQ的基本原理是怎样的?MQ的优点有哪些?MQ的核心概念包括哪些?MQ的消息传递模式有哪些?

    1 MQ的基本原理是怎样的 MQ 消息队列 是一种面向消息的中间件 用于实现不同系统之间的异步通信 其基本原理如下 生产者 Producer 将消息发送到消息队列中 而不是直接发送给消费者 Consumer 消息队列将接收到的消息存储在内部
  • Python字符串的截取

    字符串元素的截取 Python中的字符串用单引号 或双引号 括起来 同时使用反斜杠 转义特殊字符 字符串的截取的语法格式如下 变量 头下标 尾下标 索引值以 0 为开始值 1 为从末尾的开始位置 加号 是字符串的连接符 星号 表示复制当前字
  • 怎么优化深层神经网络(超参、正则以及优化)

    在训练神经网络时 我们需要做出很多决策 比如 神经网络分多少层 每层含有多少个隐藏单元 学习速率是多少 各层采用哪些激活函数等等 我们不可能从一开始就准确的预测出这些超参数 因为应用机器学习是一个高度迭代的过程 通常在项目启动时 我们会先有
  • 小程序识别车牌php,微信小程序——车牌键盘输入js+css

    请输入车牌号码 carNo item 清空 关闭 item OK Del pages jp cp jp cp wxss lf float left rt float right tel border bottom 2rpx solid dd
  • Python常用函数笔记汇总1

    清理 重塑 转换 numpy where condition x y 1 这里x y是可选参数 condition是条件 这三个输入参数都是array like的形式 而且三者的维度相同 2 当conditon的某个位置的为true时 输出
  • 树莓派启用ll命令

    前言 在Linux系统中ll命令是ls l的快捷命令 在树莓派中默认是禁用的 通过修改配置文件将其开启 启用说明 vi bashrc 找到以下位置 将 删除 some more ls aliases alias ll ls l alias
  • ubuntu中的终端是区分大小写的

    ubuntu中的终端是区分大小写的
  • 主成分分析法(PCA)的理解(附python代码案例)

    目录 一 PCA简介 二 举个例子 三 计算过程 公式 3 0 题干假设 3 1 标准化 3 2 计算协方差矩阵 3 3 计算特征值和特征值向量 3 3 多重共线性检验 可跳过 3 4 适合性检验 可跳过 3 5 计算主成分贡献率及累计贡献
  • 什么是protocol分层,垂直service??计算机网络详解【计算机网络养成】

    内容导航 分组丢失和延时 发生原因 四种分组延时 节点处理延迟 排队延迟 传输延时 Transmission 传播延时 Propagation 使用cmd命令tracert 和 tracerert 来检查延迟 分组丢失 吞吐量 有效的数据量
  • 【网易】星际穿越

    简单数学 include
  • QT实现电子时钟

    QT实现电子时钟 实现方法 实现效果 代码 头文件 源文件 实现方法 主窗口QDialog调用QLCDNumber窗口 实现效果 代码 头文件 dialog h ifndef DIALOG H define DIALOG H include
  • Git使用(3)常见报错

    仅限于当时当地情况下的处理方式 不代表所有情况 Q Refusing to fetch into current branch refs heads master of non bare repository A 在当前分支下fetch g
  • (详细步骤和代码)利用A100 GPU加速Tensorflow

    利用A100 GPU加速Tensorflow NVIDIA A100 基于 NVIDIA Ampere GPU 架构 提供一系列令人兴奋的新功能 第三代张量核心 多实例 GPU MIG 和第三代 NVLink Ampere Tensor C