1.PyTorch 源码分析(一):torch.nn.Module
2.YOLOX目标检测实战:LabVIEW+YOLOX ONNX模型实现推理检测(含源码)
3.TFlite 源码分析(一) 转换与量化
4.[推理部署]👉Mac源码编译TensorFlow C++指北
5.LLM推理2:vLLM源码学习
6.腾讯T2I-adapter源码分析(2)-推理源码分析
PyTorch 源码分析(一):torch.nn.Module
nn.Module是PyTorch中最核心和基础的结构,它是软件软件操作符/损失函数的基类,同时也是源码源码组成各种网络结构的基类(实际上是由多个module组合而成的一个module)。
在Python侧,推理推理2.1回调函数注册,软件软件2.2 module类定义中,源码源码磁力网盘源码有以下几个重点函数:
重点函数一:将模型的推理推理参数移动到CUDA上,内部会遍历其子module。软件软件
重点函数二:将模型的源码源码参数移动到CPU上,内部会遍历其子module。推理推理
重点函数三:将模型的软件软件参数转化为fp或者fp等,内部会遍历其子module。源码源码
重点函数四:forward函数调用。推理推理
重点函数五:返回该net的软件软件所有layer。
在类图中,源码源码PyTorch的算子都是module的子类,包括自定义算子和整网定义。
在C++侧,3.1 module.to("cuda")详细分析中,本质是将module的parameter&buffer等tensor移动到CUDA上,最终调用的是tensor.to(cuda)。
3.2 module.load/save逻辑中,PyTorch模型保存分为两种,一种是纯参数,一种是带模型结构(PyTorch中的模型结构,本质上是由module、sub-module构造的一个计算图)。
parameter、buffer是通过key-value的形式来存储和检索的,key为module的.name,value为存储具体数据的tensor。
InputArchive/OutputArchive的write和read逻辑。
通过Module,PyTorch将op/loss/opt等串联起来,类似于一个计算图。基于PyTorch构建的翡翠 源码ResNet等模型,是逐个算子进行计算的,tensor在CPU和GPU之间来回流动,而不是整个计算都在GPU上完成(即中间计算结果不出GPU)。实际上,在进行推理时,可以构建一个计算图,让整个计算图的计算都在GPU上完成,不知道是否可行(如果GPU上有一个CPU就可以完成这个操作,不知道tensorrt是否是这样的操作)。
YOLOX目标检测实战:LabVIEW+YOLOX ONNX模型实现推理检测(含源码)
LabVIEW实现YOLOX目标检测 本文将介绍如何利用LabVIEW进行YOLOX目标检测的实战操作。YOLOX是由旷视科技开源的高性能实时目标检测网络,通过将解耦头、数据增强、无锚点及标签分类等领域的优秀进展与YOLO进行集成,实现了超越YOLOv3、YOLOv4和YOLOv5的性能,并保持了极高的推理速度。本文将主要关注如何在LabVIEW中部署YOLOX的ONNX模型进行推理。 一、环境搭建 部署环境:所需环境包括LabVIEW软件,以及YOLOX ONNX模型。 LabVIEW工具包:安装LabVIEW ONNX工具包,以实现与ONNX模型的交互。 二、模型的获取与转化 方式一:直接下载ONNX模型。访问GitHub仓库获取YOLOX的ONNX模型,链接如下:github.com/Megvii-BaseD... 方式二:将训练好的模型pth转换为ONNX。通过下载YOLOX源码、安装库、从基准表下载预训练模型,然后使用特定指令将pth模型转换为ONNX格式。具体步骤如下:1. 安装YOLOX:在YOLOX-main文件夹中执行命令行指令。
2. 安装pycocotools。
3. 下载预训练模型:使用指定链接下载模型文件至特定路径。
4. 将模型pth转换为ONNX:执行相关命令。mina 源码
三、LabVIEW实现YOLOX ONNX推理检测 加载模型:将转换后的ONNX模型放置至LabVIEW项目中的model文件夹内,配置LabVIEW程序加载模型。 目标检测实现:使用LabVIEW ONNX工具包中的Create_Session.vi加载模型,并选择CPU、CUDA或TensorRT进行推理加速。通过查看模型结构、加载模型及实现目标检测,最终输出检测结果。 四、源码及模型下载 链接:访问百度网盘下载相关源码与模型,链接如下:pan.baidu.com/s/1FMRH1F... 总结:本文详细介绍了在LabVIEW中实现YOLOX目标检测的全过程,包括环境搭建、模型获取与转化、LabVIEW实现推理检测以及源码下载。希望对读者在LabVIEW与人工智能技术应用方面有所帮助。如有疑问或讨论,欢迎在评论区留言,同时也欢迎加入技术交流群。TFlite 源码分析(一) 转换与量化
TensorFlow Lite 是 Google 推出的用于设备端推断的开源深度学习框架,其主要目的是将 TensorFlow 模型部署到手机、嵌入式设备或物联网设备上。它由两部分构成:模型转换工具和模型推理引擎。
TFLite 的核心组成部分是转换(Converter)和解析(interpreter)。转换主要负责将模型转换成 TFLite 模型,并完成优化和量化的过程。解析则专注于高效执行推理,在端侧设备上进行计算。
转换部分,主要功能是通过 TFLiteConverter 接口实现。转换过程涉及确定输入数据类型,如是否为 float、int8 或 uint8。优化和转换过程主要通过 Toco 完成,包括导入模型、404 源码模型优化、转换以及输出模型。
在导入模型时,`ImportTensorFlowGraphDef` 函数负责确定输入输出节点,并检查所有算子是否支持,同时内联图的节点进行转换。量化过程则涉及计算网络中单层计算的量化公式,通常针对 UINT8(范围为 0-)或 INT8(范围为 -~)。量化功能主要通过 `CheckIsReadyForQuantization`、`Quantize` 等函数实现,确保输入输出节点的最大最小值存在。
输出模型时,根据指定的输出格式(如 TensorFlow 或 TFLite)进行。TFLite 输出主要分为数据保存和创建 TFLite 模型文件两部分。
量化过程分为选择量化参数和计算量化参数两部分。选择量化参数包括为输入和权重选择合适的量化参数,这些参数在 `MakeInitialDequantizeOperator` 中计算。计算参数则使用 `ChooseQuantizationParamsForArrayAndQuantizedDataType` 函数,该函数基于模板类模板实现。
TFLite 支持的量化操作包括 Post-training quantization 方法,实现相关功能的代码位于 `tools\optimize\quantize_model.cc`。
[推理部署]👉Mac源码编译TensorFlow C++指北
在Mac环境下编译TensorFlow C++源码,需要完成以下步骤,以避免可能的编译问题,确保顺利构建。
首先,确认系统环境满足要求。需有Xcode和Command Line Tools,JDK 1.8.0版本以支持编译过程中所需的Java环境,以及Bazel工具,TensorFlow依赖此工具进行编译。特别注意Bazel版本需与TensorFlow对应,如TensorFlow 1.对应Bazel 0..1。
接下里,安装依赖,boost 源码包括JDK和Bazel。JDK安装时需检查电脑中是否已安装,并确保正确安装。使用HomeBrew安装Bazel,通过命令行接受协议,并使用`--user`指令确保安装在个人目录的`bin`文件夹下,同时设置`.bazelrc`路径为`$HOME/.bazelrc`。
安装自动化工具`automake`和使用Python3.7.5在虚拟环境中构建TensorFlow C++源码。推荐使用清华镜像源加速`pip`的安装过程。通过`git clone`方式下载TensorFlow源码,确保checkout至r1.分支。调整域名映射以提升`git clone`速度。
进行编译选项配置,通常在TensorFlow文件夹内运行命令,根据提示选择默认选项。
开始编译TensorFlow,此过程可能需要较长时间,完成后,应在`bazel-bin/tensorflow`目录下找到编译好的`libtensorflow_cc.so`和`libtensorflow_framework.1.dylib`文件。
若遇到`Undefined symbols for architecture x_: “_CFRelease”`错误,这通常与创建软连接有关,无需特别处理。若需要手动安装额外依赖库,如Eigen3,可参考相关指南。
编译完成后,可对C++接口进行测试,验证编译过程的正确性。通常情况下,Mac下的TensorFlow 1. C++源码编译完成。
最后,编译TFLite,生成的动态链接库将保存在指定目录下。在`CMakelists.txt`文件中增加对应配置项,以完成TFLite的构建。
总结而言,Mac下TensorFlow 1. C++源码编译及TFLite的构建,需要遵循上述步骤,并确保环境与工具版本的兼容性,以顺利进行编译过程。Linux系统下的编译方式相似,但具体细节可能有所不同。
LLM推理2:vLLM源码学习
vLLM, developed at UC Berkeley, redefines LLM service efficiency with PagedAttention. This technology boosts throughput by times compared to HuggingFace Transformers without altering the model architecture, implemented in Python/C++/CUDA.
At the heart of vLLM lies PagedAttention, addressing the memory bottleneck in LLM services. In traditional self-attention, computation lags behind memory access, causing performance constraints. PagedAttention utilizes virtual memory and paging principles to store continuous keys and values in non-contiguous memory segments. By dividing each sequence's KV cache into blocks, PagedAttention facilitates efficient attention computations. With near-optimal memory usage, PagedAttention minimizes memory waste to under 4%, while also supporting efficient memory sharing to reduce overhead in complex sampling algorithms, thus enhancing throughput.
Continuous batching, initially unclear, was illuminated by @哦哦啊's insights. This technique optimizes system-level batch sizes to yield x or more performance improvements in real-world workloads. While most optimizations focus on model quantization and custom CUDA kernels, IO and memory issues typically outweigh compute concerns in LLM inference.
LLM inference is memory-bound, not compute-bound. It often takes longer to load data to GPU cores than the computations themselves. Thus, throughput largely hinges on the batch size that can fit into high-bandwidth GPU memory. As the batch size increases, especially when max tokens are high, the disparity in completion times across different batches can diminish GPU utilization.
vLLM stands out in benchmark tests, more than doubling performance over naive continuous batching. The dynamic space reservation capability of vLLM is suspected to significantly increase batch sizes, contributing to its superior performance.
In the llm.py file, the _run_engine() function iterates to generate results for any incomplete requests, while the self.llm_engine.step() function retrieves data for sequences needing inference from the _schedule() function, which moves waiting sequences to the running state.
To run vLLM, several methods are available, including adjustments for CUDA and PyTorch version mismatches in installation. Running examples/offline_inference.py provides a straightforward command-line interface.
The LLM class encapsulates model loading, tokenizer creation, worker and scheduler setup, and memory allocation, including the block-based allocation strategy enabled by PagedAttention. The embed, N decoders, and normalization in the LlamaModel class facilitate efficient inference. The RMSNorm class leverages CUDA acceleration, and the LlamaDecoderLayer integrates LlamaAttention and LlamaMLP for processing. PagedAttention is instrumental in optimizing memory usage during inference.
The sampling_params.py file contains default parameters for inference, generally not requiring modification. vLLM's core innovation lies in its PagedAttention technology, which optimizes memory management to enhance throughput.
While single-batch inference may not outperform HuggingFace Transformers, vLLM demonstrates significant advantages in multi-batch scenarios. The discrepancies in inference results between vLLM and HuggingFace (HF) can be explored further for a deeper understanding of the system's nuances.
腾讯T2I-adapter源码分析(2)-推理源码分析
随着stable-diffusion和midjourney展示出AI绘图的惊人潜力,人们对技术进步的惊叹不已。然而,AI绘图的可控性一直是痛点,仅凭描述词控制图像并不尽如人意。为增强AI图像的可控性,Controlnet和T2I-adapter等技术应运而生。本文将通过解析T2I-adapter的推理源码,揭示其工作原理。
本文将深入剖析推理部分的代码,以便理解T2I-Adapter的实际操作。使用如下的命令行指令进行推理,如test_adapter.py,它需要指定条件类型、深度图路径、前置处理器类型、提示语、模型和缩放尺寸等参数。
在test_adapter.py中,主要分为参数读取、模型加载和推理运算三个步骤。参数读取部分包括检查支持的条件、构建提示语,以及根据输入选择前置处理。模型加载涉及stable-diffusion和adapter模型,前者通过配置加载,后者根据输入条件构造Adapter模型。
加载stable-diffusion模型时,代码引用了来自github的CompVis/stable-diffusion库,其中关键部分包括加载参数、模型配置以及UNetModel的改动。Adapter模型的构造与论文中的结构图一致,通过ResnetBlock的组合实现。
在推理过程中,先对输入进行预处理,如深度图的处理。随后,get_adapter_feature和diffusion_inference两个核心函数调用adapter模型,与stable-diffusion模型结合进行特征融合和采样。最后,DDIM采样器接收并处理adapter特征,最终生成图像。
通过以上分析,我们逐步揭示了T2I-adapter的推理机制。后续文章将探讨训练代码。在游戏开发中,AI生成游戏角色动作的应用,如AUTOMATIC,展示了这种技术的实际应用,以解决美术资源匮乏的问题。
LangChain:代码世界的魔法师,源码解读带你笑看技术黑洞
在探索代码世界的魔法世界中,LangChain如一颗璀璨的明星,引领我们穿越技术黑洞,揭示背后的奥秘。本文将深度解读LangChain的源码,为开发者揭示构建上下文感知推理应用的秘密。
LangChain的魔法源于其核心组件,每一部分都精心设计,旨在简化大语言模型的集成与应用。让我们一起揭开这些组件的神秘面纱。
1. 模型输入输出(Model IO)
在LangChain中,任何大语言模型的应用都离不开与模型的无缝交互。通过Model IO组件,开发者能够轻松适配不同模型平台,简化调用流程。提示词模板功能允许开发者根据需求动态管理输入内容,输出解析器则提取关键信息,确保模型输出的高效利用。
2. 数据连接(Data Connection)
面对用户特定数据,LangChain提供了从加载、转换到存储与检索的全面解决方案。文档加载器与转换器、矢量存储工具,共同构建起数据处理的坚实基石。
3. 链(Chain)
在复杂应用中,简单模型可能不再足够。通过链组件,LangChain允许开发者将多个模型或其他组件串联起来,构建出高度定制化的解决方案。
4. 记忆(Memory)
记忆功能在对话式应用中至关重要。通过灵活的存储与检索机制,开发者可以确保应用在每次运行中都具备上下文意识,提升用户体验。
5. Agent
在LangChain中,Agent代理将大语言模型作为推理引擎,自主决策执行操作的序列,推动应用向更高层次发展。
6. 回调处理器(Callback)
LangChain的回调系统提供了实时干预应用流程的能力,适用于日志记录、监控及流处理等场景,确保应用运行的透明与可控。
7. 索引
索引技术在LangChain中扮演关键角色,优化数据检索效率,为应用提供高效的数据访问路径。
8. 检索
检索组件让文档与语言模型紧密协作,通过简洁的接口实现高效信息检索,满足多样化应用需求。
9. 文本分割器
在处理长文本时,文本分割器成为不可或缺的工具,确保语义连续性的同时,适应不同应用场景的多样化需求。
. 向量存储
向量存储技术作为构建索引的核心,为LangChain提供高效、灵活的数据结构,支持大规模数据处理。
. 检索器接口(Retrievers)
检索器接口作为文档与语言模型之间的桥梁,确保信息检索操作的标准化与高效性,支持多样化的检索需求。
. 总结
通过深入解析LangChain的源码,我们不仅揭示了其构建上下文感知推理应用的奥秘,也看到了其在复杂应用集成与优化中的巨大潜力。在LangChain的魔法世界里,开发者能够解锁更多可能,创造令人惊叹的技术奇迹。
Stable Diffusion详解与模型源码
Stable Diffusion,由CompVis、Stability AI和LAION共同推出,是一种在任何文本输入下生成逼真图像的潜在扩散模型(Latent Diffusion Model)。其创新之处在于通过在较低维度的latent空间上应用扩散过程,而不是直接使用像素空间,以降低内存和计算复杂度。该模型使用LAION-5B数据集中的高清进行训练,尺寸为x,结合冻结的CLIP ViT-L/文本编码器进行条件设置。Stable Diffusion的轻量级设计,使其具备在多台消费级GPU上运行的能力,模型参数包括M UNet和M文本编码器。
Stable Diffusion的推理过程简洁高效。以输入“a photograph of an astronaut riding a horse”为例,模型会生成相应的。其推理流程如图所示。Stable Diffusion具有两个输出。首先,U-Net在文本嵌入指引下,通过多次迭代(通常为次)去除latent image representation的噪音。调度器算法,如Denoising Diffusion Probabilistic Models(DDPM)或Denoising Diffusion Implicit Models(DDIM)等,基于上一次预测的latent image representation与噪音残差,预测新的去噪后的latent image representation。
最终,去噪后的latent image representation通过Variational Autoencoder(VAE)的解码器转换回与用户提示相匹配的图像。VAE模型由编码器和解码器组成,编码器将图像转换为低维潜在表示,解码器则将潜在表示转换回图像。在潜扩散训练过程中,编码器得到图像的潜在表示,用于前向扩散过程,每一步增加噪声。在推理过程中,反向扩散过程产生的去噪后的潜在波通过VAE解码器转换为图像。
Stable Diffusion的文本编码器负责将输入提示转换为U-Net可以理解的嵌入空间。它通常是一个基于转换器的编码器,将一系列输入标记映射为潜在文本嵌入。在训练期间,稳定扩散不训练文本编码器,而是使用CLIP已经训练的文本编码器CLIPTextModel。
AutoencoderKL的模型结构包括编码器和解码器,编码器将图像转换为低维潜在表示,用于前向扩散过程。解码器则将潜在表示转换回图像。在潜扩散训练中,编码器得到图像的潜在表示,用于生成过程。在推理阶段,反向扩散过程产生的去噪后的潜在波通过解码器转换为与用户提示相匹配的图像。
参考文献