大模型并发GPU

张开发
2026/5/31 1:10:01 15 分钟阅读
大模型并发GPU
第一部分GPU的物理本质与计算原理要理解GPU如何分配和计算首先要明白它到底是什么。1. GPU是什么——软硬一体的复杂系统物理层硬件GPU是一块集成了数百亿个晶体管的硅片。这些晶体管组成了最基本的逻辑门电路与门、或门、非门就是通过0和1进行计算的进而构建出能够执行加减乘除的算术逻辑单元ALU。在NVIDIA的架构中成千上万个这样的ALU被称为CUDA核心它们是并行计算的基石。软件层接口在Linux操作系统看来GPU被抽象为设备文件如/dev/nvidia0。这并非存储数据的普通文件而是一个“传送门”。当程序向这个文件写入指令时操作系统内核中的驱动程序会截获请求将数据和命令通过PCIe总线搬运到GPU的显存VRAM中从而启动硬件计算。2. 0和1如何变成复杂计算——硬件算法揭秘GPU的计算过程就是电流在精心设计的晶体管电路中流动的过程。不同的数学运算对应着不同的硬件实现策略。表格运算类型核心思想硬件实现原理形象比喻加减法逻辑门组合通过加法器电路由半加器、全加器串联而成直接处理二进制位产生和与进位。数豆子最基础、最直接的物理动作。乘除法移位与累加/减乘法将二进制数左移相当于乘以2的幂并根据乘数位是否为1进行累加。除法通过右移除以2的幂和减法来实现。搭积木通过错位叠加高效完成复杂运算。平方 (x²)特化的乘法直接调用GPU中的乘法器将同一个数据x同时送入两个输入端口A和B计算A×B。背口诀一步到位速度与普通乘法无异。开根号 (√x)迭代逼近主要使用牛顿迭代法。硬件电路会先猜一个初始值然后反复套用公式x_new 0.5 * (x_old S / x_old)进行修正直到结果收敛到足够精确。比如瞎猜 ( x0x0​ )假设猜 10。第一轮迭代1025/10102.512.51025/10102.512.512.5/26.2512.5/26.25 离 5 近多了第二轮迭代6.2525/6.25≈6.25410.256.2525/6.25≈6.25410.2510.25/25.12510.25/25.125 非常接近了第三轮迭代5.12525/5.125≈5.1254.87810.0035.12525/5.125≈5.1254.87810.00310.003/25.001510.003/25.0015 误差极小停止猜谜语先猜一个大概再根据提示不断修正直至猜中。对数/三角函数查表与插值利用特殊函数单元SFU。首先通过区间缩减如利用log(M * 2^E) log(M) E将任意输入x缩小到一个固定范围如1到2之间。然后用输入值的高位比特作为地址在固化的只读存储器ROM查找表中获取一个近似值。最后利用低位比特进行线性插值得到高精度的最终结果。会有存储器存储(例子0.00001~999999的平方、开根、log等计算的表用来直接查询出结果)查字典不现场推导而是直接查阅预先准备好的“答案小抄”并用微调确保精确。第二部分GPU资源的分配与调度理解了GPU如何计算我们再来看如何管理和分配这些宝贵的计算资源。1. 单机分配从手动到自动在没有K8s的独立服务器上GPU分配主要依赖手动或脚本。静态分配手动指定通过环境变量CUDA_VISIBLE_DEVICES用户可以强制程序使用指定的GPU。例如export CUDA_VISIBLE_DEVICES0会让程序只能看到并使用0号GPU。这种方法简单直接但容易因人为疏忽导致资源冲突。动态分配脚本/调度器更高级的方式是编写脚本调用nvidia-smi查询GPU显存使用情况自动将任务分配给空闲的GPU。在高性能计算领域Slurm等专业调度器会维护一个任务队列根据资源空闲情况自动分配实现更高效的批处理。2. K8s集群调度自动化与智能化的管理K8s将GPU管理提升到了集群级别实现了资源的池化和自动化调度。核心组件NVIDIA Device Plugin发现与上报该插件运行在每个节点上负责扫描/dev/nvidia*设备文件并向K8s API Server上报“本节点拥有N个nvidia.com/gpu资源”。注册与等待K8s将这些资源信息记录下来使其成为可被调度的资源池的一部分。这个插件会把显卡打成标签变成可以nodeSelector选择调度流程用户声明用户在Pod的YAML文件中通过resources.limits声明需要多少GPU并通过nodeSelector指定GPU型号如nvidia.com/gpu.product: NVIDIA-A100。调度器匹配K8s调度器会遍历所有节点寻找满足资源请求和标签约束的节点。绑定与挂载找到合适节点后调度器将Pod绑定到该节点。节点上的Kubelet会调用Device Plugin获取具体的GPU设备文件路径并将其挂载到容器中。高级分配策略同构卡分配当一个节点有多张相同GPU时K8s默认采用Binpack打包策略优先填满一张卡再使用下一张以减少资源碎片。也可配置为Spread分散策略将任务均匀分布提高容灾能力。比如我的请求需要6g通过上面静态分割成2g.10gb,就可以通过K8S YAML指定给他分配3个异构卡分配通过nodeSelector和自动打上的标签K8s可以轻松区分A100、T4等不同型号的GPU确保训练任务分配到高性能卡推理任务分配到经济型卡。MIG多实例GPU对于A100/H100等高端卡可以在硬件层面将其切割成多个拥有独立显存和计算单元的“小卡”如1g.10gb。K8s会将这些切片识别为独立的资源如nvidia.com/mig-1g.10gb实现更细粒度的分配和硬件级隔离。apiVersion: v1 kind: Pod metadata: name: ai-training-pod spec: # 1. 告诉 K8s把我调度到有 A100 的节点上 nodeSelector: nvidia.com/gpu.product: A100-SXM4-40GB-MIG-2g.10gb #选择插件的标签 containers: - name: gpu-container image: my-ai-image resources: limits: # 2. 申请数量我要 7 个这种特定型号的切片 nvidia.com/mig-2g.10gb: 7第三部分大模型时代的并行计算策略当模型规模远超单卡显存且需要服务海量并发请求时就需要更复杂的并行策略。1. 模型并行解决“装不下”的问题张量并行Tensor Parallelism, TP原理将模型中的单个大矩阵乘法操作如Q, K, V矩阵拆分成多个小矩阵分配到不同GPU上并行计算。过程输入数据被广播到所有参与TP的GPU上各GPU计算自己负责的部分然后通过高速互联如NVLink进行结果聚合All-Reduce。优点能有效降低单层计算延迟是处理超大规模模型的核心技术。流水线并行Pipeline Parallelism, PP原理将模型按层Layer切分不同GPU负责不同层的计算形成一条处理流水线。过程数据在GPU间依次传递GPU 0处理完前几层后传给GPU 1同时GPU 0可以开始处理下一个数据批次。优点通信开销相对较小但可能存在“气泡”即部分GPU空闲等待问题。2. 数据并行解决“服务不过来”的问题原理这是最直接的扩展方式。将完整的模型副本加载到多个GPU或GPU组上。过程incoming的用户请求被负载均衡器分发到不同的模型副本上实现并发处理。优点线性提升系统吞吐量是K8s中通过增加Pod副本数即可实现的经典模式。3. 混合并行终极解决方案现代超大规模模型如DeepSeek-R1的训练和推理几乎都采用混合并行策略。例如使用8张GPU通过TP组成一个“逻辑GPU”来承载一个巨大的模型然后在K8s中部署多个这样的“逻辑GPU”副本数据并行来服务海量用户。这种方式完美结合了模型并行和数据并行的优势是应对AI大模型挑战的终极武器。

更多文章