rustorch 0.6.29

Production-ready PyTorch-compatible deep learning library in Rust with special mathematical functions (gamma, Bessel, error functions), statistical distributions, Fourier transforms (FFT/RFFT), matrix decomposition (SVD/QR/LU/eigenvalue), automatic differentiation, neural networks, computer vision transforms, complete GPU acceleration (CUDA/Metal/OpenCL), SIMD optimizations, parallel processing, WebAssembly browser support, comprehensive distributed learning support, and performance validation
Documentation
# RusTorch API λ¬Έμ„œ

## πŸ“š μ™„μ „ν•œ API μ°Έμ‘°

이 λ¬Έμ„œλŠ” RusTorch v0.5.15의 포괄적인 API λ¬Έμ„œλ₯Ό λͺ¨λ“ˆκ³Ό κΈ°λŠ₯λ³„λ‘œ μ •λ¦¬ν•˜μ—¬ μ œκ³΅ν•©λ‹ˆλ‹€. λͺ¨λ“  1060+ ν…ŒμŠ€νŠΈμ— 걸쳐 μΌκ΄€λœ 였λ₯˜ 관리λ₯Ό μœ„ν•΄ `RusTorchError`와 `RusTorchResult<T>`λ₯Ό μ‚¬μš©ν•œ 톡합 였λ₯˜ 처리λ₯Ό ν¬ν•¨ν•©λ‹ˆλ‹€. **8단계 μ™„λ£Œ**둜 쑰건 μ—°μ‚°, 인덱싱, 톡계 ν•¨μˆ˜λ₯Ό ν¬ν•¨ν•œ κ³ κΈ‰ ν…μ„œ μœ ν‹Έλ¦¬ν‹°κ°€ μΆ”κ°€λ˜μ—ˆμŠ΅λ‹ˆλ‹€. **9단계 μ™„λ£Œ**둜 λͺ¨λΈ μ €μž₯/λ‘œλ“œ, JIT 컴파일, PyTorch ν˜Έν™˜μ„±μ„ ν¬ν•¨ν•œ 닀쀑 ν˜•μ‹ μ§€μ›μ˜ 포괄적인 직렬화 μ‹œμŠ€ν…œμ΄ λ„μž…λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

## πŸ—οΈ 핡심 μ•„ν‚€ν…μ²˜

### λͺ¨λ“ˆ ꡬ쑰

```
rustorch/
β”œβ”€β”€ tensor/              # 핡심 ν…μ„œ μ—°μ‚°κ³Ό 데이터 ꡬ쑰
β”œβ”€β”€ nn/                  # 신경망 λ ˆμ΄μ–΄μ™€ ν•¨μˆ˜
β”œβ”€β”€ autograd/            # μžλ™ λ―ΈλΆ„ μ—”μ§„
β”œβ”€β”€ optim/               # μ˜΅ν‹°λ§ˆμ΄μ €μ™€ ν•™μŠ΅λ₯  μŠ€μΌ€μ€„λŸ¬
β”œβ”€β”€ special/             # 특수 μˆ˜ν•™ ν•¨μˆ˜
β”œβ”€β”€ distributions/       # 톡계 뢄포
β”œβ”€β”€ vision/              # 컴퓨터 λΉ„μ „ λ³€ν™˜
β”œβ”€β”€ linalg/              # μ„ ν˜• λŒ€μˆ˜ μ—°μ‚° (BLAS/LAPACK)
β”œβ”€β”€ gpu/                 # GPU 가속 (CUDA/Metal/OpenCL/WebGPU)
β”œβ”€β”€ sparse/              # ν¬μ†Œ ν…μ„œ μ—°μ‚°κ³Ό κ°€μ§€μΉ˜κΈ° (12단계)
β”œβ”€β”€ serialization/       # λͺ¨λΈ 직렬화와 JIT 컴파일 (9단계)
└── wasm/                # WebAssembly 바인딩 ([WASM API λ¬Έμ„œ](WASM_API_DOCUMENTATION.md) μ°Έμ‘°)
```

## πŸ“Š ν…μ„œ λͺ¨λ“ˆ

### κΈ°λ³Έ ν…μ„œ 생성

```rust
use rustorch::tensor::Tensor;

// κΈ°λ³Έ 생성
let tensor = Tensor::new(vec![2, 3]);               // ν˜•νƒœ 기반 생성
let tensor = Tensor::from_vec(data, vec![2, 3]);    // 데이터 λ²‘ν„°λ‘œλΆ€ν„° 생성
let tensor = Tensor::zeros(vec![10, 10]);           // 영으둜 μ±„μš΄ ν…μ„œ
let tensor = Tensor::ones(vec![5, 5]);              // 일둜 μ±„μš΄ ν…μ„œ
let tensor = Tensor::randn(vec![3, 3]);             // λ¬΄μž‘μœ„ μ •κ·œ 뢄포
let tensor = Tensor::rand(vec![3, 3]);              // λ¬΄μž‘μœ„ κ· λ“± 뢄포 [0,1)
let tensor = Tensor::eye(5);                        // λ‹¨μœ„ ν–‰λ ¬
let tensor = Tensor::full(vec![2, 2], 3.14);       // νŠΉμ • κ°’μœΌλ‘œ μ±„μš°κΈ°
let tensor = Tensor::arange(0.0, 10.0, 1.0);       // λ²”μœ„ ν…μ„œ
let tensor = Tensor::linspace(0.0, 1.0, 100);      // μ„ ν˜• 간격
```

### ν…μ„œ μ—°μ‚°

```rust
// μ‚°μˆ  μ—°μ‚°
let result = a.add(&b);                             // μ›μ†Œλ³„ λ§μ…ˆ
let result = a.sub(&b);                             // μ›μ†Œλ³„ λΊ„μ…ˆ
let result = a.mul(&b);                             // μ›μ†Œλ³„ κ³±μ…ˆ
let result = a.div(&b);                             // μ›μ†Œλ³„ λ‚˜λˆ—μ…ˆ
let result = a.pow(&b);                             // μ›μ†Œλ³„ κ±°λ“­μ œκ³±
let result = a.rem(&b);                             // μ›μ†Œλ³„ λ‚˜λ¨Έμ§€

// ν–‰λ ¬ μ—°μ‚°
let result = a.matmul(&b);                          // ν–‰λ ¬ κ³±μ…ˆ
let result = a.transpose();                         // ν–‰λ ¬ μ „μΉ˜
let result = a.dot(&b);                             // 내적

// μˆ˜ν•™ ν•¨μˆ˜
let result = tensor.exp();                          // μ§€μˆ˜
let result = tensor.ln();                           // μžμ—° 둜그
let result = tensor.log10();                        // μƒμš© 둜그
let result = tensor.sqrt();                         // 제곱근
let result = tensor.abs();                          // μ ˆλŒ“κ°’
let result = tensor.sin();                          // 사인 ν•¨μˆ˜
let result = tensor.cos();                          // 코사인 ν•¨μˆ˜
let result = tensor.tan();                          // νƒ„μ  νŠΈ ν•¨μˆ˜
let result = tensor.asin();                         // 아크사인
let result = tensor.acos();                         // 아크코사인
let result = tensor.atan();                         // μ•„ν¬νƒ„μ  νŠΈ
let result = tensor.sinh();                         // 쌍곑 사인
let result = tensor.cosh();                         // 쌍곑 코사인
let result = tensor.tanh();                         // 쌍곑 νƒ„μ  νŠΈ
let result = tensor.floor();                        // λ°”λ‹₯ ν•¨μˆ˜
let result = tensor.ceil();                         // 천μž₯ ν•¨μˆ˜
let result = tensor.round();                        // 반올림 ν•¨μˆ˜
let result = tensor.sign();                         // λΆ€ν˜Έ ν•¨μˆ˜
let result = tensor.max();                          // μ΅œλŒ“κ°’
let result = tensor.min();                          // μ΅œμ†Ÿκ°’
let result = tensor.sum();                          // λͺ¨λ“  μ›μ†Œ ν•©
let result = tensor.mean();                         // 평균값
let result = tensor.std();                          // ν‘œμ€€νŽΈμ°¨
let result = tensor.var();                          // λΆ„μ‚°

// ν˜•νƒœ μ‘°μž‘
let result = tensor.reshape(vec![6, 4]);            // ν…μ„œ μž¬ν˜•μ„±
let result = tensor.squeeze();                      // 크기-1 차원 제거
let result = tensor.unsqueeze(1);                   // μΈλ±μŠ€μ— 차원 μΆ”κ°€
let result = tensor.permute(vec![1, 0, 2]);         // 차원 μˆœμ—΄
let result = tensor.expand(vec![10, 10, 5]);        // ν…μ„œ 차원 ν™•μž₯
```

## 🧠 신경망(nn) λͺ¨λ“ˆ

### κΈ°λ³Έ λ ˆμ΄μ–΄

```rust
use rustorch::nn::{Linear, Conv2d, BatchNorm1d, Dropout};

// μ„ ν˜• λ ˆμ΄μ–΄
let linear = Linear::new(784, 256)?;                // μž…λ ₯ 784, 좜λ ₯ 256
let output = linear.forward(&input)?;

// ν•©μ„±κ³± λ ˆμ΄μ–΄
let conv = Conv2d::new(3, 64, 3, None, Some(1))?; // in_channels=3, out_channels=64, kernel_size=3
let output = conv.forward(&input)?;

// 배치 μ •κ·œν™”
let bn = BatchNorm1d::new(256)?;
let normalized = bn.forward(&input)?;

// λ“œλ‘­μ•„μ›ƒ
let dropout = Dropout::new(0.5)?;
let output = dropout.forward(&input, true)?;       // training=true
```

### ν™œμ„±ν™” ν•¨μˆ˜

```rust
use rustorch::nn::{ReLU, Sigmoid, Tanh, LeakyReLU, ELU, GELU};

// κΈ°λ³Έ ν™œμ„±ν™” ν•¨μˆ˜
let relu = ReLU::new();
let sigmoid = Sigmoid::new();
let tanh = Tanh::new();

// λ§€κ°œλ³€μˆ˜ν™”λœ ν™œμ„±ν™” ν•¨μˆ˜
let leaky_relu = LeakyReLU::new(0.01)?;
let elu = ELU::new(1.0)?;
let gelu = GELU::new();

// μ‚¬μš© 예제
let activated = relu.forward(&input)?;
```

## πŸš€ GPU 가속 λͺ¨λ“ˆ

### λ””λ°”μ΄μŠ€ 관리

```rust
use rustorch::gpu::{Device, get_device_count, set_device};

// μ‚¬μš© κ°€λŠ₯ν•œ λ””λ°”μ΄μŠ€ 확인
let device_count = get_device_count()?;
let device = Device::best_available()?;            // 졜적 λ””λ°”μ΄μŠ€ 선택

// λ””λ°”μ΄μŠ€ μ„€μ •
set_device(&device)?;

// ν…μ„œλ₯Ό GPU둜 이동
let gpu_tensor = tensor.to_device(&device)?;
```

### CUDA μ—°μ‚°

```rust
#[cfg(feature = "cuda")]
use rustorch::gpu::cuda::{CudaDevice, memory_stats};

// CUDA λ””λ°”μ΄μŠ€ μ—°μ‚°
let cuda_device = CudaDevice::new(0)?;              // GPU 0 μ‚¬μš©
let stats = memory_stats(0)?;                      // λ©”λͺ¨λ¦¬ 톡계
println!("μ‚¬μš©λœ λ©”λͺ¨λ¦¬: {} MB", stats.used_memory / (1024 * 1024));
```

## 🎯 μ΅œμ ν™”κΈ°(Optim) λͺ¨λ“ˆ

### κΈ°λ³Έ μ΅œμ ν™”κΈ°

```rust
use rustorch::optim::{Adam, SGD, RMSprop, AdamW};

// Adam μ΅œμ ν™”κΈ°
let mut optimizer = Adam::new(vec![x.clone(), y.clone()], 0.001, 0.9, 0.999, 1e-8)?;

// SGD μ΅œμ ν™”κΈ°
let mut sgd = SGD::new(vec![x.clone()], 0.01, 0.9, 1e-4)?;

// μ΅œμ ν™” 단계
optimizer.zero_grad()?;
// ... μˆœμ „νŒŒμ™€ μ—­μ „νŒŒ ...
optimizer.step()?;
```

## πŸ“– μ‚¬μš© 예제

### μ„ ν˜• νšŒκ·€

```rust
use rustorch::{tensor::Tensor, nn::Linear, optim::Adam, autograd::Variable};

// 데이터 μ€€λΉ„
let x = Variable::new(Tensor::randn(vec![100, 1]), false)?;
let y = Variable::new(Tensor::randn(vec![100, 1]), false)?;

// λͺ¨λΈ μ •μ˜
let mut model = Linear::new(1, 1)?;
let mut optimizer = Adam::new(model.parameters(), 0.001, 0.9, 0.999, 1e-8)?;

// ν›ˆλ ¨ 루프
for epoch in 0..1000 {
    optimizer.zero_grad()?;
    let pred = model.forward(&x)?;
    let loss = (pred - &y).pow(&Tensor::from(2.0))?.mean()?;
    backward(&loss, true)?;
    optimizer.step()?;
    
    if epoch % 100 == 0 {
        println!("에포크 {}: 손싀 = {:.4}", epoch, loss.item::<f32>()?);
    }
}
```

## ⚠️ μ•Œλ €μ§„ μ œν•œμ‚¬ν•­

1. **GPU λ©”λͺ¨λ¦¬ μ œν•œ**: 큰 ν…μ„œ(>8GB)의 경우 λͺ…μ‹œμ  λ©”λͺ¨λ¦¬ 관리 ν•„μš”
2. **WebAssembly μ œν•œ**: 일뢀 BLAS 연산이 WASM ν™˜κ²½μ—μ„œ μ‚¬μš© λΆˆκ°€
3. **λΆ„μ‚° ν•™μŠ΅**: NCCL λ°±μ—”λ“œλŠ” Linuxμ—μ„œλ§Œ 지원
4. **Metal μ œν•œ**: 일뢀 κ³ κΈ‰ 연산은 CUDA λ°±μ—”λ“œμ—μ„œλ§Œ μ‚¬μš© κ°€λŠ₯

## πŸ”— κ΄€λ ¨ 링크

- [메인 README](../README.md)
- [WASM API λ¬Έμ„œ](WASM_API_DOCUMENTATION.md)
- [Jupyter κ°€μ΄λ“œ](jupyter-guide.md)
- [GitHub μ €μž₯μ†Œ](https://github.com/JunSuzukiJapan/RusTorch)
- [Crates.io νŒ¨ν‚€μ§€](https://crates.io/crates/rustorch)

---

**졜근 μ—…λ°μ΄νŠΈ**: v0.5.15 | **λΌμ΄μ„ μŠ€**: MIT | **μž‘μ„±μž**: Jun Suzuki