1.PyTorch ResNet 使用与源码解析
2.Python语言学习(三):Tensorflow_gpu搭建及convlstm核心源码解读
3.极智开发 | ubuntu源码编译gpu版ffmpeg
4.游戏引擎随笔 0x20:UE5 Nanite 源码解析之渲染篇:BVH 与 Cluster 的分分析 Culling
5.图解大模型训练之:Megatron源码解读2,模型并行
6.3d稀疏卷积——spconv源码剖析(三)
PyTorch ResNet 使用与源码解析
在PyTorch中,析源我们可以通过torchvision.model库轻松使用预训练的工具图像分类模型,如ResNet。分分析本文将重点讲解ResNet的析源使用和源码解析。模型介绍与ResNet应用
torchvision.model库提供了多种预训练模型,工具redisdb源码教程包括ResNet,分分析其特点是析源层深度的残差网络。首先,工具我们需要加载预训练的分分析模型参数: 模型加载代码: 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中的应用有所帮助。如果你从中受益,别忘了分享或支持作者继续创作。Python语言学习(三):Tensorflow_gpu搭建及convlstm核心源码解读
在探索深度学习领域,使用Python语言进行编程无疑是一条高效且灵活的途径。尤其在科研工作或项目实施中,Python以其丰富的库资源和简单易用的特性,成为了许多专业人士的首选。本文旨在分享在Windows系统下使用Anaconda搭建TensorFlow_gpu环境及解读ConvLSTM核心源码的过程。在提供具体步骤的同时,也期待读者的反馈,以持续改进内容。
为了在Windows系统下搭建适合研究或项目的TensorFlow_gpu环境,首先需要确认TensorFlow_gpu版本及其对应的cuDNN和CUDA版本。访问相关网站,以获取适合自身硬件配置的粉丝平台源码版本信息。以TensorFlow_gpu2.为例,进行环境搭建。
在Anaconda环境下,通过命令行操作来创建并激活特定环境,如`tensorflow-gpu`环境,选择Python3.版本。接着,安装cuDNN8.1和CUDA.2。推荐使用特定命令确保安装过程顺利,亲测有效。随后,使用清华镜像源安装TensorFlow_gpu=2..0。激活虚拟环境后,使用Python环境验证安装成功,通常通过特定命令检查GPU版本是否正确。
为了在Jupyter Notebook中利用该环境,需要安装ipykernel,并将环境写入notebook的kernel中。激活虚拟环境并打开Jupyter Notebook,通过命令确保内核安装成功。
对于ConvLSTM核心源码的解读,重点在于理解模型的构建与参数设置。模型核心代码通常包括输入数据维度、模型结构、超参数配置等。以官方样例为例,构建模型时需关注样本整理、标签设置、卷积核数量等关键参数。例如,输入数据维度为(None,,,1),输出数据维度为(None,None,,,Qcolordialog类源码)。通过返回序列设置,可以控制模型输出的形态,是返回单个时间步的输出还是整个输出序列。
在模型改造中,将彩色图像预测作为目标,需要调整模型的最后层参数,如将`return_sequence`参数更改为`False`,同时将`Conv3D`层修改为`Conv2D`层以适应预测彩色图像的需求。此外,选择合适的损失函数(如MAE)、优化器(如Adam)以及设置Metrics(如MAE)以便在训练过程中监控模型性能。
通过上述步骤,不仅能够搭建出适合特定研究或项目需求的TensorFlow_gpu环境,还能够深入理解并灵活应用ConvLSTM模型。希望本文内容能够为读者提供有价值的指导,并期待在后续过程中持续改进和完善。
极智开发 | ubuntu源码编译gpu版ffmpeg
欢迎访问极智视界公众号,获取更多深入的编程知识与实战经验分享。
本文将带你了解在 Ubuntu 系统中,如何进行源码编译,获得 GPU 加速版本的 FFmpeg 工具。
FFmpeg 是一款功能强大的音视频处理工具,支持多种格式的音视频文件,并提供了丰富的命令行工具和库,允许开发者在 C 语言或其他编程语言中进行音视频处理。
然而,FFmpeg 本身并不具备 GPU 加速功能。通过集成 CUDA SDK、OpenCL 或 Vulkan 等第三方库,能够实现 FFmpeg 的 GPU 加速,显著提升处理速度和性能。
在本文中,我们将重点介绍如何在 Ubuntu 系统中编译 GPU 加速版本的 FFmpeg。
首先,确保已安装 nv-codec-hearers,这是 NVIDIA 提供的 SDK,用于在 GPU 上加速 FFmpeg 的qq群聊源码操作。
接下来,安装 FFmpeg 编码库和相关依赖,完成 FFmpeg 的编译配置。
最后,运行编译命令,检查 FFmpeg 是否成功安装并验证 GPU 加速功能。
至此,GPU 加速版本的 FFmpeg 已成功编译和安装,能够为你在音视频处理任务中带来显著性能提升。
通过极智视界公众号,获得更多有关人工智能、深度学习的前沿技术与实用知识,欢迎加入知识星球,获取丰富的资源与项目源码,共同探索 AI 领域的无限可能。
游戏引擎随笔 0x:UE5 Nanite 源码解析之渲染篇:BVH 与 Cluster 的 Culling
Nanite遵循的设计理念是三角形的绘制数量超过像素数量就是一种浪费。UE5中的Nanite技术在EA版本发布后揭开了面纱,其渲染性能令人惊叹,本文尝试从源码层面解析Nanite的实现技术,详细讲解Nanite的实现细节,以供开发者参考。
Nanite在GPU端流程如下:
1. **Nanite::Streaming**:异步上传Cluster渲染数据,基于上一帧回读的Cluster Page Request数据进行。
2. **Nanite::InitContext**:初始化Culling上下文的GPU相关数据。
3. **Nanite::CullRasterize**:执行剔除与光栅化,包含生成深度目标、执行基础渲染以及生成阴影等步骤。
4. **Nanite::EmitDepthTargets**:根据Visibility Buffer生成深度相关的Buffer,如Scene Depth、Stencil、Velocity、Material Depth等。
5. **Nanite::BasePass**:使用Visibility Buffer和Cluster相关Buffer输出Deferred Rendering所需的G-Buffer。
6. **Nanite Shadows**:生成阴影所需的深度信息,仅包含InitContext和CullRasterize两步。
7. **Nanite::Readback**:回读PersistentCull pass产生的Cluster Page Request数据。
本文重点解析CullRasterize步骤中的PersistentCull pass源码。
为了在GPU上高效执行Culling,qqweb协议源码Nanite预生成了BVH(Bounding Volume Hierarchy),每个节点最多包含8个子节点,叶节点存储实际的Cluster索引数据。但要在GPU中实现高效的层次遍历且负载均衡并非易事,设计的不合理会导致性能下降、GPU线程闲置。
UE5的Nanite在GPU端实现了一种高效的遍历机制,性能高且负载均衡,GPU在整个过程中几乎满负荷运行。BVH和Cluster数据结构与存储方式都围绕着高效遍历和负载均衡的目标设计。
**关键Buffers数据结构**:
- **CandidateNodesAndClusters**:存储候选BVH Node和Cluster信息的全局Buffer,内存布局包括待处理的Cluster Group总数、所有候选Cluster Packed数据和所有候选BVH Node Packed数据。
- **MainAndPostPassPersistentStates**:存储Culling过程中的状态数据,包括用于写入BVH Node的读写偏移、Cluster读写偏移等。
- **InstanceCull**:执行对象实例级别的可见剔除,将可见的BVH Root Node存储在CandidateNodesAndClusters中。
- **PersistentClusterCull**:充分利用GPU线程,避免空闲,分为Node和Cluster处理两个阶段,通过组内线程同步和多线程并行处理,实现负载均衡。
**BVH Node Culling解析**:
1. 每组线程计算需要处理的候选BVH节点,通过原子操作统计有效节点数量,并在处理完成时切换至Cluster Culling。
2. 通过组内线程索引计算节点和子节点的索引,执行子节点的Culling处理,同时通过队列管理新产生的候选节点。
3. 优化候选Cluster存储,减少GPU Buffer写入开销。
**Cluster Culling解析**:
1. 处理存储在队列中的候选Cluster,通过编码和同步机制查找需要处理的Cluster。
2. 执行真正的Culling逻辑,包括可见性判断、硬件或软件光栅化等。
3. 将可见的Cluster写入全局缓冲,根据光栅化类型顺序存储,并在Post Pass中再次执行Culling流程。
解析至此,UE5的Nanite技术通过高效的GPU算法和数据结构实现了强大的渲染性能,使得百万面的高精度模型在老显卡上也能实现流畅运行。UE5团队的设计与工程实现能力令人敬佩,其精神和勇气引领了行业技术的前沿。通过深入源码学习,开发者可以深入了解先进的设计思想和工程实现方法,提升自己的技术实力。
图解大模型训练之:Megatron源码解读2,模型并行
源码解读系列将深入探讨Megatron的预训练部分代码,聚焦于模型并行策略。在上一篇文章中,我们详细介绍了如何在分布式环境中初始化模型,包括按照DP/TP/PP对进程进行分组,并为每个进程分配GPU。接下来,我们将探索如何将模型进行切分,并将其整合到分布式环境定义好的DP/TP/PP组中。
在Megatron中,通过预先设定的DP/TP/PP组,我们能够将模型进行有效的切割。这种切割方法既考虑了模型的并行性,又兼顾了内存和计算资源的优化。为了实现这一目标,我们需要在CPU上定义并初始化模型,然后将其搬运到当前进程所对应的GPU上。
模型切割的核心思想是面向进程编程,这意味着我们的脚本处理的是发生在单个进程上的任务。这样做的好处是,我们只需维护一份脚本,然后将其部署到不同机器的GPU上执行,从而实现全局并行计算。然而,每个进程处理的模型部分不同,比如在GPT模型中,预处理层涉及词嵌入计算,而后续层则涉及到softmax和损失函数的计算。为了解决模型差异性问题,我们可以通过进程ID来控制随机种子的设定,确保模型初始化的一致性。
在分布式训练中,随机种子的设定至关重要,它直接影响到模型的复现性。例如,当我们采用激活检查点技术来节省内存时,在反向传播过程中需要重新计算前向传播得到的激活值,此时就需要确保模型能够完全复现前向过程的初始化结果。通过设定不同的随机种子,我们能够确保每个模型部分在切割后仍能保持初始化的独立性和一致性。
在模型切割部分,我们有两种主要的初始化方式:先进行整体初始化再进行切割(称为“CPU上的初始化”),以及直接在GPU上进行局部初始化(称为“在GPU上的初始化”)。这两种方式的核心区别在于随机种子的设定策略。正确选择随机种子的策略,对于确保模型的复现性至关重要。
模型并行框架在Megatron中通过预定义的函数实现,例如在megatron/training.py中的pretrain函数。这个函数作为模型并行的入口,主要包含了模型架构定义、模型切割、设置优化器和学习率调整等关键步骤。在具体实现中,模型切割主要通过定义预处理层(pre_process)和后处理层(post_process)来完成,这有助于确保模型切割后首尾层和中间层的架构一致性。
在分布式模型中,如CodeGeeX,模型的切割遵循特定的策略,以确保模型在不同GPU上的并行执行。每个进程对应模型的一部分,通过AllReduce操作确保模型输出的完整性,以便下一层能够接收正确的输入。同时,每个进程负责独立计算模型的一部分,从而实现高效的并行处理。
在Megatron中,模型切割部分涉及到一系列的类定义和函数实现,包括MegatronModule、Embedding、VocabParallelEmbedding、ParallelSelfAttention等。这些类和函数在模型切割、并行层和交叉熵计算等方面发挥着关键作用。例如,MegatronModule类确保了模型的输入和输出层共用词嵌入,以满足特定的并行要求。同时,模型中的注意力层(如ParallelSelfAttention)通过“列切割”和“行切割”策略实现高效的并行计算。
模型的最后一层,即交叉熵的计算,同样通过类定义实现。在Megatron中,交叉熵计算通过平行化处理来优化内存使用和加速计算。通过将计算逻辑进行精简和优化,Megatron能够实现高效的并行交叉熵计算,以满足大规模模型训练的需求。
总之,Megatron的模型并行策略通过一系列的代码实现,旨在优化大规模模型的训练过程,提高计算效率和资源利用。通过合理地切割模型、设置随机种子、实现并行层和交叉熵计算,Megatron能够在分布式环境中实现高效、稳定的模型训练。
3d稀疏卷积——spconv源码剖析(三)
构建Rulebook
下面看ops.get_indice_pairs,位于:spconv/ops.py
构建Rulebook由ops.get_indice_pairs接口完成
get_indice_pairs函数具体实现:
主要就是完成了一些参数的校验和预处理。首先,对于3d普通稀疏卷积,根据输入shape大小,kernel size,stride等参数计算出输出输出shape,子流行稀疏卷积就不必计算了,输出shape和输入shape一样大小
准备好参数之后就进入最核心的get_indice_pairs函数。因为spconv通过torch.ops.load_library加载.so文件注册,所以这里通torch.ops.spconv.get_indice_pairs这种方式来调用该函数。
算子注册:在src/spconv/all.cc文件中通过Pytorch提供的OP Register(算子注册的方式)对底层c++ api进行了注册,可以python接口形式调用c++算子
同C++ extension方式一样,OP Register也是Pytorch提供的一种底层扩展算子注册的方式。注册的算子可以通过 torch.xxx或者 tensor.xxx的方式进行调用,该方式同样与pytorch源码解耦,增加和修改算子不需要重新编译pytorch源码。用该方式注册一个新的算子,流程非常简单:先编写C++相关的算子实现,然后通过pytorch底层的注册接口(torch::RegisterOperators),将该算子注册即可。
构建Rulebook实际通过python接口get_indice_pairs调用src/spconv/spconv_ops.cc文件种的getIndicePairs函数
代码位于:src/spconv/spconv_ops.cc
分析getIndicePairs直接将重心锁定在GPU逻辑部分,并且子流行3d稀疏卷积和正常3d稀疏卷积分开讨论,优先子流行3d稀疏卷积。
代码中最重要的3个变量分别为:indicePairs,indiceNum和gridOut,其建立过程如下:
indicePairs代表了稀疏卷积输入输出的映射规则,即Input Hash Table 和 Output Hash Table。这里分配理论最大的内存,它的shape为{ 2,kernelVolume,numAct},2表示输入和输出两个方向,kernelVolume为卷积核的volume size。例如一个3x3x3的卷积核,其volume size就是(3*3*3)。numAct表示输入有效(active)特征的数量。indiceNum用于保存卷积核每一个位置上的总的计算的次数,indiceNum对应中的count
代码中关于gpu建立rulebook调用create_submconv_indice_pair_cuda函数来完成,下面具体分析下create_submconv_indice_pair_cuda函数
子流线稀疏卷积
子流线稀疏卷积是调用create_submconv_indice_pair_cuda函数来构建rulebook
在create_submconv_indice_pair_cuda大可不必深究以下动态分发机制的运行原理。
直接将重心锁定在核函数:
prepareSubMGridKernel核函数中grid_size和block_size实则都是用的整形变量。其中block_size为tv::cuda::CUDA_NUM_THREADS,在include/tensorview/cuda_utils.h文件中定义,大小为。而grid_size大小通过tv::cuda::getBlocks(numActIn)计算得到,其中numActIn表示有效(active)输入数据的数量。
prepareSubMGridKernel作用:建立输出张量坐标(通过index表示)到输出序号之间的一张哈希表
见:include/spconv/indice.cu.h
这里计算index换了一种模板加递归的写法,看起来比较复杂而已。令:new_indicesIn = indicesIn.data(),可以推导得出index为:
ArrayIndexRowMajor位于include/tensorview/tensorview.h,其递归调用写法如下:
接着看核函数getSubMIndicePairsKernel3:
位于:include/spconv/indice.cu.h
看:
上述写法类似我们函数中常见的循环的写法,具体可以查看include/tensorview/kernel_utils.h
NumILP按默认值等于1的话,其stride也是gridDim.x*blockDim.x。索引最大值要小于该线程块的线程上限索引blockDim.x * gridDim.x,功能与下面代码类似:
参考: blog.csdn.net/ChuiGeDaQ...
Pytorch之Dataparallel源码解析
深入解析Pytorch之Dataparallel源码
在深入理解Dataparallel原理之前,需要明白它的使用场景和目的。Dataparallel设计用于在多GPU环境下并行处理数据,提高模型训练效率。
初始化阶段,Dataparallel需要实例化一个模型。这一步中,模型的参数会被复制到所有可用的GPU上,从而实现并行计算。
在前向传播阶段,Dataparallel的核心作用体现出来。它会将输入数据分割成多个小批次,然后分别发送到各个GPU上。在每个GPU上执行前向传播操作后,结果会被收集并汇总。这样,即便模型在多GPU上运行,输出结果也如同在单GPU上运行一样。
具体实现中,Dataparallel会利用Python的多重继承和数据并行策略。它继承自nn.Module,同时调用nn.DataParallel的构造函数,从而实现并行计算。
对于那些需要在GPU间共享的状态或变量,Dataparallel还提供了相应的管理机制,确保数据的一致性和计算的正确性。这样的设计使得模型能够高效地在多GPU环境下运行,同时保持代码的简洁性和易读性。
总结而言,Dataparallel通过分割数据、并行执行前向传播和收集结果的机制,实现了高效的数据并行训练。理解其源码有助于开发者更好地利用多GPU资源,提升模型训练效率。