一、third_party 目录概览

PyTorch 采用 vendored(内嵌) 方式管理第三方依赖,将所有关键库的源码直接放置在 third_party/ 目录下,而非通过系统包管理器动态链接。这种策略的核心原因有三:

  1. 构建确定性:精确锁定每个依赖的版本,避免系统环境差异导致的编译失败
  2. 交叉编译友好:移动端(Android/iOS)及嵌入式部署需要从源码交叉编译全部依赖
  3. 深度定制:许多库(如 FBGEMM、Kineto)由 Meta 内部开发并针对 PyTorch 做了定制优化

整个目录包含 60+ 个子项目,覆盖从底层 SIMD 指令抽象到上层模型序列化的完整技术栈。按功能可划分为以下七大类:

third_party/
├── 【GPU 计算加速】  cutlass, flash-attention, cudnn_frontend, composable_kernel, aiter, mslk
├── 【CPU 计算加速】  fbgemm, sleef, XNNPACK, NNPACK, ideep, kleidiai, gemmlowp
├── 【分布式通信】    nccl, gloo, tensorpipe, cpp-httplib
├── 【构建基础设施】  pybind11, protobuf, flatbuffers, fmt, nlohmann, googletest
├── 【底层运行时】    cpuinfo, pthreadpool, FP16, FXdiv, psimd, mimalloc, pocketfft
├── 【性能诊断】      kineto, NVTX, ittapi, benchmark
└── 【平台适配】      VulkanMemoryAllocator, llvm-openmp, miniz, python-peachpy, valgrind-headers

二、GPU 计算加速层:极致性能的追求

GPU 计算是 PyTorch 性能的核心,third_party/ 中的 GPU 相关库构成了一个多层级的加速体系。

2.1 CUTLASS — CUDA 矩阵乘法模板库

CUTLASS(CUDA Templates for Linear Algebra Subroutines)是 NVIDIA 开源的 CUDA C++ 模板库,提供从 Volta 到 Blackwell 全系列 GPU 的高性能 GEMM 实现。

cutlass/
├── include/cutlass/        # 核心模板头文件
│   ├── gemm/               # GEMM 操作模板
│   ├── conv/               # 卷积操作模板
│   ├── epilogue/           # 后处理模板(bias、activation)
│   └── cute/               # CuTe DSL(Tensor Core 编程抽象)
├── python/                 # Python 绑定工具
└── tools/profiler/         # 性能分析工具

CUTLASS 的核心价值在于 CuTe(Cute Tensor)DSL,它将 Tensor Core 的硬件抽象为可组合的 Layout 和 Copy 操作,让开发者无需直接处理 mma.sync 等 PTX 指令。PyTorch 的 torch.compile 后端 Inductor 在生成 GPU kernel 时,底层即依赖 CUTLASS 提供的混合精度矩阵乘法模板(FP8/FP16/BF16/TF32)。

2.2 flash-attention — 高效注意力算法

Flash Attention 是 Transformer 领域的里程碑式优化,通过 分块计算 + IO 感知 策略将注意力机制的内存复杂度从 O(N²) 降至 O(N)。

flash-attention/
├── csrc/                   # CUDA C++ 核心实现
│   ├── flash_attn/         # FlashAttention-2 (Ampere/Hopper)
│   └── flash_attn_ck/      # AMD CK 后端
├── hopper/                 # FlashAttention-3 (H100 专用)
└── flash_attn/             # Python 接口

PyTorch 通过 torch.nn.functional.scaled_dot_product_attention 统一调度 Flash Attention,根据硬件自动选择最优实现。在 H100 上 FlashAttention-3 利用 TMA(Tensor Memory Accelerator)和 WGMMA 指令,吞吐量较 V2 提升约 1.5-2 倍。

2.3 cudnn_frontend — cuDNN Graph API 前端

cuDNN Frontend 是 NVIDIA 提供的 header-only C++ 库,封装了 cuDNN v8+ 的 Graph API。相比旧版 Legacy API,Graph API 允许将多个操作(卷积 + BN + ReLU)融合为一个计算图,由 cuDNN 运行时自动选择最优实现。

// Graph API 使用模式
auto graph = cudnn_frontend::graph::Graph();
graph.set_io_data_type(cudnn_frontend::DataType_t::HALF);
auto conv_output = graph.conv_fprop(X, W, conv_options);
auto bn_output = graph.batchnorm(conv_output, ...);
graph.build_operation_graph(cudnn_handle);

2.4 AMD GPU 生态:composable_kernel + aiter

PyTorch 对 AMD ROCm 的支持同样依赖 vendored 库:

库定位核心技术
composable_kernel类比 CUTLASS,AMD GPU 的 Tile-based 编程模板可组合 Tensor 坐标变换、GEMM/Conv 模板
aiterAMD AI 算子集合(Meta Superintelligence Labs)FP8 GEMM、Grouped Attention、Triton 后端

两者互补:composable_kernel 提供底层模板,aiter 提供面向特定 AI 场景的高层算子。目标架构包括 gfx942(MI300X)和 gfx950。

2.5 MSLK — Meta Superintelligence Labs Kernels

MSLK 是 Meta 内部维护的 GenAI 高性能 kernel 集合(前身为 FBGEMM GenAI),覆盖 CUDA 和 ROCm 双平台。它在 CMakeLists.txt 中被默认启用于 SM100a(Blackwell)和 gfx942/gfx950 架构,提供的核心能力包括:

  • FP8 GEMM with Grouped Scaling
  • 高效 Grouped Query Attention
  • 稀疏矩阵乘法加速

三、CPU 计算加速层:覆盖服务器到移动端

3.1 FBGEMM — 量化推理加速引擎

FBGEMM(Facebook GEneral Matrix Multiplication)是 Meta 自研的 低精度矩阵乘法库,专注 INT8/INT4 量化推理场景。

fbgemm/
├── include/fbgemm/         # 公共头文件
│   ├── Fbgemm.h            # 核心 GEMM 接口
│   └── QuantUtils.h        # 量化工具
├── src/                    # CPU 实现(AVX2/AVX512)
├── fbgemm_gpu/             # GPU 扩展(推荐系统优化)
└── bench/                  # 性能基准

FBGEMM 的独特之处在于支持 行级量化(row-wise quantization) 和 离群值感知量化(outlier-aware quantization),有效减少量化精度损失。在推荐系统(DLRM)场景中,FBGEMM-GPU 的 Table Batched Embedding 操作可将 embedding lookup 吞吐提升数倍。

3.2 SLEEF — SIMD 数学函数库

SLEEF(SIMD Library for Evaluating Elementary Functions)提供 向量化数学函数 实现:

sleef/src/
├── libm/                   # sin, cos, exp, log 等基础函数
├── dft/                    # 离散傅里叶变换
└── quad/                   # 四精度浮点运算

PyTorch 的 CPU 向量化层(aten/src/ATen/cpu/vec/)在 AVX2/AVX512/NEON 架构上直接调用 SLEEF 函数,实现批量数学运算的 SIMD 加速。与标准库的 std::sin 逐元素计算相比,SLEEF 的向量化版本在 256-bit SIMD 宽度下可获得约 4-8 倍加速。

3.3 移动端推理:XNNPACK 与 NNPACK

特性XNNPACKNNPACK
维护方GoogleMeta(已较少维护)
目标平台ARM/x86/WebAssembly/RISC-V多核 CPU
核心算法间接卷积、微核设计Winograd/FFT 快速卷积
在 PyTorch 中的地位移动推理主力后端遗留方案,逐渐被替代

XNNPACK 的微核(micro-kernel)架构将不同硬件的 SIMD 差异封装在最小粒度的计算单元中,上层算法代码完全与硬件无关——这使得增加新架构支持仅需编写微核即可。

3.4 Intel 与 ARM 专用加速

  • ideep(Intel Deep Learning Engine Primitives):oneDNN(前 MKL-DNN)的 C++ 封装,提供面向 Intel CPU 的优化卷积、GEMM、Pooling 等算子
  • kleidiai(Arm KleidiAI):面向 ARM CPU 的 AI 微核库,覆盖矩阵打包(packing)和混合精度乘法,针对 Cortex-A/Neoverse 架构深度调优
  • gemmlowp:Google 的低精度 GEMM 库,其 fixedpoint/ 头文件被 PyTorch 量化 CPU 算子引用

四、分布式通信层:多机多卡训练基石

4.1 NCCL — GPU 间通信的事实标准

NCCL(NVIDIA Collective Communications Library)实现了高性能 GPU 间集合通信原语:

nccl/src/
├── collectives/            # all-reduce, all-gather, reduce-scatter 等
├── transport/              # NVLink, PCIe, InfiniBand 传输层
├── graph/                  # 拓扑感知路由
└── plugins/                # 可插拔网络传输插件

NCCL 的核心技术是 拓扑感知通信——它自动检测 GPU 间的物理连接拓扑(NVLink/NVSwitch/PCIe),构建最优的 Ring 或 Tree 通信模式。在 DGX H100(8×H100 + NVSwitch)上,allreduce 可达到接近 900 GB/s 的双向带宽。

4.2 Gloo — CPU 集合通信

Gloo 是 Meta 开发的 CPU 集合通信库,支持 TCP/IP 和 InfiniBand 传输。与 NCCL 专注 GPU 不同,Gloo 覆盖 CPU Tensor 的通信场景,同时提供 ProcessGroup 接口的 CPU 实现。

4.3 TensorPipe — 异构张量传输

TensorPipe 解决的是一个独特问题:不同设备上 Tensor 的高效传输。当一个 Tensor 在 GPU 上、另一端在 CPU 上时,TensorPipe 自动选择最优传输路径:

传输决策矩阵:
┌──────────────┬───────────────┬────────────────────┐
│ 源设备        │ 目标设备       │ 选择的传输方式       │
├──────────────┼───────────────┼────────────────────┤
│ CUDA GPU     │ 同节点 CUDA   │ cudaMemcpy P2P     │
│ CUDA GPU     │ 远程 CUDA     │ InfiniBand + RDMA  │
│ CPU          │ 远程 CPU      │ TCP/SHM            │
│ CUDA GPU     │ 远程 CPU      │ cudaMemcpy + TCP   │
└──────────────┴───────────────┴────────────────────┘

4.4 cpp-httplib — 分布式控制面

cpp-httplib 是一个单头文件 HTTP 库,被 PyTorch 用在分布式训练的 控制面(Control Plane)服务器中(torch/csrc/distributed/c10d/control_plane/WorkerServer.cpp),提供健康检查、handler 注册等 HTTP 接口。


五、构建基础设施层:连接 Python 与 C++

5.1 pybind11 — 最关键的基础设施

pybind11 是整个 PyTorch Python/C++ 桥梁的 核心基础设施。它的 header-only 设计使得在 torch/csrc/ 中将 C++ 函数暴露给 Python 变得极为简洁:

// pybind11 典型用法(torch/csrc/ 中随处可见)
#include <pybind11/pybind11.h>
namespace py = pybind11;

void init_torch_functions(py::module& m) {
    m.def("_get_tensor_data", &getTensorData);
    py::class_<TensorOptions>(m, "TensorOptions")
        .def(py::init<>())
        .def("dtype", &TensorOptions::dtype);
}

PyTorch 的几乎所有 Python API 最终都通过 pybind11 绑定到 C++ 实现。

5.2 序列化双雄:Protobuf 与 FlatBuffers

特性ProtobufFlatBuffers
编码方式编码/解码(需要反序列化)零拷贝(直接内存访问)
性能中等极快(无反序列化开销)
在 PyTorch 中的用途ONNX 模型序列化移动端 Lite Interpreter 模型格式
文件大小较小较大

Protobuf 通过 .proto 定义的 schema 驱动 ONNX 的模型格式,而 FlatBuffers 则被 PyTorch Mobile 的 Lite Interpreter 采用——它的零拷贝特性非常适合内存受限的移动设备。

5.3 工具库

  • fmt:现代 C++ 格式化库,PyTorch C++ 层的日志和错误消息格式化依赖此库,其 API 设计已被 C++20 std::format 采纳
  • nlohmann/json:header-only JSON 库,用于配置文件解析、实验性功能的元数据处理
  • googletest:C++ 单元测试框架,PyTorch 的 build/bin/ 下所有 C++ 测试用例基于此构建

六、底层运行时层:看不见的性能基石

6.1 cpuinfo — CPU 能力探测

cpuinfo 在 PyTorch 启动时检测 CPU 的微架构、指令集和缓存拓扑:

cpuinfo 检测链路:
启动 → 检测 CPU 型号 → 识别 ISA 扩展 (AVX512/NEON/SVE)
                      → 读取缓存拓扑 (L1/L2/L3 大小)
                      → 报告核心计数和 NUMA 拓扑
                      ↓
            ATen Dispatch 根据结果选择最优 kernel

例如,当 cpuinfo 检测到 AVX512 支持时,PyTorch 的 DispatchStub 会自动路由到 AVX512 优化的 kernel 实现。

6.2 pthreadpool — 轻量级线程池

pthreadpool 提供基于 work-stealing 调度策略的 C 语言线程池,是 NNPACK、XNNPACK 的底层并行化基础。PyTorch 中 at::parallel_for 在特定场景下即通过 pthreadpool 分发工作。

6.3 底层数值与 SIMD 工具

库功能典型调用场景
FP16IEEE 754 半精度浮点转换混合精度训练的 CPU 端类型转换
FXdiv预计算快速整数除法pthreadpool 工作分区计算
psimd128-bit SIMD 可移植抽象NNPACK 的后备 SIMD 后端
pocketfftheader-only FFT 实现torch.fft 模块的底层引擎
mimallocMicrosoft 高性能内存分配器可通过 LD_PRELOAD 替换 malloc

pocketfft 值得特别关注——它是一个极简的单文件 FFT 库,支持 1D-ND 变换和 DCT,精度优于传统的 FFTPack。PyTorch 的 torch.fft.fft, torch.fft.rfft 等 API 在 CPU 上的实现即直接调用 pocketfft。


七、性能诊断层:从 Profiling 到 Tracing

7.1 Kineto — PyTorch Profiler 内核

Kineto 是 PyTorch Profiler 的底层引擎,通过 CUPTI(CUDA Profiling Tools Interface)收集 GPU kernel 执行时间线:

Kineto 数据流:
GPU kernel 执行 → CUPTI 回调 → Kineto 事件收集 → Chrome Trace 格式输出
                                                   ↓
                                        tensorboard / HTA 可视化

7.2 NVTX 与 ITT API — 跨平台标注

工具厂商对应 PyTorch API配套 Profiler
NVTXNVIDIAtorch.cuda.nvtx.range_push/popNsight Systems
ITT APIInteltorch.profiler 内部集成VTune Profiler

两者的设计理念一致:在代码中插入零开销标注(annotation),仅当 profiler attach 时才收集数据。

7.3 Google Benchmark

C++ 微基准测试框架,PyTorch 用它构建 ATen 算子的性能回归测试。位于 benchmarks/ 和 binaries/ 下的大量 benchmark 程序基于此框架。


八、平台适配层:一套代码跑遍所有设备

8.1 VulkanMemoryAllocator — 移动 GPU 推理

AMD 开源的 Vulkan 内存管理库,被 PyTorch 的 Vulkan 后端 使用。该后端面向移动端和嵌入式设备的 GPU 推理——在没有 CUDA 的 Android/iOS 设备上通过 Vulkan Compute Pipeline 执行张量运算。

8.2 llvm-openmp — macOS 多线程补丁

Apple Clang 不自带 OpenMP 运行时,因此 PyTorch 的 macOS wheel 需要捆绑 LLVM 项目的 libomp.dylib,确保 CPU 并行化 kernel 正常工作。

8.3 miniz — 模型包解压

单文件 zlib 兼容压缩库,被 AOTInductor 的模型包加载器(model_package_loader.cpp)直接使用,在运行时解压 .zip 格式的编译模型包,避免引入系统 zlib 依赖。

8.4 python-peachpy — x86-64 汇编生成

PeachPy 是一个用 Python 编写 x86-64 汇编的框架,被 NNPACK 用来生成手写汇编级别的矩阵乘法和变换核函数。当目标平台不支持 PeachPy 时,自动回退到 psimd 的通用 SIMD 实现。


九、构建系统集成:多构建系统并存

third_party/ 下的库通过三种构建系统集成进 PyTorch:

构建系统入口文件用途
CMakeCMakeLists.txt + cmake/主构建系统(开源社区)
Buck2BUCK.oss + *.BUILDMeta 内部构建
BazelBUILD.bazel + WORKSPACEGoogle 生态部分库自带

在根目录 CMakeLists.txt 中,通过 USE_* 开关控制每个第三方库是否编译:

# 典型条件编译控制
option(USE_FBGEMM "Use FBGEMM" ON)
option(USE_XNNPACK "Use XNNPACK" ON)
option(USE_FLASH_ATTENTION "Use Flash Attention" ON)
option(USE_MSLK "Use MSLK kernels" ON)
option(USE_SYSTEM_SLEEF "Use system SLEEF instead of vendored" OFF)

USE_SYSTEM_* 系列开关允许使用系统级安装的库替代 vendored 版本,在包管理器(如 conda)分发时特别有用。


十、依赖关系全景图

                    ┌─────────────────────────────────────┐
                    │           Python 用户代码             │
                    └──────────────────┬──────────────────┘
                                       │ pybind11
                    ┌──────────────────▼──────────────────┐
                    │          torch/csrc/ 绑定层           │
                    │  (fmt, nlohmann, cpp-httplib, NVTX)  │
                    └──────────────────┬──────────────────┘
                                       │
          ┌────────────────────────────┼────────────────────────────┐
          │                            │                            │
    ┌─────▼─────┐              ┌──────▼──────┐             ┌──────▼───────┐
    │  GPU 加速   │              │  CPU 加速    │             │  分布式通信    │
    │  cutlass   │              │  fbgemm     │             │  nccl        │
    │  flash-attn│              │  sleef      │             │  gloo        │
    │  cudnn_fe  │              │  xnnpack    │             │  tensorpipe  │
    │  mslk      │              │  ideep      │             └──────────────┘
    │  comp_krnl │              │  kleidiai   │
    │  aiter     │              │  gemmlowp   │
    └────────────┘              └──────┬──────┘
                                       │
                    ┌──────────────────▼──────────────────┐
                    │         底层运行时基础设施             │
                    │  cpuinfo, pthreadpool, FP16, FXdiv  │
                    │  psimd, pocketfft, mimalloc, miniz  │
                    └─────────────────────────────────────┘

十一、快速参考表

库名类别许可证一句话定位
cutlassGPU 计算NVIDIA EULACUDA 矩阵乘法模板库
flash-attentionGPU 计算BSD-3IO 感知高效注意力
cudnn_frontendGPU 计算NVIDIAcuDNN Graph API C++ 前端
composable_kernelGPU 计算MITAMD GPU Tile 编程模板
aiterGPU 计算AMDAMD AI 算子集合
mslkGPU 计算BSDMeta GenAI 高性能 kernel
fbgemmCPU 计算Meta量化 GEMM 推理引擎
sleefCPU 计算Boost 1.0SIMD 数学函数库
XNNPACKCPU 计算Google移动端 NN 推理引擎
NNPACKCPU 计算BSD-2CPU 快速卷积(遗留)
ideepCPU 计算MITIntel oneDNN 封装
kleidiaiCPU 计算Apache 2.0ARM CPU AI 微核
gemmlowpCPU 计算Apache 2.0低精度 GEMM 定点数学
nccl分布式NVIDIAGPU 集合通信
gloo分布式MetaCPU 集合通信
tensorpipe分布式BSD-3异构张量传输
cpp-httplib分布式MIT分布式控制面 HTTP 服务
pybind11基础设施BSD-3Python/C++ 绑定核心
protobuf序列化BSD-3ONNX 模型序列化
flatbuffers序列化Apache 2.0移动端零拷贝序列化
onnx互操作Apache 2.0模型交换格式标准
fmt工具MITC++ 格式化库
nlohmann工具MITJSON 解析库
googletest测试BSD-3C++ 单元测试框架
benchmark测试Apache 2.0C++ 微基准测试
kineto诊断BSDGPU Profiler 引擎
NVTX诊断Apache 2.0NVIDIA 代码标注 API
ittapi诊断BSD-3Intel 代码标注 API
cpuinfo运行时BSD-2CPU 能力探测
pthreadpool运行时BSD-2轻量级线程池
FP16运行时BSD-2半精度浮点转换
FXdiv运行时MIT快速整数除法
psimd运行时MIT可移植 SIMD 抽象
pocketfft运行时BSD-3FFT 实现
mimalloc运行时MIT高性能内存分配器
miniz平台适配MITzlib 兼容压缩库
VulkanMemoryAllocator平台适配MITVulkan GPU 内存管理
llvm-openmp平台适配Apache 2.0macOS OpenMP 运行时
python-peachpy平台适配BSD-2Python x86-64 汇编生成

十二、总结与思考

PyTorch 的 third_party/ 目录本质上是一幅 深度学习系统栈的完整拼图:

  1. 硬件覆盖的广度:从 NVIDIA(CUTLASS/NCCL/cudnn_frontend)到 AMD(composable_kernel/aiter)到 Intel(ideep/ittapi)到 ARM(kleidiai/XNNPACK),再到 Vulkan 移动 GPU,几乎覆盖所有主流计算硬件

  2. 性能层次的深度:从 SIMD 指令抽象(psimd/FP16)到线程池调度(pthreadpool)到 GEMM 模板(CUTLASS/FBGEMM)到通信优化(NCCL/TensorPipe),每一层都有专精的优化

  3. 工程取舍的智慧:vendored 方式牺牲了仓库体积换取构建确定性;多构建系统并存满足了开源社区(CMake)和 Meta 内部(Buck2)的双重需求;USE_SYSTEM_* 开关又为系统级包管理留下了灵活性

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐