随着视频中基于图像和手势识别、语音识别、自然语言处理、推荐系统等领域的应用程序和服务越来越多,对高性能深度学习(DL)训练的需求正在加速增长。Habana® Gaudi®AI 处理器旨在最大限度地提高训练吞吐量和效率,同时为开发人员提供可扩展到许多工作负载和系统的优化软件和工具。Habana Gaudi软件的开发考虑到了最终用户,提供了多功能性和易于编程来满足用户专有模型的独特需求,同时允许将现有模型简单无缝地过渡到Gaudi。我们想让您开始使用Habana的Gaudi HPU(Habana处理器单元)。有许多新用户和现有用户可能有在GPU或CPU上运行工作负载的经验,本文的目标是引导您完成将现有AI工作负载和模型迁移到Gaudi HPU的过程。我们将向您介绍硬件架构、软件堆栈的基础知识,
Gaudi 架构和Habana SynapseAI®软件套件我们将从基本架构的概述开始。Gaudi旨在加速DL训练工作负载。其异构架构包括一组完全可编程的张量处理核心(TPC)及其相关的开发工具和库,以及一个可配置的矩阵数学引擎。
TPC是一个VLIW SIMD处理器,具有为训练工作负载量身定制的指令集和硬件。它是可编程的,为用户提供了最大的创新灵活性,以及许多面向工作负载的功能,例如:
- GEMM运行加速
- 张量寻址
- 延迟隐藏功能
- 随机数生成
- 特殊功能的高级实现
TPC原生支持以下数据类型:FP32、BF16、INT32、INT16、INT8、UINT32、UINT16和UINT8。
Gaudi存储器架构在每个TPC中包括片上SRAM和本地存储器。此外,芯片封装集成了4个HBM器件,提供32GB容量和1TB/s带宽。PCIe接口提供主机接口,同时支持3.0代和4.0代模式。
Gaudi是第一个在片上集成RDMA over Converged Ethernet (RoCE v2)引擎的DL训练处理器。凭借高达2 Tb/s的双向吞吐量,这些引擎在训练过程中所需的处理器间通信中发挥着关键作用。RoCE的这种原生集成允许客户在服务器和机架内部使用相同的扩展技术(纵向扩展),以及跨机架扩展(横向扩展)。这些可以直接在Gaudi处理器之间连接,也可以通过任意数量的标准以太网交换机连接。图1显示了硬件框图:
图 1. Gaudi HPU框图
SynapseAI软件套件旨在促进在Habana的Gaudi加速器上进行高性能DL训练,可将神经网络拓扑高效地映射到Gaudi硬件上。软件堆栈包括Habana的图形编译器和运行时、TPC内核库、固件和驱动程序,以及用于定制内核开发的TPC SDK和SynapseAI Profiler 等开发人员工具。SynapseAI与流行的框架、TensorFlow和PyTorch集成,并针对Gaudi进行了性能优化。图2显示了SynapseAI软件套件的组件。为了轻松地将SynapseAI软件集成到您的工作环境中,Habana为TensorFlow和PyTorch提供了一组Docker镜像,其中包括创建运行模型的环境所需的所有成分。我们将探索如何将这些库集成到您的模型中。
图 2. SynapseAI软件堆栈
设置环境在本节中,我们将介绍如何设置环境,然后添加确保Gaudi HPU被框架识别并可以开始在您的模型中执行操作所需的简单步骤。除了Docker镜像之外,Habana在我们的ModelReferences GitHub存储库中还有一组参考模型和示例,可用作向模型添加适当组件的指南。
开始的第一步是确保您拥有完整的构建环境,其中包括Habana驱动程序、SynapseAI软件堆栈和框架。在大多数情况下,确保创建完整环境的最佳方法是使用Habana提供的预构建Docker镜像,这些镜像可在我们的Software Vault中找到。这些Docker镜像包含单节点和横向扩展二进制文件,不需要额外的安装步骤。如果您在基于云的环境中使用Gaudi,请务必选择您的云服务提供商提供的Habana Gaudi镜像,该镜像包含完整的驱动程序和相关框架。对于需要独立安装完整驱动程序和SynapseAI软件堆栈(作为本地安装)的用户,您可以参考专用的安装和安装GitHub存储库以获取详细说明。第二步是加载Habana库并以Gaudi HPU设备为目标。我们将在下一节解释如何为TensorFlow和PyTorch执行此操作
TensorFlow入门对于TensorFlow,Habana将TensorFlow框架与SynapseAI集成到一个插件中,使用 tf.load_library和tf.load_op_library调用库模块和自定义操作/内核。框架集成包括三个主要组件:
- SynapseAI助手
- 设备
- 图形传递
TensorFlow框架控制图形构建或图形执行所需的大部分对象。SynapseAI允许用户在设备上创建、编译和启动图形。图形传递库通过模式匹配、标记、分割和封装(PAMSEN)操作优化TensorFlow图。它旨在操纵TensorFlow图以充分利用Gaudi的硬件资源。给定具有Gaudi实现的图形节点集合,PAMSEN尝试合并尽可能多的图形节点,同时保持图形的正确性。通过保留图语义并自动发现可以融合到一个实体中的子图,PAMSEN提供了与原生TensorFlow相当(或更好)的性能。
要准备模型,您必须加载Habana模块库。调用位于library_loader.py下的load_habana_module()。此函数加载在TensorFlow级别使用Gaudi HPU所需的Habana库:
import tensorflow as tf
from habana_frameworks.tensorflow import load_habana_module
load_habana_module()
tf.compat.v1.disable_eager_execution() # if using tf.session
运行旧版(TF1.x)模型时有一些特定要求,并且在使用Horovod进行多卡和多节点训练时要求有所不同。如果您在单卡上运行TF2.x模型,则不需要最后一条语句。
加载后,Gaudi HPU会在TensorFlow中注册并优先于CPU。这意味着当给定的操作可用于CPU和Gaudi HPU时,该操作将分配给Gaudi HPU。使用上述步骤完成初始模型迁移后,您可以开始查看habana_ops 对象中定义的Habana ops和自定义TensorFlow ops的集成。可以使用以下命令导入:from habana_frameworks.tensorflow import habana_ops。它应该只在load_habana_module()被调用后使用。自定义操作用于与标准TensorFlow操作进行模式匹配。当模型移植到Gaudi HPU时,软件堆栈决定哪些操作放在CPU上,哪些放在Gaudi HPU上。优化过程会自动将不受支持的操作放在CPU上。
在您的模型中完成这些步骤后,您将能够在Gaudi HPU实例上运行它。下面是一个简单的示例,展示了如何为Gaudi启用MNIST模型。(所需的最小更改以粗体突出显示。):
import tensorflow as tf
from TensorFlow.common.library_loader import load_habana_module
load_habana_module()
(x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0
model = tf.keras.models.Sequential([
tf.keras.layers.Flatten(input_shape=(28, 28)),
tf.keras.layers.Dense(10),
])
loss = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)
optimizer = tf.keras.optimizers.SGD(learning_rate=0.01)
model.compile(optimizer=optimizer, loss=loss, metrics=['accuracy'])
model.fit(x_train, y_train, epochs=5, batch_size=128)
model.evaluate(x_test, y_test)
框架和SynapseAI软件堆栈之间的PyTorch Habana桥接接口,用于驱动在Habana Gaudi设备上执行深度学习模型(图3)。Habana提供的安装包在标准PyTorch版本之上进行了修改,并包含在Habana提供的Docker镜像中。此安装包中的自定义框架需要用于将PyTorch与Habana Bridge集成。在这种情况下,您将通过加载PyTorch Habana插件库和模块来修改PyTorch深度学习模型训练脚本import habana_frameworks.torch.core以与Habana Bridge集成。
在Gaudi HPU上执行PyTorch模型有两种Habana PyTorch支持的主要模式:
- 急切模式——标准PyTorch急切模式脚本中定义的逐个操作执行。
- 惰性模式——延迟执行图形,包括从脚本Op由Op交付的操作,如Eager模式。它在Gaudi上提供了Eager模式的性能体验。
图 3. PyTorch Habana全栈架构
通常,建议初始模型开发应在Eager模式下运行以建立功能,然后在Lazy模式下运行以获得最佳性能。这可以通过设置运行时标志来选择(如下面的步骤5所示)。
在Habana上运行模型需要添加以下一组代码。以下步骤涵盖了Eager和Lazy执行模式。
1. 加载Habana PyTorch插件库,libhabana_pytorch_plugin.so。
import torch
from habana_frameworks.torch.utils.library_loader import load_habana_module
load_habana_module()
2. 以Gaudi HPU设备为目标:
device = torch.device("hpu")
3. 将模型移动到设备:
model.to(device)
4. 导入Habana Torch库:
import habana_frameworks.torch.core as htcore
5. 通过设置如下所示的环境变量来启用延迟执行模式。如果要在Eager模式下执行代码,请不要设置此环境变量:
os.environ["PT_HPU_LAZY_MODE"] = "1"
6. 在Lazy模式下,只要数据从Habana设备读回主机,就会触发执行。例如,如果您正在运行一个拓扑并使用loss.item()从设备获取丢失值到主机,则会触发执行。在代码中添加mark_step()是触发执行的另一种方式:
htcore.mark_step()
mark_step()的位置需要放在训练脚本的以下几点:
- 在optimizer.step()明确划分训练迭代之后,
- 如果正在使用的优化器是Habana自定义优化器,则在loss.backward和optimizer.step()之间。
当模型移植到Gaudi HPU上运行时,软件堆栈决定哪些操作放在CPU上,哪些放在HPU上。该决定基于该操作是否以HPU作为后端注册到PyTorch。如果op未在其后端注册为HPU,则op的执行会自动回退到主机CPU。
Habana提供了自己的一些针对Habana设备定制的复杂PyTorch操作的实现。在给定的模型中,用自定义Habana版本替换这些复杂的操作将提供更好的性能。
以下是Habana设备当前支持的自定义优化器列表:
- FusedAdagrad——参考 torch.optim.Adagrad
- FusedAdamW——参考 torch.optim.AdamW
- FusedLamb——参考 LAMB优化器论文
- FusedSGD——参考 torch.optim.SGD
本文的目的是引导您完成将现有深度学习模型迁移到Gaudi的过程,并展示让您的模型准备好运行的基本步骤。请继续关注主网站Habana.ai以获取产品发布公告并注册我们的兴趣列表以获取即将举行的活动的通知。
有用的资源- 开发者网站是开始的最佳场所。这将指向我们的模型、文档和其他资源。
- Habana Documentation 包含所有详细的附属资料,尤其是迁移指南。
- Habana Vault 是下载最新驱动程序和Docker镜像的地方。
- 用户论坛是社区讨论与Habana和Gaudi相关的所有事情的地方。
https://www.codeproject.com/Articles/5317382/Getting-Started-with-Habana-Gaudi-for-Deep-Learnin