从FasterTransformer源码解读开始了解大模型(2.1)代码通读02

news2024/11/24 7:24:38

从FasterTransformer源码解读开始了解大模型(2.0)代码解读02-初始化和forward

写在前面的话

本篇的内容主要是介绍ParallelGpt.cc中的代码内容,首先介绍一些初始化和工具函数,然后会从forward主函数开始介绍一部分。

零、初始化initialize和allocateBuffer

打开src/fastertransformer/models/multi_gpu_gpt/ParallelGpt.cc文件,这里是GPT的真正的处理推理请求的功能函数。在这个文件的fastertransformer namespace中,第一个函数是用于做一些初始化的函数initialize,从31到87行,主要是创建了三个对象,gpt_context_decoder是用于做ContextDecoder或者说Encoder部分的,gpt_decoder是用于做Decoder的,而进行采样和结果生成的是DynamicDecodeLayer部分。这三个部分我们会在后续的代码解读中展开说明。

第95行到202行是allocateBuffer函数,在每次处理一个推理请求时,都会使用allocateBuffer进行显存的分配和内存的分配。这里挑出几个比较有特点的buffer进行简单讲解。

在109行,计算了一个变量为self_cache_size,大小是*(num_layer / pipeline_para_.world_size) * batchxbeam * memory_len * hidden_units_ / tensor_para.world_size_,这个实际上就是计算KV Cache的大小。而134和135行就用该数值的大小进行了KV Cache的分配。

const size_t self_cache_size =
        (num_layer_ / pipeline_para_.world_size_) * batchxbeam * memory_len * hidden_units_ / tensor_para_.world_size_;

llm小知识-KV Cache:我们知道,在Attention注意力得分的计算过程中,对于当前的token i,需要先计算出查询结果Qi,Ki和Vi,然后使用Qi与token i 之前的所有token的K结果和V结果来进行注意力得分计算,就是拿Qi与所有的K(0-i)点积求和,再与V(0-i)进行加权求和,最终求得Attention注意力得分。那么在这个过程中,可以通过将之前所有计算过的Ki和Vi进行存储的方式,来减少计算量(用显存空间换时间),那么这部分用于存储KV的就是KVCache。目前有一些量化算法也会关注于KV的量化以减少存储空间

在163行的context_decoder_input_buf_,这块buff被分配的大小为sizeof(T) * batchxbeam * max_input_len * hidden_units,这块buff大小为每一个输入token的大小乘以隐藏状态的大小,同样大小的buff还有context_decoder_output_buf,context_decoder_normed_input_buf等,这个大小是在ContextDecoder进行计算流程时真正的隐藏状态的大小(可以参考前几章中的decoder-only模型结构)所以会多次出现。

context_decoder_input_buf_  = (T*)(allocator_->reMalloc(
        context_decoder_input_buf_, sizeof(T) * batchxbeam * max_input_len * hidden_units_, false));

类似的还有120行的decoder_input_buf变量,大小为sizeof(T) * batchxbeam * hidden_units,相比较之下少了一个max_input_len大小维度,由于Decoder每一步只生成一个token所以相当于长度始终为1,少了一个输入长度的维度。与decoder_input_buf大小相同的还有decoder_normed_input_buf,decoder_output_buf等等。

decoder_input_buf_ = (T*)(allocator_->reMalloc(decoder_input_buf_, sizeof(T) * batchxbeam * hidden_units_, false));
    decoder_normed_input_buf_ =
        (T*)(allocator_->reMalloc(decoder_normed_input_buf_, sizeof(T) * batchxbeam * hidden_units_, false));
    decoder_output_buf_ =
        (T*)(allocator_->reMalloc(decoder_output_buf_, sizeof(T) * batchxbeam * hidden_units_, false));

在204到271行,是与allocateBuffer对应的freeBuffer函数,对指针中分配了的空间进行释放,这一段没有特别值得讲解的地方。

一、forward函数-起始检查

ParallelGpt.cc文件中拥有两个forward函数,我们主要看574行开始的forward函数。

进入forward函数后,首先通过FT_CHECK的多个宏定义检查了输入tensor的数量以及对几个比较重要的输入tensor进行了输入形状检查。

		FT_CHECK_WITH_INFO(input_tensors->size() >= 3, "input_tensors->size() >= 3");
    FT_CHECK_WITH_INFO(output_tensors->size() >= 2, "output_tensors->size() >= 2");
    FT_CHECK(input_tensors->at("input_ids").shape.size() == 2);
    FT_CHECK(input_tensors->at("input_lengths").shape.size() == 1);
    FT_CHECK(input_tensors->find("output_seq_len") != input_tensors->end()
             && input_tensors->at("output_seq_len").shape.size() == 1);
    FT_CHECK(output_tensors->at("output_ids").shape.size() == 3);
    FT_CHECK(output_tensors->at("sequence_length").shape.size() == 2);
    FT_CHECK_WITH_INFO(input_tensors->at("input_ids").shape[0] == output_tensors->at("output_ids").shape[0],
                       "input_tensors->at(\"input_ids\").shape[0] == output_tensors->at(\"output_ids\").shape[0]");

    // Used when inputs do not contain random_seed
    const size_t batch_size = output_tensors->at("output_ids").shape[0];
    const size_t beam_width = output_tensors->at("output_ids").shape[1];
    FT_CHECK_WITH_INFO(output_tensors->count("cum_log_probs") == 0
                           || output_tensors->at("cum_log_probs").size() == batch_size * beam_width,
                       "The shape of cum_log_probs should match with batch_size x beam_width if provided.");

对于输入input_tensors来说,必须要有input_ids,input_lengths,output_seq_len这三个必备的输入,而对于output_tensors来说,则必须要有output_ids和sequence_length这两个必备的输出。这几个tensor的含义和形状如下所示(B指的是batch size,S指的是Sequence length, bz指的是beam width)

tensor名称形状含义
input_idsB x S需要推理的所有token ids,总共batch size个句子
input_lengthsB长度为batch size的数组,每个位置标记着对应位置的token ids长度为多少
output_seq_lenB长度为batch size的数组,每个位置标记着对应位置句子的输入最长到多少
output_idsB x bw x S推理完成的所有token ids,总共batch size个句子
sequence_lengthB x bw推理完成后所有句子的长度,每个位置标记着对应位置的句子长度

llm小知识-batch size:大部分的推理引擎都会将多个请求(可能每个请求只包含一个句子)打包为一个batch来进行推理,在推理过程中同一batch的句子之间是完全可以做到互不干扰的,打batch的一个非常明显的优点是可以充分发挥硬件的算力,同时处理多个请求。另外需要注意的一点是,在batch中,可能会出现长短不一的情况,这个时候是需要在短的句子后面做padding的,这一步往往是会在客户端或者server侧前端就完成好,在推理侧拿到的数据往往是已经做好padding的

如图是一个batch_size为4的推理请求,其中除了最长的句子以外其他的句子都做了padding
在这里插入图片描述

完成了输入形状的检查之后,根据不同的输出要求,还需要对cum_log_probs的tensor进行检查。这一步是对完成推理后是否要返回生成的logits进行开关设置检查。

在645行可以看见,max_input_length的设置是取出input_ids的第二个维度长度,这也是建立在短的输入是做了padding的基础认知之上的。

在647行可以看见,这里对continue gen进行了一个取出,这个参数是用于控制是否进行多轮持续生成的,但实际使用情况中并不会经常使用到continues gen,会对整体的推理服务使用产生较多的限制。

下一回预告

下一回继续讲解forward函数中的多个步骤,在代码解读中会跳过一些不常用的和并不是很重要的参数,按照顺序对比较重要的部分进行分析

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1829585.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【ROS里程计】中部分代码解释

bool OdomNodePub::Odom_Reset(ubt_odom::odomreset::Request& req, ubt_odom::odomreset::Response& res) {if(req.cmd "reset"){OdomResetFlag true;}else{OdomResetFlag false;}res.state "success";return true; } 该函数是一个ROS节点中…

元数据、数据元、数据字典、数据模型及元模型的区别详解

在数据管理和分析领域,有许多相似的概念,如元数据、数据元、数据字典、数据模型和元模型。这些概念的定义和应用往往容易混淆。 数据元 数据元是通过一系列属性描述的数据单元,包括定义、标识、表示以及允许值等。这些属性帮助我们理解和使用…

aop注解快速实现数据脱敏返回

说明: 公司之前数据接口数据管理不严格,很多接口的敏感数据都没有脱敏处理,直接返回给前端了,然后被甲方的第三方安全漏洞扫出来,老板要求紧急处理,常用的话在单个字段上加上脱敏注解会更加的灵活&#xf…

Parallels Desktop 19 for mac破解版安装激活使用指南

Parallels Desktop 19 for Mac 乃是一款适配于 Mac 的虚拟化软件。它能让您在 Mac 计算机上同时运行多个操作系统。您可借此创建虚拟机,并于其中装设不同的操作系统,如 Windows、Linux 或 macOS。使用 Parallels Desktop 19 mac 版时,您可在 …

EarMaster7.5.74官方版安装激活使用教程

EarMaster就是你音乐路上的良师益友。这是一款来自丹麦皇家音乐学院的多媒体音乐教育软件,针对视唱练耳为音乐学生,音乐爱好者以及音乐专业人员都带来了很多的帮助,让你们可以获得音乐家般的耳朵,通过专业视唱练耳培训考试&#x…

52. QT插件开发--插件程序(带ui文件)的创建与编译

1. 说明 一般情况下,针对代码量比较小的QT程序不需要进行插件集成化开发,但是针对大型程序来说,代码结构比较复杂,使用插件开发的方式可以提高代码开发和维护效率,团队之间的分工合作也会更加的明确。所谓插件式开发,实际上就是把程序的一部分功能封装起来,编译成一个单…

Modbus为何要转成ProfiNET

Modbus与ProfiNET代表了工业通讯不同阶段的发展,各自具有优缺点。Modbus简单易用,适合小型系统;ProfiNET高效稳定,适用于大型复杂网络。转换Modbus为ProfiNET可提高系统性能和扩展性。实际场景下,升级生产线控制器为Pr…

Cisco Packet Tracer实验(四)

生成树协议(Spanning Tree Protocol) 交换机在目的地址未知或接收到广播帧时是要进行广播的。如果交换机之间存在回路/环路,那么就会产生广播循环风暴,从而严重影响网络性能。 而交换机中运行的STP协议能避免交换机之间发生广播…

Python(三)---字符串

文章目录 前言1.创建字符串2.字符串的编码3.空字符串和len()函数4.转义字符5.从控制台读取字符串6.字符串的相关操作6.1.通过[]访问元素6.2.字符串切片slice操作6.3.字符串拼接和字符串复制6.4.split()分割和join()合并6.5.常用查找方法6.6.replace() 实现字符串替换6.7.去除首…

基于CPS-SPWM链式STATCOM系统在电压不平衡环境下控制策略的simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 基于CPS-SPWM链式STATCOM系统在电压不平衡环境下控制策略的simulink建模与仿真。利用电压外环PI调节器得到有功 电流指令值结合由负载侧电流检测 到 的无功 电流指令值 &#…

GPU的工作原理

location: Beijing 1. why is GPU CPU的存储单元和计算单元的互通过慢直接促进了GPU的发展 先介绍一个概念:FLOPS(Floating Point Operations Per Second,浮点运算每秒)是一个衡量其执行浮点运算的能力,可以作为计算…

Gstreamer学习3----灌数据给管线之appsrc

参考资料 Basic tutorial 8: Short-cutting the pipeline gstreamer向appsrc发送帧画面的代码_gst appsrc可变帧率-CSDN博客 在官网教程Basic tutorial 8: Short-cutting the pipeline 里面,讲了一个例子,push音频数据给管线,视频的例子更…

归纳贪心好题

很有趣的一道归纳贪心题目 class Solution { public:int minimumAddedCoins(vector<int>& coins, int target) {sort(coins.begin(),coins.end());int n coins.size();int s 0,i0;int res 0;while(s<target){if(i<n&&coins[i]<s1)scoins[i];els…

Photoshop中图像美化工具的应用

Photoshop中图像美化工具的应用 Photoshop中的裁剪工具Photoshop中的修饰工具模糊工具锐化工具涂抹工具 Photoshop中的颜色调整工具减淡工具加深工具海绵工具 Photoshop中的修复工具仿制图章工具污点修复画笔工具修复画笔工具修补工具内容感知移动工具红眼工具 Photoshop中的裁…

Ubuntu 的 apt 相关问题

错误:1 http://mirrors.tuna.tsinghua.edu.cn/ubuntu focal InRelease Couldnt create temporary file /tmp/apt.conf.KSeTlI for passing config to apt-key 原因 无法创建配置文件 /tmp/apt.conf.KSeTlI 并传递给 apt-key apt-key 等实际上并不是直接使…

效果超越ControlNet+IP-Adapter和FreeControl!Ctrl-X:可控文生图新框架(加州大学英伟达)

文章链接&#xff1a;https://arxiv.org/pdf/2406.07540 项目链接&#xff1a;https://genforce.github.io/ctrl-x/ 最近的可控生成方法&#xff0c;如FreeControl和Diffusion Self-guidance&#xff0c;为文本到图像&#xff08;T2I&#xff09;扩散模型带来了细粒度的空间…

SinNerf理解和效果

文章目录 SinNerf 解决的问题方法和结构自己训练的效果 SinNerf 解决的问题 该方法主要解决的问题是&#xff1a; 现有都使用多张照片来进行nerf 表示的学习&#xff0c;这篇文章的话&#xff0c;主要是想使用一张单视角的照片来Nerf表示的学习。通过从单张照片中得到的伪标签…

Parallels Desktop 19 激活码 - 苹果 Mac 最新版 PD 19激活密钥虚拟机下载 (支持Win11/macOS Sonoma)

Parallels Desktop 被称为 macOS 上强大的虚拟机软件。可以在 Mac 下同时模拟运行 Win、Linux、Android 等多种操作系统及软件而不必重启电脑&#xff0c;并能在不同系统间随意切换。 最新版 Parallels Desktop 19 (PD19) 完全支持 macOS Sonoma、Ventura 和 Windows 11 / Win…

AOSP平台开发的利器——Android Studio for Platform

Android Studio for Platform (ASfP) 是一个为使用 Soong 构建系统构建的 Android 开源项目&#xff08;AOSP&#xff09;平台开发者而设计的 Android Studio IDE 版本。与标准 Android Studio 不同&#xff0c;ASfP 具有多语言支持&#xff0c;可以在同一 IDE 中编写 C、Kotli…