【AI Infra小白入门⑤】AI Infra必备编程基础:Python、C++与Linux速通指南
本文是「AI Infra 小白入门」系列的第五篇,也是"前置基础"模块的第一篇。前面我们建立了全景认知,从这篇开始,我们正式进入技术内容。首先来聊聊AI Infra工程师每天都在用的编程语言——Python、C++,以及Linux环境。
一、为什么AI Infra是"双语世界"?
如果你关注AI领域,可能会发现一个有趣的现象:
- 搞算法的,主要写Python
- 搞底层的,主要写C++
- 搞AI Infra的,两种语言都要会
为什么?因为AI Infra处在"算法"和"硬件"之间,天然就是个"双语世界":
- 上层(Python):和算法框架(PyTorch)打交道、写脚本、做原型——Python灵活高效
- 下层(C++):写高性能kernel、推理引擎、算子库——C++速度快、可控性强
- 中间(pybind11):把C++代码封装成Python接口,供上层调用
用一张图来理解:
┌─────────────────────────────────────┐ │ Python层(胶水+框架+原型) │ │ PyTorch / 训练脚本 / 工具脚本 │ ├─────────────────────────────────────┤ │ pybind11(桥梁) │ ← 把C++算子/引擎暴露给Python ├─────────────────────────────────────┤ │ C++层(性能关键路径) │ │ CUDA Kernel / 推理引擎 / 算子库 │ └─────────────────────────────────────┘所以,想做AI Infra,Python和C++都得会。但不用怕,不需要你精通每一个细节,掌握核心内容就够了。
二、Python进阶:AI Infra常用特性
Python在AI Infra中主要用来做"胶水"——写训练脚本、工具脚本、框架接口等。你不需要成为Python专家,但以下几个特性一定要掌握。
2.1 装饰器(Decorator)
装饰器本质上是"函数的函数"——给一个函数额外加功能,但不修改它的代码。
举个最常见的例子——计时装饰器:
importfunctoolsimporttimedeftiming(fn):@functools.wraps(fn)defwrapper(*args,**kwargs):t0=time.perf_counter()result=fn(*args,**kwargs)print(f"{fn.__name__}:{(time.perf_counter()-t0)*1000:.2f}ms")returnresultreturnwrapper# 使用方式@timingdefmy_function():# 做一些事情time.sleep(0.1)my_function()# 输出: my_function: 100.xx msAI Infra中的应用场景:
- Benchmark计时
- Profiling打点
- 分布式训练中的rank检查
2.2 生成器(Generator)
生成器用yield关键字,实现"惰性求值"——需要的时候才生成下一个值,而不是一次性全部生成好。
# 生成器表达式:不会一次性创建1亿个元素,几乎不占内存gen=(x*xforxinrange(10**8))# 用的时候才一个个取foriingen:ifi>100:breakprint(i)AI Infra中的应用场景:
- 处理大数据集时避免一次性加载(DataLoader的思想基础)
- 节省内存,处理超大文件
2.3 多进程 vs 多线程
Python有个著名的GIL(全局解释器锁),导致多线程在CPU密集型任务中并不能真正并行。所以:
| 方式 | 适用场景 | 原因 |
|---|---|---|
| 多线程(threading) | IO密集型 | GIL限制了CPU并行,但IO等待时GIL会释放 |
| 多进程(multiprocessing) | CPU密集型 | 每个进程有独立的GIL,真正并行 |
| asyncio | 高并发IO | 单线程异步,Serving网关常用 |
AI Infra中的应用场景:
- 分布式训练(DDP)每个rank就是一个进程
- 数据加载器(DataLoader)用多进程加速
- 推理Serving的网关层用asyncio
2.4 面向对象进阶
__init__/__call__/ 上下文管理器(__enter__/__exit__)- MRO(方法解析顺序)与
super()——理解PyTorch Module的多重继承
这些在阅读PyTorch源码和写自定义Module时经常遇到。
三、C++核心:性能关键路径的必备
C++是AI Infra的"硬核"部分——CUDA kernel、推理引擎、自定义算子……性能关键路径几乎都是C++写的。
对于AI Infra工程师,你需要掌握以下核心内容:
3.1 指针与内存管理
这是C++的基础中的基础:
- 指针、引用、数组衰减
- 栈内存 vs 堆内存:
new/delete、malloc/free - 智能指针:
unique_ptr/shared_ptr——现代C++必备
💡为什么重要:推理引擎、TensorRT插件的代码里,智能指针随处可见。不懂指针,根本读不懂这些代码。
3.2 编译与链接
C++代码从源码到可执行文件,要经过几个步骤:
.cpp → 预处理 → 编译(.o目标文件) → 链接(可执行文件/库)- 静态库(.a/.lib):编译时直接链进可执行文件
- 动态库(.so/.dll):运行时才加载
- CMake:C++工程的标配构建工具
AI Infra中的应用场景:
- CUDA工程中,
nvcc编译.cu文件,和C++目标文件链接 - 部署时经常遇到"库找不到"的问题——都是编译链接的基础知识
3.3 模板基础
模板让C++代码可以"泛型编程"——一份代码支持多种数据类型。
template<typenameT>Tadd(T a,T b){returna+b;}// 使用add<int>(1,2);// int版本add<float>(1.0f,2.0f);// float版本AI Infra中的应用场景:
- CUDA kernel经常按数据类型特化(FP16 / FP32 / INT8)
- 推理引擎的Tensor类通常是模板类
四、pybind11:Python与C++的桥梁
pybind11是一个轻量级的库,用来把C++代码封装成Python可以调用的模块。
4.1 一个最简单的例子
#include<pybind11/pybind11.h>intadd(inta,intb){returna+b;}PYBIND11_MODULE(my_ops,m){m.def("add",&add,"A function that adds two integers");}编译之后,Python里直接用:
importmy_opsprint(my_ops.add(1,2))# 输出: 3就这么简单!
4.2 为什么重要?
pybind11是自定义算子接入PyTorch的标准路径。
PyTorch的C++ Extension(torch.utils.cpp_extension)底层就是pybind11。你想写一个自定义CUDA算子,然后在PyTorch里调用?pybind11是必经之路。
五、Linux基础:调试部署的基本功
做AI Infra,几乎所有工作都是在Linux环境下完成的。Linux命令行不行,直接影响你的工作效率。
以下是你必须掌握的内容:
5.1 命令行工具
| 工具 | 用途 | 重要程度 |
|---|---|---|
grep | 在文件中搜索内容 | ⭐⭐⭐⭐⭐ |
awk/sed | 文本处理 | ⭐⭐⭐⭐ |
find | 查找文件 | ⭐⭐⭐⭐⭐ |
xargs | 批量执行命令 | ⭐⭐⭐ |
管道(|) | 串联命令 | ⭐⭐⭐⭐⭐ |
5.2 Shell脚本
- 变量、循环、条件判断
set -e(出错就退出,避免脚本继续执行造成更大问题)
5.3 进程管理
ps/top/htop:查看进程kill:杀进程nohup/&/jobs:后台运行- 训练任务挂后台是日常操作
5.4 环境配置
PATH:可执行文件搜索路径LD_LIBRARY_PATH:动态库搜索路径💡 小贴士:CUDA库找不到,十有八九是
LD_LIBRARY_PATH没配对venv/conda:Python虚拟环境
5.5 GPU相关
nvidia-smi:查看GPU状态watch -n1 nvidia-smi:每秒刷新一次,实时监控
六、小白学习建议
Python怎么学?
- 如果你已经会Python基础:重点看装饰器、生成器、多进程、面向对象进阶
- 推荐边用边学:写一个训练脚本、写一个数据处理工具,在实战中掌握
- 不用追求"Pythonic"——AI Infra的Python代码大多很朴素,够用就行
C++怎么学?
- 如果你零基础:先从C语言基础开始(指针、内存),再过渡到C++
- 重点掌握:指针与内存、智能指针、编译链接、模板基础
- 不用学太偏的特性——AI Infra用到的C++特性其实很集中
- 最好的学习方式:读推理引擎的源码(比如TensorRT的sample、ONNX Runtime的核心代码)
Linux怎么学?
- 多用、多练——用多了自然就会了
- 把常用命令记下来,做成自己的"速查表"
- 遇到问题先自己查,查不到再问人——查资料的过程也是学习
七、总结一下
今天这篇文章,我们讲了AI Infra必备的编程基础:
- Python进阶:装饰器、生成器、多进程/多线程、面向对象——主要用在上层胶水和脚本
- C++核心:指针与内存、编译链接、模板——主要用在性能关键路径
- pybind11:Python和C++之间的桥梁,自定义算子的必经之路
- Linux基础:命令行、Shell、进程管理、环境配置——调试部署的基本功
下一篇预告:我们来聊聊AI Infra需要的数学基础。别担心,不需要你会推导复杂公式,只要能快速心算矩阵维度、理解几个核心概念就够了——工程数学,够用就行。
📚本系列导航:
- 第1篇:一文搞懂什么是AI基础设施:五大方向与不可能三角
- 第2篇:大厂AI Infra组织架构大揭秘
- 第3篇:AI Infra岗位路线图:级别、薪资与成长路径
- 第4篇:AI Infra学习路线图:从入门到精通的完整指南
- 第5篇:AI Infra必备编程基础:Python、C++与Linux速通指南(本文)
- 第6篇:AI Infra数学基础速成:线代、概率与微积分(工程向)
- 更多内容持续更新中……