做AI这行,看到某份顶级工程师技能清单刷屏,我第一反应是先存下来,拆开看一遍。项目标题里是一个英文ID,后面跟着skills,翻译过来大概就是“某某的技能清单”。很多人把它理解成一份“简历增强版”,但真正打开之后会发现,这根本不是罗列技能,而是一个人在AI领域从新手走到核心位置的完整能力结构。这篇文章我会带你把这种技能清单拆开,看它背后到底包含哪些硬功底、哪些软实力,以及作为一个普通工程师,怎么照着这个思路搭建自己的技能树。没有“三天精通”的路子,但有一条可复现的、按需补能力的路径。
1. 技能全貌:顶尖AI工程师的核心能力地图
1.1 一份技能清单为什么能刷屏
先聊聊动机。AI这个行业有个很奇怪的现象:岗位JD写得越来越像“造神计划”,要求同时会训练大模型、懂分布式、能写框架、还要有论文产出。但技能清单项目偏偏不跟你玩这一套,它没有打分,没有评级,没有“精通某某算法”,就是把一个人常年使用的工具、方法、方向,像流水账一样摊开。这种“低包装感”反而成了稀缺品。
我自己的感受是,大部分转行或者刚入行的朋友,对“AI工程师”的认知是高度碎片化的:今天刷到一篇讲Prompt Engineering的帖子,觉得要学;明天看到有人用扩散模型做图,又觉得这个是重点。结果收藏夹里堆了几百篇资料,真要上手还是不知道从哪下手。刷屏的那份技能清单,本质上是帮所有人做了一次“信息降噪”,它明确告诉你:一个能长期战斗在AI一线的人,他日常生活中高频使用的、真正吃饭的本事只有那么几类。这比任何“三个月成为AI工程师”的教程都更有参考价值。
1.2 从点状技能到T型能力结构
我看完这类清单后的第一感受是:它不是一条垂直直线,而是T字形结构。一横代表广度,一竖代表深度。横向上,这位工程师会写代码,能聊产品,理解模型训练,也能写技术文档;纵向上,他一定有某个领域做得极其深入,比如大规模语言模型的训练与部署,或者自动化机器学习系统。
为什么必须是T型?我踩过这样的坑:刚入行那两年,只盯着各类模型的PyTorch实现,觉得“会用模型就是高手”,结果一遇到训练速度上不去、模型部署到线上环境后内存爆掉,就完全抓瞎。反过来,我也见过不少后端工程师转做AI,工程能力很扎实,但长期只会调包,对模型内部结构和优化原理缺乏理解,遇到新论文就不知道怎么复现。真正的竞争力来自两者交叉:深入一个领域的核心,同时具备横向调用其他领域知识的能力。技能清单之所以有分量,是因为它把这条T字结构展示得非常清楚。
1.3 一张能力地图:从数学基础到产品落地
如果要把技能清单整理成层级,我习惯分成四层,每一层都为上一层供血。
| 能力层级 | 要回答的核心问题 | 典型技能 |
|---|---|---|
| 基础层 | 算法从哪里来,代码为什么能跑 | 线性代数、概率统计、数据结构、Python/C++ |
| 理论层 | 模型为什么有效,如何学习 | 机器学习、深度学习、优化方法、损失函数设计 |
| 工程层 | 模型怎么训,怎么上生产 | 训练管线、分布式加速、推理优化、容器化部署 |
| 影响层 | 如何让工作被看见,如何推动协作 | 技术写作、开源协同、项目规划、沟通表达 |
这四层不是简单线性递进,而是互相反馈。比如,工作做深之后会发现数学基础不够,回头补概率论;部署模型久了又会反向推动模型结构设计。顶尖工程师往往是在这四层之间反复穿梭,而不是一次性打通。这个地图,就是我后面所有拆解的总框架。
2. 基础能力拆解:数学、编程与系统设计
2.1 数学与算法:能推导,也要有直觉
不少人对数学有个误解,觉得做AI要变成“人形计算器”。其实工作在实战中,数学更多提供的是判断力,而不是机械计算能力。比如你想给Transformer换一个更高效的注意力算子,就必须搞清楚为什么Self-Attention的计算复杂度是输入长度的平方,否则连算法可行的数量级都无法判断。同样,混合精度训练为什么要保留FP32的权重副本,理解起来用到的也只是浮点数表示和梯度量级的常识。
我自己的做法是,遇到一个算法先不看公式推导,而是问自己三个问题:这个算法的输入输出是什么形状,它的核心操作是什么时间复杂度,数值上会不会不稳定。这三问都能答上来,基本就能动手写代码了。写代码时还有一个非常实用的习惯:在关键的张量运算前后加维度断言。下面这段代码是我常用的“保险丝”:
import numpy as np def linear_layer(x: np.ndarray, w: np.ndarray, b: np.ndarray): # x: [batch_size, in_features] # w: [out_features, in_features] assert x.ndim == 2, "输入必须是二维矩阵" assert w.ndim == 2 and b.ndim == 1, "权重和偏置维度不正确" assert w.shape[1] == x.shape[1], f"特征维度不匹配: {w.shape[1]} != {x.shape[1]}" return x @ w.T + b别小看这些断言。模型结构一旦复杂,最容易出错的就是维度传递,很多报错信息藏在框架内部,等它抛出来再去查,非常浪费时间。前置断言等于把错误定位在网络入口,能省下一半调试时间。
2.2 工程硬功夫:代码质量、测试与调试
模型代码首先是一份代码,然后才是“AI代码”。我会严格要求自己做到可复现、可读、可测试。可复现方面,训练脚本必须固定随机种子,并且把超参配置和代码一起提交到版本库。很多人训练时总发现结果对不上,多半是随机种子没固定,或者依赖库版本升级后行为变了。下面这个种子固定代码我每次都会用:
import random import numpy as np def set_seed(seed: int = 42): random.seed(seed) np.random.seed(seed) torch.manual_seed(seed) if torch.cuda.is_available(): torch.cuda.manual_seed_all(seed)可测试方面,我建议在正式训练之前,先拿一个极小的数据子集跑一遍完整流程,确认模型能“过拟合”这一小批数据。如果模型连小批量都记不住,说明反向传播链路有问题或学习率太低;如果小批量能过拟合但全量数据效果差,再考虑数据分布或正则化问题。把“能不能跑通”和“效果好不好”拆成两个问题,排查速度会快很多。
2.3 系统性能:GPU怎么用才不算浪费
基础能力里最容易被忽略的是系统性能。很多算法能力很强的人,一训练就发现GPU利用率上不去。原因往往是数据加载太慢,模型在等数据,GPU在摸鱼。最简单的监控命令我每次开训练都会准备两个:
# 实时看显存与利用率 nvidia-smi # 每隔1秒刷新一次,方便长时间观察 watch -n 1 nvidia-smi有一次我训练一个中小规模的模型,GPU利用率只有30%出头,一开始怀疑是模型计算量太小,后来用打点发现每个step的时间严重波动,终于定位到是数据读取线程数太少,磁盘IO成了瓶颈。把num_workers从2调成8,再配合缓存式数据加载,吞吐直接翻倍。懂模型优化只能解决“算法快不快”,懂系统性能才能解决“机器闲不闲”,这两个能力在技能清单里是并列的关系。
3. 深度学习专项技能:从训练到部署全流程
3.1 复现模型的能力:从论文到可用代码
我反复跟周围的人说,复现论文是高效率的学习方法,没有之一。它逼你把“标题党”式的宏观理解变成一行行能跑的代码。一份技能清单里如果只写“读过哪些模型”,价值不大;但如果写上“复现过哪些模型”,含金量完全不同。
我的复现套路分五步走。第一步,只读论文的实验部分,确定数据集、评价指标、训练超参,不急着看方法细节。第二步,照着模型结构搭建骨架,先用随机输入把前向传播跑通,把各层输出的shape打印出来,这一步能筛掉80%的结构错误。第三步,实现损失函数和训练循环,在小批量数据上跑几十个step,看loss是否明显下降。第四步,让模型在极小的数据子集上过拟合,确保模型至少具备“死记硬背”的能力。第五步,再放开到全量数据,按论文设置调整学习率和正则化。这套流程听起来慢,实际比“边看论文边敲代码”快得多,因为错误都被限制在小范围内。
3.2 训练调试:损失不下降怎么排错
训练模型遇到loss不下降或者变成NaN,是每个AI工程师的“必修课”。我整理过一张速查表,基本覆盖了最常见的症状。
| 症状 | 可能原因 | 优先排查点 |
|---|---|---|
| loss一开始就是NaN | 学习率过大或前向数值不稳定 | 降低学习率,检查输入数据是否含NaN/Inf |
| loss一直是某个常数 | 标签错位、梯度没回传、损失函数选错 | 打印logits与label,检查label是否shuffle错 |
| loss震荡剧烈 | 学习率过高、batch_size过小 | 减小学习率,适当增大batch_size并同步调整学习率 |
| 训练loss下降但验证集不降 | 过拟合 / 数据泄漏 | 检查预处理是否混入验证集信息,增加正则化 |
我自己踩过最深的坑是标签错位。训练语言模型时,loss卡在初始值附近很久,梯度检查也做了,模型结构也打印了,最后才发现是构造训练样本时把输入文本和标签文本错开了一位。这种问题不会像维度不匹配一样报错,只会安安静静地让loss躺平。所以后来我学会了一件事:不管多急,先手动挑两个batch出来,把input和target并排打印,确认对应关系再训练。
3.3 推理部署:与框架和硬件的最后博弈
训练是“让模型变强”,部署是“让模型受控”。技能清单里很大篇幅都在讲推理优化,因为模型不能只活在实验环境里。部署前我会做这几件事:把模型导出成通用推理格式,减少框架依赖;对模型做剪枝或量化,降低推理耗时和显存占用;用真实输入做一次压测,记录P99延迟和吞吐量。
以量化为例,它为什么有效?因为推理时不需要那么高的数值精度,把FP32的模型转成INT8,体积缩小到四分之一左右,推理速度通常能提升2到3倍。代价是精度可能有微小下降。我在实操时一般会先做校准,挑一小部分有代表性的数据喂给量化模型看输出变化,如果精度损失超过一个点,就换用混合精度或只量化部分层。很多同学只关注“模型训得多好”,忽略了“能不能低成本跑起来”,这恰恰是产品能不能落地的关键。
4. 研究者的视野:文献、写作与开源影响力
4.1 读论文的正确方式:精度与广度
技能清单一般还会列一条:读论文的方法。这个能力容易被低估,但AI技术迭代这么快,读论文是长期竞争力的来源。我的方法很简单,一篇论文分三遍读。第一遍看标题、摘要、图表结论,花十分钟判断这论文跟自己有没有关系;有关系才进入第二遍,精读方法和实验设置,亲手推一遍关键公式;如果决定要把论文里的方法用进项目,再读第三遍,对照开源代码搞清每个实现的细节。
很多人读论文喜欢从第一个字读到最后一个字,效率其实很低。我建议反过来:先看结论,再看图表,最后看方法。生活化一点说,这就像买电器先看参数和好评,再翻说明书一样。只花10分钟就能排除掉80%的无关论文,剩下的时间全部花在值得精读的内容上。
4.2 技术写作:把实验变成影响力
一次痛苦的教训让我开始重视写作:做完一个项目,代码也开源了,但因为文档和实验记录写得乱,半年后自己回看都嫌费劲。从那之后,我给自己定了一条规矩:每个实验,不管成功还是失败,都写一页实验记录,包括假设、改动点、复现步骤、结果和结论。特别是失败记录,价值比成功还高,因为它能防止团队重复踩坑。
写博客则是更进一步的整理。我每次想写某个技术点,都会发现自己“以为懂了,但解释不清”。写出来才能把含糊的地方暴露出来。不必写长篇大论,一篇几百字、配合一个最小代码示例就足够。技术写作的核心不是卖弄,而是“让一个陌生读者能复现你的结论”。这份能力进了技能清单,代表作者已经意识到:代码影响机器,写作影响人。
4.3 开源协同:如何在社区里获得正反馈
参与开源项目是打通读写闭环的好方式。我建议从修文档、报Issue开始,不要一上来就提交几千行的PR。先挑自己正在用、真正遇到问题的项目去读代码,遇到问题就去提Issue,这比四处乱看更高效。因为你自己踩过的坑就是最真实的需求,项目维护者也会更愿意帮一个需要长期使用的人。
等能力到一定程度后提交PR,过程里会收到苛刻的评审意见。有一段时间我觉得评审意见是在挑刺,后来才明白,那是快速提升代码品位的免费训练营。很多工程上的坏习惯,就是在被社区一遍遍要求改格式、补测试、拆函数的过程中改掉的。技能清单里能长期保持活跃的工程师,几乎都有开源参与的习惯,因为它是最真实的一线反馈机制。
5. 构建属于自己的技能清单
5.1 从项目需求倒推技能树
先声明一个观点:完全按别人的技能清单来学习,效果并不会太好。因为那是别人的问题域,不是你的。你需要的是“用项目倒推技能树”。举个例子,假设你希望做一个能在手机端运行的小目标检测模型,那倒推出来的技能就包括:图像分类和检测的基础知识、轻量网络结构、模型剪枝与量化、移动端推理库的调用、数据标注与管理。这个过程中,数学和系统性能的问题都会自然出现,你再按需去补。
我提供一个模板供你填充:先写一个场景化的项目目标,然后用思维导图或表格列出这个目标依赖的三大类技能:理论层、工程层、工具层。接下来把每类技能标成“已掌握”“可上手”“还不会”。最后只关注“还不会”中最影响项目推进的那一项,学完立刻用到项目里。用这种方式学习,你会觉得每学一个知识点都在解决具体问题,而不是漫无目的刷网课。
5.2 建立个人知识库与回顾机制
技能清单不是一劳永逸的静态文档,它需要持续更新。我现在的个人知识库分四个区:基础区、专项区、工具箱区、项目区。基础区放数学和算法笔记;专项区放各类模型和训练方法;工具箱区放自己常用且顺手的命令、代码片段和软硬件踩坑记录;项目区则按项目归档实验报告。
每个项目结束,我会花半小时更新一次知识库。如果我在项目里发现了某个坑,就写进工具箱区;如果某些旧技术已经不再使用,就标注“失效”而不是直接删除,因为失效的记录同样有参考价值。我还固定每周抽时间回看一次自己的技能清单,把重复出现的困惑标出来,这些地方往往意味着下一步的学习方向。一个活跃更新的清单,比一份完美但过期的清单有价值得多。
5.3 常见误区与避坑指南
最后分享几个我在整理和对照技能清单时总结的常见误区。
| 误区 | 真相 |
|---|---|
| 技能越多越好 | 深度优先,横向能力只需要够用 |
| 数学要全部精通才能开始动手 | 按需学习,用到哪块补哪块 |
| 经典论文必须一篇篇全刷 | 挑与自己方向相关的论文精读 |
| 模型跑通就万事大吉 | 部署、监控、迭代才是长期课题 |
| 学习资料收藏了就是学会了 | 未经复现的知识,不算是技能 |
还有一个非常现实的坑:拿别人的清单当“考试大纲”。这很容易变成自我打击,看到别人会的自己不会,马上焦虑。正确的做法是拿它当“地图”,看的是结构和方向,而不是逐项打勾。每个人的技能树本来就不一样,就算同一领域的两个工程师,各自擅长的子方向也完全可以不同。
我个人在实际操作中最深的体会是,清单是一面镜子,隔一段时间就照一次,能清晰地看到自己有没有在舒适区里原地转圈。这个项目标题之所以打动我,不是因为它展示了一个大牛的过去,而是它为普通人提供了一种整理能力的方式。你不需要先成为大牛再写清单,反过来,先写一份粗糙但真实的清单,然后照着它一点点做项目、补能力,比盲目刷题和囤资料踏实得多。别等了,那份清单现在就可以是你的。