首页 > 编程语言 >Inferllm源码解析

Inferllm源码解析

时间:2023-08-06 10:44:52浏览次数:32  
标签:scale Inferllm -- float 源码 llm gpu 解析 inferllm

Inferllm源码解析

文件结构

  1. application: 放置几个不同模型的参数配置和后处理
  2. include: 包含抽象model类的头文件
  3. src/core: 核心组件,包括tensor、算法等基础算子的抽象和KV文件系统的实现
  4. src/graph: 包含了几种LLM模型的具体实现
  5. src/kern: 包含了不同硬件下的算子实现
  6. src: 剩余一些其他公共函数实现

继承与组合关系

chat/alpaca/chatglm是外置的application程序,通过该入口设置模型随机种子、线程数、token等inferllm::ModelConfig模型参数
利用这些模型参数构建inferllm::Model的shared_ptr,经过load、init、decode_iter等操作进行编解码,设置fix_word函数对结果后处理

关键inferllm::Model类中包含了实际执行类inferllm::ModelImp,而inferllm::ModelImp则包含了inferllms::device的unique_ptr和inferllms::Graph的shared_ptr以及Vocab的shared_ptr,在实际计算时,则通过inferllm::ModelImp中的graph进行execute,得到token,将token进行解码并返回。

alpaca
chat/baichuan/llama
chatglm
-- inferllm::mdoel
-- inferllm::ModelImp
-- inferllms::Tensor
-- inferllms::device(CPUDevice, GPUdevice)
-- inferllm::ThreadPool
-- inferllm::Kernel
-- inferllm::KernelID
-- inferllm::LlmParams
-- inferllm::Graph(llamaGraph, chatglmGraph, baichuanGraph)
-- inferllm::OprModuleBase()
-- inferllm::OpBase(LayerNorm, Embedding, SoftMax, Elemwise, MatMul, MatMulLast, LlamaAttention, GlmAttention, DiagMask)
-- inferllm::Kernel
-- inferllm::UserConfig
-- inferllm::WorkSpace
-- inferllm::Tensor
-- inferllm:: Vocab
-- inferllm::ModelConfig
-- compt_type
-- nr_thread
-- nr_ctx
-- device_id

核心类属性分析

model_imp类

所有model的抽象接口,也是所有model的基类,当其他模型运行时,使用该基类的shared_ptr对象,借助多态的方法实现模型的参数加载load函数,模型填充prefill函数以及token的encode和decode操作,

load: 加载模型文件,将权重加载到graph中,并将最终输出logist重置为对应的vocab_len
prefill: 类似于warmup函数,将token填入到模型中
decode: 第一次运行的token,放于网络中运行并解码
decode_iter:非第一次的模型运行tokens,取top_k个返回
sample_and_update:加入惩罚因子对输出进行惩罚,并选出top_p个作为下一个token
tokenize: 将文本编码为对应的input_ids
decode_summary: 将编解码效率和速度总结输出

OprModuleBase类

是所有opr操作的基础类,有添加opr函数,get_all_weights函数,获取inputs函数,获取output函数,name名字,device设备等函数。

execute:有pre_execute、execute、end_execute对op的输入输出进行前处理和后处理
get_workspace_in_byte:得到当前Module中的所有op中最大占用空间

LlamaFFNModule类

包含了2次matmul乘积silu激活函数并进行残差操作,然后与w3进行matmul得到最终输出结果。

GlmFFNModule类

包含了一次matmul乘积gelu激活函数,然后与w2相乘得到最后输出。

HeadModule类

包含了一次layer_norm,对输入进行norm和matmul得到最终输出。

EmbdModule

Embedding模块,通过input_ids找到对应的embedding编码。

OpBase类

所有Op基础类,包含了执行预处理操作,执行操作,后执行操作、set_name、set_outputs、set_weights等操作。

LayerNorm类、Embedding类、SoftMax类、Elemwise类、MatMul类、MatMulLast类、LlamaAttention类、GlmAttention类、DiagMask类

调用两种不同的kernel,RmsNormFloat和NormFloat,对输入数据进行归一化处理。
调用EmbeddingGetFloatFloat kernel进行使用不同的device计算。
调用softmax类在不同的device上进行操作

Kernel实现

llm_elemwise_broadcast_dim0_src1_compute_float_add_gpu、llm_elemwise_compute_float_scale_gpu

实现elemwise的乘法和加法,每个线程计算一次乘法或者加法,并且当第二个数的维度小于第一个的维度时,采用dim0上广播expand。
例如:
[[1, 2, 3,], [4, 5, 6]] * [[7, 8, 9]]
这时,如果乘完计算123之后,会循环计算,第二个矩阵就在dim0上进行广播扩充。

llm_elemwise_broadcast_dim0_src1_compute_float

计算当前机器的blocks,设置不同的blocks,找到对应不同的乘加算法。

ApplyFunction

函数模板,根据不同的函数function去实现不同的计算逻辑

LaunchKernel

带安全检查和block参数配置的应用函数

llm_softmax_compute_float_gpu

先找到最大值,val = exp(v-max_v), sum += val_all, softmax(val_i / sum)
并行策略:每次计算一行上的softmax,多线程并行计算多行,线程数为行数

llm_norm_compute_float_gpu

得到每一行中的方差scale,v[i] *= scale
并行策略:每次计算一个seq_len上的norm,并行线程数为seq_len

llm_embedding_get_float_float

将embedding的头指针拷贝到cuda中,并将每一行对应的数据拷贝到cuda中

dequantize_row_q4_0_reference_gpu

__restrict用法
反量化操作,加了unroll操作,每32个数计算一次,其中反量化算子下高4位为第一个数,低4位为第二个数,并在计算时加入了scale因子。
并行策略:在embedding量化中并行线程数为seq_len

SiluFunctor、GeluFunctor、AddFunctor、MulFunctor

cpu计算函数,一些常见的函数

llm_rms_norm_compute_float_gpu

得到每一行中的方差scale,v[i] *= scale
并行策略:每次计算一个seq_len上的norm,并行线程数为seq_len

llm_rope_compute_float_gpu

计算rotate_position_embedding,每次计算rotate_scale, 将position分为两半,前后两部分分别计算x0 * cos_scale - x1 * sin_scale
并行策略:每次计算每个seq_len下每个head每个rotate下的旋转位置编码,并行线程数seqlen * head * (n_rot / 2)次

llm_matmul_compute_float_float_gpu

矩阵乘积运算,每次只进行一行一列的计算
并行策略:并行线程数M×N

llm_matmul_compute_int4_float_step1_gpu

分两步进行计算,第一步计算两个张量的scale尺度,保存在d中,第二步将对应位置上的x,y取出来,int4乘加后并保存在float中,其中val = x_int4_sum * y_int4_sum * d1 * d2

llm_scale_diag_mask_inf_float_gpu、llm_diag_mask_inf_float_gpu

将矩阵对角线以上的mask设置为无限大,否则乘以scale
并行策略:并行线程数为head * seqlen * (n_past + seqlen)

llm_matmul_compute_with_head_stride_float、llm_head_batched_matmul_compute_float_gpu

用于计算多头、多batch矩阵乘积,并行数量上比普通矩阵乘法多了一个head num

标签:scale,Inferllm,--,float,源码,llm,gpu,解析,inferllm
From: https://www.cnblogs.com/wildkid1024/p/17609154.html

相关文章

  • Spring源码之XML文件中Bean标签的解析1
    读取XML文件,创建对象xml文件里包含Bean的信息,为了避免多次IO,需要一次性读取xml文件中所有bean信息,加入到Spring工厂。读取配置文件newClassPathResource("applicationContext.xml")ClassPathResource是Spring封装的一个类型;Resource接口:可以读取相关资源文件的内容获得......
  • rtems解析(1)
    目录概述概述多处理器系统实时执行器(RTEMS)是一个多线程、单地址空间、实时操作系统,没有内核空间/用户空间分隔。它能够在SMP配置中操作,提供最先进的功能集。RTEMS生态系统是RTEMS项目提供的工具、包、代码、文档和在线内容的集合。生态系统提供了一种开发、维护和使用RTEMS......
  • 智慧工地管理平台源码,视频监控、劳务实名制、环境监测、安全质量管理、GIS地理信息、
    智慧工地可视化系统利用物联网、人工智能、云计算、大数据、移动互联网等新一代信息技术,通过工地中台、三维建模服务、视频AI分析服务等技术支撑,实现智慧工地高精度动态仿真,趋势分析、预测、模拟,建设智能化、标准化的智慧工地综合业务系统,解决传统工地管理存在的弊端,更好的提高工地......
  • 4 Diac中E_CYCLE模块源码分析
    E_CYCLE的源码分析一E_CYCLE的功能输入事件接口:START、STOP,输出事件接口EO数据输入接口:DTSTART是开启定时事件,STOP结束定时事件,EO是时间到了触发的事件,DT是配置时间间隔参数,数据类型为字符串类型。举例:DT输入T#10MS,则10MS触发一次EO事件   二源码分析该源码主要......
  • 正向解析
    一.各种资源记录区域解析库:由众多资源记录RR(ResourceRecord)组成name[TTL]INrr_typevalue 记录类型:A,AAAA,PTR,SOA,NS,CNAME,MX SOA:StartOfAuthority,起始授权记录;一个区域解析库有且仅能有一个SOA记录,必须位于解析库的第一条记录SOA,是起始授权机构记录,说......
  • 安装 配置 正向 解析 DNS方法
    安装配置正向解析DNS方法1,安装dhcp[root@localhost~]#yuminstallbind*-y2,关闭防火墙和selinux[root@localhost~]#systemctlstopfirewalld.service关闭防火墙[root@localhost~]#setenforce0关闭selinux3,查看bind文件列表[root@localhost~]#rpm-qlbind......
  • CleanMyMac真的有必要买吗 2023年最新CleanMyMac和腾讯柠檬详细解析
    在如今的电脑使用过程中,保持电脑干净整洁是一项重要的任务。而随着Mac电脑越来越受欢迎,Mac电脑清理软件也愈发流行。在众多的Mac电脑清理软件中,CleanMyMac是一款备受好评的软件。但是,很多人还在犹豫CleanMyMac有必要买吗?同时,也有人想知道CleanMyMac和腾讯柠檬哪个好。接下来,我们将......
  • macbook怎么卸载软件?2023年最新全新解析macbook电脑怎样删除软件
    macbook怎么卸载软件?2023年最新全新解析macbook电脑怎样删除软件。关于Mac笔记本如何卸载软件_Mac笔记本卸载软件的四种方法的知识大家了解吗?以下就是小编整理的关于Mac笔记本如何卸载软件_Mac笔记本卸载软件的四种方法的介绍,希望可以给到大家一些参考,一起来了解下吧!Mac笔记本与Win......
  • 动力节点|MyBatis从入门实战到深入源码
    MyBatis是一种简单易用、灵活性高且高性能的持久化框架,也是Java开发中不可或缺的一部分。动力节点老杜的MyBatis教程,上线后广受好评从零基础小白学习的角度出发,层层递进从简单到深入,从实战到源码一步一案例,一码一实操,嘴对嘴指导MyBatis重点、难点、考点一网打尽不管你是小白还是正......
  • 在线直播系统源码,移动端列表左右滑动效果
    在线直播系统源码,移动端列表左右滑动效果<view class="evaluationItem">                <scroll-view class="uni-swiper-tab" scroll-x :style="'height:'+scrollH+'px'">                    <view class="scrollx_i......