Triton is all you need —— Vector Addition & Reverse Array
Vector addition原题:编写一个在 GPU 上执行 32 位浮点数向量逐元素相加的程序。该程序应接受两个等长输入向量,并产生一个包含它们和的输出向量。 exp1: Input: A = [1.0, 2.0, 3.0, 4.0] B = [5.0, 6.0, 7.0, 8.0] Output: C = [6.0, 8.0, 10.0, 12.0] ...
Vector addition原题:编写一个在 GPU 上执行 32 位浮点数向量逐元素相加的程序。该程序应接受两个等长输入向量,并产生一个包含它们和的输出向量。 exp1: Input: A = [1.0, 2.0, 3.0, 4.0] B = [5.0, 6.0, 7.0, 8.0] Output: C = [6.0, 8.0, 10.0, 12.0] ...
文章启蒙来自苏神的缓存与效果的极限拉扯:从MHA、MQA、GQA到MLA,拜谢Orz。 attention首先attention的公式我们都知道如下: \mathrm{Attention}(K,Q,V)=\mathrm{softmax}(\frac{QK^{\top}}{\sqrt{d_{k}}})V 我们尝试用数学来表述清楚这个问题,首先假设输入为一条token的x,输出为一条token的o,结合上面的公式得到QKV矩阵: q=x W_q\in\mathbb{R}^{d_k},W_q\in\mathbb{R}^{d\times d_k}k=x W_{k}\in\mathbb R^{d_k},W_{k}\in\mathbb R^{d\times d_k}v=xW_{v}\in\mathbb{R}^{d_k},W_{v}\in\mathbb{R}^{d\times d_v} ...
双向子序列也是双指针 接雨水 接水最多的容器 双指针的搜索范围三数之和
目前推理框架基本上都需要用到多轮对话的场景,自然产生了kv cache的存储和索引算法。如果能把prompt和后续产生的KV Cache保存下来,会极大地降低首Token的耗时。 目前使用最多的就是两个技术方案,一个是SGLang推出的RadixAttention的Prefix Cache,另一个是vllm原生的Chunk Prefills。当然vllm也兼容了Prefix Cache,这两个技术只能用一个,vllm默认是Chunk Prefills,可以通过加入参数--enable-prefix-caching来开启,这里不谈TensorRT-LLM是因为其不完全开源。 ...
单机八卡,我们按照PP + TP的方式来进行方案说明,使用的是vllm框架,主要命令和函数如下: python single_node_multi_gpu_demo.py --mode pipeline_parallel --tensor-parallel 4 --pipeline-parallel 2 --model facebook/opt-13b def pipeline_parallel_inference(self, model_name: str, tensor_parallel_size: int, pipeline_parallel_size: int): “““流水线并行推理 - 将模型层分布到多个GPU上””” print(f"🚀 启动流水线并行推理 - 模型: {model_name}") print(f" 张量并行: {tensor_parallel_size}, 流水线并行: {pipeline_parallel_size}") ...
一个client建立之后就会建立一个core engine,这些配置会通过QMZ IPC发送给core engine。 Core engine Architecture Worker and Executor MultiprocExecutor在MultiprocExecutor类中,可以清晰的找到三部曲: 1、创建RPC消息队列 # Initialize worker and set up message queues for SchedulerOutputs # and ModelRunnerOutputs max_chunk_bytes = envs.VLLM_MQ_MAX_CHUNK_BYTES_MB * 1024 * 1024 self.rpc_broadcast_mq = MessageQueue(self.world_size, self.world_size, max_chunk_bytes=max_chunk_bytes) scheduler_output_handle = self.rpc_broadcast_mq.export_handle() ...
首先,需要说一些特性在前面: NCCL是NVIDIA 集体通信库(NVIDIA Collective Communication Library),专注于 GPU 间交互,利用 NVLink、PCIe 和 InfiniBand (IB) 等互连技术实现高带宽和低延迟。 NCCL并不是完全开源 ...
随着LLM业务的不断发展,我们发现单机单卡无法承载一个模型的训练和推理,故此出现了单机多卡和多机多卡的训练推理算子,这时候每个机和卡之间都需要通信,所以通信算子十分的重要。 分布式并行下面是传统的四种并行处理架构,常用于大模型训练。 DP 每张卡拷贝相同的模型结构,仅对数据做切分。每张卡计算完的梯度也是针对各自数据的,需要做一次allreduce,然后使用优化器更新模型,进入下一次迭代。 ...
(施工ing) 概述我们知道,算子的作用是计算,那在整个体系中,我们的核心目标是拉满GPU的利用率。 在现代分布式体系中,多GPU之间同时存在着计算、内存访问和通信这三种基本活动,为了服务于我们的核心目标,我们需要尽可能的将通信时间和访存时间放在计算时间内,使得GPU不存在运算时间的泡泡。 大模型分布式系统执行的核心组件是并行的GPU。提升GPU运算的最佳方法,是通过计算与通信的重叠来实现。这种重叠可以通过两种方式达成:算子分解或通信内核融合。虽然算子分解实现起来简单,但往往导致性能欠佳。而将通信内核与计算内核融合,则需要更多的思考和计算。 故此最原始的想法就是用计算时间掩盖通信时间,通过大批量的数据直接发送到GPU,减少kernel开启和关闭、通信的开销。 Triton-distributedTriton-distributed是字节seed团队开发的Triton 编译器的扩展。对于 LLM 来说,分布式优化的关键要求是计算通信重叠。以前,在小规模分布式训练/推理中,通信开销并不是一个关键的成本问题。然而,随着集群数量呈指数级增长,计算与通信重叠变得至关重要。 ...
ROCm 入门 首先就是amd官方的命名跟nv的区别,其实区别并不大,只是AMD在cuda的基础上做了更多的优化,比如说一个wavefront有64个work-item,相当于一个warp有64个threads。其次就是有两种register,在 ...
(施工ing) include日录主要存放了编译器核心功能的.h头文件,提供约定和规范 lib是.c和.cpp,主要是功能的实现,和include一一对应 ...
challenge 新模型 新module出现,需要对应算子进行计算,还需要结合硬件进行特性优化和测试,尽量充分发挥硬件性能 硬件厂商还会发布新技术的加速计算库 专用加速芯片爆发导致性能可移植性成为一种刚需 不同厂商的ISA不尽相同 一般缺乏如GCC、LLVM等编译工具链,使得针对CPU和GPU已有的优化算子库和针对语言的优化Pass很难短期移植到NPU上 架构 和传统编译器对比 在编译优化层通过统一IR执行不同的Pass进行优化,从而提高执行性能 软件结构栈:分成前端、优化、后端三段式,IR解耦前端和后端使得模块化表示 AI编译器对Graph IR进行优化后,将优化后的IR转换成传统编译器IR,最后依赖传统编译器进行机器码生成 左边是旧编译器架构,右边是ai编译器架构 ...