最初XLA实际上是跟Tensorflow深度结合的,很好地服务了Tensorflow和TPU,而与XLA的结合主要依赖于社区的支持,即torch-xla。 as mp +import torch_xla.core.xla_model as xm +import torch_xla.distributed.parallel_loader as pl +import torch_xla.distributed.xla_multiprocessing as xmp +import torch_xla.distributed.xla_backend def _mp_fn device runtime + dist.init_process_group("xla", init_method='xla://') + + model.to(xm.xla_device() 上的Tensor相乘: import torch_xla.core.xla_model as xm import torch device = xm.xla_device() a = torch.normal
XLA工作原理。 XLA输入语言HLO IR,XLA HLO定义图形,编译成各种体系结构机器指令。编译过程。XLA HLO->目标无关优化分析->XLA HLO->XLA后端->目标相关优化分析->目标特定代码生成。 二,操作符放在XLA_CPU、XLA_GPU设备。 打开JIT编译。在会话打开。把所有可能操作符编程成XLA计算。 不使用XLA运行。 TF_XLA_FLAGS=--xla_generate_hlo_graph=.* python mnist_softmax_xla.py XLA框架处于试验阶段,AOT主要应用场景内存较小嵌入式设备、手机
对于快捷和可扩展的支柱来说,开发工作将主要关注 XLA 编译,因为谷歌认为 XLA 将成为深度学习编译器的行业标准。其目标是使模型训练和推理工作流程在 CPU 和 GPU 上更快地执行。 原文链接: Google’s Tensorflow Roadmap Includes Better XLA Compilation and Distributed Computing(https://www.infoq.com
XLA 帮助 TensorFlow 保持其灵活性,同时消除性能问题。 在内部基准(internal benchmark)测试中,相比于没有 XLA 的 TensorFlow,XLA 显示了在 Nvidia GPU 上高达 50%的加速。 如预期那样,最大的加速来自含有长序列元素操作的模型,因为 XLA 可以将长序列元素操作融合进高效的循环中。然而,XLA 仍然被认为是实验性的,一些基准可能会经历减速过程。 通过设计,XLA 通过添加自定义后端(backend)使支持新设备更容易。由于 TensorFlow 可以指向 XLA,因此可以向 XLA 添加新设备后端,从而使其能够运行 TensorFlow 图。 XLA 为新设备提供了一个显著更小的实现界面,因为 XLA 操作仅仅是原始的(回想一下 XLA 独自处理复杂 op 的分解)。
那么,XLA到底是什么?声网率先树立XLA标准有何深意?XLA的推出又将如何影响整个RTE行业? 行业首个体验质量标准 XLA有何亮点? 可以看到,声网XLA的体验指标,并没有停留在“可用”的标准上,而是在定义什么是“好用”。 这也是声网XLA与电信行业SLA标准最大的不同之处。 代表行业最高水平 达到XLA标准有多难? 有人可能会问,作为RTE行业首个体验质量标准,声网XLA一定代表业内最高水平吗?想要达到XLA的标准到底有多难呢?我们不妨从两个角度来看。 费力又费钱 声网推出XLA意欲何为? 作为声网上市后的首个重磅的产品动作,此次XLA标准的发布,无疑凸显了声网对于体验和服务的高度重视。
JAX 幕后花絮 — XLA 编译 JAX 的强大之处在于它利用了 XLA 编译技术。JAX 所展现出的卓越运行性能,归功于 XLA 提供的硬件特定优化。 实际上,XLA 编译并非 JAX 独有,TensorFlow 和 PyTorch 也都提供了使用 XLA 的选项。不过,与其它流行框架相比,JAX 从设计之初就全面拥抱了 XLA。 : import torch_xla import torch_xla.core.xla_model as xm import torch_xla.distributed.parallel_loader 这种情况并不出人意料,因为它们共享了 XLA 后端。理论上,JAX 生成的任何 XLA(高级线性优化)图都应该能够被 PyTorch/XLA 同样实现。 除了可能的性能提升之外,还有一些其他的动力因素: XLA友好性 与 PyTorch 后来通过 PyTorch/XLA 实现的“函数化”不同,JAX 从设计之初就内嵌了 XLA 的支持。
def xla_add(xla_builder, xla_args, np_x, np_y): return xla_builder.Add(xla_args[0], xla_args[1]) def xla_sinh(xla_builder, xla_args, np_x): b, xla_x = xla_builder, xla_args[0] return b.Div(b.Sub(b.Exp(xla_x ), b.Exp(b.Neg(xla_x))), b.Const(2)) def xla_while(xla_builder, xla_args, cond_fun, body_fun, init_val =(init_val,)) return xla_builder.While(xla_cond, xla_body, xla_args[-1]) jax.register_translation_rule (while_loop, xla_while) JAX从原语到XLA HLO的翻译规则 另外,JAX和Autograd完全兼容。
该方法应用的正是谷歌上个月给TPU开放权限的XLA(Accelerated Linear Algebra)编译器。 XLA嵌入 首先,需要定义动态语义和静态嵌入,定义一个运行时结构来嵌入XLA值 1const AA{T, N} = AbstractArray{T, N} 2struct XRTArray{T, Shp N}( 14a::XRTAllocation) where {T, Dims, N} 15new{T, Dims, N}(a) 16end 17end △ XRTArray的定义 假设我们有一个示例XLA 现在,可以将Julia代码编译到XLA,不过Julia不是用HLO运行的,而是根据Julia库提供的功能编写的。 这张表格展示编译到XLA后,Metalhead.jl VGG19正向传递和反后传递的指令计数细分。
此外,我们还将研究这些特征与宏和生成的函数的交互,这些函数将与XLA编译器相关。 如何将XLA嵌入到Julia IR XLA嵌入 要编译为XLA而不是LLVM,我们应用了上一节中概述的策略。 这产生了一个非常简单的XLA映射(遍历每个语句,从拼接指令规范获取静态操作数,从类型推断获得动态形状并生成相应的XLA代码)。 Listing 2: 手动构建的XLA嵌入 满足这些条件的IR可以简单地转换成XLA IR。 图1:在编译到XLA之后,Metalhead.jl VGG19的forward pass 和backwards pass 生成的XLA指令摘要。 结论 在这篇论文中,我们讨论了如何将Julia代码编译为XLA IR,从而实现卸载到TPU设备。
https://github.com/pytorch/xla 设置 这里有两种方法可以获得TPU的使用权 GCP计算引擎虚拟机与预构建的PyTorch/XLA映像并按照PyTorch/XLA github 由于PyTorch/XLA目前正在积极开发中,我使用最新的TPU版本: ? 使用TPU训练 让我们看看代码。PyTorch/XLA有自己的多核运行方式,由于TPUs是多核的,您希望利用它。 但在你这样做之前,你可能想要把你的模型中的device = ' cuda '替换为 import torch_xla_py.xla_model as xm... 对于多核训练,PyTorch/XLA使用它自己的并行类。 python MyModel.py 工作的局限性 PyTorch/XLA的设计导致了一系列PyTorch功能的限制。
PyTorch对云TPU的支持是通过与XLA(加速线性代数)的集成实现的,XLA是一种用于线性代数的编译器,可以针对多种类型的硬件,包括CPU、GPU和TPU。 ? curl https://raw.githubusercontent.com/pytorch/xla/master/contrib/scripts/env-setup.py -o pytorch-xla-env-setup.py import torch_xla.core.xla_model as xm import torch_xla.debug.metrics as met import torch_xla.distributed.parallel_loader as pl import torch_xla.distributed.xla_multiprocessing as xmp import torch_xla.utils.utils as xu from “PyTorch on XLA Devices”, PyTorch release.
将 Julia 语义映射到 XLA 只要 Julia 程序是按照 XLA 基元来编写的,我们就能将其编译到 XLA。 embedded IR 中的任意元组或 immutable 结构被映射至一个 XLA 元组,即 julia 值 1 + 2im(由两个整数结构组成的复杂数字)将被映射至 XLA 元组 (s64[], s64 我们在 XLA IR 的 Julia 嵌入中保存该结构类型,但很显然 XLA 不了解 julia 类型,因此在最终的转换步骤中这些类型被转换成适当的元组。 类似地,(julia)元组构造函数(以及 immutable 结构的构造函数)变成了 XLA 的元组构件。元组引用(immutable 结构的字段引用)变成了 XLA 的元组引用。 由于 XLA 目前不支持来自一个映射指令的多个输出,该函数在多个映射指令上重复运行,因此后续需要清洗 XLA 的 DCE。
然后选择Debian GNU/Linux 9 Stretch + PyTorch/XLA启动盘。如果打算用ImageNet真实数据训练,需要至少300GB的磁盘大小。 -0.5 (torch-xla-0.5)$ python /usr/share/torch-xla-0.5/pytorch/xla/test/test_train_imagenet.py --datadir :r0.5 python3 pytorch/xla/test/test_train_imagenet.py --model=resnet50 --num_epochs=90 --num_workers= gsutil cp "$DIST_BUCKET/$TORCH_XLA_WHEEL" . !gsutil cp "$DIST_BUCKET/$TORCHVISION_WHEEL" . ! pip install "$TORCH_XLA_WHEEL" !pip install "$TORCHVISION_WHEEL" !
PyTorch与TPU集成实战 5.1 PyTorch XLA:TPU后端 PyTorch XLA是PyTorch的一个扩展,提供了对TPU的原生支持。 :安装与TPU兼容的PyTorch版本 安装PyTorch XLA:安装TPU特定的XLA后端 验证安装:运行简单的测试脚本来确认TPU可用 以下是安装PyTorch XLA的详细命令: # 更新系统 -cp39-linux_x86_64.whl # 验证安装 python -c "import torch; import torch_xla; import torch_xla.core.xla_model :使用XLA特定的检查点保存方法 以下是一个简单的PyTorch模型在TPU上运行的示例: import torch import torch_xla import torch_xla.core.xla_model 在TPU上训练模型的示例: import torch import torch_xla import torch_xla.core.xla_model as xm import torch_xla.distributed.parallel_loader
4.2 TPU 软件栈的核心:XLA 在 TPU 世界里,XLA 是整个软件栈的核心 [3]。它是一个面向深度学习的编译器,可以做 ahead-of-time 或 just-in-time 编译。 PyTorch / XLA 通过 Lazy Tensor 机制收集 IR 图,再下发到 XLA 编译 [4],尽可能保留 PyTorch 的使用体验,同时让模型跑在 Cloud TPU 或 XLA GPU 在 TPU / XLA 视角下,XLA 倾向将 Conv + BN + ReLU 融合为一个或少量 HLO / Fusion 区域 [3,4]。 Available: https://openxla.org/xla [4] PyTorch. "PyTorch/XLA Overview." PyTorch/XLA Documentation. Available: https://pytorch.org/xla/master/learn/xla-overview.html [5] OpenXLA. "StableHLO."
不仅如此,XLA(Accelerated Linear Algebra,即加速线性代数) 还为未来进一步的性能提升打下了基础。 对 XLA 试验性的发布。 XLA 是一个应用领域高度聚焦的 TensorFlow 图编译器,可运行于 CPU 和 GPU。雷锋网获知,谷歌的 XLA 研究进度极快。 我们可以期待未来的 TensorFlow 版本配备更完善、更强大的 XLA。 加入了 TensorFlow Debuggerr (tfdbg)。
还有一个实验性的编译器XLA,这个编译器通过生成既能在GPU、又能在CPU上运行的代码,进而加速线性代数计算。 XLA被认为提升了TensorFlow 的移动性,未来TensorFlow程序只需创建一个后端即可在新硬件平台上运行。 XLA为未来更多的性能改进奠定了基础;而tensorflow.org 全新提供“提示和技巧”,这有助于用户调整模型以达到最大速度。 ■ 实验性的推出XLA:面向CPU和GPU的TensorFlow编译器。XLA正在迅速发展,预计未来会看到更多的进展。
不仅如此,XLA(Accelerated Linear Algebra,即加速线性代数) 还为未来进一步的性能提升打下了基础。 对 XLA 试验性的发布。 XLA 是一个应用领域高度聚焦的 TensorFlow 图编译器,可运行于 CPU 和 GPU。雷锋网获知,谷歌的 XLA 研究进度极快。 我们可以期待未来的 TensorFlow 版本配备更完善、更强大的 XLA。 加入了 TensorFlow Debuggerr (tfdbg)。
that XLA will be used). Devices: 2020-06-18 04:15:11.417085: I tensorflow/compiler/xla/service/service.cc:176] StreamExecutor Successfully opened dynamic library libcuda.so.1 2020-06-18 04:15:11.593401: I tensorflow/compiler/xla that XLA will be used). Devices: 2020-06-18 04:15:11.593427: I tensorflow/compiler/xla/service/service.cc:176] StreamExecutor
,可对 Python 程序与 NumPy 运算执行自动微分,支持循环、分支、递归、闭包函数求导,也可以求三阶导数;依赖于 XLA,JAX 可以在 GPU 和 TPU 上编译和运行 NumPy 程序;通过 XLA,即加速线性代数(Accelerated Linear Algebra),是一个全程序优化编译器,专门为线性代数设计。JAX是建立在XLA之上的,大大提升了计算速度的上限。3. JIT。 JAX文档将JAX称为Autograd和XLA的结合体。自动求导的能力在科学计算的许多领域都是至关重要的,而JAX提供了几个强大的自动求导工具。5. 深度学习。 网友lsaldyt表示他一直致力于用jax做序列模型(LSTM、NTM等),然后发现XLA的编译对于非常复杂的模型来说有点棘手。但他喜欢jax,一有机会就会向朋友宣传,但它绝对是一把双刃剑。 你可以完全用C++来做训练和推理,而不需要用JAX/Python/XLA的组合来捣乱,并通过Tensorflow在C++中使用XLA。