返回首页
最新
嗨,HN,您在解决问题时自己想出的最复杂和精妙的算法是什么?
Gmail的主导地位似乎是由其投递能力、垃圾邮件过滤、可靠性和生态系统整合所驱动的。像ProtonMail这样的加密邮件服务提供商虽然提供了不同的权衡,但尚未实现主流采用。我很好奇Gmail的优势中有多少是技术层面的,多少是由于默认设置和用户锁定,以及加密邮件在不久的将来是否能够在类似规模上实现现实竞争。
我一直在碰壁:在 NumPy 或 PyTorch 中原型设计一些东西,然后为了边缘部署将其重写为 C++。重写的过程总是比最初的工作耗时更长。Eigen 的固定大小矩阵 API 无法映射到张量工作负载,xtensor 仅支持 CPU,且使用编译时模板类型,导致错误信息难以阅读,并且它们在 Mac 上都不支持 GPU。更糟糕的是,Eigen 的性能通常比 Python 版本还要慢,因为 PyTorch 打包了优化过的 BLAS,而 Eigen 则使用其自身有限的实现。
因此,我构建了 Axiom,使得重写过程变得机械化。该 API 尽可能接近 NumPy/PyTorch——相同的方法名称、广播规则、运算符重载、动态形状、运行时数据类型。在 PyTorch 中看起来是这样的代码:
```python
scores = Q.matmul(K.transpose(-2, -1)) / math.sqrt(64)
output = scores.softmax(-1).matmul(V)
```
在 Axiom 中看起来是这样的:
```cpp
auto scores = Q.matmul(K.transpose(-2, -1)) / std::sqrt(64.0f);
auto output = scores.softmax(-1).matmul(V);
```
没有心理翻译,也没有调试微妙的 API 差异。
箱子里的内容(28,000 行代码):
- 100 多个操作:算术运算、归约、激活函数(relu、gelu、silu、softmax)、池化、FFT、完整的 LAPACK 线性代数(SVD、QR、Cholesky、特征分解、求解器)
- 通过 MPSGraph 的 Metal GPU——所有操作都在 GPU 上运行,而不仅仅是矩阵乘法。编译的图形通过(形状,数据类型)进行缓存,以避免重新编译
- 无缝的 CPU ↔ GPU:`auto g = tensor.gpu();`——Apple Silicon 上的统一内存完全避免了复制
- 内置 einops:`tensor.rearrange("b h w c -> b c h w")`
- 跨架构的高速 SIMD(NEON、AVX2、AVX-512、SSE、WASM、RISC-V)
- 通过变体支持运行时数据类型(可读的错误,而不是模板爆炸)
- 默认行优先,支持通过 as_f_contiguous() 进行列优先
- 在 macOS、Linux、Windows 和 WebAssembly 上运行
在 M4 Pro 上的性能(与使用 OpenBLAS 的 Eigen、PyTorch、NumPy 比较):
- 矩阵乘法 2048×2048:3,196 GFLOPS(Eigen 2,911 / PyTorch 2,433)
- ReLU 4096×4096:123 GB/s(Eigen 117 / PyTorch 70)
- FFT2 2048×2048:14.9ms(PyTorch 27.6ms / NumPy 63.5ms)
尝试方法:
```bash
git clone https://github.com/frikallo/axiom.git
cd axiom && make release
```
或者通过 FetchContent 将其添加到您的 CMake 项目中。示例文件位于 examples/ 目录中。
欢迎提问有关内部实现的问题或对 API 的反馈。