个人学习笔记

Qwen2.5Omni解析

5 分钟阅读

Audio部分 1. 音频前处理 第一步:读取音频数据 本文以Qwen2.5-Omni-7B为例解析该模型。 源码:modeling_qwen2_5_omni.py Audio部分 1. 音频前处理 第一步:读取音频数据 第一步:比如20s的视频,原始采样率为44.100kHz。audio会用16kHz采样率重采样,得到335459个浮点数值,范围是[-1.0, 1.0]。为什么不是320000个浮点数值?这是因为原始采样率与16000存在四舍五入补帧情况,导致多采样部分。

音频基本概念

1 分钟阅读

音频 比特率:比如128kbps,表示每秒有128kbit的音频数据,也就是16KB/s。标准的MP3用128kbs;高品质MP3用192kbps。 频道:也称声道(Channel),表示声音信号流数量。1为单声道;2为立体声道。 量化位深:Bit Depth,表示每个采用点振幅的二进制数据。8bit用于早期游戏机;16bit主流音频;24bit专业录音。 分贝:decibel (dB),音频领域表示动态范围,DR6.02×n()+1.76(dB)。其中位深16bit对应98dB;24bit对应146dB。 采样频率:也称采样率(Sampling Rate),每秒对音频信号的采样次数。CD质量的采用率一般是44.1kHz 未压缩音频数据量大小计算:(bytes)(Hz)×(bits/sample)××(s)÷8(bitsbytes) 比如44.1kHz、16 bit、2声道、1分钟数据量: 44100×16×2×60÷81058400bytes1.01MB 比特率 = 采用率 × 位深 × Channel Python方法 import librosa y, sr = librosa.load(data,sr=SAMPLE_RATE,offset=0,duration=None) # 读取音频 # data对应音频源,可以是文件,比如mp4/wav等等;也可以是字节流 # sr对应Sample Rate,如果指定为None,则保留原始采样率;指定为正整数,则重采样到该频率 # offset对应起始秒 # duration对应时长秒 # 返回值 # y 对应numpy一维数组,-1.0到1.0的浮点数, # sr 对应实际采样率

Qwen2.5VL解析

17 分钟阅读

Vision部分 本文以Qwen2.5VL-7B为例,分Vision部分和LLM部分,来解析该模型。 源码:modeling_qwen2_5_vl.py Vision部分 在config.json中vision部分的配置如下: "vision_config": { "depth": 32, "embed_dim": 1280, "mlp_ratio": 4, "num_heads": 16, "in_chans": 3, "hidden_size": 1536, "patch_size": 14, "spatial_merge_size": 2, "spatial_patch_size": 14, "temporal_patch_size": 2 }

LLM的采样策略

2 分钟阅读

贪心解码 随机采样 LLM的decode阶段会输出vocab_size个数值,本文用logits表示。每个位置对应词典每个token。选择哪个token,有不同的策略。 参考链接:logits_process.py 贪心解码 Greedy Decoding,也就是直接选择数值最大的那个位置的token。示例代码如下: # logits is [vocab_size] logit, token = torch.topk(logits, 1) 随机采样 参数说明: temperature: 控制文本的随机性,越高随机性越强。算法上用于运算 logits = logits/temperature repetition_penalty: 用于减少文本中的重复,对已经出现过的token,一般数值为1.2。做操作如下: logit = logit * repetition_penalty if logit < 0 else logit / repetition_penalty top_k: 选取数值最大的top_k个结果,一般为40到100之间 top_p: 指定概率,累计概率在top_p以内的会被选择,一般指定为0.7到1.0之间,比如0.8。 举例概率列表[0.25, 0.20, 0.15, 0.1, 0.07, 0.06, 0.05, 0.04, 0.03, 0.01],累计概率为cumsum,得到[0.25, 0.45, 0.60, 0.70, 0.77, 0.83],0.83开始超出了top_p,所以只选择0.83之前的部分 计算过程: # repetition penalty def encode_repetition(input_ids, scores): score = torch.gather(scores, 1, input_ids) score = torch.where(score < 0, score * penalty, score / penalty) scores_processed = scores.scatter(1, input_ids, score) return scores_processed def encode_topp(scores): cumulative_probs = scores.softmax(-1).cumsum(-1) # probility sorted_indices_to_remove = cumulative_probs <= (1 - self.top_p) sorted_indices_to_remove[..., -self.min_tokens_to_keep :] = 0 indices_to_remove = sorted_indices_to_remove.scatter(1, sorted_indices, sorted_indices_to_remove) scores_processed = scores.masked_fill(indices_to_remove, "-inf") logits = encode_repetition(input_ids, logits) # repetition logits, indices = torch.topk(logits, top_k) # top_k logits = logits/temperature # temperature logits = encode_top_p(logits) # top_p probabilities = logits.softmax(-1) #

Safetensors文件格式

2 分钟阅读

基本介绍 基本介绍 本文出处:Safetensors 一种tensors的存储格式,读写速度快,常用于huggingface上权重的存储 安装方法:pip3 install safetensors

LoRA学习

10 分钟阅读

LoRA概念 LoRA概念 论文:[2106.09685] LoRA: Low-Rank Adaptation of Large Language Models LoRA: Low Rank Adaptation,低秩适应,一种高效的微调技术,在原有LLM基础上额外增加少量可训练的参数,而非对整个LLM进行训练。训练速度更快,适合资源有限场景。 lora_rank: 简写成r,低秩,一般很小,r <= 32。将原有矩阵参数,转换成W=W0+ΔW,其中ΔW=A×B。举例说明权重[2048, 1024] + [2048, 32] x [32, 1024],其中32就是lora_rank,W的参数量2M,ΔW的参数量96K。也就是LoRA只用训练96K即可。 lora_alpha: 是LoRA的缩放系数,起到调整更新 ΔW 幅度的作用,这时ΔW=loraalpharA×B 前向推导公式:h=W0x+ΔWx=W0x+loraalpharBAx

CUDA与Triton

6 分钟阅读

并行计算术语 并行计算术语 名词 全称 注解 SI Single Instruction 指单一指令,一个时钟执行单一指令。即便多个处理单元,也执行一样的指令。 SD Single Data 指单一数据,一个时钟一条数据。即便多个处理单元,也使用相同的数据。 MI Multiple Instruction 指多指令,不同处理单元处理不同的指令。 MD Multiple Data 指多数据,不同的处理单元处理不同的数据。 SISD Single Instruction, Single Data 串行计算,传统单核芯片属于该类 SIMD Single Instruction, Multiple Data 单指令多数据流,典型的可以支持向量计算,对不同的数据使用相同的指令。一般现代CPU都会支持SIMD指令。 MISD Multiple Instruction, Single Data 多指令单数据流,几乎不存在这样的架构 MIMD Multiple Instruction, Multiple Data 多指令多数据流。多核处理器都是属于这个范畴 SIMT Single Instruction Multiple Threads 单指令多线程,每个线程处理相同的指令和不同的数据。可以认为是SIMD的升级版,个人理解它们的区别在于:SIMD的数据必须是向量形式的数据,SIMT的数据则没有形式的要求。所以SIMT可以更加灵活。现代GPU一般都是SIMT。 SPMD Simple Program, Multiple Data 单程序多数据,一种编程概念,用于数据并行的应用。一般MIMD或者SIMT,可以支持SPMD

OpenAI CLIP

1 分钟阅读

概述 概述 源码:github, huggingface 介绍:https://openai.com/index/clip CLIP全称Contrastive Language-Image Pretraining,基于语言图像对比预训练,是目前最为优秀的zero-shot模型,也是后续一系列图文模型的基石,甚至直接拿它做Backbone。它最大的优势在于,可以直接用文本+图像做训练,这部分数据量在网上是非常庞大的。而传统的标注类数据集成本非常高昂,数据量也不是一个量级。 zero-shot:零样本学习,无需专门对样本分类,使分类功能可以泛化。 原理如下图(图来自官方)所示: 训练时,文本数据经过Text Encoder 生成[T1, T2, ..., TN]向量;图片数据经过Image Encoder转成[I1, I2, ..., IN]向量,然后两个向量求余弦距离,得到所有文件与图片的相关性 推理时,同样的方式使用Text Encode和Image Encoder得到两个向量,求余弦举例 通常图像用resnet50做backbone,文本用vit做backbone

Python常用工具

少于 1 分钟阅读

ipython venv ipython 可以执行python交互命令 安装方式: pip3 install ipython venv 创建虚拟环境,可以做python环境隔离 cd myfold # 创建虚拟环境,不包含pip;也可以去掉without-pip,包含pip python3 -m venv --without-pip myenv # 进入虚拟python环境 source myenv/bin/activate # 执行python相关操作 ... # 退出环境 deactivate

编辑ONNX模型

1 分钟阅读

概述 概述 onnx模型编辑方法有2种: onnx-graphsurgeon : 手工编辑onnx模型 onnx-modifier : 图形化编辑onnx模型 虽然onnx-modifier有图形界面编辑onnx,但是实际用起来问题特别多。onnx-graphsurgeon用起来更加强大,简洁。 安装方法如下: pip install onnx_graphsurgeon --index-url https://pypi.ngc.nvidia.com 也可以源码编译安装: make build pip install onnx_graphsurgeon/dist/onnx_graphsurgeon-*-py2.py3-none-any.whl

FasterRCNN

1 分钟阅读

概述 概述 源码: Torch Faster RCNN 论文地址:Faster R-CNN

各NN框架的MLIR

24 分钟阅读

ONNX MLIR ONNX MLIR 官网介绍:http://onnx.ai/onnx-mlir 论文:Compiling ONNX Neural Network Models Using MLIR github地址:onnx mlir docker下载:docker pull onnxmlirczar/onnx-mlir:amd64 转换工具 ## EmitONNXBasic 会生成.mlir文件(含文本形式的weight)和.tmp文件(不含weight) docker/onnx-mlir.py --EmitONNXBasic xxx.onnx