Arganzheng's Blog

stay hungry, stay foolish

PyTorch 深度实践(02):Tensor 与内存布局

Tensor Abstraction and Memory Layout in PyTorch

上一篇从整体上介绍了 PyTorch:它不是只有 Python API 的库,而是连接模型代码、Tensor 编程模型、算子运行时、设备后端、Kernel 和硬件的一套计算平台。 这一次进入这张地图的核心数据抽象: Tensor 到底是什么?1 初学 PyTorch 时,Tensor 很容易被理解成“支持 GPU 的 NumPy 数组”。这个理解可以帮助开始使用,但不足以解释真实工程中的许多现象: 为什么 transpose() 通常不会复制数据?2 为什么 view() 有时成功,有时会报错?3 为什么 reshape() 有时是零拷贝,有时会产生一份新数据?4 为什么一个 Tensor 的 shape 相同,性能却可能完全不同?...

PyTorch 深度实践(01):PyTorch 整体介绍

PyTorch Overall Introduction

PyTorch 经常被介绍成一个“深度学习框架”,也经常被使用成一个 Python 库:导入 torch,创建 Tensor,定义 nn.Module,然后训练模型。 这种理解对于开始使用 PyTorch 已经足够,但对于训练平台、推理引擎、算子开发和 AI-Infra 来说还不够。真正需要理解的是: PyTorch 如何把 Python 中表达的张量计算,转化为可以自动求导、跨设备执行、编译优化和分布式协作的运行时系统?1 一行看起来很普通的代码: z = torch.add(x, y) 背后可能涉及: Python API Python Binding Operator Schema Dispatcher ATen O...

PyTorch 深度实践:从 Tensor 到深度学习运行时(总纲)

Deep Dive into PyTorch, from Tensor to Deep Learning Runtime

内容简介 《PyTorch 深度实践:从 Tensor 到深度学习运行时》是一组共十篇的系列文章,面向有后端工程经验、尤其是 Java 背景、准备进入 AI-Infra 方向的工程师,系统梳理 PyTorch 从 Python API 到 C++、CUDA、编译器、性能分析和分布式运行时的主要机制。 它同时是《AI 算法工程师学习地图》 L1 工具箱的深入篇:算法侧的《算法工程师的工具箱》讲 PyTorch 的”用”——五个对象、二十行训练循环、显存的账——本系列讲”改”:Dispatcher、Autograd 引擎、编译、分布式。两张地图共享本系列,算法方向的读者按需读。 这个系列不是 PyTorch API 速查表,也不是机器学习算法教程,而是试图回答一个...

C++ 在 AI-Infra(09):系列总结与通关自测

C++ for AI-Infra: Series Recap and Final Self-Test

八篇正文回答了一个问题:PyTorch 和 vLLM 的 C++ 源码里,这段代码为什么这样写。第一篇讲一个 .cpp 怎么变成 .so、import torch 拉起哪几个库;第二篇讲 at::Tensor 为什么是一个 8 字节的句柄、数据什么时候释放;第三篇讲 AT_DISPATCH 里的 scalar_t 从哪里来;第四篇讲 Dispatcher 用什么机制调到 kernel;第五篇讲算子怎么在没有任何显式调用的情况下登记进 torch.ops;第六篇讲 no_grad 为什么对其他线程不生效;第七篇讲一个 Tensor 跨过 Python/C++ 边界经过了什么;第八篇讲一个改动从写完到能提 PR 要跑哪些东西。八篇合起来,是总纲开篇那段 scale_sh...

C++ 在 AI-Infra(08):构建、调试与测试工具链

Build, Debug and Test Toolchain

PyTorch 的 CI 测试脚本 .ci/pytorch/test.sh 里有一段很奇怪的代码。在 ASan 构建下,它先设置一堆环境变量,然后故意让 Python 进程崩溃四次: if [[ "$BUILD_ENVIRONMENT" == *asan* ]]; then export ASAN_OPTIONS=detect_leaks=0:symbolize=1:detect_stack_use_after_return=true:strict_init_order=true:detect_odr_violation=1:detect_container_overflow=0:check_initialization_order=true:debug=...

C++ 在 AI-Infra(07):与 Python 之间——pybind11、Python C API 与 ABI

pybind11, the Python C API and ABI

torch.Tensor 在 Python 里是一个再普通不过的对象:能 isinstance、能子类化、能 t.foo = 1 挂属性、能被 gc 收集。但它在 C++ 里的定义,在 torch/csrc/autograd/python_variable.h 开头: // Python object that backs torch.autograd.Variable struct THPVariable { PyObject_HEAD // Payload at::Tensor cdata; // Hooks to be run on backwards pass (corresponds to Python attr // '_backw...

C++ 在 AI-Infra(06):并发、内存模型、TLS 与守卫

Concurrency, Memory Model, TLS and Guards

with torch.no_grad(): 大概是 PyTorch 用户最早学会的几个写法之一。它在 Python 侧是一个上下文管理器,__enter__ 调 torch.set_grad_enabled(False),__exit__ 把旧值设回去。顺着 torch._C._set_grad_enabled 往下追,会落到 torch/csrc/autograd/init.cpp 里的这段 C++: static PyObject* set_grad_enabled( PyObject* _unused, PyObject* args, PyObject* kwargs) { HANDLE_TH_ERRORS static Py...

C++ 在 AI-Infra(05):宏、静态注册与代码生成

Macros, Static Registration and Code Generation

vLLM 的 CPU 后端把所有自定义算子登记到 PyTorch 的代码在 csrc/cpu/torch_bindings.cpp 里,形状是这样的: #include "cache.h" #include "ops.h" #include "core/registration.h" #include <torch/library.h> // ... TORCH_LIBRARY_EXPAND(TORCH_EXTENSION_NAME, ops) { // vLLM custom ops // ... // Activation ops // Activation function used in SwiGLU. ops.d...

C++ 在 AI-Infra(04):多态与类型擦除——运行时如何选择实现

Polymorphism and Type Erasure

在 Python 里写 torch.add(a, b),如果 a 在 CPU 上就跑 CPU kernel,在 GPU 上就跑 CUDA kernel。这个”按参数选实现”的动作在 C++ 层叫 dispatch,做这件事的类叫 c10::Dispatcher。它的核心调用路径在 aten/src/ATen/core/dispatch/Dispatcher.h 里(本文引用的 PyTorch 源码以 v2.10.0 为准),删掉调试和 profiler 分支后只剩这几行: template <class Return, class... Args> C10_ALWAYS_INLINE_UNLESS_MOBILE Return Dispatcher::c...

C++ 在 AI-Infra(03):模板与泛型编程

Templates and Generic Programming

打开 aten/src/ATen/native/cpu/Activation.cpp,log_sigmoid 的 CPU kernel 里有这么一段(log_sigmoid_cpu_kernel 的 else 分支,删节): AT_DISPATCH_FLOATING_TYPES(input.scalar_type(), "log_sigmoid_cpu", [&] { using Vec = Vectorized<scalar_t>; scalar_t* output_data = output.data_ptr<scalar_t>(); scalar_t* buffer_data = buffer.data_ptr&l...

×