中科类脑 AI Infra 实习 一面
Q: AI框架常用的通信协议有哪些?
AI框架的通信涉及训练集群内GPU间通信、推理服务对外接口、数据加载等多个层面:
1. NCCL(NVIDIA Collective Communications Library):
- 专为GPU间高效集合通信设计(AllReduce/AllGather/Broadcast/Reduce-Scatter等)。
- 自动检测拓扑(NVLink/NVSwitch/PCIe/InfiniBand),选择最优通信路径和算法。
- 带宽利用率极高:在DGX A100上AllReduce可达~90% NVLink峰值(600GB/s总双向)。
- 是PyTorch DDP、DeepSpeed、Megatron的底层通信库。
2. gRPC(Google Remote Procedure Call):
- 基于HTTP/2 + Protobuf序列化的高性能RPC框架。
- 特点:强类型接口(.proto定义)、多语言支持、双向流。
- 应用:TensorFlow Serving、Triton Inference Server的推理API、参数服务器通信。
- 性能:单连接可达数十万QPS(小消息),延迟~100us-1ms(局域网)。
3. MPI(Message Passing Interface):
- 传统HPC通信标准,支持点对点(Send/Recv)和集合操作。
- 实现:OpenMPI、MPICH、Intel MPI。
- 在AI中的地位:逐渐被NCCL取代用于GPU通信,但仍用于CPU集群和进程管理(mpirun启动分布式训练)。
4. RDMA(Remote Direct Memory Access):
- 绕过CPU和OS内核,直接在NIC之间传输数据到远端内存。
- 协议:InfiniBand(HPC主流,延迟
1-2us)、RoCE v2(Ethernet上的RDMA,延迟3-5us)。 - 优势:超低延迟、零CPU开销、接近线速带宽。
- 应用:NCCL底层在有IB卡时自动使用RDMA;GPUDirect RDMA允许NIC直接读写GPU显存。
5. TCP/HTTP(通用协议):
- 性能较低但通用性最好,用于推理服务的公网API暴露。
- HTTP REST/JSON:简单但序列化/反序列化开销大。
- 适用场景:推理服务对外接口、Dashboard/监控数据传输。
6. 共享内存(Shared Memory/IPC):
- 同机进程间最快的通信方式(零网络开销,仅内存访问延迟)。
- 应用:多进程DataLoader将预处理数据传给训练进程、同机多GPU间的小数据交换。
- 实现:POSIX shm、mmap、PyTorch的torch.multiprocessing共享tensor。
Q: 多路复用了解哪些?推理框架的复用?
I/O多路复用(系统级):
| 机制 | 特点 | 性能 | 适用 |
|---|---|---|---|
| select | FD数量限1024,每次轮询所有FD | O(n) | 跨平台兼容 |
| poll | 无FD数量限制,链表管理 | O(n) | 比select稍好 |
| epoll | 事件驱动,回调通知就绪FD | O(1)获取就绪事件 | Linux高性能服务器 |
| kqueue | BSD/macOS事件通知 | O(1) | macOS/FreeBSD |
| io_uring | Linux 5.1+异步IO框架 | 极高(零拷贝) | 最新高性能方案 |
epoll为什么高效:内核维护红黑树管理注册的FD,就绪事件放入链表直接返回。不需要遍历所有FD。
推理框架中的复用含义:
与OS的I/O多路复用类似,推理框架也面临”多个请求竞争有限GPU资源”的问题:
模型实例复用:多个推理请求共享同一个模型的GPU内存中的权重(不为每个请求加载一份模型)。
Continuous Batching(请求级多路复用):
- 类比epoll:GPU是”FD”,多个请求是”事件”。
- 每次decode迭代后检查哪些请求完成(类似epoll_wait返回就绪事件),移出完成的请求,填入新请求。
- 效果:GPU利用率从静态batch的30-50%提升到80%+。
计算资源复用:
- 同一GPU上的不同CUDA Stream可以并行执行不同的计算任务。
- MPS(Multi-Process Service)允许多个进程共享GPU。
- MIG(Multi-Instance GPU)将物理GPU分为多个独立实例。
Q: HTTP/2.0的特性?
HTTP/2.0是对HTTP/1.1的重大性能升级,核心改进集中在传输效率:
1. 多路复用(Multiplexing):
- 单个TCP连接上可以并行传输多个请求和响应(stream),互不阻塞。
- 每个请求/响应是一个stream,有唯一ID。
- 解决了HTTP/1.1的队头阻塞(Head-of-Line Blocking):1.1中一个慢响应会阻塞同连接后续请求。
- 注意:TCP层的队头阻塞仍在(丢包影响所有stream)→ HTTP/3用QUIC(UDP)彻底解决。
2. 二进制分帧(Binary Framing):
- 所有通信分割为更小的帧(frame),在二进制层面解析。
- 比HTTP/1.1的文本协议解析更高效、更不易出错。
- 帧类型:DATA(负载数据)、HEADERS(头部)、PRIORITY、RST_STREAM、SETTINGS等。
3. 头部压缩(HPACK):
- 维护动态表和静态表,用索引引用重复的header字段。
- HTTP/1.1中每次请求携带完整header(Cookie、User-Agent等可达数KB),HTTP/2只传差异。
- 压缩率可达90%+。
4. 服务器推送(Server Push):
- 服务器可以主动推送资源(如页面的CSS/JS),无需客户端请求。
- 减少RTT:客户端收到HTML时,关联资源已在路上。
5. 流优先级:可设置各stream的优先级和依赖关系,控制资源分配。
6. 流量控制:stream级和连接级的两层流控,防止快发送者淹没慢接收者。
对AI推理服务的意义:gRPC基于HTTP/2,天然获得多路复用(同一连接并发多个推理请求)和头部压缩(减少protobuf metadata开销)的好处。
Q: 视频会议一般用什么协议?
视频会议的核心需求是实时性——宁可丢帧也不能有累积延迟。协议栈从底层到上层:
传输层:UDP(非TCP)
选择UDP的根本原因:
- TCP丢包时触发重传,重传导致延迟累积——一个丢包可能导致数百ms卡顿。
- 视频会议允许少量丢帧(人眼不敏感),不允许延迟累积。
- UDP无重传、无拥塞控制(应用层自己做),延迟可控。
应用层协议栈:
- RTP(Real-time Transport Protocol):实时传输音视频数据。每个RTP包携带时间戳(同步用)、序列号(检测丢包)、payload type(编码格式)。
- RTCP(RTP Control Protocol):RTP的控制协议,周期性交换QoS统计(丢包率、延迟、jitter),供发送端调整码率/分辨率。
- SRTP:RTP的加密版本,保护音视频数据隐私。
信令协议(会话建立/控制):
- SIP(Session Initiation Protocol):会话发起/终止/修改,类似”拨号”过程。
- ICE/STUN/TURN:NAT穿透方案。STUN探测公网地址,TURN做中继(无法P2P时)。
现代方案:WebRTC:
- 浏览器端实时通信的完整框架。
- 底层:SRTP(音视频传输)+ SCTP over DTLS(数据通道)+ ICE(NAT穿透)。
- 编解码:VP8/VP9/H.264(视频)、Opus(音频)。
- 端到端延迟目标:<150ms(”实时对话”体验)。
Q: Linux内存管理机制?
Linux内存管理是一个多层次的系统,从硬件页表到用户空间分配器:
1. 虚拟内存(核心抽象):
- 每个进程有独立的虚拟地址空间(64位系统下为128TB用户空间 + 128TB内核空间)。
- 通过MMU(内存管理单元)+ 页表将虚拟地址翻译为物理地址。
- 好处:进程隔离、按需分配、内存保护、共享库。
2. 分页机制:
- 内存管理的基本单位是页(page),x86-64默认4KB。
- 4级页表(PGD→PUD→PMD→PTE),每级9位,覆盖48位虚拟地址。
- 大页(Huge Page):2MB/1GB页,减少TLB miss和页表层级。AI框架常用大页(
hugetlbfs)优化大块内存分配。
3. 物理内存分配:
- Buddy System(伙伴系统):管理物理页帧,按2^n页的块分配和合并。分裂大块满足小请求,合并相邻空闲块减少碎片。
- Slab Allocator:在Buddy之上,针对内核小对象(如inode、task_struct)的高效分配器。预分配对象池,减少频繁的buddy分配。
4. 用户空间地址管理:
- VMA(vm_area_struct):描述进程地址空间中每个连续区域的属性(起止地址、权限、映射文件等)。
- 进程地址空间布局:text(代码) → data(全局变量) → heap(向上增长) → … → mmap区域 → stack(向下增长)。
5. 页面回收与交换:
- Page Cache:文件内容缓存在物理内存中(读写文件优先走cache)。
- Swap:物理内存不足时,将不活跃的匿名页(非文件映射的堆/栈)交换到磁盘swap分区。
- OOM Killer:当所有回收手段用尽(cache全清、swap满),选择oom_score最高的进程杀掉释放内存。
对AI框架的影响:
- GPU训练/推理需要大块连续物理内存 → cudaMalloc内部使用NVIDIA UVM或pinned memory。
- 数据加载:mmap大文件避免全部读入内存;hugepage减少TLB miss提高CPU预处理效率。
Q: Docker的Namespace机制?
Namespace是Linux内核提供的资源隔离机制,每个Namespace创造了一个独立的资源视图,进程只能看到自己Namespace内的资源。Docker利用以下7种Namespace实现容器隔离:
| Namespace | 隔离内容 | Docker用途 |
|---|---|---|
| PID | 进程ID空间 | 容器内PID从1开始,看不到宿主机其他进程 |
| NET | 网络栈(网卡/IP/路由/端口) | 容器有独立IP和端口空间 |
| MNT | 文件系统挂载点 | 容器有独立的文件系统视图 |
| UTS | 主机名和域名 | 容器有独立hostname |
| IPC | 进程间通信(信号量/共享内存/消息队列) | 容器间IPC隔离 |
| User | 用户/组ID映射 | 容器内root映射为宿主机非特权用户(安全) |
| Cgroup | cgroup层次视图 | 容器只能看到自己的cgroup |
实现原理:
clone()系统调用创建新进程时传入CLONE_NEWPID/CLONE_NEWNET等标志,在对应Namespace中创建。unshare()将当前进程移入新Namespace。setns()加入已有Namespace(如docker exec进入容器)。
Namespace vs 虚拟机:
- Namespace是内核级别的逻辑隔离(共享内核),虚拟机是硬件级别的物理隔离(独立内核)。
- Namespace几乎零开销(仅多了一层查找表),虚拟机有虚拟化开销。
- Namespace隔离性较弱(共享内核漏洞可逃逸),虚拟机隔离性强。
Q: Docker容器间如何通信?
Docker提供多种网络模式满足不同通信需求:
1. Bridge网络(默认模式):
- Docker创建虚拟网桥
docker0(默认172.17.0.0/16子网)。 - 每个容器获得一对veth pair:一端在容器内(eth0),一端连接到docker0网桥。
- 同一bridge上的容器可以直接通过IP通信。
- 访问外网:通过iptables NAT规则MASQUERADE。
- 局限:默认bridge不支持DNS解析(需用–link或自定义网络)。
2. Host网络:
- 容器直接共享宿主机网络栈,无network namespace隔离。
- 容器进程直接监听宿主机端口,性能最好(零网络虚拟化开销)。
- 适用:高性能网络要求、GPU训练(NCCL通信走host网络性能最好)。
3. Overlay网络(跨主机通信):
- 通过VXLAN隧道封装实现跨主机容器间L2网络。
- Docker Swarm/Kubernetes中多节点容器互通的标准方案。
- 有封装/解封装开销,延迟增加约10-50us。
4. Macvlan:
- 容器获得独立MAC地址,直接接入物理网络(像独立物理机一样)。
- 性能接近host模式,且保持网络隔离。
5. 自定义Bridge网络(生产推荐):
1 | docker network create my_net |
- 支持容器名DNS解析(无需知道IP)。
- 提供更好的隔离(不同network之间默认不通)。
AI训练场景:通常使用host网络模式,让NCCL直接访问IB/RoCE网卡,避免容器网络虚拟化的带宽和延迟开销。
Q: Docker的原理?
Docker基于Linux内核的三大技术实现轻量级进程隔离:
1. Namespace(资源隔离):
- 提供进程、网络、文件系统、用户等维度的独立视图。
- 容器内进程认为自己运行在独立系统中,实际共享宿主机内核。
2. Cgroups(资源限制):
- Control Groups控制容器可使用资源的上限:
- CPU:核心绑定、时间片比例、CFS bandwidth。
- 内存:最大使用量(超限OOM Kill)、swap限制。
- I/O:磁盘读写带宽限制。
- 网络:通过tc做带宽限制。
- AI训练中常用:
--gpus='"device=0,1"'(GPU分配),--memory=32g(内存限制)。
3. UnionFS/OverlayFS(分层镜像文件系统):
- 镜像由多个只读层(layer)叠加组成,每层只包含与前一层的差异。
- 容器运行时在最上层添加可写层(container layer),写入使用COW(Copy-on-Write)。
- 优势:多个容器共享相同的基础镜像层(如Ubuntu base layer只存一份),节省磁盘和下载时间。
Docker工作流:
1 | 1. docker pull: 下载镜像各层 (Registry → 本地存储) |
与虚拟机的关键区别:
- Docker:共享宿主机内核,启动秒级,几乎零额外CPU开销,隔离性较弱。
- VM:独立内核+虚拟化硬件,启动分钟级,5-15% CPU开销,隔离性强。
- AI训练选Docker:性能接近裸机 + 环境可复现 + 快速部署。
Q: Linux中如何替换文本?
Linux文本替换工具从简单到强大:
| 工具 | 命令示例 | 特点 |
|---|---|---|
| sed | sed -i 's/old/new/g' file |
流编辑器,最常用,支持正则 |
| awk | awk '{gsub(/old/,"new")}1' file |
更强的文本处理(可编程) |
| perl | perl -pi -e 's/old/new/g' file |
最强正则支持(PCRE) |
| tr | echo "abc" | tr 'a-z' 'A-Z' |
字符级转换(非字符串) |
| Vi/Vim | :%s/old/new/g |
交互式编辑器内替换 |
sed详解(最常用):
1 | # 基本替换(原地修改) |
AI开发中的典型场景:批量修改配置文件中的模型路径、更新版本号、替换deprecated API调用。
Q: 进程间通信(IPC)方式有哪些?
| 方式 | 速度 | 适用场景 | 特点 |
|---|---|---|---|
| 共享内存 | 最快(内存访问速度) | 同机大数据传输 | 需要额外同步机制 |
| 管道/FIFO | 中等 | 父子/无亲缘进程 | 单向、FIFO语义 |
| Unix Socket | 快(同机优化) | 通用进程通信 | 双向、可传FD |
| 消息队列 | 中等 | 异步消息传递 | 内核维护、按类型取 |
| 信号量 | N/A(同步用) | 资源计数/互斥 | 不传数据,控制并发 |
| 信号 | 快但信息少 | 异步通知 | 仅通知事件,不传数据 |
| TCP/UDP Socket | 较慢 | 跨网络通信 | 最通用,跨机器 |
AI框架中的IPC应用:
- 共享内存:PyTorch DataLoader多worker预处理数据,通过共享内存传给训练进程(避免序列化开销)。
torch.multiprocessing底层用mmap共享tensor。 - 管道:简单的进程间命令传递(如触发checkpoint保存)。
- Unix Socket:NCCL在同机GPU间的控制通道。
- TCP Socket:分布式训练的rendezvous(进程发现)、gRPC推理服务。
Q: 协程数量如何限制?
协程(Coroutine)是用户态轻量级”线程”,切换成本极低(无系统调用,仅保存/恢复少量寄存器),但无限创建仍会消耗内存和引发竞争。限制方式:
1. 信号量/令牌桶模式:
1 | # Python asyncio示例 |
2. 协程池模式:
1 | # 使用aiojobs或自实现worker pool |
3. Go语言的buffered channel模式:
1 | // channel容量 = 最大并发协程数 |
4. 资源感知动态调整:
- 监控当前内存/连接数/CPU使用率。
- 动态调整并发上限(如内存使用>80%时减少并发)。
- 适合不确定负载的生产环境。
为什么需要限制:
- 每个协程虽轻量(Go约2-8KB栈,Python约几十KB),百万级仍消耗数GB内存。
- 下游资源(数据库连接池、文件描述符、网络端口)有上限。
- 过多并发可能导致下游过载(如数据库连接池耗尽)。
Q: 开闭原则(OCP)的具体代码应用?
开闭原则(Open-Closed Principle):软件实体(类/模块/函数)应该对扩展开放,对修改关闭——新增功能时通过添加新代码实现,而不修改已有的稳定代码。
策略模式实现OCP(推理框架中最常见):
1 | // 定义算子接口(对修改关闭) |
新增任何算子:只需实现Operator接口 + 注册到Registry,不需要修改调度器、执行引擎、图优化器等已有代码。
AI框架中的OCP应用:
- PyTorch的dispatch机制:新增DispatchKey不修改核心调度逻辑。
- TensorRT的Plugin接口:自定义算子通过实现IPluginV2接口注册。
- ONNX Runtime的ExecutionProvider:新增硬件后端不修改框架核心。
Q: 并发编程如何实现?
并发编程的核心挑战是在多个执行单元间安全高效地协调工作:
| 模型 | 实现 | 适用场景 | 优势 | 劣势 |
|---|---|---|---|---|
| 多线程 | pthread/std::thread | CPU密集+共享数据 | 共享内存高效通信 | 需要锁同步,死锁风险 |
| 多进程 | fork/multiprocessing | CPU密集+故障隔离 | 隔离性好,绕过GIL | IPC开销,内存不共享 |
| 协程 | asyncio/goroutine | IO密集+高并发 | 轻量切换(us级) | 不能利用多核(单线程) |
| 线程池 | ThreadPoolExecutor | 通用 | 复用线程减少创建开销 | 需要合理设置池大小 |
| Actor模型 | Akka/Ray | 分布式、无共享 | 无锁、天然分布式 | 编程范式学习成本 |
| CSP模型 | Go goroutine+channel | 并发通信 | 通过通信共享而非共享通信 | channel可能成为瓶颈 |
AI训练/推理中的实际应用:
- DDP训练:多进程(每进程管理一块GPU,进程间用NCCL通信)。选多进程因为:绕过Python GIL、GPU独立管理、进程崩溃不影响其他。
- 数据加载:多进程预处理(DataLoader num_workers)+ 共享内存传输tensor。
- 推理服务:协程处理网络IO(接收请求)+ 线程/进程池执行GPU推理。
- Ray框架:Actor模型实现分布式训练调度、超参搜索。
Q: CUDA Core和Tensor Core的区别?
| 特性 | CUDA Core | Tensor Core |
|---|---|---|
| 功能 | 通用浮点/整数FMA (a×b+c) | 专用矩阵乘加 (D=A×B+C) |
| 每周期运算量 | 1个标量FMA/Core | 一个小矩阵块的MMA(如4×4×4) |
| 数据类型 | FP32/FP64/INT32 | FP16/BF16/TF32/FP8/INT8 |
| 编程接口 | 自动使用(CUDA代码) | WMMA API / cuBLAS / cuDNN |
| 典型吞吐(A100) | 19.5 TFLOPS (FP32) | 312 TFLOPS (FP16) |
| 适用算子 | 通用计算、逐元素操作 | GEMM、卷积的核心计算 |
Tensor Core的工作方式:
- A100 Tensor Core单次执行:D(FP32, 4×4) += A(FP16, 4×4) × B(FP16, 4×4)。
- 一个warp(32线程)协作执行一个WMMA操作(如m16n8k16)。
- 输入FP16/BF16/INT8,累加器FP32/INT32,保证计算精度。
为什么Tensor Core这么快:
- 专用硬件电路做矩阵乘:相比通用Core,面积效率极高。
- 16倍的吞吐差异(312T vs 19.5T FP16 vs FP32)。
- 减少指令数:1条WMMA指令 = 数百次标量FMA。
各代Tensor Core支持的类型:
- V100(1代):FP16→FP32
- A100(3代):FP16/BF16/TF32/FP64/INT8/INT4/Binary
- H100(4代):新增FP8(E4M3/E5M2)
- B100(5代):新增FP4
使用注意:
- 维度需对齐到特定值(如FP16需M/N/K为8或16的倍数)。
- 数据layout需匹配(行/列主序要求)。
- 不是所有计算都适合Tensor Core——只有GEMM类运算能利用。逐元素操作仍然走CUDA Core。
Q: 达芬奇架构了解多少?
华为昇腾NPU的达芬奇(Da Vinci)架构是为AI计算专门设计的处理器架构,与NVIDIA GPU有根本性的设计差异:
AI Core内部结构:
1 | ┌──────────── AI Core ────────────┐ |
各单元详解:
- Cube单元:矩阵运算核心,单次执行16×16矩阵乘(FP16),类似GPU的Tensor Core但粒度更大。Ascend 910B有约512个Cube Core。
- Vector单元:2048位向量处理器,一次处理128个FP16元素。负责激活函数、归一化、逐元素操作等。
- Scalar单元:标量运算和程序流程控制(循环、分支、地址计算)。
- MTE(Memory Transfer Engine):独立的DMA引擎,负责各级buffer间的数据搬运。支持多维数据重排(transpose、padding等),不占用计算资源。
- 内存层次:L0 Buffer(寄存器级) → L1 Buffer(类似shared memory, 512KB) → L2 Cache → HBM。
编程模型(Ascend C):
与CUDA的关键区别:程序员必须显式管理所有数据搬运。
1 | // Ascend C编程范式 |
与NVIDIA GPU的编程模型对比:GPU有L1/L2 Cache自动管理,程序员可以不显式管理shared memory(依赖cache也能工作,只是不够优化)。NPU没有这种”兜底”机制——如果不手动搬数据到L1 Buffer,数据就留在HBM中,每次计算都要从HBM读取,性能极差。
Q: Reduce算子如何优化?
Reduce(规约)是GPU编程中的经典优化问题,优化层次从基础到极致:
优化演进(以sum reduce为例):
Level 1:避免线程闲置(基础):
- 使用顺序寻址(tid < stride)而非交错寻址(tid % 2*stride == 0),减少warp divergence。
- 确保活跃线程是连续的前半部分。
Level 2:首次加载时规约(Double数据量):
- 每个线程在首次加载时就处理2个元素做第一次add:
sdata[tid] = input[tid] + input[tid + blockDim.x]。 - 一个Block可以覆盖2倍数据量(或Block数减半)。
Level 3:Warp内展开(消除sync开销):
- 最后32个活跃线程位于同一Warp,Warp内执行天然同步,不需要
__syncthreads()。 - 将最后5步(stride=16,8,4,2,1)完全展开为顺序指令。
- 使用
volatile修饰shared memory确保编译器不优化掉中间读写。
Level 4:Warp Shuffle(避免shared memory):
1 | float val = thread_data; |
- 直接在寄存器间交换数据,不经过shared memory。
- 无bank conflict、无sync开销。
- 延迟仅1-2 cycle(vs shared memory ~20 cycle)。
Level 5:多级规约(处理大数据):
- Block内Reduce得到Block结果 → Block结果需要进一步合并。
- 方案A:全局原子操作
atomicAdd(&result, block_sum)—— 简单但有竞争。 - 方案B:两轮kernel —— 第一轮各Block输出partial sum,第二轮对partial sum再reduce。
- 方案C:Cooperative Groups的grid-wide sync(需支持cooperative launch)。
Level 6:向量化加载 + Grid-stride Loop:
1 | float sum = 0; |
- 每线程处理多个元素,覆盖任意大数据。
- 向量化加载(float4)减少内存事务。
Q: AI框架具体要开发哪些部分?
一个完整的AI框架(如PyTorch/TensorFlow/MindSpore)包含以下核心模块:
1. 前端(用户接口层):
- Python API设计:简洁、符合直觉的模型定义和训练接口。
- 自动微分(autograd):记录前向操作构建计算图,自动生成反向梯度计算。
- 模型定义DSL:Module/Layer抽象、参数管理、模型序列化。
2. 图层(中间表示+优化):
- 计算图IR设计:SSA形式、类型系统、shape推导。
- 图优化Pass:算子融合、常量折叠、死代码消除、CSE、Layout优化。
- 图切分:根据并行策略将图切分为多个子图分配到不同设备。
- 动态/静态图转换:torch.compile的TorchDynamo图捕获机制。
3. 运行时(执行引擎):
- 内存管理:内存池、tensor生命周期管理、显存碎片整理。
- 算子调度:根据设备类型dispatch到对应实现、多stream并行执行。
- 设备抽象:统一的Device接口封装不同硬件(CPU/CUDA/NPU/XLA)。
- 动态shape处理:运行时shape推导、缓存已编译kernel。
4. 算子库(性能核心):
- 各硬件平台的高性能算子实现(CUDA kernel/OpenCL kernel/NPU算子)。
- 数学库封装:cuBLAS(GEMM)、cuDNN(Conv/BN)、cuFFT、cuSPARSE。
- 自定义算子扩展接口(torch.library/TORCH_LIBRARY)。
5. 编译器(新一代核心):
- DSL到kernel的编译:Triton/TVM/XLA。
- 自动调优(AutoTuning):搜索最优的tile size/schedule。
- 代码生成:生成CUDA PTX/LLVM IR/硬件指令。
6. 分布式(规模化训练):
- 通信库封装:NCCL/Gloo集合通信原语。
- 并行策略实现:DDP/FSDP/TP/PP的实际编排逻辑。
- 弹性训练:节点故障恢复、动态伸缩。
- Checkpointing:分布式模型保存/加载。
7. 工具链:
- Profiler:torch.profiler、Nsight集成。
- Debugger:tensor检查、NaN检测、梯度监控。
- 模型转换:ONNX导出、量化工具、剪枝工具。