- 博客(381)
- 收藏
- 关注
原创 深度解析:CPU 与 GPU 上的张量运算,为何“快”与“慢”并非绝对?
在深度学习和科学计算领域,GPU 因其强大的并行计算能力而被奉为加速的利器。一个普遍的认知是“GPU 比 CPU 快”。然而,这个看似简单的结论在实践中却充满了微妙的细节和重要的反转。当计算任务的数据规模发生变化时,“快”与“慢”的定义也会随之改变。for我们测试了三种截然不同的数据规模:极小规模 (2x2)、中等规模 (128x128) 和大规模 (4096x4096实验结果揭示了计算效率背后深刻的权衡,并对我们如何选择合适的计算硬件提供了宝贵的洞见。(完整测试代码在文末)
2025-08-05 00:07:25
540
原创 深度剖析PyTorch torch.compile的性能曲线与优化临界点
橙色的静态编译线和绿色的动态编译线在初始波动后,几乎保持为水平直线,远低于Eager模式。: 在模型极其简单时,编译的固定框架开销(投资)超过了它节省下来的(少量)核函数启动开销(回报)。当操作链很长时,这种“死亡千纸割”式的累积开销变得无法忽视,构成了性能的主要瓶颈。都将其视为一个整体进行优化,其执行时间几乎与操作数量无关,彻底消除了核函数启动次数带来的性能瓶颈。)组成的模型,系统性地将其操作语句数量从1增加到30,并在GPU上精确测量每次调用的平均延迟。的性能曲线则讲述了一个关于“投资回报”的故事。
2025-08-02 18:33:42
1007
原创 从本地到云端:将Linux文件夹上传至GitHub仓库的完整指南
在深入操作之前,理解几个核心概念至关重要,这将有助于明晰每个步骤的目的。本指南将详细介绍如何将一个位于Linux环境下的本地项目文件夹,首次上传到一个空的GitHub远程仓库。此命令将暂存区中的所有内容创建为一个新的提交,并附加一条描述性信息。子目录,用于存放所有Git元数据和历史记录,从而将此文件夹转换为一个Git仓库。操作成功后,刷新GitHub仓库页面,所有文件将显示在其中。此命令会将当前目录下所有文件的快照添加到“暂存区”,为下一次提交做准备。创建一个新的提交来记录这次的变更,并附上有意义的描述。
2025-08-01 18:46:25
665
原创 深入torch.compile的黑匣子:守卫(Guards)如何决定你的代码性能
而一次因守卫失效导致的重新编译,其延迟则会飙升到毫秒(ms)级别,产生数十倍甚至上百倍的性能差异。因此,我们设计了一个高精度的计时函数,来精确测量每一次关键调用的延迟,并以此作为判断“是否发生重新编译”的黄金标准。有时,一次看似无害的外部状态变更,就可能让已编译好的、风驰电掣的代码瞬间“缓存失效”,退化到代价高昂的重新编译。得益于守卫的精确性,可以放心地修改一个对象的未被特定编译函数使用的部分,而不用担心会导致该函数的缓存失效。首先,我们需要证明守卫是真实存在的,并且它的失效会带来巨大的性能代价。
2025-07-31 23:58:55
552
原创 pytorch程序语句固定开销分析
然而,在这些宏观优化的背后,构成我们代码的每一条基础语句——无论是PyTorch的张量操作还是纯Python的“胶水代码”——都存在其固有的、微小的性能开销。GPU的威力在于其大规模并行性,这点开销在处理大型张量时会被完全摊销,但对于小规模、高频率的操作,延迟是必须考虑的因素。然而,普遍共识和大量测试表明,对于中到大规模的迭代,列表推导式因其在C层面的优化,性能通常会显著优于显式循环。通过量化这些基础操作的固定开销,我们能更深刻地理解代码的真实成本,从而做出更明智的决策,打造出极致性能的AI系统。
2025-07-31 19:59:32
815
原创 PyTorch数据选取与索引详解:从入门到高效实践
在PyTorch中,从现有张量(Tensor)中高效、准确地选取所需的数据子集是日常操作的核心。无论是准备数据批次、提取模型输出的特定部分,还是根据条件过滤数据,都离不开强大的索引机制。基础索引与切片是最直观、最常用的数据选取方式,其语法与Python的NumPy和列表非常相似。是一个非常强大的函数,常用于根据索引从源张量中“收集”数据。通过传入一个包含索引值的张量,可以一次性地从目标张量中选取多个、非连续的元素。(布尔张量)作为索引。此函数将输入张量视为一个一维张量,然后根据提供的索引选取元素。
2025-07-24 17:51:17
876
原创 PyTorch常用Tensor形状变换函数详解
是最常用的两个用于重塑张量形状的函数。它们都可以改变张量的维度,但前提是新旧张量的元素总数必须保持一致。函数则提供了更强大的维度重排能力,可以一次性对所有维度进行任意顺序的重新排列。这个组合会创建数据的完整物理副本,适用于需要一个独立的、可修改的新张量的场景。除了改变张量的形状,有时还需要沿着某些维度复制数据,以生成一个更大的张量。函数通过扩展长度为 1 的维度来创建一个新的、更高维度的张量。函数不复制数据、只创建视图的特性,是实现广播操作的首选。函数返回一个具有新形状的张量,这个新张量与原始张量。
2025-07-24 17:29:23
901
原创 PyTorch C++扩展:集成自定义CUDA内核的简明指南
PyTorch提供了卓越的性能,但为了实现极致优化或非标准操作,编写自定义CUDA C++内核是必经之路。PyTorch强大的C++扩展机制可以无缝地将自定义CUDA代码集成到Python工作流中。本指南将通过一个简单的向量加法示例(c = a + b),分步展示如何正确地构建、编译并调用一个自定义的CUDA C++内核,并特别强调避免常见编译错误的关键文件组织方法。
2025-07-22 00:40:49
824
原创 Triton的核心概念与简单入门
网格 (Grid)是在启动Triton核函数之前,在主机端(CPU)定义的。它告诉Triton:“对于即将开始的这项庞大任务,需要启动多少个‘工人’(程序实例)来并行处理?继续建墙的比喻,工头(CPU)在开工前会做出规划:“这堵墙总长1000米,每个工人负责建造10米。因此,我需要个工人。这个“需要100个工人”的规划,就是网格。# 在主机端 (Host/CPU) 的代码# N 是总任务量 (墙的总长度)# BLOCK_SIZE 是每个程序实例处理的数据块大小 (每个工人负责的长度)
2025-07-19 21:25:53
1329
原创 SGLang 推理框架深度解析:请求的调度与生命周期
它像一位经验丰富的指挥家,确保了计算密集型和访存密集型任务能够和谐共存、交错执行,从而在复杂的并发场景下,依然能够提供卓越的推理性能。SGLang 作为先进的推理框架,其内部的调度器(Scheduler)通过一套精密设计的机制,系统化地管理着每一个请求从进入到完成的完整生命周期。SGLang 允许根据不同策略对该队列进行排序,例如默认的 “lpm”(Longest Prefix Match,最长前缀匹配)策略会优先处理那些与其他请求有更长公共前缀的请求,以最大化 KV 缓存的复用率。
2025-07-18 21:18:27
883
原创 SGLang 推理框架核心组件解析:请求、内存与缓存的协同工作
在多用户、多请求的服务场景中,不同请求的输入(prompt)往往有重叠的前缀。一旦找到匹配的前缀,该前缀对应的所有 token 的 KV 缓存就可以被直接复用,无需重新计算。)、输入的文本序列(prompt)、生成的配置参数(如温度、最大新 token 数)以及请求当前的状态(如等待中、运行中、已完成)。这四个关键字段,分别代表了从请求到底层缓存管理的不同层面,它们之间的协同关系构成了 SGLang 高效推理的基石。这个对象是请求在系统内流转的基本单位,包含了与该请求相关的所有信息,例如请求的唯一标识符(
2025-07-18 21:07:31
936
原创 深入解析:Chunked Prefill 与 FlashAttention/FlashInfer 如何协同工作
分块预填充”(Chunked Prefill)是一种先进的调度策略,它通过将大型预填充任务分解,并与解码任务混合在同一个计算批次中,从而显著提升GPU利用率和系统整体吞吐量。传统的连续批处理(Continuous Batching)在处理新请求时,会执行一个完整的预填充操作,这个操作的耗时由最长的输入序列决定。在现代大语言模型(LLM)推理服务中,为了同时满足低延迟和高吞吐的需求,系统必须高效处理两种截然不同的计算负载:用于处理输入提示(Prompt)的。这类函数来处理打包好的(packed)变长序列。
2025-07-17 18:01:05
749
原创 SGLang 推理框架中的 ForwardMode 深度解析
在预填充期间,已经在进行解码的旧请求要么暂停,要么只能生成一个词元,这导致了解码请求的有效吞吐量下降,特别是遇到那些特别长的Prefill任务,那将会大大增加其他请求解码速度。当一个新的请求(例如,用户的提问)进入系统时,模型需要一次性处理整个输入序列(prompt),并计算出每个 token 对应的键值缓存(KV Cache)。它会生成第一个 token “北”,然后将“北”的 KV Cache 添加到已有的缓存中,接着生成“京”,循环往复,直到生成完整的答案并遇到终止符。这个过程是计算密集型的。
2025-07-17 17:59:24
1161
原创 大模型投机推理专业基础(2023年+2024年)
大模型投机推理(或称投机解码、投机采样)是一种用于加速大规模语言模型推理过程的技术,它通过利用多个模型的协同作用来优化推理效率。在大模型推理中,由于模型的参数量庞大,推理过程通常需要大量的计算资源和时间,而投机推理的目标是尽可能减少这种计算开销,提高推理速度。其基本原理是使用一个“草稿模型”(通常是一个相对较小且计算高效的模型)来初步生成结果,然后利用“目标模型”(即实际的大规模语言模型)对草稿结果进行验证和修正。这个过程可以分为草稿阶段和验证阶段。
2025-07-13 13:08:46
602
原创 CUDA Graph与torch.compile推理计算图捕获详解
首先,分析数据特征,确定几个典型或常见的张量形状。例如,在自然语言处理中,你可以为不同的序列长度定义几个桶,如。
2025-07-12 20:56:24
739
原创 GPU硬件资源分配举例
这意味着,一个线程块在其整个生命周期中,无论其内部的Warp是正在计算还是在等待访存,它都在持续地占用着宝贵的SM资源。这也解释了为什么单个线程块的资源消耗对整个GPU的吞吐量至关重要。如果一个线程块设计不当,消耗了过多的共享内存或寄存器,导致SM只能容纳一个块,那么该SM的硬件并行能力将无法被充分利用,从而限制了最终的性能。
2025-07-10 01:57:31
393
原创 GPU里面数据的迁移路径
想象一下矩阵乘法,一个数据元素会被多次使用,现在所有的重复访问都发生在这块超高速的共享内存上,完全避免了对慢速全局显存的重复请求。这是数据离开全局显存后的第一站。要理解这个现象,我们必须深入GPU内部,探索数据从海量的全局显存(HBM)流入到微小的计算核心(寄存器)所经过的两条核心路径。它的容量以GB计,带宽极高,但延迟也是最高的。它的效率高度依赖于你的访存模式是否“友好”(例如,线程块内的线程连续访问连续的内存,即。这是一个屏障,它确保了共享内存中的数据块是完整且一致的,之后所有线程才能安全地从中读取。
2025-07-10 01:27:36
282
原创 FlashAttention 深入浅出
标准Attention(注意力)机制是深度学习,尤其是在自然语言处理领域中一项革命性的技术,它允许模型在处理序列数据时,动态地将焦点放在输入序列的不同部分,从而赋予模型更强的表征能力。其核心思想源于人类的视觉注意力,即我们关注信息的特定部分,而非一次性处理所有信息。在模型中,这意味着在生成一个输出时,可以有选择地关注输入序列中与之最相关的部分。标准Attention,特别是。我们可以将这个过程类比于一个信息检索系统。
2025-07-08 20:47:13
606
原创 PagedAttention深入浅出
我们继续借助“学者与办公室”的比喻,深入探讨PagedAttention这一精妙的技术,看它是如何彻底解决先前讨论的KV Cache管理困境的。面对工作台上堆满的、大部分空白的厚重笔记本所造成的巨大浪费,一位聪明的办公室主任(vLLM框架的设计者)从计算机科学的基石——操作系统中的虚拟内存管理中获得了灵感,并提出了。其核心思想是颠覆性的:我们不再给学者分发完整的、笨重的笔记本,而是将整个办公室的“草稿纸”(GPU显存)预先统一裁切成标准大小的、独立的“便签纸”(物理块。
2025-07-08 15:10:00
606
原创 主流的Attention Backend介绍
与传统的PyTorch或TensorFlow实现不同,Triton允许开发者直接编写高度定制化的内核代码,针对注意力计算中的矩阵乘法、softmax操作等关键步骤进行优化,减少不必要的内存拷贝和计算冗余,尤其适合处理Transformer模型中长序列的注意力操作。为了解决这一瓶颈,研究者们提出了“Attention Backend”这一概念,即在计算框架之外,专门设计高效的底层实现和调度策略,以充分利用硬件资源,实现更快、更省内存的注意力运算。
2025-06-28 20:33:25
979
原创 Attention Backend的认识
在人工智能领域,注意力机制(Attention Mechanism)的提出标志着深度学习模型对信息处理方式的革命性转变。这种模拟人类选择性关注能力的技术,通过动态分配计算资源,使模型能够聚焦于输入数据的关键部分。随着Transformer架构的普及,注意力机制逐渐成为自然语言处理、计算机视觉等领域的核心组件。然而,当模型规模突破万亿参数量级时,传统注意力计算方式暴露出内存占用高、计算效率低等瓶颈,催生了以FlashInfer、FlashMLA为代表的专用注意力后端技术。
2025-06-16 19:50:04
919
原创 VSCode CUDA C++进行Linux远程开发
注意,由于CUDA程序依赖于NVIDIA GPU及其驱动程序,确保目标机器上已正确安装相应的硬件和软件环境。此外,需要在远程服务器上配置SSH访问权限。
2025-06-07 16:07:46
509
原创 GPU存储计算体系,推理加速技术与传输瓶颈分析
当前主流大模型均使用KV Cache加速技术,这导致解码阶段的每次矩阵-矩阵乘法运算被简化矩阵-向量乘法,计算复杂度也由o(n^2)降低为o(n)。但是这个改进也带来了另一个问题:矩阵-向量乘法相对矩阵-矩阵乘法,计算访存比更低,传输的数据量只降为原来一半,但是计算的数据量却急剧降为几千分之一,整个运算过程的性能瓶颈卡在数据传输上面。每个层级都有其独特的存储特性以及典型的容量范围。GPU 强大的计算能力在这种情况下无法得到充分发挥,因为它受限于从相对较慢的显存中获取数据的速度。对于矩阵向量乘法这种典型的。
2025-04-10 11:25:46
914
原创 EAGLE-3投机采样论文阅读
EAGLE-1论文链接EAGLE-2论文链接EAGLE-3论文链接EAGLE-github链接Training-Time Test (训练时测试),顾名思义,指的是在模型训练过程中进行测试的技术。它与传统的训练后测试 (Post-Training Test) 相对应,后者是在模型训练完成后,使用独立的测试数据集评估模型的性能。通过在训练过程中引入测试,能够更早地发现问题,从而更好地指导训练过程,提高模型性能和效率。它试图将测试环节融入到模型的学习循环中,而不是仅仅作为最后验证的手段。
2025-04-02 19:02:31
1995
1
原创 模型的在线量化和离线量化
模型的离线量化 (Offline Quantization) 和在线动态量化 (Online Dynamic Quantization) 是两种不同的模型量化方法,它们在量化的时间和方式上存在显著差异。量化的目的是将模型中的浮点数参数 (例如,FP32) 转换为较低精度的整数 (例如,INT8),以减小模型大小、降低计算复杂度并加速推理。选择哪种量化方法取决于具体的应用场景和性能要求。
2025-02-28 19:24:34
1009
原创 奖励模型 Reward Models介绍
通常可以使用与 LLM 相同的模型架构,例如,Transformer。传统的 LLM 训练方法,例如,最大似然估计 (MLE),通常是基于大量文本数据进行训练,目标是最大化模型生成训练数据的概率。Reward Model 的目标是解决这些问题,通过学习人类的偏好和价值观,为 LLM 的训练提供更有效的指导信号。使用收集到的数据和定义的训练目标,训练 Reward Model。可以使用标准的优化算法,例如,Adam。这个奖励分数可以用来指导 LLM 的训练,使其生成更符合人类偏好、更安全、更有帮助的文本。
2025-02-27 17:25:08
938
原创 Tmux新手使用教程
,然后使用方向键、 vi/emacs 键位或鼠标滚轮进行滚动,按 q 或 Esc 退出复制模式。,然后松开,再按快捷键的剩余部分。终端模式是linux服务器登录进去的模式,而会话模式是在终端模式下进入tmux会话后的界面,任务部署完成后再离开回到终端模式。想象一下,你需要在终端中同时做很多事情:编辑代码、运行程序、查看日志等等。你会看到终端底部多了一行绿色的状态栏,这就代表你进入了 tmux 的世界。要回滚查看 tmux 中之前打印的内容,你需要先进入复制模式 (
2025-01-22 15:38:42
1094
原创 NVIDIA PyTorch Docker 镜像安装
是一个 NVIDIA 提供的 PyTorch Docker 镜像,其中包含了 PyTorch 以及与 NVIDIA GPU 相关的库,这个过程可能会需要一些时间,取决于你的网络速度和镜像大小。运行此命令后,你将进入容器的 bash shell。表示将容器的8888端口映射到宿主机的8888端口,这样就能从宿主机访问容器中的服务。参数指定使用所有可用的 GPU,如果你想使用特定的 GPU,可以例如使用。如果需要挂载宿主机的目录到容器中,可以使用。如果想要使用指定的端口,需要增加。表示这个镜像的版本号,
2025-01-15 21:38:47
2696
7
原创 Docker新手使用教程
在你项目的根目录创建一个名为 Dockerfile (注意没有文件后缀) 的文件。在 Dockerfile 中写入构建镜像的指令。在你项目根目录下,使用。
2025-01-15 21:37:37
1031
原创 深度学习与浮点数精度问题探究
符号位(Sign bit):1位,用来表示数的正负。0表示正数,1表示负数。指数部分(Exponent):11位,允许表示一个更宽范围的指数值。指数采用偏置(Bias)表示法,对于双精度浮点数,偏置值为1023。尾数部分(Mantissa 或 Fraction):52位,加上隐含的前导1,实际上可以提供53位的有效数字精度。−1sign×2×1mantissa−1sign×2×1mantissasign是符号位,0或1;exponent是指数部分的实际二进制值;
2025-01-14 14:34:04
971
原创 python命令行参数
模块可以让你轻松地定义程序期望接收的参数,并自动生成帮助信息。位置参数是必须传递的参数,并且其顺序很重要。在 Python 中,你可以使用。可选参数不是必须的,通常使用。模块来处理命令行参数。方法来添加命令行参数。将上述代码保存为例如。
2025-01-13 17:46:44
464
原创 论文阅读:《Whole-animal connectomes of both Caenorhabditis elegans sexes》
这项研究首次完整地绘制了秀丽隐杆线虫(C. elegans)的雄性和雌雄同体的全动物连接组,为我们提供了该模式生物两种性别所有神经元及突触连接的详细图谱。研究人员利用连续切片电子显微镜技术对雄性和雌雄同体线虫进行了高分辨率扫描,并结合人工注释和三维重建技术,精确地追踪了神经元的结构和连接。通过比较不同性别连接组,研究揭示了两者神经回路的相似之处和性别特异性差异,尤其在与交配相关的神经回路中发现了显著的差异。此外,研究还在雄性线虫中发现了先前未知的神经元类型和连接模式。
2025-01-12 23:33:46
1440
1
原创 DeepSpeed多卡高性能训练框架
随着深度学习模型规模的日益增大,训练这些模型所需的计算资源和时间成本也随之增加,传统的单机训练方式已难以应对大规模模型的训练需求。分布式训练作为一种有效的解决方案,通过将模型和数据分布到多个计算节点上,实现了并行计算,从而显著提高了训练速度。DeepSpeed是由微软开源的深度学习训练优化库,专为分布式训练场景设计,旨在提高大规模模型训练的效率和可扩展性。DeepSpeed 的核心理念是通过提供一系列优化技术,让大规模深度学习模型的训练变得更高效、更易用。
2025-01-10 15:32:39
2341
原创 Linux服务器安装Anaconda与环境管理
如果你有特定的 Python 版本需求,可以在安装后创建新的 conda 环境来指定 Python 版本。:如果你只需要一个轻量级的 Python 环境管理工具,考虑安装 Miniconda,它提供了与 Anaconda 相同的包管理功能但体积更小。指定了该环境中使用的 Python 版本。这将显示所有环境的列表以及每个环境的位置。请注意,下载链接中的版本号应替换为最新发布的版本号。将输出的哈希值与提供的哈希值进行比较,以确认文件完整性。的环境中安装 Python 3.9 和指定的软件包。
2025-01-08 17:49:54
1077
原创 大型模型Transformer提示词类型
系统提示词定义了模型的整体行为和输出风格,是模型运行的基础。用户提示词是用户提出的具体问题或请求,直接决定了模型此次交互的主题。助理提示词则是模型依据前两者生成的回答,体现了模型的理解能力和表达能力。通过合理配置这三类提示词,可以有效地指导大型语言模型产生更加准确、有用且符合预期的结果。在实际应用中,系统提示词往往由开发团队精心设计,而用户提示词则来自终端用户的即时输入,助理提示词则是模型基于这些输入自动生成的输出。
2025-01-08 15:13:53
810
原创 Python Json格式数据处理
确保你的 JSON 文件是以 UTF-8 编码保存的,并且没有 BOM(字节顺序标记)。如果你必须处理包含多个独立 JSON 对象的文件,可以逐行读取文件并解析每一行作为单独的 JSON 对象。当你运行上述 Python 程序,并按照提示进行操作时,你可以查看这个 JSON 文件的内容,并对其进行编辑,比如修改。如果你确实需要存储多个 JSON 对象,考虑将它们放入一个数组中,或者每个对象保存为单独的文件。:JSON 文件中可能包含了多于一个顶级对象或数组,或者有额外的字符(如注释、多余的逗号等)。
2025-01-08 11:58:38
1152
原创 基于RSA的Linux服务器SSH登录配置
为了生成 SSH 公钥,Python 可以使用paramiko或者等库。不过,最简单的方法是直接调用系统命令来生成密钥对。下面将给出一个简单的 Python 脚本示例,它会调用系统的ssh-keygen命令来生成 SSH 密钥对,并说明如何在 Linux 上使用这些密钥进行登录。
2025-01-08 11:20:08
526
原创 大型模型transformers加载与使用
可以看到,其实参数规模为1.3B的模型还是挺傻的,要正常进行对话估计参数规模得10B上下,此时常规消费级显卡的显存肯定不够用了。确保你已经从 Hugging Face 下载了必要的文件,并将它们放在本地的。变量设置为你下载模型文件的文件夹路径。基本配置:RTX 4060(8GB),推理过程最高显存占用为3GB。作为参数,从本地文件夹加载模型,并配置 FP16。作为参数,从本地文件夹加载 tokenizer。其他代码部分与之前的示例相同,用于推理和生成文本。文件夹中(或你指定的路径)。
2025-01-07 18:55:12
1818
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人