1.stable-diffusion-webui源码分析(10)-unet网络结构
2.高度优化,京东AI开源的二值网络inference框架
3.PyTorch ResNet 使用与源码解析
4.VGGish源码学习
5.ONNX一本通:综述&使用&源码分析(持续更新)
6.ML system 入坑指南
stable-diffusion-webui源码分析(10)-unet网络结构
stable-diffusion-webui的源码分析深入探讨了unet网络结构在AI绘图中的关键作用。unet在去噪过程中起着核心作用,它接收prompt特征、latent特征和时间步特征,通过下采样和上采样过程生成新的luncher源码解析特征。稳定扩散模型的unet结构基于原始unet,并进行了定制以嵌入文本信息。在webui的实现中,关键代码位于openaimodel.py,其中包含大量的初始化参数和组件,如ResnetBlock、SpatialTransformer和DownSample等。
模型的构建通过__init__方法进行,参数丰富,配置文件v1-inference.yaml定义了这些参数。初始化代码中,会检查输入参数的有效性,并设置一些变量。时间编码(time_embed)是一个维度的向量,通过多个MLP层生成。input_blocks部分的conv_nd是卷积层,其参数根据配置进行设置,TimestepEmbedSequential则负责传递时间信息给各个模块。
unet的结构复杂,包括内嵌的ResBlock和SpatialTransformer模块,以及通过循环进行的下采样和上采样。每层模块的添加和参数设置都有特定条件,如基于分辨率的注意力机制。通过分析,我们看到模型如何整合时间步和文本信息,通过ResBlock处理隐变量,通过SpatialTransformer实现注意力机制。
最后,DownSample和UpSample模块用于调整特征的空间分辨率。总的来说,unet网络结构是stable-diffusion-webui中AI绘图背后的重要技术基础,深入理解其细节对于掌握AI创作过程至关重要。
高度优化,京东AI开源的二值网络inference框架
京东 AI 开源了一个高度优化的针对 ARM 指令集的二值网络推理框架 dabnn。dabnn 是首个针对二值网络的开源推理框架,相较于 BMXNet,其速度提升了一个数量级。dabnn 已在 ACM MM 的 Open Source Software Competition 中被接收。
二值网络是接苹果源码编程教程一种特殊神经网络,权重和中间特征被压缩至 1 位,实现了网络量化到极致。二值网络的优势在于 1 位乘加操作能通过位运算高效实现,使其能在主流硬件平台上无缝运行。相比之下,三值、2 位、4 位等量化网络需特殊硬件平台支持,且在计算效率上无法与二值网络匹敌。
在二值网络领域,已有 BMXNet、BitStream、BitFlow 等推理框架。然而,这些框架或无源代码,或速度较慢。dabnn 则填补了这一空白,提供了针对 ARM 指令集高度优化的推理框架。论文证实了 dabnn 的高效性,并在 ACM MM 的 Open Source Software Competition 中被接收。
dabnn 通过使用 Binary Direct Convolution 实现二值卷积,而非 BMXNet 使用的 BGEMM。这种策略减少了 addv 指令的使用,优化了 ARM 架构下的计算过程。实验对比显示,dabnn 在 3x3 卷积上的推理速度相较于 TensorFlow Lite 提升了 8~ 倍,相较于 BMXNet 提升了 7~ 倍。
为方便使用,dabnn 开源了将 ONNX 模型转换为 dabnn 模型的工具。这一功能使得 dabnn 可与几乎所有训练框架兼容。与 BMXNet 相比,dabnn 提供了更广泛的模型转换支持。
自发布以来,dabnn 已被多个二值网络研究项目采用,包括商汤科技的 IR-Net 和北航等机构的 Balanced Binary Neural Networks with Gated Residual。这些应用展示了 dabnn 在二值网络领域的重要性与实用性。
PyTorch ResNet 使用与源码解析
在PyTorch中,我们可以通过torchvision.model库轻松使用预训练的图像分类模型,如ResNet。本文将重点讲解ResNet的使用和源码解析。模型介绍与ResNet应用
torchvision.model库提供了多种预训练模型,包括ResNet,其特点是层深度的残差网络。首先,米酷影视6.2源码我们需要加载预训练的模型参数: 模型加载代码: pythonmodel = torchvision.models.resnet(pretrained=True)
接着,将模型放置到GPU上,并设置为评估模式: GPU和评估模式设置: pythonmodel = model.to(device='cuda')
model.eval()
Inference流程
在进行预测时,主要步骤包括数据预处理和网络前向传播: 关键代码: pythonwith torch.no_grad():
output = model(input_data)
残差连接详解
ResNet的核心是残差块,包含两个路径:一个是拟合残差的路径(称为残差路径),另一个是恒等映射(称为shortcut)。通过element-wise addition将两者连接: 残差块结构: 1. 残差路径: [公式] 2. 短路路径: [公式] (通常为identity mapping)网络结构与变种
ResNet有不同深度的变种,如ResNet、ResNet、ResNet等,网络结构根据层数和块的数量有所不同: 不同ResNet的结构图: ...源码分析
构造函数中,例如ResNet的构造过程是通过_resnet()方法逐步构建网络,涉及BasicBlock或Bottleneck的使用: ResNet构造函数: ... 源码的深入解析包括forward()方法的执行流程,以及_make_layer()方法定义网络层: forward()方法和_make_layer()方法: ...图解示例
ResNet和ResNet的不同层结构,如layer1的升维与shortcut处理: ResNet和ResNet的图解: ... 希望这些内容对理解ResNet在PyTorch中的应用有所帮助。如果你从中受益,别忘了分享或支持作者继续创作。VGGish源码学习
深入研究VGGish源码,该模型在模态视频分析领域颇为流行,尤其在生成语音部分的embedding特征向量方面。本文旨在基于官方源码进行学习。
VGGish的代码库结构简洁,仅包含几个.py文件。文件大体功能明确,下文将结合具体代码进行详述。在开始之前,需要预先下载两个预训练文件,与.py文件放在同一目录。
VGGish的环境安装过程简便,对依赖包的版本要求宽松。只需依次执行安装命令,确保环境配置无误。运行vggish_smoke_test.py脚本,如显示"Looks Good To Me"则表明环境已搭建完成。
着手VGGish模型的拆解,以vggish_inference_demo.py中的main函数为起点,分为两大部分:数据准备与前向推理获得Embedding特征及特征后处理。
在数据准备阶段,首先确认输入是否为.wav文件,若非则自行生成。接着,使用vggish_input.py模块将输入数据调整为适用于模型的batch格式。假设输入音频长1分秒,采样频率为.1kHz,源码测试管理系统读取的wav_data为(,)的一维数组(若为双声道,则调整为单声道)。
进入前向推理阶段,初始化特征处理对象pproc及记录器对象writer。通过vggish_slim.py模块构建VGG模型,并加载预训练权重。前向推理生成维的embedding特征向量。值得注意的是,输入数据为[num_samples, , ]的三维数据,在推理过程中会增加一维[num_samples,num_frames,num_bins,1],最终经过卷积层提取特征,FC层压缩,得到的embedding_batch为[num_samples,]。
后处理环节中,应用PCA(主成分分析)对embedding特征进行调整。这一步骤旨在与YouTube-8M项目兼容,后者已发布用于数百万YouTube视频的PCA/whitened/quantized格式的音频和视觉嵌入。不过,若无需使用官方发布的AudioSet嵌入,则可直接使用网络输出的原始嵌入,无需进行PCA操作。
本文旨在为读者提供深入理解VGGish源码的路径,通过详述模型的构建、安装与应用过程,旨在促进对模态视频分析技术的深入学习与应用。
ONNX一本通:综述&使用&源码分析(持续更新)
ONNX详解:功能概述、Python API应用与源码解析
ONNX的核心功能集中在模型定义、算子操作、序列化与反序列化,以及模型验证上。它主要通过onnx-runtime实现运行时支持,包括图优化和平台特定的算子库。模型转换工具如tf、pytorch和mindspore的FMK工具包负责各自框架模型至ONNX的转换。ONNX Python API实战
场景一:构建线性回归模型,基础操作演示了API的使用。
场景二至四:包括为op添加常量参数、属性以及控制流(尽管控制流在正式模型中应尽量避免)。
场景五和后续:涉及for循环和自定义算子的V2搭建源码添加,如Cos算子,涉及算子定义、添加到算子集、Python实现等步骤。
源码分析
onnx.checker:负责模型和元素的检查,cpp代码中实现具体检查逻辑。
onnx.compose、onnx.defs、onnx.helper等:提供模型构建、算子定义和辅助函数。
onnx.numpy_helper:处理numpy数组与onnx tensor的转换。
onnx.reference:提供Python实现的op推理功能。
onnx.shape_inference:进行模型的形状推断。
onnx.version_converter:处理不同op_set_version的转换。
转换实践
ONNX支持将tf、pytorch和mindspore的模型转换为ONNX格式,同时也有ONNX到TensorRT、MNN和MS-Lite等其他格式的转换选项。总结
ONNX提供了一个统一的IR(中间表示)框架,通过Python API构建模型,支持算子定义的检查和模型的序列化。同时,它利用numpy实现基础算子,便于模型的正确性验证,并支持不同框架模型之间的转换。ML system 入坑指南
欢迎进入机器学习系统(ML system)的广阔领域。随着ChatGpt等大模型的兴起,人们愈发关注大模型的实际落地。然而,除了先进的算法,背后支撑的ML system——从分布式训练到高效推理的完整链路同样至关重要。优秀的基础设施是应用爆发的基石。对于刚刚踏入这个领域的“新手”以及对ML system感兴趣但并非该领域背景的其他领域人士,本文将分享个人的学习历程和指引,希望能为你们提供入门和进一步探索的指南。 让我们先从课程入手。学习路径的构建离不开坚实的知识基础。首先,掌握计算机基础,如数据结构,这是必不可少的。接下来,让我们深入探讨更专业性进阶课程: 南京大学JYY老师的操作系统课程:课程内容深入且作业繁重,质量与四大课程相当。 MIT的6.S操作系统课程:提供全面的资料、实验(lab)以及课程内容。 CMU的并行计算课程:介绍现代多处理器、CPU加速、分布式通讯协议、GPU加速(CUDA编程)、异构计算、同步和缓存等核心概念。 UCB的cs课程:专注于高性能计算(HPC)的原理和应用。 MIT的分布式系统课程:使用Go语言实现,了解传统分布式系统知识和历史对于现代分布式机器学习系统的学习具有一定的帮助,但并非必需。 在课程之外,还有专门针对机器学习系统的课程: CMU的深度学习系统课程:由陈天奇老师讲授,涵盖神经网络库实现、自动微分、GPU加速、模型部署和AI编译部分内容。课程内容全面,适合有一定基础的学习者阅读或作为参考。 Mini torch:一个用Python实现的简单版本torch,涉及自动微分、张量、GPU加速,适合新手入门。 MIT的Tiny ML课程:针对移动设备和嵌入式系统的课程,感谢@江湖骗子 @Lyken 学长的补充。 此外,还有华为Mindspore团队(我曾在此实习的团队)和一群专家联合推出的课程,涵盖了计算图、编译器前后端、分布式训练等内容,适合有一定基础的学习者阅读或作为工具书使用。微软发起的系统为AI工具书,正在快速迭代更新,补充基础知识。陈天奇老师的AI编译器课程以TVM为基础,是前沿领域的少数课程之一。对于大型模型的学习,理解最新的算法和模型架构变化是非常必要的,虽然很难有系统的课程,但通过阅读论文、官方网站、博客等资源,可以紧跟业界进展。可以参考李沐老师的论文精讲,关注影响力巨大的工作,如“多就是一切”(Muli is all you need)。
对于大规模分布式训练,目前没有非常系统的课程,但了解分布式训练的基本知识、并行策略和显存优化策略等对于学习者至关重要。这里简单总结了几个关键知识点和参考论文。
编程语言方面,Python是首选,但了解如何调用C(如Cpython、pybind)以及Python高级特性(如hook、装饰器)对于ML sys领域很有帮助。CUDA、OpenCL等并行计算技术也是非Nvidia芯片设备(如手机SoC)上进行异构加速的通用方案。
此外,还有一些工具和框架,如TensorRT、AI Template、Severing Triton-inference-server、clip-as-service、Mobile inference等,涵盖了推理引擎、模型服务等不同方面。对于分布式训练,ColossalAI、Megatron-LM、Deepspeed、huggingface accelerate、Bagua等框架提供了不同层次的支持,帮助解决大规模模型训练中的问题。
最后,对于学习者来说,探索源码、实际案例学习是深入理解ML sys领域知识的绝佳途径。此外,编程语言(如C++、Python)、CUDA、OpenCL等并行计算技术、分布式通讯技术以及大型深度学习框架(如TensorFlow、PyTorch)等都是学习的必备知识。同时,了解AI编译器、模型优化技术、系统设计和实现等方面的知识,对于构建高效、可扩展的机器学习系统至关重要。
使用全套开源工具构建 LLM 应用实战:在 Dify 调用 Baichuan 开源模型能力
在当前开源大语言模型的热潮中,许多开发者希望本地部署开源LLM(大型语言模型),用于研究LLM或构建基于开源LLM的应用。笔者也尝试通过开源社区的项目,本地部署服务构建自己的LLM应用。那么,本地部署开源LLM构建聊天应用需要哪些准备呢?本文将详细介绍步骤与工具,包括本地环境准备、大型语言模型、推理服务以及使用开源平台Dify.AI快速构建应用。 本地环境的准备: 为了部署高性能的开源大模型,需要一台配备高性能大显存NVIDIA显卡、大容量高速内存和大容量固态硬盘的本地机器。以Baichuan-chat-B模型为例,建议配置为:i9-K CPU、GTX双卡、GB内存和2TB固态硬盘。 大型语言模型: 大型语言模型是构建应用的基础,不同模型根据预训练数据和任务目标的不同,其结构和知识学习也不同。在Hugging Face等热门AI社区,可以寻找感兴趣的开源LLMs进行尝试和能力对比。 本地部署推理服务: 推理服务将预训练模型加载至本地服务器,提供模型预测接口,支持本地化使用LLM进行NLP任务,无需依赖云服务。使用GitHub上的一流开源项目,如LocalAI、openLLM等,一键部署热门开源模型。 Dify.AI:“LLM操作系统”:使用开源平台Dify.AI,构建基于不同LLM能力的AI应用变得简单。Dify支持快速调用和切换开源模型,包括托管在HuggingFace和Replicate上的所有模型,支持本地部署,通过Xorbits inference推理服务构建AI应用。
以下为实操步骤,从零开始介绍环境配置、安装CUDA、WSL2准备、Docker部署等。 环境准备: 基本的conda和Python环境推荐使用conda管理。首先安装conda,初始化Python3.环境。安装CUDA,推荐从官网直接下载Windows 版本。WSL2环境准备,安装Ubuntu版本并配置代理脚本。安装Docker Desktop,选择使用WSL2,确保WLS和Docker正常运行。配置WSL,安装WSL的CUDA,安装PyTorch。 部署推理服务Xinference: 根据Dify部署文档,Xinference支持多种大型语言模型。选择Xinference部署Baichuan-chat-3B模型。在WSL中安装Xinference基础依赖,并配置模型。启动Xinference并下载部署模型。使用Xinference管理模型查看已部署模型的uid。 部署Dify.AI: 参考Dify官网部署文档,CloneDify源代码,启动Dify,检查容器运行状态。在浏览器访问部署结果。 接入Xinference配置模型供应商: 在Dify设置中填入Xinference模型信息,注意SeverUrl使用局域网IP,获取WSL的IP地址。配置Baichuan-chat模型,创建应用。 后记: 本地部署结合Dify.AI,快速构建基于开源LLM的AI应用成为可能。通过持续迭代和优化,提升应用性能。Dify提供了一个完整的LLM应用技术栈,简化了构建和管理过程,支持数据清洗、标注等服务。LLM应用的场景和能力将进一步丰富,门槛降低。深入 Dify 源码,洞察 Dify RAG 核心机制
深入探究Dify源码,揭示RAG核心机制的关键环节 在对Dify的完整流程有了初步了解后,发现其RAG检索效果在实际部署中不尽如人意。因此,针对私有化部署的Dify,我结合前端配置和实现流程,详细解析了技术细节,旨在帮助调整知识库配置或进行定制化开发。Docker私有化部署技术方案
本文重点聚焦于Dify docker私有化部署的默认技术方案,特别是使用Dify和Xinference的GPU环境部署。若想了解更多,可查阅Dify与Xinference的集成部署教程。RAG核心流程详解
Extractor:负责原始文件内容的提取,主要在api/core/rag/extractor/extract_processor.py中实现。分为Dify默认解析和Unstructured解析,后者可能涉及付费,通常Dify解析更为常用。
Cleaner:清洗解析内容,减少后续处理负担,主要基于规则进行过滤,用户可在前端进行调整。
Splitter:文件分片策略,Dify提供自动和自定义两种,影响检索效果。
Retrieval:Dify支持多种检索模式,包括关键词检索和向量数据库检索,向量库的选择对效果有很大影响。
Rerank:对检索结果进行排序,配置Top K和score阈值,但存在设计上的不足。
总结与优化建议
Dify的RAG服务提供了基础框架,但性能优化空间大。通过调整配置,特别是针对特定业务场景,可以改善检索效果。对RAG效果要求高的用户,可能需要进行定制化的二次开发和优化。