【多端外卖系统源码】【水质指标源码】【伊春软件源码】autograd源码

2024-12-23 07:19:00 来源:免费棋牌源码搭建 分类:休闲

1.PyTorch源码学习系列 - 2. Tensor
2.3d稀疏卷积——spconv源码剖析(五)
3.PyTorch进阶1:C++扩展

autograd源码

PyTorch源码学习系列 - 2. Tensor

       本系列文章同步发布于微信公众号小飞怪兽屋及知乎专栏PyTorch源码学习-知乎(zhihu.com),源码欢迎关注。源码

       若问初学者接触PyTorch应从何学起,源码答案非神经网络(NN)或自动求导系统(Autograd)莫属,源码而是源码看似平凡却无所不在的张量(Tensor)。正如编程初学者在控制台输出“Hello World”一样,源码多端外卖系统源码Tensor是源码PyTorch的“Hello World”,每个初学者接触PyTorch时,源码都通过torch.tensor函数创建自己的源码Tensor。

       编写上述代码时,源码我们已步入PyTorch的源码宏观世界,利用其函数创建Tensor对象。源码然而,源码Tensor是源码如何创建、存储、源码设计的?今天,让我们深入探究Tensor的微观世界。

       Tensor是水质指标源码什么?从数学角度看,Tensor本质上是多维向量。在数学里,数称为标量,一维数据称为向量,二维数据称为矩阵,三维及以上数据统称为张量。维度是衡量事物的方式,例如时间是一种维度,销售额相对于时间的关系可视为一维Tensor。Tensor用于表示多维数据,在不同场景下具有不同的物理含义。

       如何存储Tensor?在计算机中,程序代码、数据和生成数据都需要加载到内存。存储Tensor的物理媒介是内存(GPU上是显存),内存是一块可供寻址的存储单元。设计Tensor存储方案时,伊春软件源码需要先了解其特性,如数组。创建数组时,会向内存申请一块指定大小的连续存储空间,这正是PyTorch中Strided Tensor的存储方式。

       PyTorch引入了步伐(Stride)的概念,表示逻辑索引的相对距离。例如,一个二维矩阵的Stride是一个大小为2的一维向量。Stride用于快速计算元素的物理地址,类似于C/C++中的多级指针寻址方式。Tensor支持Python切片操作,因此PyTorch引入视图概念,使所有Tensor视图共享同一内存空间,提高程序运行效率并减少内存空间浪费。

       PyTorch将Tensor的物理存储抽象成一个Storage类,与逻辑表示类Tensor解耦,webpage源码泄露建立Tensor视图和物理存储Storage之间多对一的联系。Storage是声明类,具体实现在实现类StorageImpl中。StorageImp有两个核心成员:Storage和StorageImpl。

       PyTorch的Tensor不仅用Storage类管理物理存储,还在Tensor中定义了很多相关元信息,如size、stride和dtype,这些信息都存在TensorImpl类中的sizes_and_strides_和data_type_中。key_set_保存PyTorch对Tensor的layout、device和dtype相关的调度信息。

       PyTorch创建了一个TensorBody.h的模板文件,在该文件中创建了一个继承基类TensorBase的类Tensor。TensorBase基类封装了所有与Tensor存储相关的细节。在类Tensor中,PyTorch使用代码自动生成工具将aten/src/ATen/native/native_functions.yaml中声明的函数替换此处的宏${ tensor_method_declarations}

       Python中的Tensor继承于基类_TensorBase,该类是野牛指标源码用Python C API绑定的一个C++类。THPVariable_initModule函数除了声明一个_TensorBase Python类之外,还通过torch::autograd::initTorchFunctions(module)函数声明Python Tensor相关的函数。

       torch.Tensor会调用C++的THPVariable_tensor函数,该函数在文件torch/csrc/autograd/python_torch_functions_manual.cpp中。在经过一系列参数检测之后,在函数结束之前调用了torch::utils::tensor_ctor函数。

       torch::utils::tensor_ctor在文件torch/csrc/utils/tensor_new.cpp中,该文件包含了创建Tensor的一些工具函数。在该函数中调用了internal_new_from_data函数创建Tensor。

       recursive_store函数的核心在于

       Tensor创建后,我们需要通过函数或方法对其进行操作。Tensor的方法主要通过torch::autograd::variable_methods和extra_methods两个对象初始化。Tensor的函数则是通过initTorchFunctions初始化,调用gatherTorchFunctions来初始化函数,主要分为两种函数:内置函数和自定义函数。

3d稀疏卷积——spconv源码剖析(五)

       介绍在构建的Rulebook指导下执行特定的稀疏卷积计算,关注于类SparseConvolution,其代码位于spconv/conv.py。

       Fsp.indice_subm_conv和Fsp.indice_conv经过spconv/functional.py中的SubMConvFunction和SparseConvFunction对象转换,最终会调用spconv/ops.py模块中的indice_conv等函数。

       专注于子流线卷积接口:indice_subm_conv,其代码位于spconv/functional.py。

       通过Python接口调用底层C++函数可能不够直观,因此使用torch.autograd.Function封装算子底层调用,该类表示PyTorch中的可导函数,具备前向推理和反向传播实现时,即可作为普通PyTorch函数使用。

       值得注意的是,Function类在模型部署中具有优势,若定义了symbolic静态方法,此Function在执行torch.onnx.export()时,可依据symbolic定义规则转换为ONNX算子。

       apply方法是torch.autograd.Function的一部分,此方法负责在前向推理或反向传播时的调度工作。通过将indice_subm_conv = SubMConvFunction.apply简化为indice_subm_conv接口,简化了算子使用,屏蔽了SubMConvFunction的具体实现。

       SubMConvFunction的前向传播方法forward调用spconv/ops.py的indice_conv函数。在src/spconv/all.cc文件中,通过PyTorch提供的OP Register对底层C++API进行注册。

       通过torch.ops.load_library加载.so文件,使用torch.ops.spconv.indice_conv调用src/spconv/spconv_ops.cc文件中的indiceConv函数。

       深入探索src/spconv/spconv_ops.cc文件中的indiceConv函数。

       代写部分代码内容...

PyTorch进阶1:C++扩展

       本文介绍如何使用C++扩展来优化PyTorch模型性能,以实现LLTM(Long-Long-Term-Memory)循环单元为例。通过自定义扩展,可以显著提升模型在Python解释器和CUDA核心加载方面的效率。

       实现LLTM模型时,直接通过PyTorch的Module或Function实现前向传播可能已足够,但为了进一步优化性能,可以使用C++或CUDA重写关键部分。C++扩展有预先构建和即时构建两种风格。

       预先构建风格通过setuptools的setup.py脚本完成,简化了配置和管理混合C++/CUDA扩展的编译流程。预先构建风格在编译时完成所有步骤,适用于模型优化中需要频繁调用的特定操作。

       即时构建则通过torch.utils.cpp_extension.load()函数实现,提供了一种简便的编译和加载扩展方法,无需维护单独的构建文件。即时构建在首次运行时可能需要额外时间来编译扩展,但后续加载速度较快,尤其当源码未改变时。

       在实现C++操作时,关键在于编写前向传播和反向传播函数。反向传播函数通常需要额外实现,以计算损失关于每个输入的导数。这些函数被整合进torch.autograd.Function以创建Python绑定。

       绑定C++扩展到Python使用pybind,确保了Python和C++代码之间的无缝交互。设置目录结构和导入torch库后,将C++扩展导入PyTorch,从而能够从Python调用C++函数。

       性能对比方面,C++版本相较于纯Python实现展现出显著加速,尤其是在前向传播环节。反向传播的加速效果可能不明显,但整体上,PyTorch的自动微分引擎通过C++实现,提供高效的操作流。

       在GPU设备上,通过CUDA张量实现性能提升更为明显。ATen后端的设备抽象特性使得同样的代码能够在CPU和GPU上运行,并利用GPU优化的实现加速关键操作。对于大规模计算,利用CUDA核心编写特定的核心代码可以进一步提升性能。

       总的来说,使用C++扩展优化PyTorch模型性能是一种有效策略,尤其是在模型计算密集型场景中,能够显著提升运行效率。通过选择预先构建或即时构建风格,开发者可以根据具体需求和场景灵活选择实现方式。

更多资讯请点击:休闲

推荐资讯

天津南开区市场监管局对乱涨价药店罚款50万元

中国消费者报天津讯记者 万晓东)近日,天津市南开区市场监管局对一药店销售口罩两次涨价的违法行为作出罚款50万元的决定。据悉,天津市南开区市场监管综合行政执法支队的执法人员在对辖区的一家药店检查时,发现