欢迎来到皮皮网网首页

【口袋娃娃机 源码】【gitee查看源码】【捕鱼源码教程】自动微分源码_微分工具

来源:cs1.6 外挂 源码 时间:2024-11-26 04:40:39

1.ML system 入坑指南
2.Pytorch - Module
3.分子动力学DMFF:共建生产级可微分力场计算引擎,自动让复杂力场参数优化不再难
4.PyTorch进阶1:C++扩展
5.锂离子电池电化学模拟开源软件有哪些?微分微分
6.Dive into TensorFlow系列(1)-静态图运行原理

自动微分源码_微分工具

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,涉及自动微分、张量、gitee查看源码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编译器、模型优化技术、系统设计和实现等方面的知识,对于构建高效、可扩展的机器学习系统至关重要。

Pytorch - Module

       本文聚焦于剖析Pytorch的源码,选取了torch.nn.Module作为研究对象。Module作为模型模块的封装父类,负责封装逻辑或模型的一层或多层区块。在Pytorch中,我们只需继承Module并保存模型参数,定义forward方法以实现前向传播,而后向传播则由tensor的自动微分机制处理。

       让我们以多层感知器(MLP)为例,演示如何通过继承nn.Module自定义模型。MLP包含两个子模块:隐藏层和输出层。

       Module内部仅有两个非内部变量:dump_patches和training,前者通常无作用,后者指示模块状态,gdb 源码arm是否处于训练中。其他变量分为三部分:模块信息,用于进行前向和反向的钩子,以及用于生成或加载状态字典的钩子。

       模块信息包含了模型参数(_parameters)、缓存(_buffers 和 _non_persistent_buffers_set)以及内部模块(_modules)。这些信息由Module的__dict__记录,通过重写__getattr__、__setattr__和__delattr__方法访问。

       每个模块拥有的钩子可以分为全局钩子和本地钩子。全局钩子适用于所有模块,主要用于调试;本地钩子仅作用于该模块本身,进行输入、输出和梯度处理,或用于调试目的。

       为保存模块状态,我们还提供了状态字典(state_dict)功能,用于生成或恢复模块的状态信息,其中包含参数、持久状态缓存以及其他额外状态。避免保存值为None的参数和缓存。

       Module中的变量状态保存在训练标志字段training中,它指示模块当前是否处于训练状态。确保在进行推断前使用eval()函数调整dropout和批量归一化层为评估模式,以获得一致的推断结果。

       当模块调用前向、后向函数或各类钩子时,前向与后向过程以及各种钩子则被自动调用。

       Module还具备钩子机制,包含前向、后向处理和状态字典操作。进一步,用户可以指定设备和数据类型迁移模块中的参数与缓存。

分子动力学DMFF:共建生产级可微分力场计算引擎,让复杂力场参数优化不再难

       开发高精度、具备良好迁移性的分子力场模型在微尺度科学计算领域一直是一个核心挑战。近期,DeepModeling社区的开发者们发起了一项名为可微分分子力场(DMFF)的项目,旨在通过可微分编程框架技术打造全新生产级力场计算引擎。该项目旨在解决力场参数优化困难、复杂力场计算等开发过程中的痛点问题。

       项目背景

       准确且高效地描述原子、游戏源码钩子分子、粗粒化粒子间的相互作用是多尺度建模的关键问题。虽然神经网络方法在材料模拟等领域已取得显著成果,但基于物理的分子力场在生物和有机高分子领域仍起着重要作用。然而,力场的开发过程通常局限于“小农作坊”模式,缺乏自动化流程,高度依赖人工干预。新一代力场(如AMOEBA、MPID)的函数形式复杂,力场开发人员往往难以快速验证这些力场在分子动力学(MD)过程中的效果。因此,力场开发严重依赖少数几个课题组或商业公司,速度慢且专业性强。

       区别于传统编程,可微分编程技术使开发者能专注于计算流程,让参数微分和优化任务自动执行。DMFF基于此技术构建,将各种物理力场和模拟计算视为人工智能模型的延伸。通过DMFF,用户可利用第一性原理或实验数据,借助先进机器学习算法反向矫正、优化物理模型参数。这一框架旨在替代手动调参和手动编写MD代码的传统模式,为自动化、可持续的力场开发提供基础。

       项目特点

       DMFF定位为一个适应多场景、具备灵活性和高性能的生产级力场开发解决方案。核心开发者在DP系列方法、分子动力学引擎、高性能优化等领域经验丰富,且深入理解学界和业界的需求。为了实现这一目标,项目希望吸引更多的开发者和感兴趣用户加入,共建可微分力场计算引擎,简化复杂力场参数优化的过程。

       项目结构与使用方式

       DMFF提供源码下载和使用pip安装的功能。它主要由基于OpenMM的“前端”模块和基于可微分编程框架JAX的“后端”组成,设计了用户友好的API,便于用户快速进行力场参数解析和力场计算。通过类似OpenMM的前端API,用户可获得各力场项的计算函数。利用JAX实现自动微分,可方便地计算力(能量关于坐标的负梯度)和力场参数导数。

       案例分析

       DMFF在优化有机小分子电荷模型和水的多极矩可极化力场方面展现出显著效果。通过概念验证,开发者仅使用8轮迭代,便将酯类小分子水合自由能计算值的均方根误差从1. kcal/mol降低至0. kcal/mol。此外,DMFF简化了在先进水模型开发中的参数调优过程,通过自动微分和分子动力学模拟,获得准确的模拟结果。

       未来展望

       DMFF正处于快速迭代发展期,有待完善和探索的领域包括如何进一步优化、扩展功能以及增强与现有力场模型的兼容性。项目鼓励社区成员在GitHub项目中提出问题、参与讨论或提交代码贡献。通过共同努力,DMFF与DeepModeling社区内的其他项目将推动这场力场开发范式的变革,让更多研究者受益于自动化、可持续的力场开发流程。

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模型性能是一种有效策略,尤其是在模型计算密集型场景中,能够显著提升运行效率。通过选择预先构建或即时构建风格,开发者可以根据具体需求和场景灵活选择实现方式。

锂离子电池电化学模拟开源软件有哪些?

       锂离子电池电化学模拟开源软件概述

       锂离子电池的电化学模拟是理解和优化电池设计的关键工具。随着研究的深入,多款开源软件应运而生,旨在通过物理和数学模型精准地模拟电池内部的物理和电化学过程。本文将详细介绍几个主要的开源软件。

       1. TauFactor

       TauFactor是一个基于MatLab的开源应用,专注于利用图像数据高效计算多孔介质的迂曲因子、体积分数、表面积等关键参数。该软件通过松弛有限差分方法计算迂曲因子,适用于现代断层扫描技术获取的大量数据集,计算效率高且不需要高计算能力。其核心功能包括迂曲因子计算、代表性体积单元分析、图形用户界面等。

       2. OpenPNM

       OpenPNM是一个Python源码库,专为多孔介质建模提供现成框架,支持孔隙网络的三维生成和操作。其主要功能包括三维网络生成、网格结构操作、数据保存/导出等。该库已被广泛应用于多孔材料研究领域。

       3. BruggemanEstimator

       BruggemanEstimator是一款用于估算锂离子电池多孔电极迂曲度的开源软件。它基于电极表面和截面照片中的活性物质颗粒取向分布分析,采用理论基础和原理进行计算。用户需要安装Wolfram Mathematica软件或下载CDF文件播放器来运行。

       4. batts3D

       batts3D是一个基于Python的软件库,使用离散元法模拟三维多孔电极的可充放电电化学响应。该软件已扩展了Bruggeman迂曲度关系,可用于模拟颗粒混合物组合的多极体系,并与实验结果一致。

       5. PyBaMM

       PyBaMM是一个使用Python实现的电池数学模型库,支持最先进的自动微分和数值求解器。它能够解决基于物理的电化学模型,如Doyle-Fuller-Newman模型,并具有广泛的模型和参数集。PyBaMM还支持实验指令的模拟,如CCCV或GITT。

       6. Dualfoil 5.0

       原创作者开发的FORTRAN程序,用于模拟锂离子、钠离子和镍金属氢化物电池的电化学过程。

       7. COMSOL Multiphysics

       COMSOL Multiphysics提供了一个完整的仿真环境,包含电池与燃料电池模块,可用于锂离子电池等的建模、仿真和研究。

       8. BatPaC

       Argonne实验室Paul Nelson团队开发的计算电动汽车锂离子电池性能和成本的模型,基于Microsoft Office Excel,具有灵活性和直观性。

       本文概述了锂离子电池电化学模拟领域的几个开源软件,它们在不同层面上支持电池设计和性能分析。随着研究的深入,更多创新工具将持续涌现,推动锂离子电池技术的发展。未来将分享更多学习笔记和资源,包括电池设计过程和相关工具的详细应用。

Dive into TensorFlow系列(1)-静态图运行原理

       接触过TensorFlow v1的朋友都知道,训练一个TF模型有三个步骤:定义输入和模型结构,创建tf.Session实例sess,执行sess.run()启动训练。不管是因为历史遗留代码或是团队保守的建模规范,其实很多算法团队仍在大量使用TF v1进行日常建模。但背后的运行原理大家是否清楚呢?今天让我们一起来探个究竟。

       学习静态图运行原理能干什么?掌握它对我们TF实践中的错误排查、程序定制、性能优化至关重要,是必备的前置知识。

一、何为静态图?

       众所周知,TensorFlow程序有两种运行选择,即静态图模式与动态图模式。

1.1 静态图

       静态图采用声明式编程范式(先编译后执行),根据前端语言(如python)描述的神经网络结构和参数信息构建固定的静成计算图。静态图在执行期间不依赖前端语言,而是由TF框架负责调度执行,因此非常适合做神经网络模型的部署。用户定义的静态图经序列化后用GraphDef表达,其包含的信息有:网络连接、参数设置、损失函数、优化器等。

       有了完整的静态图定义后,TF编译器将计算图转化成IR(中间表示)。初始IR会经TF编译器一系列的转换和优化策略生成等价的计算图。编译器前端转换和优化包括:自动微分、常量折叠、公共子表达式消除;编译器后端与硬件相关,其转换和优化包括:代码指令生成和编译、算子选择、内存分配、内存复用等。

二、Session是干啥的?

2.1 Session定义

       tf.Session代表用户程序和C++运行时之间的连接。一个Session类对象session可以用来访问本机计算设备,也可访问TF分布式运行时环境中的远程设备。session也能缓存tf.Graph信息,使得相同计算逻辑的多次执行得以高效实现。

       tf.Session的构造方法定义如下:我们来看一下__init__()方法的三个参数:

2.2 Session.run()

tf.Session.run()实际是调用tf.BaseSession.run()方法,其函数签名如下:

       run()方法的参数说明如下:当Session指定fetches后,根据要获取的结果决定tf.Graph实际执行的subgraph(并非整个tf.Graph都要执行)。执行静态图还有三个要点:首先我们看一下和用户直接打交道的前端Session,具体分为普通Session和交互式InteractiveSession。前者全称为tf.Session,需要在启动之前先构建完整的计算图;后者全称为tf.InteractiveSession,它是先构建一个session,然后再定义各种操作,适用于shell和IPython等交互式环境。这两个类均继承自BaseSession,这个基类实现了整个生命周期的所有会话逻辑(相关代码在tensorflow/python/client/session.py中)。前端Session类的继承关系如下图:

       TensorFlow后端会根据前端tf.Session(target='', graph=None, config=None)创建时指定的target来创建不同的后端Session。target是要连接的TF后端执行引擎,默认为空字符串。后端Session的创建采用抽象工厂模式,如果为空字符串,则创建本地DirectionSession;如果是grpc://开头的URL串,则创建分布式GrpcSession。

三、静态图执行过程

       为便于大家理解,我们先给出粗粒度的静态图执行原理如下:静态图的实际执行过程要比上文描述的复杂得多。由于本篇的初衷不是做源码的完整剖析,因此我们仅就Client向Master的处理过程做详细说明,旨在让读者亲身体会一下交互过程的复杂性。Client创建GrpcSession,控制Client会话的生命周期;Master运行时被MasterSession控制。GrpcSession通过抽象工厂模式得到,首先得到工厂类GrpcSessionFactory的对象,并用SessionFactory句柄factory存储。然后通过factory的多态方法生成GrpcSession,如果target为grpc://的话。Master本质上是一个Server,每个Server均有一个MasterService和一个WorkerService。Client通过GrpcSession调用Master节点的MasterService,这个过程需借助MasterInterface才可完成。MasterInterface用来和MasterService进行通信,它有两种不同的场景实现:如果读者想对上述过程做更为深入的了解,可以参考关键类的源码。

四、总结

       作为Dive into TensorFlow系列第一讲,本文由浅入深、系统讲解了静态图及其运行原理,以及支撑这些功能的架构设计与部分源码解析。回到文章开头提到的用户读懂全文能有什么收益?(尝试提几点)

       参考文献:

Graphs and Sessions:github.com/tensorflow/d... 《机器学习系统:设计与实现》:openmlsys.github.io/cha... 前后端连接的桥梁Session:likecs.com/show-... TensorFlow v1..5源码:github.com/tensorflow/t... TensorFlow Architecture:github.com/tensorflow/d... TensorFlow分布式环境Session:cnblogs.com/rossiXYZ/p...