用NVIDIA Tensor Cores和TensorFlow 2加速医学图像分割
用NVIDIA Tensor Cores和TensorFlow 2加速医学图像分割
Accelerating Medical Image Segmentation with NVIDIA Tensor Cores and TensorFlow 2
医学图像分割是当前学术界研究的热点。这方面正在进行的挑战、竞赛和研究项目的数量证明了这一点,这些项目的数量只是逐年上升。在解决这一问题的各种方法中,U-Net已经成为许多2D和3D分割任务的最佳解决方案的骨干。这是因为简单性、多功能性和有效性。
当实践者面临一个新的分割任务时,第一步通常是使用现有的U-Net实现作为主干。但是,随着TensorFlow 2.0的到来,缺少现成的解决方案。如何有效地将模型转换到TensorFlow 2.0以利用新功能,同时仍然保持顶级硬件性能并确保最先进的精度?

Figure 1. Example of a serial section Transmission Electron Microscopy image (ssTEM) and its corresponding segmentation
U-Net for medical image segmentation
U-Net首先由Olaf Ronneberger、Philip Fischer和Thomas Brox引入。在本文中,U-Net:用于生物医学图像分割的卷积网络。U-Net允许以高精度和高性能无缝分割2D图像。可以用来解决许多不同的分割问题。
图2显示了U-Net模型及其不同组件的构造。U-Net由一条压缩和一条扩展路径组成,其目的是通过卷积和池操作的结合,在其最核心的部分建立一个瓶颈。在这个瓶颈之后,通过卷积和上采样相结合的方法重建图像。跳跃连接的目的是帮助梯度的反向流动,以改善训练。

Figure
2. The architecture of a U-Net model. Source: U-Net: Convolutional Networks for Biomedical Image
Segmentation
U-Net擅长的任务通常被称为语义分割,需要用对应的类来标记图像中的每个像素,以反映所表示的内容。因为对图像中的每个像素都执行此操作,所以此任务通常称为密集预测。
在语义分割的情况下,预测的预期结果是高分辨率图像,通常与被馈送到网络的图像具有相同的维度,其中每个像素被标记到相应的类。广义地说,语义分割只是一种像素级、多类分类的形式。
尽管U-Net主要用于语义分割,但基于U-Net的网络在目标检测或实例分割等任务中取得很好的效果并不少见。
Migrating
to TensorFlow 2.0 with performance in mind
通常,使用深度学习模型的第一步是建立一个让感到舒适的基线。在NVIDIA深度学习示例Github存储库中,可以找到最流行的深度学习模型的实现。这些实现几乎涵盖了每个领域和框架,并提供了广泛的基准,以确保最佳的准确性和性能。因此,无论是从业者还是研究者,都是最佳起点。
在这些实现中,可以找到U-Net,可以在TensorFlow 1.x和TensorFlow 2.0中找到。但是,迁移到TensorFlow的最新版本需要遵循哪些步骤?
A new way to run models
在这个新版本的TensorFlow中,最显著的变化之一是在使用会话到函数调用之间的切换。到目前为止,将指定要调用的输入和函数,并期望返回模型的输出。然后在会话.run调用,如下代码示例所示:
TensorFlow 1.X
outputs = session.run(f(placeholder),
feed_dict={placeholder: input})
TensorFlow 2.0
outputs = f(input)
这是可能的,因为TensorFlow 2.0中默认启用了紧急执行。这改变了与TensorFlow交互的方式,因为紧急执行是一个立即评估操作的命令式编程环境。提供了一些好处,例如更直观的界面、更容易调试、自然的控制流,但代价是性能较差。通常被推荐用于研究和实验。
AutoGraph
要在使用TensorFlow 2.0的模型中实现生产级性能,必须使用AutoGraph(AG)。这个Tensorflow 2.0特性允许通过使用decorator使用自然的Python语法编写Tensorflow图形代码@tf.函数,如下代码示例所示:
@tf.function
def train_step(features, targets, optimizer):
With tf.GradientTape() as tape:
predictions = model(features)
loss = loss_fn(predictions, targets)
vars = model.trainable_variables
gradients = tape.gradient(loss, vars)
optimizer = apply_gradients(zip(gradients, vars))
尽管AG仍有局限性,但带来的性能改进是显而易见的。有关如何使用tf.函数和AG,参见TensorFlow 2.0指南。
Maximizing Tensor Core usage
混合精度是不同数值精度在计算方法中的综合运用。混合精度训练通过以半精度格式执行操作,同时以单精度存储最小信息以在网络的关键部分保留尽可能多的信息,从而显著加快计算速度。
在Volta和Turing体系结构中引入张量核之后,可以通过切换到混合精度来体验显著的训练加速:在最严格的数学模型体系结构上,总体加速高达3倍。使用混合精度训练需要两个步骤:
1. Porting the model to use the FP16 data type where appropriate.
2. Adding loss scaling to preserve small gradient values.
For more information, see the following resources:
- Mixed Precision Training paper
- Training With Mixed Precision documentation.
- Mixed-Precision Training of Deep Neural Networks post.
- Using TF-AMP from the TensorFlow User Guide.
Enabling automatic mixed precision training
要在TensorFlow 2.0中启用自动混合精度(AMP),必须对代码应用以下更改。
设置Keras混合精度策略:
tf.keras.mixed_precision.experimental.set_policy('mixed_float16')
在优化器上使用损失缩放包装器。默认情况下,可以选择动态损耗缩放:
optimizer = tf.keras.mixed_precision.experimental.LossScaleOptimizer(optimizer, "dynamic")
确保使用缩放损失计算梯度:
loss = loss_fn(predictions, targets)scaled_loss = optimizer.get_scaled_loss(loss)
vars = model.trainable_variables
scaled_gradients = tape.gradient(scaled_loss, vars)
gradients = optimizer.get_unscaled_gradients(scaled_gradients)
optimizer.apply_gradients(zip(gradients, vars))
Enabling Accelerated Linear Algebra
加速线性代数(XLA)是一种特定于领域的线性代数编译器,可以加速TensorFlow模型,而不必更改源代码。其结果是速度和内存使用的提高:在启用XLA之后,大多数内部基准测试的运行速度提高了1.1-1.5倍。
要启用XLA,请在优化器中设置实时(JIT)图形编译。可以通过对代码进行以下更改来完成此操作:
tf.config.optimizer.set_jit(True)
U-Net in TensorFlow 2.0
在NVIDIA深度学习示例GitHub存储库中,可以找到使用TensorFlow 2.0的U-Net实现。这个实现包含了所有必要的部分,不仅可以将U-Net移植到新版本的Google框架中,还可以使用
tf.estimator.Estimator.
除了前面描述的与模型性能相关的必要更改外,请遵循以下步骤以确保模型完全符合新API:
- API cleanup
- Data loading
- Model definition
API cleanup
由于TensorFlow 2.0中的许多API操作已被删除或已更改位置,第一步是使用v2升级脚本将不推荐的调用替换为新的等效调用:
tf_upgrade_v2 \
--intree unet_tf1/ \
--outtree unet_tf2/ \
--reportfile report.txt
尽管此转换脚本自动化了大部分过程,但根据报告文件中捕获的建议,仍需要手动进行一些更改。有关更多信息,TensorFlow提供了以下指南,自动将代码升级到TensorFlow 2。
数据加载
用于训练模型的数据管道与用于TensorFlow 1.x实现的数据管道相同。是使用tf.data.Dataset数据集API操作。数据管道加载图像并使用不同的数据增强技术对其进行转换。有关详细信息,请参见data_loader.py脚本。
模型定义
这个新版本的TensorFlow鼓励将代码重构成更小的函数并模块化不同的组件。其中之一是模型定义,现在可以通过子类化来执行tf.keras.Model型:
class Unet(tf.keras.Model): """ U-Net: Convolutional Networks for Biomedical Image Segmentation
Source:
https://arxiv.org/pdf/1505.04597
"""
def __init__(self):
super().__init__(self)
self.input_block = InputBlock(filters=64)
self.bottleneck = BottleneckBlock(1024)
self.output_block = OutputBlock(filters=64, n_classes=2)
self.down_blocks = [DownsampleBlock(filters, idx)
for idx, filters in enumerate([128, 256, 512])]
self.up_blocks = [UpsampleBlock(filters, idx)
for idx, filters in enumerate([512, 256, 128])]
def call(self, x, training=True):
skip_connections = []
out, residual = self.input_block(x)
skip_connections.append(residual)
for down_block in self.down_blocks:
out, residual = down_block(out)
skip_connections.append(residual)
out = self.bottleneck(out, training)
for up_block in self.up_blocks:
out = up_block(out, skip_connections.pop())
out = self.output_block(out, skip_connections.pop())
return tf.keras.activations.softmax(out, axis=-1)
Performance results
根据上述更改,运行模型以验证TensorFlow2.0上Tensor Cores提供的加速。有三种不同的特性影响性能:
- The use of TensorFlow AG
- The use of Accelerated Linear Algebra (XLA)
- The use of automatic mixed precision (AMP) using Tensor Cores
Training performance
结果是通过ensorflow:20.02-tf-py3下一代NVIDIA DGX-1上带有(8x V100 16G)GPU的容器。性能数字(以每秒项/图像为单位)在1000次迭代中平均,不包括前200个预热步骤。

Table 1. Single- and multi-GPU training performance for FP32 and mixed precision. The speedup is the ratio of images per second processed in mixed precision compared to FP32.
在TensorFlow 2.0中,对于单GPU训练,使用混合精度的例子模型能够达到每秒图像测量的2.89x加速比;对于多GPU训练,使用混合精度的例子模型能够达到每秒图像测量的2.7x加速比,使用混合精度的例子模型能够达到几乎完美的弱比例因子。有关更多信息,请参阅遵循的步骤。
对TensorFlow2.0中可用的不同特性如何影响训练阶段性能的额外了解。提高模型吞吐量的最有效方法是启用AMP,包括此功能在内的所有设置都是性能最好的。但是,当使用混合精度进行训练时,XLA只有在使用AG时才能提供提升。AMP、XLA和AG的组合提供了最佳的结果。
Inference performance
通过运行tensorflow:20.02-tf-py3下一代NVIDIA DGX-1上的容器,带有(1x V100 16G)GPU。吞吐量以每秒图像帧为单位报告。每批报告的延迟时间以毫秒为单位。

表2. FP32和混合精度的单GPU推理性能。加速比是每秒以混合精度处理的图像与FP32的比率。
该模型在TensorFlow 2.0推理机上使用混合精度,可达到3.19x的加速比。有关更多信息,请参阅推理性能基准测试步骤。
TensorFlow2.0中可用的不同特性如何影响推理阶段性能的额外细节。最重要的性能提升出现在启用放大器时,因为张量核大大加速了预测。因为模型已经过训练,所以可以通过启用AG来禁用急切执行,这将提供额外的增强。
Next steps
可以使用NVIDIA gpu开始利用TensorFlow 2.0中的新功能。TensorFlow2.0极大地简化了模型的训练过程,并且在最新版本的框架中比以往任何时候都更容易利用Tensor核心。
在Deep Learning Examples存储库中,将找到25个以上最流行的Deep Learning模型的开源实现。有TensorFlow、Pythorch和MXNet。在这些例子中,是关于如何以最先进的精度和破纪录的性能运行这些模型的逐步指南。
所有实现都附带了有关如何执行混合精度训练以使用张量核加速模型的说明。还以检查点的形式分发这些模型。这些模型是完全维护的,包括最新的功能,如多GPU训练、使用DALI加载数据和TensorRT部署。
用NVIDIA Tensor Cores和TensorFlow 2加速医学图像分割的更多相关文章
- NVIDIA Tensor Cores解析
NVIDIA Tensor Cores解析 高性能计算机和人工智能前所未有的加速 Tensor Cores支持混合精度计算,动态调整计算以加快吞吐量,同时保持精度.最新一代将这些加速功能扩展到各种工作 ...
- CUDA 9中张量核(Tensor Cores)编程
CUDA 9中张量核(Tensor Cores)编程 Programming Tensor Cores in CUDA 9 一.概述 新的Volta GPU架构的一个重要特点是它的Tensor核,使T ...
- TensorFlow XLA加速编译器
TensorFlow XLA加速编译器 加速线性代数器(Accelerated linear algebra,XLA)是线性代数领域的专用编译器.根据 https://www.tensorflow.o ...
- tensorflow+入门笔记︱基本张量tensor理解与tensorflow运行结构
Gokula Krishnan Santhanam认为,大部分深度学习框架都包含以下五个核心组件: 张量(Tensor) 基于张量的各种操作 计算图(Computation Graph) 自动微分(A ...
- ubuntu16.04下安装TensorFlow(GPU加速)----详细图文教程【转】
本文转载自:https://blog.csdn.net/zhaoyu106/article/details/52793183 le/details/52793183 写在前面 一些废话 接触深度学习已 ...
- Tensorflow计算加速
在tensorflow里可以通过tf.device函数来指定每个运行的设备,可以是GPU也可以是CPU,比如CPU在tensorflow里的名称为/cpu:0,即便电脑里有多个CPU,tensorfl ...
- 在cuDNN中简化Tensor Ops
在cuDNN中简化Tensor Ops 在Tesla V100 GPU中引入神经网络模型以来,神经网络模型已迅速利用NVIDIA Tensor Cores进行深度学习.例如,基于Tensor Core ...
- 模型加速[tensorflow&tensorrt]
在tensorflow1.8之后的版本中,tensorflow.contrib部分都有tensorrt的组件,该组件存在的意义在于,你可以读取pb文件,并调用tensorrt的方法进行subgraph ...
- 学习笔记TF067:TensorFlow Serving、Flod、计算加速,机器学习评测体系,公开数据集
TensorFlow Serving https://tensorflow.github.io/serving/ . 生产环境灵活.高性能机器学习模型服务系统.适合基于实际数据大规模运行,产生多个模型 ...
随机推荐
- android The content of the adapter has changed but ListView did not receive a notification 错误的解决方案
使用了AsyncTask在后台刷新适配器,并且通知ui线程更新ListView,运行时发现时不时的出现 如题 的错误, 导致程序崩溃,解决方法如下: 1.建立一个缓冲数据集,这个数据集就是填充适配器的 ...
- 第三部分 IDEA创建并运行项目
可以创建一个maven,几行代码就解决了导入依赖,但是我的电脑不知道哪里出现了问题,IDEA重装,jdk重装,maven重装,都无法解决问题,找了3天,还是没有解决问题.最后只能采用手动导入包方法.看 ...
- springmvcdemo
项目点击属性 2.3 转换成2.5 已经变成一个网站项目了 报错消失 pom.xml <project xmlns="http://maven.apache.or ...
- aspnetcore 应用 接入Keycloak快速上手指南
登录及身份认证是现代web应用最基本的功能之一,对于企业内部的系统,多个系统往往希望有一套SSO服务对企业用户的登录及身份认证进行统一的管理,提升用户同时使用多个系统的体验,Keycloak正是为此种 ...
- MySQL查看及杀掉链接方法大全
前言: 在数据库运维过程中,我们时常会关注数据库的链接情况,比如总共有多少链接.有多少活跃链接.有没有执行时间过长的链接等.数据库的各种异常也能通过链接情况间接反应出来,特别是数据库出现死锁或严重卡顿 ...
- 『动善时』JMeter基础 — 16、JMeter配置元件【HTTP信息头管理器】
目录 1.用于演示的项目说明 2.测试计划内包含的元件 3.HTTP请求界面内容 4.查看脚本执行结果 5.添加请求头信息(HTTP信息头管理器) 6.优先级说明 7.补充:常见请求头信息 JMete ...
- Git安装教程最新版本(国内gitee国外github)
Git安装教程最新版本(国内gitee国外github) 欢迎关注博主公众号「Java大师」, 专注于分享Java领域干货文章, 关注回复「资源」, 获取大师使用的typora主题: http://w ...
- CSS元素的盒类型
一.css简介 CSS是Cascading Style Sheet的缩写,中文称层叠样式表.HTML中的元素都有着自己的属性和默认样式,CSS控制HTML内标签显示不同布局样式.控制对应html标签颜 ...
- 诸神之眼 - Nmap 教程
*注: www.heihei.work 为本人测试网站,可由 官方测试网站 scanme.nmap.org代替. NO.11.扫描端口开放的服务nmap -T4 -A -v www.heiehi.wo ...
- Docker——Tomcat JVM 内存配置
前言 安装再docker中的tomcat,在下载大文件或者某些情况下,会出现tomcat的内存溢出等情况,所以需要配置tomcat的内存大小,docker中的tomcat内存大小配置有四种方式. 一. ...