Skip to main content

3 posts tagged with "Burn"

View All Tags

2024年标志着Burn架构的重大演变。 传统的深度学习框架常常要求开发者在性能、可移植性和灵活性之间做出妥协;而我们的目标是超越这些权衡。 展望2025年,我们致力于将这一理念应用于整个计算栈,从嵌入式设备到数据中心,涵盖所有领域。

2024年回顾:突破硬件限制

重新定义内核开发

今年之初,我们面临一个限制:我们的WGPU后端依赖于基础的WGSL模板,限制了我们的适应能力。这个挑战促使我们创建了CubeCL [1],这是我们统一内核开发的解决方案。这项任务非常复杂——设计一个抽象层,适用于各种不同的硬件,同时保持顶级性能。我们的结果证明了这一策略的有效性,在大多数基准测试中,性能现在已匹配甚至超过LibTorch。

多后端架构

后端生态系统现已包括CUDA [2]、HIP/ROCm [3]以及支持WebGPU和Vulkan的先进WGPU实现 [4]。迄今为止最显著的成就是在相同硬件上实现不同后端的性能平衡。例如,无论是在CUDA还是Vulkan上执行矩阵乘法操作,性能几乎相同,这直接反映了我们平台无关优化的策略。

我们还引入了新的Router和HTTP后端:Router后端支持多后端的动态混合,而HTTP后端则支持跨多台机器的分布式处理。为了解决内存管理挑战,我们实施了池化和检查点机制,即使在反向传播期间也能实现操作融合。

硬件无关加速

我们的硬件加速策略标志着一个重要的技术里程碑。我们并不依赖于特定平台的库,如cuBLAS [5]或rocBLAS [6],而是开发了一套编译器栈,利用每个平台的最佳特性,同时确保跨平台的兼容性。这涉及克服代码生成和优化中的复杂挑战,尤其是对于矩阵乘法等操作,必须高效利用各种硬件架构的张量核心。

2025年路线图:拥抱极端

在2025年,我们将解决深度学习部署中的两个基本挑战。

小规模:量化

量化对于资源有限的计算至关重要。 我们的方法使用复杂操作的融合,通过“读取时融合”功能,实现如归约等任务在计算管道中的无缝集成。 这种融合策略自动处理操作的打包和解包,确保量化操作高效运行,无需手动调整。 结果是什么?高性能的量化操作在保持精度的同时,降低了资源需求。

大规模:可扩展的分布式计算

在另一端,是分布式计算。 通过利用我们的Router和HTTP后端构建强大的分布式训练基础设施,我们旨在创建一个流畅的分布式计算体验, 使工作负载能够在不同硬件和后端配置之间轻松流动,同时优化异构计算环境中的资源利用。

为了支持这种普遍兼容性的愿景,我们正在扩展我们的后端生态系统,包括:

  • 开发Metal后端,充分利用Apple Silicon的能力,超越当前WGPU的功能;
  • 在Rust中实现一个即时向量化的CPU后端,以增强CPU性能;
  • 开启新的后端可能性,如FPGA支持,确保Burn能够适应任何计算环境。

我们还将大量投资于开发者体验,提供全面的CubeCL文档,并推动Burn API的稳定化。这些改进将使开发者更容易利用我们跨平台能力的全部潜力。

在2024年,我们证明了跨平台性能不需要妥协。 展望2025年,我们将这一原则扩展到整个计算领域——从微控制器到服务器农场。 通过解决两个极端的技术挑战,我们致力于使深度学习在任何规模或硬件限制下都更加高效和易用。

参考文献

鱼雪

概述

Burn 0.15.0 带来了显著的性能改进,特别是在矩阵乘法和卷积操作方面。

此外,此版本还引入了以下重要更新:

  • 实验性支持:新增 ROCm/HIPSPIR-V 支持,通过 CubeCL 运行时实现。
  • 多后端兼容性:奠定多后端支持的基础。
  • 新特性:增加了量化操作支持。
  • ONNX 支持扩展:包括更多的算子支持和错误修复,以提升覆盖率。

除此之外,Burn 0.15.0 还包含多项错误修复、性能优化、新的张量操作,以及改进的文档支持。


模块与张量相关更新

  • 移除:对常量泛型模块的拷贝限制。
  • 新增deform_conv2d(实现于 torchvision)、Softminroundfloorceil 等浮点操作。
  • 增强:为张量同步增加支持,添加 tensor.one_hot 整数操作。
  • 更改:LR 调度器调整为首次调用 .step() 时返回初始学习率。

ONNX 支持扩展

  • 支持多维索引的 gather 操作。
  • 增强张量形状跟踪能力。
  • 新增 ConvTranspose1dtrilu 操作支持。
  • 修复 where 操作在标量输入下的行为。

后端改进

  • 支持 CudaDeviceMetalDevice,避免重复创建设备。
  • 新增 SPIR-V 编译器支持 (burn-wgpu) 和 HIP 支持 (burn-hip)。
  • 引入 BackendRouter,为分布式后端处理铺路。
  • 修复自动微分相关的内存泄漏和 NaN 问题。

文档与示例

  • 新增自定义 cubecl 内核的文档。
  • 改进了回归任务的示例和 burn-tch 文档。
  • 修复了多个 Burn Book 的链接及 Raspberry Pi 示例的编译问题。

性能与优化

  • 性能提升:增强了切片内核的性能,改进了 conv2dconv_transpose2d 的自动调优。
  • 数据局部性优化:为隐式 GEMM 提供更好的性能支持,并新增边界检查以支持任意输入形状。

Miscellaneous 更新

  • 工具链:更新了 CI 工作流及工具,修复编译器设置的多处问题。
  • 兼容性:确保最小支持 Rust 版本为 1.81。

参考


通过 Burn 0.15.0,深度学习开发者可以更高效地利用 GPU 加速和量化技术,同时享受多后端支持带来的灵活性。欢迎尝试新版本并加入我们的社区,共同推动 Rust 生态的技术进步!

鱼雪

Burn 是一个新型的、全面的 动态深度学习框架,使用 Rust 构建,目标是提供极高的 灵活性计算效率可移植性。通过自动内核融合、异步执行和多硬件后端的支持,Burn 为开发者提供了前所未有的高性能深度学习体验。

Burn 的主要特性

  • 自动内核融合:通过动态生成 GPU 内核,提升模型执行效率。
  • 异步执行架构:保证框架与计算的独立性,提升系统性能。
  • 多后端集成:支持多种硬件架构,跨平台高效执行。
  • 线程安全与智能内存管理:利用 Rust 的所有权系统,确保训练过程中的安全与效率。

性能优化:自动内核融合与异步执行

自动内核融合 💥

Burn 提供自动内核融合,意味着在任何后端都能对模型进行优化。在可能的情况下,Burn 自动创建自定义低级内核,特别适用于需要最小化内存迁移的场景,从而显著提升模型的计算效率。

以下是一个 Rust 代码片段,展示如何实现自定义 GELU 激活函数:

fn gelu_custom<B: Backend, const D: usize>(x: Tensor<B, D>) -> Tensor<B, D> {
let x = x.clone() * ((x / SQRT_2).erf() + 1);
x / 2
}

在运行时,Burn 会为这个自定义实现自动创建内核,与手工编写的 GPU 实现性能相媲美。目前,自动内核融合仅支持 WGPU 后端,未来会扩展到其他后端。

异步执行 ❤️‍🔥

Burn 的后端采用 异步执行风格,这使得模型的计算不会阻塞框架的正常执行,确保系统的高响应性。这种异步架构还为自动内核融合等优化技术提供了支持,进一步提高执行效率。更多关于异步执行的信息,请访问 Burn 博客

线程安全的模块 🦞

Burn 利用 Rust 的所有权系统,使每个模块成为其权重的唯一所有者。这样可以安全地将模块发送到不同线程进行计算,适合多设备训练,避免了传统框架中的同步问题。

智能内存管理 🦀

内存管理 是深度学习框架的关键之一。Burn 使用内存池减少频繁的内存分配和释放,从而提升吞吐量,并通过跟踪张量的所有权在适当时候进行就地突变,进一步减少内存使用。有关内存管理的更多详细信息,请参考 Burn 博客

自动内核选择 🎯

Burn 会自动运行基准测试并为硬件选择最佳内核配置,以确保在所有硬件上高效执行。这稍微增加了热身时间,但会在几次前向和后向传递后稳定下来,大大提高长期执行效率。

硬件特定优化 🔥

Burn 支持多种硬件特性,例如 Nvidia Tensor Cores。目前,Tensor Cores 支持通过 LibTorch 和 Candle 后端进行优化,但还未支持其他加速器。我们计划在未来为 WGPU 后端引入类似的硬件支持。

扩展与灵活性:后端扩展与自定义实现

Burn 提供了丰富的扩展能力,使开发者能够轻松地为模型添加自定义操作或编写特定后端的内核。例如,可以手动编写快闪注意力的实现来提升性能。更多关于后端扩展的信息,请参考 Burn Book

Burn 的深度学习工作流程

培训与推理

Burn 从一开始就考虑了深度学习的培训和推理过程,提供了符合人体工程学的仪表板来监控训练进展,并能够在从嵌入式设备到大型 GPU 集群的任意设备上运行推理。

  • 培训仪表板 📈:Burn 提供基于 Ratatui 框架的终端 UI 仪表板,用户可以方便地实时跟踪训练和验证指标。
  • ONNX 支持 🐫:Burn 支持导入符合 ONNX 标准的模型,便于将其他框架(如 TensorFlow 或 PyTorch)的模型移植到 Burn。
  • 浏览器推理 🌐:通过编译为 Web Assembly,Burn 支持直接在浏览器内运行推理。您可以查看以下示例:

多后端支持

Burn 致力于成为一个 跨平台、支持多后端的深度学习框架,旨在满足不同硬件和开发需求的灵活性。

支持的后端

  1. WGPU 后端 🌐:基于 Rust 图形库 WGPU,支持跨平台 GPU 加速,适用于从 Vulkan 到 WebGPU 等多种环境。更多信息,请参考 WGPU 后端 README
  2. Candle 后端 🕯:基于 Hugging Face 的 Candle,支持 Web Assembly 和 CUDA,适合极简的高性能模型。更多信息,请参考 Candle 后端 README
  3. LibTorch 后端 🎆:基于 PyTorch 的 Rust 绑定,支持 CPU、CUDA 和 Metal,加速深度学习模型训练和推理。更多信息,请参考 LibTorch 后端 README
  4. NdArray 后端 🦐:轻量级 CPU 后端,唯一支持 no_std 的后端,可在无操作系统环境下运行。更多信息,请参考 NdArray 后端 README
  5. Autodiff 后端 🔄:作为后端修饰器,为任何基础后端增加自动微分支持,用于模型训练。更多信息,请参考 Autodiff 后端 README
  6. Fusion 后端 💥:为支持内核融合的后端增加内核融合特性,目前仅 WGPU 后端支持融合。更多信息,请参考 Fusion 后端 README

入门指南

The Burn Book 🔥

要有效地开始使用 Burn,建议阅读 The Burn Book 的前几章,了解 Burn 的关键组成部分和哲学,涵盖了张量、模块和优化器等构建模块的详细示例。

示例代码 🙏

以下是一个简单的代码片段,展示 Burn 的模块声明和前向传播实现:

use burn::nn;
use burn::module::Module;
use burn::tensor::backend::Backend;

#[derive(Module, Debug)]
pub struct PositionWiseFeedForward<B: Backend> {
linear_inner: nn::Linear<B>,
linear_outer: nn::Linear<B>,
dropout: nn::Dropout,
gelu: nn::Gelu,
}

impl<B: Backend> PositionWiseFeedForward<B> {
pub fn forward<const D: usize>(&self,

input: Tensor<B, D>) -> Tensor<B, D> {
let x = self.linear_inner.forward(input);
let x = self.gelu.forward(x);
let x = self.dropout.forward(x);

self.linear_outer.forward(x)
}
}

我们还提供了丰富的 代码示例,展示如何在不同情景中使用 Burn。

为什么选择 Rust 进行深度学习 🦀

Rust 提供了 零成本抽象 和强大的 内存管理,是深度学习开发的理想选择。Rust 提供高性能和安全性,同时使用 Cargo 作为包管理器,可以轻松地构建、测试和部署应用程序。

Rust 的学习曲线可能较为陡峭,但一旦掌握,它可以提供更可靠、无 bug 的解决方案,极大地提升开发效率和代码质量。

结论

Burn 是一个功能强大的 Rust 深度学习框架,支持自动内核融合、异步执行、多后端集成,适用于从嵌入式设备到大型 GPU 集群的各种场景。如果您对深度学习的性能和灵活性有高要求,并且希望探索 Rust 的强大能力,那么 Burn 会是一个绝佳的选择。

鱼雪