1.Netty源码解析 -- FastThreadLocal与HashedWheelTimer
2.[fastllm]cuda-kernels源码解析
3.å¦ä½è´ä¹°FastBuilder
4.[fastllm]fastllm源码结构解析
5.OPENFAST变速控制器介绍
6.FastDDS移植 - Boost 编译安装
Netty源码解析 -- FastThreadLocal与HashedWheelTimer
Netty源码分析系列文章接近尾声,源码本文深入解析FastThreadLocal与HashedWheelTimer。源码基于Netty 4.1.版本。源码 FastThreadLocal简介: FastThreadLocal与FastThreadLocalThread协同工作。源码FastThreadLocalThread继承自Thread类,源码内部封装一个InternalThreadLocalMap,源码spring源码阅读工具该map只能用于当前线程,源码存放了所有FastThreadLocal对应的源码值。每个FastThreadLocal拥有一个index,源码用于定位InternalThreadLocalMap中的源码值。获取值时,源码首先检查当前线程是源码否为FastThreadLocalThread,如果不是源码,则从UnpaddedInternalThreadLocalMap.slowThreadLocalMap获取InternalThreadLocalMap,源码这实际上回退到使用ThreadLocal。源码 FastThreadLocal获取值步骤: #1 获取当前线程的InternalThreadLocalMap,如果是FastThreadLocalThread则直接获取,否则通过UnpaddedInternalThreadLocalMap.slowThreadLocalMap获取。#2 通过每个FastThreadLocal的index,获取InternalThreadLocalMap中的值。
#3 若找不到值,则调用initialize方法构建新对象。
FastThreadLocal特点: FastThreadLocal无需使用hash算法,通过下标直接获取值,复杂度为log(1),性能非常高效。 HashedWheelTimer介绍: HashedWheelTimer是Netty提供的时间轮调度器,用于高效管理各种延时任务。时间轮是ajax 优点 源码一种批量化任务调度模型,能够充分利用线程资源。简单说,就是将任务按照时间间隔存放在环形队列中,执行线程定时执行队列中的任务。 例如,环形队列有个格子,执行线程每秒移动一个格子,则每轮可存放1分钟内的任务。任务执行逻辑如下:给定两个任务task1(秒后执行)、task2(2分秒后执行),当前执行线程位于第6格子。那么,task1将放到+6=格,轮数为0;task2放到+6=格,轮数为2。执行线程将执行当前格子轮数为0的任务,并将其他任务轮数减1。 HashedWheelTimer的缺点: 时间轮调度器的时间精度受限于执行线程的移动速度。例如,每秒移动一个格子,则调度精度小于一秒的任务无法准时调用。 HashedWheelTimer关键字段: 添加延迟任务时,使用HashedWheelTimer#newTimeout方法,如果HashedWheelTimer未启动,则启动HashedWheelTimer。启动后,构建HashedWheelTimeout并添加到timeouts集合。 HashedWheelTimer运行流程: 启动后阻塞HashedWheelTimer线程,在线绘画 源码直到Worker线程启动完成。计算下一格子开始执行的时间,然后睡眠到下次格子开始执行时间。获取tick对应的格子索引,处理已到期任务,移动到下一个格子。当HashedWheelTimer停止时,取消任务并停止时间轮。 HashedWheelTimer性能比较: HashedWheelTimer新增任务复杂度为O(1),优于使用堆维护任务的ScheduledExecutorService,适合处理大量任务。然而,当任务较少或无任务时,HashedWheelTimer的执行线程需要不断移动,造成性能消耗。另外,使用同一个线程调用和执行任务,某些任务执行时间过久会影响后续任务执行。为避免这种情况,可在任务中使用额外线程执行逻辑。如果任务过多,可能导致任务长期滞留在timeouts中而不能及时执行。 本文深入剖析FastThreadLocal与HashedWheelTimer的实现细节,旨在提供全面的技术洞察与实战经验。希望对您理解Netty源码与时间轮调度器有帮助。关注微信公众号,获取更多Netty源码解析与技术分享。[fastllm]cuda-kernels源码解析
在fastllm中,mpq创建源码CUDA-kernels的使用是关键优化点之一,主要涉及以下几个高频率使用的kernel:gemv_int4、gemv_int8、gemm_int8、RMSNorm、softmax、RotatePosition2D、swiglu等。其中,gemm是计算密集型的,而其余大部分都是内存受限型。利用量化bit进行计算,比原始的torch转为浮点数更快,同时,没有进行融合操作,为后续优化留下了空间。
gemv_int4 kernel:主要用于实现float*int4的GEMV乘积,其中偏置值设定为最小值。在计算中,矩阵被划分为不同的tile,不同tile之间并行操作。在遍历m/2的过程中,找到对应int4值的位置,通过保存的mins找到最小值minv。同一组的两个int4值共享同一个minv,计算结果的最终和被保存在sdata[0]上,用于更新对应m列位置的output值。结果向量为n*1。风水软件 源码
gemv_int8 kernel:在功能上与gemv_int4类似,但偏置值由保存的minv变为了zeros。
gemm_int8 kernel:此kernel负责计算n*m矩阵与m*k矩阵的乘积。计算过程涉及多个tile并行,block内部保存的是部分和。考虑到线程数量限制,通常会有优化空间。最终结果通过为单位进行更新。
layerNorm实现:此kernel实现layernorm计算,通过计算均值和方差来调整数据分布。计算中,sdata存储所有和,sdata2存储平方和。每个block内计算部分和后,规约得到全局的均值和方差,从而更新output。
RMS kernels解析:RMSNorm kernel实现RMS归一化,通过计算输入的平方和和均值,进而更新output。
softmax kernels解析:计算输入的softmax值,涉及最大值查找、指数计算和规约求和等步骤,以防止浮点数下溢。
RotatePosition2D Kernels解析:用于旋转位置编码,线程展开成三层循环。LlamaRotatePosition2D、NearlyRotatePosition和RotatePosition2D在旋转方式上有所区别,体现在不同的位置上进行计算。
AttentionMask Kernels解析:对输入按照mask掩码置值,普通mask直接置为maskv,而Alibimask则是置为相对位置的值之和。具体含义可能涉及空间上的概念,但文中未详细说明。
swiglu kernels解析:作为激活函数,这些kernel在原地操作中执行常见函数,线程足够使用,直接按照公式计算即可。
综上所述,fastllm中CUDA-kernels的使用旨在通过优化计算过程和内存操作,提升模型的计算效率,实现更高效的推理和训练。
å¦ä½è´ä¹°FastBuilder
å¨FastBuilderå®ç½è´ä¹°æè æ §é½å®ç½ã
ä¸ä¸çåä¼ä¸çå æ¬FastReportçæææºä»£ç ï¼ä½ å¯æ ¹æ®èªå·±çç¹æ®éæ±è°æ´äº§åï¼å¹¶å®å ¨æ§å¶ææ软件代ç ï¼ä»¥ä¿éæ¥è¡¨çç»å¯¹å®å ¨ãæ §é½è¿ç»å¤å¹´è¢«FastReportæäºä¸å½åºBest Partner称å·ï¼ä¸ååå ±å»ºFastReportä¸æç½ï¼æä¾æ£ç产åãä¸ææç¨ãè¯ç¨ä¸è½½çæ¬å°åå¢å¼æå¡ï¼ä¸ºä¸å½åºå®¢æ·ä¿é©¾æ¤èªã
[fastllm]fastllm源码结构解析
fastllm源码结构解析 主要文件结构和继承关系如下: main包含factoryllm工厂,用于生成各种llm模型实例,basellm作为基类,包含通用方法和参数,所有模型使用相同的命名空间,fastllm为基本类,定义数据格式、权重映射和基础算子操作。 fastllm类属性解析:SetThreads(int t): 设置线程数
SetLowMemMode(bool m): 设置低内存模式
LowBitConfig: 包含量化参数,提供量化与反量化方法
DataType: 包括浮点、int8、int4等数据类型
DataDevice: 包含CPU与CUDA
WeightType: 包括LINEAR、EMBEDDING和None
Data: 包括形状、大小、扩容信息,量化配置等,提供复制、分配、预扩容等功能
Tokenizer: 包含TrieNode链表和token-to-string字典,提供插入、编码和解码函数
WeightMap: 存储模型名称与数据内存,支持从文件加载和保存低位量化权重
core类操作分析:Embedding: 根据输入与权重计算输出
RMSNorm: L2归一化后乘以权重
LayerNorm: 使用gamma、beta进行层归一化
Linear: 线性变换
Split: 按轴分割数据
Cat: 按轴拼接数据
MatMulTransB: 多线程下矩阵转置乘法
Softmax: 激活函数
Silu: SiLU激活函数
GeluNew: 新型Gelu激活函数
Mul: 矩阵与浮点数乘法
MulTo: 点乘
AddTo: 点加操作(带alpha和不带alpha)
AttentionMask: 根据mask值替换
Permute: 数据通道转换
ToDevice: 数据迁移至GPU
basellm作为抽象类,继承自fastllm,包含纯虚函数如加载权重、模型推理、保存低比特模型、热身等。 chatglm、moss和vicuna继承自basellm,实现具体模型,函数与basellm类似。 fastllm结构体与属性解析:FileBuffer: 文件读写操作,包括读取各种类型数据和文件写操作
Data操作: 包括数据拷贝、统计、扩容、转置、计算权重和等
Tokenizer方法: 包括初始化、清空、插入、编码和解码
WeightMap方法: 包括从文件加载和保存低位量化权重
fastllm方法: 包括矩阵转置、通道转换、数据迁移、多线程乘法、激活函数等
OPENFAST变速控制器介绍
FAST变速控制器主要涉及两大控制区域:低于额定风速时的变速控制与高于额定风速时的变桨控制。控制策略围绕发电机转速展开,旨在优化能量捕获与系统稳定性。控制器内部不进行风速无输出的定义,偏航控制因响应速度慢,通常对极端载荷和疲劳损伤影响较小,故未被集成。
基本控制中的核心为低通滤波器,用于平滑发电机转速信号,减少高频噪声对控制响应的影响。指数平滑递归单极低通滤波器在控制器中被采用,其离散时间递归方程确保了信号的平滑处理。转角频率的设定则参考了叶片挥舞自然频率,确保控制响应的时效性。
变速控制区域下,风电机组以最大风能利用系数运作,发电功率与转速呈二次方关系。此关系源自风能与功率的计算公式,叶尖速比作为关键参数,其固定值确保了变速运行阶段的高效能利用。变桨控制区域则通过调整桨距角,维持发电机功率恒定,转矩与转速成反比。
FAST控制器以NREL 5MW机组为对象,提供了转矩-转速图,直观展示了不同控制区域的特性。图中标注的点对应控制器源码DISCON.F中的变量,便于理解与参数调整。容量控制通过定义发电机转速与转矩关系实现,确保不同容量机组的适应性。
转矩-转速图中各点含义如下:高速轴侧介于区域1和区域[公式] 的过渡发电机转速为最小启动转速;区域[公式] 到区域2的过渡转速为VS-CtInSp的%;区域2至[公式] 处的过渡转速为区域[公式] 与区域2交点计算所得;高速轴侧额定发电机转速为额定转速的%;高速轴的输入功率为发电机功率除以效率计算。
各区域的函数定义为:区域2与区域[公式] 为直线,区域3为反比例函数。区域2与区域[公式] 的直线方程通过给定转速-转矩计算,区域[公式] 通过两点定义,另一点通过设定发电机同步转速计算;区域3的函数关系为功率与转速的反比例。
总之,FAST变速控制器通过智能控制策略优化了风电机组在不同风速条件下的性能,确保了能量捕获效率与系统稳定性。通过参数调整与功能优化,该控制器能够适应不同容量的风电机组,实现高效、稳定的运行。
FastDDS移植 - Boost 编译安装
Boost是一个强大的C++库集合,为开发者提供了丰富的功能和工具,尤其在数据结构、算法、网络和并发编程等方面。本文将指导如何在不同平台上编译安装Boost,从源码下载到配置和编译都有详细步骤。
1. 首先,访问Boost官方网站(boost.org/)下载适合你的开发环境(Linux或Windows)的源码。务必选择最新版本。
2. 在源码目录中,运行bootstrap.sh脚本初始化编译过程,然后执行b2命令开始编译。由于Boost源码较大,这可能需要一些时间。
3. 对于x平台,通常无需修改编译配置。确保你的Linux系统已经安装了g++4.6或更高版本的编译器,可通过g++ --version检查。
4. 完成编译后,你将看到编译成功的输出信息。在应用中引用Boost库时,记得在编译时告诉编译器库文件的路径。
5. 对于ARM平台,可能需要进行交叉编译。参考ljbachelor的GCC编译工具链教程来配置工程文件(project-config.jam),然后执行编译指令。
6. 无论是哪种平台,示例代码保持不变,只需在对应的平台使用x的编译指令。
通过以上步骤,你就能成功在FastDDS移植项目中使用Boost库了。