TensorRT-LLM七日谈 Day5 在day2, 我们尝试了对于llama8B进行转换和推理,可惜最后因为OOM而失败,在day4,我们详细的过了一遍tinyllama的推理,值得注意的是,这两个模型的推理走的是不同的流程。llama8b需要显式的进行模型的转换,引擎的生成,而tinyllama则进行了隐式的执行。如果参考[1],也有明确的说明。目前模型的推理确实支持多种形式。
TensorRT-LLM七日谈 Day4 其中, 在model_loader()的调用中,实现了模型的加载和engine的构造。而在step_forward函数中,则实现了每次的step。在Day2 中,我们梳理了trt-llm对于TinyLLama的调用,在Day3,我们也熟悉了一下Trt-llm常规的三步流程。这里其实有个问题,在针对tiny-llama的部署中,其实没有显式的进行模型转换,那麽其推理接口中到底包含了什么?今天算是仔细过了一遍模型的生成,可以看到,其中包含了。其中,主要的时间都用于模型的构造了。最后完成了模型的推理。
TensorRT-LLM七日谈 Day3 今天主要是结合理论进一步熟悉TensorRT-LLM的内容从下面的分享可以看出,TensorRT-LLM是在TensorRT的基础上进行了进一步封装,提供拼batch,量化等推理加速实现方式。下面的图片更好的展示了TensorRT-LLM的流程,包含权重转换,构建Engine,以及推理,评估等内容。总结一下就是三步。不想看图的话,可以看看AI的总结,我放在附录中。下图也很好的展示的trt-llm推理的全流程。
TensorRT-LLM七日谈 Day2 其实,目前为止,我们对于tensorrt-llm 这个库就已经有基本的认知了,它通过python作为接口,但是底层还是依赖tensorrt,cuda闭源的高性能实现,如果查看tensorrt-llm 的源码,还可以看到pybind的文件夹,里面包含了python和cpp的一些接口的转换和交互。进一步观察package的内容,可以看到,它由多个python文件组成,此外,在libs中也包含多个.so文件。昨天卡在了环境配置上,经过一天的等待,pip基本完成后,我们基于链接1,继续配置环境。
ARM assembly 13: Fibonacci 在assembly 12中,我们实现了GCD,它通过recursice的方式来实现计算。今天我们来讲Fibonacci,它的Recursive相比于GCD会更加复杂,所以值得进一步讲解。首先,我们还是看看Fibonacci的传统实现,那就是首先,我们展示一下code base。
ARM assembly 12: GCD(最大公约数)计算 基于gcd.s,我们可以看到,gcd函数的两个参数可以分别被传入到r0,r1寄存器中,然后,我们可以基于此实现base case,也就是上述代码中 b == 0的情况。在完成了recursive中参数的计算后,我们需要把它们分别传入r0,r1(现在它们在r1和r4).接下来,利用bl操作执行迭代操作。我们尝试在汇编中实现上述逻辑,没有什么难点,需要注意SDIV用于实现 signed integer division。基于下面的gcd.s文件,我们尝试实现gcd函数。在nums.txt中,我们可以看到。
ARM assembly: lesson 11 在之前,我们提到,当函数的参数小于等于4个时,我们会把它存放于寄存器中,但是如果函数参数大于4个,我们就需要通过stack去进行参数的存储,这毫无疑问,将增加代码操作的复杂性,因为我们需要对于栈利用stack pointer进行控制。
ARM Assembly: Lesson 9 (for loops) 2. 构建一个判断条件,和两个分支,一个分支用于实现循环,一个分支用于处理终止情况,他们将指向两个label。为了将上述代码从C转换为汇编代码,我们需要。相关指令:branch, cmp。1. 利用一个寄存器存储i。
ARM Assembly: 第8课 branching 单个的B表示进入一个无条件的分支,而含条件的分支通常可以基于APSR 条件flag进行指令的执行。比如,基于condition flag z是否为1, 我们可以进行BEQ结果的判断。下面是各种条件分支的触发机制和与condition flag的关系。
ARM assembly 7 CMP指令通过计算 Rn - Operand2 来更新条件标志,但不存储结果。(即Rn大于等于Operand2),则设置为1。(换言之,有错位,反而设定为0)。CMP 通过隐式的减法操作来更新条件标志,但不存放结果。: 如果有符号溢出发生,则设置为1。: 如果结果为负,则设置为1。: 如果结果为零,则设置为1。
ARM Assembly 6: Shift 和 Rotate 将寄存器中的位向左移动,右边用零填充。左移相当于对二进制数进行乘以2的幂的操作。Rd: 结果存储的目标寄存器。Rn: 要进行位移的源寄存器。#shamt: 位移的位数(立即数)。S: 可选,若存在则更新条件标志。
ARM 汇编5 数据类型 在ARMv7-M处理器中,Byte对应8bits,Halfword对应16bits, Word对应32bits。而之所以two's complement 能够进行数字的表达,就是巧妙的利用了overflow的原理,如下图。关于负数,我们通常会基于two's complement的模式进行数字的表达。如下图,一个寄存器中包含8 nibbles,也就是32bits。而在展示中,我们通常会使用一位来表示4bits,也就是。2. 负数对应的表达是首先反转,1. 正数对应的表达是。所以,-18的表达就是。
ARM汇编3: 在下列代码中,变量var1,var2存储于内存中,我们不能通过mov去获取或者改变内存中的数值,下面介绍具体的方法。首先介绍如下语法知识。.data 的指令用于表示数据部分的开始,其中存储了已经初始化的数据。_start 表示代码entry point的位置。_start:.dataLDR可用于将内存中的数据(word)加载到寄存器。如上图指令,内存中的数据的拷贝,不能通过mov进行,需要通过LDR!具体介绍参考链接1。
ARM汇编语言: lesson 2(ADD, SUB, MUL, set CPSR) 在arm中,add, sub, mov都支持 sub 支持 register或者immediate的操作。而mul 只支持 寄存器的操作。
ARM汇编学习第一讲 MOV, Exit Syscall 准备硬件需求:一台可执行ARM 汇编的算力设备,可以是Raspberry Pi, 也可以是其他云端的虚拟机,也可以利用QEMU去仿真。资料查阅ARM架构的各种syscall信息。
数据结构与算法2 哈希表 关于哈希表,在python中,dict()和set()就是基于哈希表来实现对于字典的存储和管理,在CPP中,std ::unordered_map和 std::unordered_set 就是基于哈希表的实现, 而std::set 则是基于红黑树的实现。使用哈希表来存储和查找元素,能够在平均情况下实现 O(1) 的查找、插入和删除操作。