【暑期实习】阿里云 AI Infra 二面复盘
项目深挖很多,也聊到了互联和软件硬件协同
最近面了一场阿里云的 AI Infra 二面,整体感受是,这轮不是那种偏八股或者偏刷题的面试,更像是围绕项目经历一路深挖,看你到底有没有真的做过优化,也看你对自己后面想做的方向是不是足够清楚。开头还是常规自我介绍,我主要讲了自己现在在做的方向,包括 AI Infra、异构计算、底层性能优化,以及一些算子开发、图优化、推理优化相关的经历。后面的问题也基本都是顺着这些内容往下展开。
前半段主要是在深挖项目。面试官先问了我现在做过的几类事情,我把内容归成了三块:一块是算子优化,一块是算子融合和图优化,还有一块是一些稳定性问题和 bug 修复。这里他问得比较细,不只是让你讲做了什么,而是会继续追问你怎么定位、怎么判断、怎么验证结果。比如我提到自己修过一个推理/训练过程中显存异常和长稳问题,他就继续往下问,这个问题原来为什么会发生,你具体做了什么,为什么修完之后就能稳定。这里我主要讲的是一条图优化之后的链路里,本来应该走 host 侧的 shape tensor,在 int32 场景下被错误地当成了 device tensor 去传,后面读取 shape 的时候读到了错误地址,导致维度异常,最后训练失败。我的处理思路是先拉日志、对照计算图逐条定位链路,再把这条链路里相关的 shape 信息显式约束回 host memory 路径,避免 host/device 封装混乱。这个地方其实挺像典型的 infra 问题,不是“代码写错一行”那么简单,而是数据语义、执行路径和图优化一起叠出来的。
后面他还追问了性能优化怎么做。我举了一个加法类算子的例子,重点不在算子本身有多复杂,而在于你怎么从工程角度把它做快。我的思路是先看它有没有可能复用已有输入 buffer,如果当前输入没有其他依赖、生命周期也允许,就不重新申请 output buffer,而是直接复用其中一个输入的存储。这样做的收益不只是少一次 malloc/free,而是把一整段额外内存分配和管理的时间也省掉了。面试官还继续问了优化前后效果、极限大概在哪、为什么这么估。我这里给的是,优化前平均耗时大概在 21 微秒,优化后能比较稳定地降到 12 微秒左右,在输入 shape 更规整的模型里可以做到 10 微秒以内。如果继续往极限压,可能还有空间到 6 到 7 微秒,但这个已经会明显受输入 shape 规整程度、调度开销和整网上下文影响了,不是单独看一个 kernel 就能完全决定的。
中间还问到了我做过的量化推理项目,主要是 AWQ 路线下的 W4A16。这里面试官问得也不是“你会不会量化”这么泛,而是继续往具体实现上压,比如 Linear 层怎么改、数据结构怎么设计、内存布局怎么处理、正确性怎么验证。我这里主要是从三个角度去讲。第一是权重量化成 Int4,激活保持 FP16,执行过程中会涉及权重反量化后再参与矩阵乘。第二是为了减少访存开销,会尽量做向量化加载,把更小粒度的数据一次打包读取,减少内存访问次数。第三是量化不是只看速度,还要做端到端的正确性验证,我会把量化后的结果和非量化结果做对比,看精度下降是不是在一个可接受范围里。这个部分我能感觉到,面试官不是在考你“知道不知道 AWQ”,而是在看你有没有把这个东西真做过、真想过。
再往后,问题就开始从单算子逐渐往系统层走了。他问到了多卡协同、卡间通信、NVLink、RDMA,也问了不同 GPU 生态的差别,还聊到了我怎么看现在用 AI agent 帮忙写代码、review 和梳理工程。对我来说,这一段的感受比较明显:这场面试不只是想确认你会不会写 kernel,而是想确认你是不是有往更大的系统层面去想,比如算子优化最后怎么影响整网,整网之外又怎么和多卡、互联、profiling、软件硬件协同接起来。整体答下来,我觉得自己相对顺的部分还是项目细节、排查思路、性能优化路径和开发 workflow;相对一般的部分,是更底层的微架构细节和更深入的多卡通信经验,这两块后面还得继续补。
#暑期实习##二面##面试复盘##ai infra##阿里云#
查看19道真题和解析