tracel-ai/burn
요약
Burn은 유연성, 효율성, 이식성을 모두 갖춘 차세대 텐서 라이브러리이자 딥러닝 프레임워크입니다. Rust를 기반으로 설계되어 정적 그래프 최적화의 장점을 유지하면서도 높은 유연성을 제공합니다. Burn은 CUDA, ROCm, Metal, Vulkan 등 다양한 하드웨어 백엔드를 지원하며, Autodiff, Fusion, Router, Remote와 같은 데코레이터 패턴을 통해 기능을 확장하고 분산 컴퓨팅까지 지원할 수 있습니다.
핵심 포인트
- Burn은 Rust를 활용하여 유연성을 유지하면서 정적 그래프 최적화 수준의 성능을 제공합니다.
- 다양한 하드웨어 백엔드를 지원하며, 설계 단계부터 제네릭하게 작성되어 백엔드 조합이 용이합니다.
- Autodiff는 별도의 백엔드 데코레이터로 구현되어 자동 미분 기능을 모든 기본 백엔드에 투명하게 추가할 수 있습니다.
- Fusion과 Router 같은 데코레이터를 통해 커널 퓨전, 하드웨어 운용성 단순화 등 고급 기능을 쉽게 통합할 수 있습니다.
- Remote 백엔드는 클라이언트-서버 구조를 통해 원격 컴퓨팅을 지원하여 분산 환경에 유용합니다.
Burn은 유연성, 효율성, 그리고 이식성(portability)을 타협하지 않는 차세대 텐서 라이브러리(Tensor Library)이자 딥러닝 프레임워크(Deep Learning Framework)입니다.
Burn은 수치 계산(numerical computing), 모델 추론(model inference) 및 모델 학습(model training)에 최적화된 텐서 라이브러리이자 딥러닝 프레임워크입니다. Burn은 Rust를 활용하여 통상적으로 정적 그래프(static-graph) 프레임워크에서만 가능한 최적화를 수행하며, 유연성을 해치지 않으면서도 최적의 속도를 제공합니다.
Burn은 견고한 구현을 통해 가능한 한 많은 하드웨어에서 가능한 한 빠르게 작동하는 것을 목표로 합니다. 우리는 클라우드에서 모델을 학습시킨 후, 사용자마다 각기 다른 고객의 하드웨어에 배포해야 하는 현대적 요구사항에서 이러한 유연성이 매우 중요하다고 믿습니다.
대부분의 백엔드(backends)는 모든 운영체제(operating systems)를 지원하므로, 아래 표에는 명시하지 않았습니다.
GPU 백엔드(Backends):
| CUDA | ROCm | Metal | Vulkan | WebGPU | LibTorch | |
|---|---|---|---|---|---|---|
| Nvidia | ☑️ | - | - | ☑️ | ☑️ | ☑️ |
| ... |
CPU 백엔드(Backends):
| Cpu (CubeCL) | Flex | LibTorch | |
|---|---|---|---|
| X86 | ☑️ | ☑️ | ☑️ |
| ... |
다른 프레임워크와 비교했을 때, Burn은 많은 백엔드를 지원하는 방식에 있어 매우 다른 접근 방식을 취합니다. 설계 단계부터 대부분의 코드는 Backend 트레이트(trait)에 대해 제네릭(generic)하게 작성되어 있어, 교체 가능한 백엔드로 Burn을 구축할 수 있습니다. 이를 통해 백엔드를 조합하는 것이 가능해지며, 자동 미분(autodifferentiation) 및 자동 커널 퓨전(automatic kernel fusion)과 같은 추가적인 기능을 백엔드에 증강할 수 있습니다.
Autodiff: 모든 백엔드에 역전파(backpropagation)를 가져다주는 백엔드 데코레이터(Backend decorator) 🔄
앞서 언급한 백엔드들과 달리, Autodiff는 실제로는 백엔드 *데코레이터(decorator)*입니다. 이는 Autodiff가 단독으로 존재할 수 없으며, 반드시 다른 백엔드를 캡슐화(encapsulate)해야 함을 의미합니다.
기본 백엔드를 Autodiff로 감싸는 간단한 동작만으로 투명하게 자동 미분(autodifferentiation) 지원 기능이 갖춰지며, 이를 통해 모델에서 backward를 호출하는 것이 가능해집니다.
use burn::backend::{Autodiff, Wgpu};
use burn::tensor::{Distribution, Tensor};
fn main() {
...
참고로, Autodiff를 지원하지 않는 백엔드(추론용)에서 실행되는 모델에 대해 backward를 호출하는 실수를 범하는 것은 불가능합니다. 이 메서드는 오직 Autodiff 백엔드에서만 제공되기 때문입니다.
자세한 내용은 Autodiff Backend README를 참조하세요.
Fusion: 모든 퍼스트 파티 백엔드에 커널 퓨전 (Kernel Fusion)을 제공하는 백엔드 데코레이터 (Backend decorator)
이 백엔드 데코레이터는 내부 백엔드가 지원하는 경우, 해당 백엔드에 커널 퓨전 (Kernel Fusion) 기능을 강화합니다. 이 백엔드를 Autodiff와 같은 다른 백엔드 데코레이터와 조합할 수 있음에 유의하세요. 모든 퍼스트 파티 가속 백엔드(WGPU 및 CUDA와 같은)는 기본적으로 Fusion을 사용합니다 (burn/fusion 기능 플래그), 따라서 일반적으로 수동으로 적용할 필요는 없습니다.
#[cfg(not(feature = "fusion"))]
pub type Cuda<F = f32, I = i32> = CubeBackend<CudaRuntime, F, I, u8>;
#[cfg(feature = "fusion")]
...
참고로, 저희는 연산 제한 (Compute bound) 및 메모리 제한 (Memory bound) 연산에 기반한 자동 그래디언트 체크포인팅 (Automatic gradient checkpointing)을 구현할 계획이며, 이는 Fusion 백엔드와 유연하게 작동하여 훈련 중 코드가 훨씬 더 빠르게 실행되도록 할 것입니다. 이 이슈를 참조하세요.
자세한 내용은 Fusion Backend README를 참조하세요.
Router (Beta): 여러 백엔드를 하나의 백엔드로 조합하는 백엔드 데코레이터
이 백엔드는 예를 들어 일부 연산은 CPU에서 실행하고 다른 연산은 GPU에서 실행하고 싶은 경우와 같이 하드웨어 운용성을 단순화합니다.
use burn::tensor::{Distribution, Tensor};
use burn::backend::{
Flex, Router, Wgpu, flex::FlexDevice, router::duo::MultiDevice, wgpu::WgpuDevice,
...
Remote (Beta): 분산 컴퓨팅 (Distributed computations)에 유용한 원격 백엔드 실행을 위한 백엔드 데코레이터
이 백엔드는 클라이언트와 서버의 두 부분으로 구성됩니다. 클라이언트는 네트워크를 통해 텐서 연산을 원격 컴퓨팅 백엔드로 전송합니다. 단 한 줄의 코드로 어떤 퍼스트 파티 백엔드든 서버로 사용할 수 있습니다:
fn main_server() {
// 3000번 포트에서 서버를 시작합니다.
burn::server::start::<burn::backend::Cuda>(Default::default(), 3000);
...
Burn을 사용하면 전체 딥러닝 워크플로우(workflow)가 간편해집니다. 인체공학적인 대시보드로 학습 진행 상황을 모니터링할 수 있으며, 임베디드 장치부터 대규모 GPU 클러스터에 이르기까지 어디에서나 추론 (inference)을 실행할 수 있습니다.
Burn은 학습과 추론을 염두에 두고 처음부터 설계되었습니다. 또한 PyTorch와 같은 프레임워크와 비교했을 때, Burn이 코드 변경 없이 학습에서 배포로의 전환을 얼마나 단순화하는지도 주목할 만한 가치가 있습니다.
다음 섹션을 클릭하여 확장하세요 👇
학습 대시보드 (Training Dashboard) 📈
이전 영상(사진을 클릭하세요!)에서 보시는 바와 같이, Ratatui 크레이트 (crate)를 기반으로 한 새로운 터미널 UI 대시보드를 통해 사용자는 외부 애플리케이션에 연결할 필요 없이 손쉽게 학습 과정을 추적할 수 있습니다.
화살표 키만 사용하여 실시간으로 업데이트되는 학습 및 검증 지표 (metrics)를 시각화하고, 등록된 모든 지표의 생애 주기 진행 과정이나 최근 이력을 분석할 수 있습니다. 학습 루프 (training loop)를 중단하더라도 크래시 (crash)가 발생하지 않아, 잠재적인 체크포인트 (checkpoint)를 완전히 기록하거나 중요한 코드 조각을 중단 없이 완료할 수 있습니다 🛡
ONNX 지원 🐫
Burn은 burn-onnx 크레이트를 통해 ONNX (Open Neural Network Exchange) 모델 임포트 (import)를 지원하므로, TensorFlow 또는 PyTorch의 모델을 Burn으로 쉽게 포팅 (port)할 수 있습니다. ONNX 모델은 Burn의 네이티브 API를 사용하는 Rust 코드로 변환되어, 임포트된 모델이 모든 Burn 백엔드 (CPU, GPU, WebAssembly)에서 실행될 수 있으며 자동 커널 퓨전 (automatic kernel fusion)과 같은 Burn의 모든 최적화 혜택을 누릴 수 있습니다.
ONNX 지원에 대한 자세한 내용은 Burn Book의 이 섹션에서 설명합니다 🔥.
참고: 이 크레이트는 현재 활발히 개발 중이며, 현재 제한된 범위의 ONNX 연산자 (operators)를 지원합니다.
PyTorch 또는 Safetensors 모델 임포트 🚚
PyTorch 또는 Safetensors 형식의 가중치 (weights)를 Burn으로 정의된 모델에 직접 로드할 수 있습니다. 이를 통해 Burn의 성능 및 배포 기능을 활용하면서 기존 모델을 쉽게 재사용할 수 있습니다.
Burn Book의 모델 저장 및 로드 (Saving & Loading Models) 섹션에서 더 자세히 알아보세요.
브라우저에서의 추론 (Inference in the Browser) 🌐
우리의 여러 백엔드(backends)는 WebAssembly 환경에서 실행될 수 있습니다. CPU 실행을 위한 Flex와 WebGPU를 통한 GPU 가속을 위한 WGPU가 이에 해당합니다. 이는 브라우저 내에서 직접 추론 (inference)을 실행할 수 있음을 의미합니다. 우리는 이에 대한 몇 가지 예시를 제공합니다:
- 숫자를 그리면 작은 컨브넷 (convnet)이 그것이 무엇인지 찾아내는 MNIST! 2️⃣ 7️⃣ 😰
- 이미지를 업로드하고 분류할 수 있는 이미지 분류 (Image Classification)! 🌄
임베디드: no_std 지원 ⚙️
Burn의 핵심 구성 요소들은 no_std를 지원합니다. 이는 운영 체제(OS)가 없는 임베디드 장치와 같은 베어 메탈 (bare metal) 환경에서도 실행될 수 있음을 의미합니다.
현재로서는 Flex 백엔드만이 no_std 환경에서 사용될 수 있습니다.
서로 다른 백엔드 간의 성능을 평가하고 시간이 지남에 따른 개선 사항을 추적하기 위해, 우리는 전용 벤치마킹 스위트 (benchmarking suite)를 제공합니다.
burn-bench를 사용하여 벤치마크를 실행하고 비교해 보세요.
⚠️ 경고: wgpu 백엔드 중 하나를 사용할 때, 재귀적 타입 평가 (recursive type evaluation)와 관련된 컴파일 에러가 발생할 수 있습니다. 이는 wgpu 의존성 체인 내의 복잡한 타입 중첩 (type nesting) 때문입니다. 이 문제를 해결하려면 main.rs 또는 lib.rs 파일의 최상단에 다음 줄을 추가하세요: #![recursion_limit = "256"]
깊게 중첩된 연관 타입 (associated types) 및 트레이트 바운드 (trait bounds)로 인해, 기본 재귀 제한(128)은 필요한 깊이(통상 130-150)보다 낮은 경우가 많습니다.
Burn에 대해 방금 들으셨나요? 제대로 찾아오셨습니다! 이 섹션을 계속 읽어 나가시면 빠르게 합류하실 수 있을 것입니다.
The Burn Book 🔥
Burn으로 효과적인 작업을 시작하려면, 핵심 구성 요소와 철학을 이해하는 것이 매우 중요합니다. 이것이 우리가 신규 사용자들에게 The Burn Book 🔥의 첫 섹션들을 읽어볼 것을 강력히 권장하는 이유입니다. 이 책은 텐서 (tensors), 모듈 (modules), 옵티마이저 (optimizers)와 같은 빌딩 블록부터 직접 GPU 커널 (GPU kernels)을 코딩하는 것과 같은 고급 사용법에 이르기까지, 프레임워크의 모든 측면을 다루는 상세한 예시와 설명을 제공합니다.
이 프로젝트는 끊임없이 진화하고 있으며, 저희는 가능한 한 새로운 내용이 추가될 때마다 책을 최신 상태로 유지하려고 노력하고 있습니다. 하지만 때때로 일부 세부 사항을 놓칠 수도 있으니, 이상한 점을 발견하시면 저희에게 알려주세요! Pull Request (PR)도 기쁘게 환영합니다 😄
예제 (Examples) 🙏
이 프레임워크가 얼마나 직관적으로 사용 가능한지 보여주는 코드 스니펫(code snippet)으로 시작해 보겠습니다! 다음은 몇 가지 파라미터(parameters)와 함께 순전파 (forward pass)를 포함하는 신경망 모듈 (neural network module)을 선언하는 예시입니다.
use burn::nn;
use burn::module::Module;
use burn::tensor::backend::Backend;
...
저희 저장소에는 다양한 시나리오에서 프레임워크를 사용하는 방법을 보여주는 상당히 많은 양의 예제가 있습니다.
책을 따라하기:
- 기본 워크플로우 (Basic Workflow): MNIST 데이터셋을 학습시키고 추론 (inference)에 사용할 수 있는 커스텀 CNN
Module을 생성합니다. - 커스텀 학습 루프 (Custom Training Loop):
Learner를 사용하는 대신 기본적인 학습 루프를 구현합니다. - 커스텀 WGPU 커널 (Custom WGPU Kernel): WGPU 백엔드 (backend)를 사용하여 자신만의 커스텀 연산을 만드는 방법을 배웁니다.
추가 예제:
- 커스텀 CSV 데이터셋 (Custom CSV Dataset): 회귀 (regression) 작업을 위해 CSV 데이터를 파싱하는 데이터셋을 구현합니다.
- 회귀 (Regression): California Housing 데이터셋에서 단순한 MLP를 학습시켜 구역별 주택 가격 중앙값을 예측합니다.
- 커스텀 이미지 데이터셋 (Custom Image Dataset): 단순한 폴더 구조를 따르는 커스텀 이미지 데이터셋에서 단순한 CNN을 학습시킵니다.
- 커스텀 렌더러 (Custom Renderer):
Learner진행 상황을 표시하기 위한 커스텀 렌더러를 구현합니다. - 이미지 분류 웹 (Image Classification Web): Burn, WGPU 및 WebAssembly를 사용한 이미지 분류 웹 브라우저 데모입니다.
- 웹에서의 MNIST 추론 (MNIST Inference on Web): 브라우저 내에서 실행되는 대화형 MNIST 추론 데모입니다. 이 데모는 온라인에서 확인할 수 있습니다.
- MNIST 학습 (MNIST Training):
Learner를 사용하여 커스텀Module(MLP)을 학습시키는 방법을 보여줍니다.
메트릭 (metrics)을 기록하고 학습 체크포인트 (training checkpoints)를 유지하도록 설정되었습니다. - PyTorch Import Inference: Burn을 사용하여 샘플 이미지에 대해 추론 (inference)을 수행하기 위해 MNIST로 사전 학습된 PyTorch 모델을 가져옵니다.
- Text Classification: AG News 또는 DbPedia 데이터셋에서 텍스트 분류 트랜스포머 (transformer) 모델을 학습시킵니다. 학습된 모델은 이후 텍스트 샘플을 분류하는 데 사용될 수 있습니다.
- Text Generation: DbPedia 데이터셋에서 텍스트 생성 트랜스포머 (transformer) 모델을 학습시킵니다.
- Wasserstein GAN MNIST: MNIST를 기반으로 새로운 필기 숫자를 생성하기 위해 WGAN 모델을 학습시킵니다.
더욱 실질적인 통찰을 얻으려면, 저장소 (repository)를 클론 (clone)하여 컴퓨터에서 직접 실행해 볼 수 있습니다!
사전 학습된 모델 (Pre-trained Models) 🤖
저희는 Burn으로 구축된 모델과 예제의 최신화되고 큐레이션된 목록을 유지하고 있습니다. 자세한 내용은 tracel-ai/models 저장소를 참조하세요.
원하는 모델이 보이지 않나요? 주저하지 말고 이슈 (issue)를 생성해 주세요. 우선적으로 처리할 수도 있습니다. Burn을 사용하여 모델을 구축했고 이를 공유하고 싶으신가요? Pull Request를 생성하여 커뮤니티 섹션에 모델을 추가할 수도 있습니다!
왜 딥러닝 (Deep Learning)에 Rust를 사용해야 할까요? 🦀
딥러닝 (Deep Learning)은 매우 높은 수준의 추상화 (abstractions)와 극도로 빠른 실행 시간 (execution time)이 모두 필요한 특수한 형태의 소프트웨어입니다. Rust는 신경망 모듈 (neural network modules)을 쉽게 생성할 수 있는 제로 비용 추상화 (zero-cost abstractions)를 제공하고, 모든 세부 사항을 최적화할 수 있도록 메모리에 대한 세밀한 제어 (fine-grained control)를 제공하기 때문에 해당 사용 사례에 완벽한 후보입니다.
사용자가 AI 분야의 혁신에 집중할 수 있도록 프레임워크가 높은 수준에서 사용하기 쉬워야 한다는 점은 중요합니다. 하지만 모델 실행은 계산 (computations)에 크게 의존하기 때문에 성능 (performance)을 간과할 수 없습니다.
오늘날까지 이 문제에 대한 주류 해결책은 Python으로 API를 제공하되 C/C++과 같은 저수준 언어 (low-level languages)의 바인딩 (bindings)에 의존하는 것이었습니다. 이는 이식성 (portability)을 낮추고, 복잡성을 증가시키며, 연구자와 엔지니어 사이의 마찰을 유발합니다. 저희는 Rust의 추상화 방식이 이러한 두 언어 간의 이분법 (dichotomy)을 해결할 수 있을 만큼 다재다능하다고 느낍니다.
Rust에는 Cargo 패키지 매니저 (package manager)도 포함되어 있어, Python에서는 보통 고통스러운 작업인 빌드, 테스트 및 배포를 어떤 환경에서든 믿을 수 없을 정도로 쉽게 만들어 줍니다.
Rust가 처음에는 어려운 언어라는 평판이 있지만, 저희는 숙련된 이후에는 (😅) 더 빠르고 신뢰할 수 있으며 버그가 없는 (bug-free) 솔루션을 구축하는 데 도움이 된다고 강력히 믿습니다!
사용 중단 안내 (Deprecation Note)
0.14.0 버전 이후부터 텐서 데이터 (tensor data)의 내부 구조가 변경되었습니다. 이전의 Data 구조체는 사용 중단 (deprecated)되었으며, 0.17.0 버전부터는 새로운 TensorData 구조체로 공식적으로 대체되었습니다. TensorData는 기본 데이터를 바이트 (bytes)로 저장하고 데이터 타입 (data type)을 필드로 유지함으로써 더 높은 유연성을 제공합니다. 코드에서 Data를 사용하고 있다면 반드시 TensorData로 전환하시기 바랍니다.
이전 버전으로부터 모델 레코드 (Model Records) 로드하기 ⚠️
0.14.0보다 오래된 버전에서 저장된 모델 레코드를 로드하려는 경우, record-backward-compat 기능 플래그 (feature flag)가 포함된 호환 가능한 버전(0.14, 0.15 또는 0.16)을 사용해야 합니다.
features = [..., "record-backward-compat"]
AI 자동 생성 콘텐츠
본 콘텐츠는 GitHub Trending Rust (weekly)의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기