阿里巴巴 AI Infra 实习 一面
Q: 什么是访存密集型算子?
访存密集型算子是指算术强度低、性能受内存带宽限制的算子。典型例子:elementwise操作(add/relu/sigmoid)、LayerNorm、BatchNorm、Softmax、transpose/reshape。这些算子计算量小但需要读写大量数据,优化方向是减少内存访问次数(算子融合)和提高带宽利用(合并访存、向量化加载)。
Q: FP32、FP16、INT8的存储格式是怎样的?
- FP32:1位符号 + 8位指数 + 23位尾数,共32位。范围约±3.4e38,精度约7位有效数字。
- FP16:1位符号 + 5位指数 + 10位尾数,共16位。范围约±65504,精度约3-4位有效数字。
- BF16:1位符号 + 8位指数 + 7位尾数,共16位。范围同FP32,精度约2-3位。
- INT8:8位定点整数,有符号范围-128
127,无符号0255。
Q: 量化的原理及过程?
原理:将浮点数映射到低位整数表示,减少存储和计算开销。核心公式:q = round(x / scale) + zero_point,反量化:x ≈ (q - zero_point) * scale。
过程:统计数据分布(calibration)→ 确定scale和zero_point(基于min-max/percentile/KL散度)→ 将权重/激活量化为INT8 → 推理时用整数运算加速 → 必要时反量化回浮点。
Q: GPU和CPU的结构差异及各自适合计算什么?
- CPU:少量强大核心(数十个),大缓存,复杂控制逻辑(分支预测/乱序执行)。适合延迟敏感的串行复杂任务、分支密集逻辑、操作系统和IO。
- GPU:大量简单核心(数千个),小缓存,简单控制。适合吞吐量导向的大规模并行计算(矩阵运算、图像处理、深度学习训推)。
Q: UDP和TCP的区别和适用场景?
- TCP:面向连接、可靠传输(确认/重传/流控)、有序、开销大。适合网页、文件传输等需要可靠性的场景。
- UDP:无连接、不可靠、无序、开销小、速度快。适合实时音视频、游戏、DNS查询等对延迟敏感可容忍丢包的场景。
- 在HPC中RDMA通常基于UDP/InfiniBand实现高性能通信。
Q: Linux查找磁盘使用的指令?
df -h:查看文件系统整体使用情况。du -sh *:查看当前目录下各文件/目录大小。du -h --max-depth=1:查看一级目录大小。ncdu:交互式磁盘使用分析工具。lsblk:查看块设备信息。
Q: 手撕:链表判断有环?
(编程题)
Q: 手撕:CUDA实现向量加法?
(编程题)
Q: 介绍锁的概念?
锁(Lock/Mutex)是并发编程中保护共享资源的同步原语。核心思想:同一时刻只允许一个线程/进程访问临界区。类型包括互斥锁、读写锁、自旋锁、递归锁。加锁-操作-解锁模式防止数据竞争,但使用不当可能导致死锁、优先级反转、性能下降。
Q: 交叉熵损失函数的理解?
交叉熵:H(p,q) = -Σ p(x) * log(q(x)),衡量真实分布p与预测分布q的差异。在分类任务中,p是one-hot标签,q是模型softmax输出。交叉熵等价于负对数似然:-log(q_y)(y为正确类别)。值越小表示预测分布越接近真实分布。梯度形式简洁:∂L/∂z = q - p,计算高效。
Q: CUDA编程中并行性和并发性的区别?
- 并行性(Parallelism):多个线程同时执行相同/不同操作。如一个Warp内32个线程真正同时执行同一指令(SIMT)。
- 并发性(Concurrency):多个任务在时间上重叠执行但不一定同时。如多个kernel在不同stream中交替使用GPU资源、计算与数据传输overlap。
GPU通过大规模并行(thousands of threads)和并发(multi-stream)两者结合实现高性能。
Q: 手撕:实现SVM?
(编程题)
Q: 手撕:实现Transformer?
(编程题)