【暑期实习】阿里云 AI infra一面复盘
先做代码题,再深挖算子优化、图融合和量化
这场阿里一面整体给我的感觉是,节奏比较紧,前面先处理了一个在线代码题,后面基本都是顺着项目经历往下深挖。代码题是“队列的最大值”,要求均摊 O(1) 地返回当前队列最大值,我当时用的是普通队列加单调双端队列这套常见思路:一个队列维护正常入队出队,另一个双端队列维护当前可能成为最大值的候选元素。这个题本身不算特别难,但相当于是先热一下身,也看你对基础数据结构是不是熟。
后面的主体还是项目追问,而且问得挺细。面试官先从我做过的算子优化、图优化这些经历切进来,重点问的是:你到底怎么判断哪些地方值得优化,哪些算子值得单独提出来做性能优化,哪些链路值得做融合。我当时的回答主线比较直接:先把不开图优化和开图优化的计算图都拉出来,对比前后变化,再看哪些高频算子没有被自动优化覆盖,哪些算子链在图里重复出现很多次。如果是单个算子在整张图里占比很高,就优先做单算子性能优化;如果是一串算子反复出现,而且中间依赖关系比较干净,就更适合做融合。这个逻辑听起来不复杂,但真问起来,还是会一路追到你怎么扫描图、怎么判断独立性、怎么决定要不要下手。
融合这一块问得尤其细。不是那种泛泛地问“会不会算子融合”,而是直接问你:如果一串算子里有中间结果被别的分支依赖,那你怎么办;如果有个常量被很多地方共用,你怎么判断能不能融。我这里回答的大意是,融合前一定先判断输入输出是不是独立,如果中间节点还被图里其他地方引用,那就要非常谨慎,很多时候这种链根本不该硬融;真正适合下手的,是那种输入相对单一、输出也不会被额外分叉使用的一整段链路。也就是说,判断“能不能融”其实比“怎么融”更重要,不然最后很容易为了追求图上看起来更少的节点数,反而把语义搞坏。
中间还聊到了算子执行流程和性能来源。面试官会顺着我做过的 add 类算子优化继续问,比如你说它是 latency bound,那具体慢在哪。我这里讲的是一个比较工程化的点:有些看起来很简单的二元算子,真正耗时的并不全在算数本身,而在输入输出 buffer 的准备、数据拷贝和不必要的内存分配上。比如如果能确认某个输入张量在当前图里是独立的、不再被其他节点使用,那就可以直接复用它的地址作为输出地址,而不是每次都新申请一块输出内存。这个优化本身不花哨,但在高频算子上是能真正省出时间的。
另一个比较深的部分是,他会继续追问你对 GPU 执行和数据搬运过程到底理解到哪一步。比如 Host to Device、Device to Host 这种显式拷贝在今天的框架里到底怎么发生,统一地址空间和显式地址空间的差别是什么,当前做的工作里有没有碰到更先进一些的地址管理或者互联能力。我这里能答上的还是偏现有工程里的实际体验:现在手上的这套东西仍然很依赖显式地分清 host 和 device、显式地处理数据搬运,而不是那种已经完全统一抽象掉的状态。这个地方能明显感觉出来,对方其实不是在考名词,而是在判断你对底层软件栈和硬件演进有没有概念。
量化这一块也被拿出来单独问了。主要不是问“你知道几个名词”,而是问 W8A8、FP8、AWQ/W4A16 这些方案到底差在哪,为什么权重和激活在很多场景下会采用不一样的精度策略,以及中间累加结果为什么通常要放到更宽的位宽里去承接。我这里答得相对老实,核心还是围绕两个点:一是权重和激活对量化误差的敏感性不完全一样,很多时候权重更适合压低精度,激活则更容易影响最终结果;二是矩阵乘这种成加过程,中间累加结果如果位宽不够,很容易直接溢出,所以实际实现里通常会留更大的累加空间,再在后面做反量化或者类型转换。感觉这一段面试官更想看的是你有没有把“量化”当成一个完整的数据流过程去理解,而不是只停在“能省显存”这句话上。
后面还问到了 TensorFlow 插件机制和 profiling。比如 TensorFlow 这套插件开发为什么让人觉得麻烦,和 PyTorch 的 extension 比起来差别在哪;再比如你现在手上有哪些工具可以观察 kernel 的性能瓶颈,能看到多细。我这边主要讲的是,TensorFlow 这套链路在开发体验上确实更重,注册、底层实现、对接调用这些步骤都更绕;profiling 这边,我平时会先用自己写的轻量级 timing 方法做粗筛,看看时间主要花在数据搬运还是计算,再用更细的工具去看更具体的 kernel 表现。至少到目前这个阶段,我可以比较稳定地判断一个 kernel 更偏访存瓶颈还是计算瓶颈,但再往 layout、cache、冲突模式这些更细的层面,还在继续补。
整体下来,这一面不像那种特别“压迫式”的面试,但问题其实挺实。代码题只是开场,真正拉开差距的还是后面这些追问:你是不是自己看过图,你知不知道什么时候该融、什么时候不该融,你是不是清楚性能到底慢在哪,你对量化和底层执行流程到底是“听说过”,还是能把它讲成一个完整过程。对我自己来说,这一面答得比较顺的是图优化筛选逻辑、单算子优化思路、量化和 kernel 观察方法;相对一般的是再往下走到更底层的硬件细节和互联实现时,自己的理解还不够系统。
#面试复盘##暑期实习##一面##阿里云##AI infra#