Arganzheng's Blog

stay hungry, stay foolish

C++ 在 AI-Infra(01):从源码到二进制——编译模型与项目布局

Compilation Model and Project Layout

import torch 背后,Python 解释器真正加载的第一个 C 语言文件只有 15 行。它是 torch/csrc/stub.c,全文如下: #include <Python.h> extern PyObject* initModule(void); #ifndef _WIN32 #ifdef __cplusplus extern "C" #endif __attribute__((visibility("default"))) PyObject* PyInit__C(void); #endif PyMODINIT_FUNC PyInit__C(void) { return initModule(); } 这个文件看起来简单到不...

C++ 在 AI-Infra:从对象模型到算子扩展(总纲)

C++ for AI-Infra, from the Object Model to Operator Extensions

内容简介 《C++ 在 AI-Infra:从对象模型到算子扩展》是一组共八篇的系列文章,面向有 Java 或其他托管语言背景、准备阅读和修改 PyTorch、vLLM 等 AI-Infra 项目 C++ 层的工程师。 它不是一本 C++ 教材。C++ 有几十个特性、几千页标准,而 AI-Infra 项目真正大量使用的只是一个子集。这个系列只讲这个子集,并且每一个特性都从一个具体问题引出: PyTorch 和 vLLM 的 C++ 源码里,这段代码为什么这样写? 一个典型例子。PyTorch 的 at::Tensor 在 Python 侧看起来是一个普通对象,但它的 C++ 定义大致是: class TensorBase { protected: ...

Python 在 AI-Infra(07):项目工程化与生产交付

Python Project Engineering and Production Delivery

前面几篇讨论的都是”代码本身”:语言机制、类型与数据契约、并发、元编程、内存、测试与调试。这一篇讨论一件不同的事——怎么把这些代码变成一个可以交付的东西。 对 Java 开发者来说,这套东西是现成的: 关注点 Java Python 依赖管理与构建 Maven / Gradle pyproject.toml + pip / uv / Poetry 环境隔离 JVM + classpath 天然隔离 venv / conda(必须显式创建) 应用框架与依赖注...

Python 在 AI-Infra(06):单元测试、问题定位与调试实践

Python Unit Testing, Troubleshooting, and Debugging

在 AI-Infra 系统中,代码的正确性往往不能只靠阅读来判断。 一个推理服务可能涉及异步调度、动态 batch、多后端切换、插件加载和资源生命周期管理。在这些场景下,逻辑正确但时序错误、类型匹配但运行时值不符、代码不报错但内存持续增长——这些问题在 code review 中很难发现,必须依赖测试和调试工具来定位。 常见的工程挑战包括: 异步代码中的超时、取消和资源泄漏难以用肉眼确认; Mock 不到位导致测试通过但上线失败; 插件和装饰器改变了运行时行为,但调用方看到的仍是旧签名; Python 层内存增长缓慢,直到 OOM 时才被发现; 进程卡死但没有崩溃,无法从日志判断阻塞位置。 本文要回答的核心问题是: 如何验证一...

Python 在 AI-Infra(05):内存管理与优化

Python Memory Management and Optimization

在 AI-Infra 系统中,Python 通常不是执行密集计算的主体。模型推理、张量运算和部分数据处理,往往由 C、C++、CUDA 或其他原生运行时完成。 Python 更多承担以下职责: 组织请求、任务和配置对象; 管理数据结构与生命周期; 调用 NumPy、PyTorch 等原生库; 连接 CPU 内存、GPU 显存和外部服务; 协调模型、缓存、队列及资源句柄。 因此,Python 性能问题不一定表现为某段 Python 代码“计算得很慢”。很多时候,真正的问题来自: 创建了过多 Python 对象; 临时对象存活时间过长; 容器或缓存无限增长; 不小心进行了复制; Python 对象与原生数据之间发生了...

Python 在 AI-Infra(04):Python的动态机制及工程实践

Python Dynamic Mechanisms and Practice

在传统业务系统中,Python 的动态特性常常被视为一种“方便开发”的语言能力:可以通过字符串获取属性,可以在运行时导入模块,也可以用装饰器包装函数。 但在 AI Infra 中,动态机制的价值远不止于“少写几行代码”。 推理引擎、模型加载器、调度器、缓存系统、存储后端和监控组件,往往需要在不同环境中自由组合。系统既要能够快速接入新组件,又不能让核心逻辑充满 if-else。这使得 Python 的反射、元编程和动态加载能力,逐渐从语言技巧演变为架构工具。 本文将从三个问题出发: Python 在运行时如何访问和操作已有的程序结构?如何在程序定义、创建或执行过程中介入并影响程序结构或行为?这些能力如何应用到 AI Infra 的插件系统与路由分发系统中...

Python 在 AI-Infra(03):并发、异步与任务协作

Python Concurrency, Asynchrony, and Task Collaboration in AI Systems

在 AI-Infra 系统中,Python 往往并不直接承担最重的数值计算。真正消耗算力的部分,通常由 CUDA、C++、通信库或专用推理引擎完成。 但这并不意味着 Python 不需要并发。 恰恰相反,模型服务、任务调度、数据预处理、资源监控和流水线编排,通常都由 Python 负责。系统的吞吐量、尾延迟和资源利用率,很大程度上取决于 Python 是否能够正确组织并发任务。 常见场景包括: 同时处理大量模型推理请求; 并发访问对象存储、数据库和远程 RPC 服务; 在多个模型节点之间转发流式数据; 调度训练任务并持续监控任务状态; 让 CPU 预处理、GPU 推理和结果后处理形成流水线; 在请求高峰期通过队列和背压保护系统资源。...

Python 在 AI-Infra(02):类型系统与数据契约设计

Python Type System and Data Contract Design

Python 是动态类型语言,但这不意味着”无类型”。自 Python 3.5 引入 typing 模块以来,类型注解已经从”可选装饰”演变为大型项目的工程标配。PyTorch、vLLM、FastAPI 等 AI Infra 项目大量依赖类型系统的高级特性。 与 Java 把类型声明、编译检查、.class 文件携带类型信息、运行时反射合为一体不同,Python 的类型系统由两个协作层构成——类型信息提供层和类型信息消费层。而在这两层之上,还有一层工程落地:用它们构建数据契约。 本文围绕的核心问题是: Python 的类型信息从哪里来、被谁消费,又如何在系统边界上落成可执行的数据契约? 一、总览:类型系统的两层架构与数据契约 1. 提供层、消费层与...

Python 在 AI-Infra(01):语言机制与运行时原理

Python Language Mechanisms and Runtime Internals

Python 常被认为是一门”简单易学”的语言。但在深度学习框架、推理服务和分布式训练系统里,真正需要掌握的不是语法,而是语法背后的运行时模型。下面这些在 AI-Infra 代码里随处可见的写法,每一行都依赖一个可以被替换、被拦截、被扩展的机制: import torch 触发 .so 扩展加载、算子注册、后端初始化 model(x) 走的是 __call__,中间可能插入 hooks for batch in loader 迭代协议 + 生成器的暂停与恢复 with torch.inference_mode() 上下文管理协...

Python 在 AI-Infra:从语言机制到生产交付(总纲)

Python for AI-Infra, from Language Mechanisms to Production Delivery (Overview)

内容简介 《Python 在 AI-Infra:从语言机制到生产交付》是一组共七篇的系列文章,面向有后端工程经验(尤其是 Java 背景)、准备转向 AI-Infra 方向的工程师,系统梳理这个方向真正需要的 Python 能力:语言核心机制、类型系统与数据契约、并发与异步、反射与元编程、内存管理、测试与调试、以及工程化交付。 这个系列不是 Python 语法教程,也不是技巧集合,而是试图回答一个问题: 在 AI-Infra 系统里,Python 并不承担最重的计算,那它到底承担什么?为此需要掌握它的哪些机制? 答案是:真正吃算力的部分由 CUDA、C++、通信库和专用推理引擎完成,Python 承担的是组织、调度、扩展、观测和交付——它是整个系统的...

×