摘要: 手搓自动微分 不同于符号微分、手动微分和差分法,自动微分方法有着使用简单、计算精度较高、性能较好等优势,因此在各大深度学习框架中得到了广泛的应用。虽然每个框架所使用的自动微分的原理不尽相同,但大致都是基于链式法则计算结合图计算的一些优化。如果是自己动手来手搓一个自动微分框架的话,大致就只能实现一下一阶的链式法则的自动微分。 阅读全文
posted @ 2024-04-18 15:59 DECHIN 阅读(162) 评论(0) 推荐(0) 编辑
摘要: 直方图与核密度估计 核密度估计(KDE)方法,相当于用多个波包的组合形式来近似一个真实的概率密度,以获得一个连续可微分的概率密度函数。本文通过一些简单的概率分布的示例,演示了一下KDE的使用方法。其实KDE的思想在很多领域都会以不同的形式出现,是一个比较基础的概率分布近似手段。 阅读全文
posted @ 2024-04-17 17:18 DECHIN 阅读(160) 评论(0) 推荐(0) 编辑
摘要: Tkinter常用功能示例(一) 本文主要介绍一些Python的Tkinter GUI框架的常用功能模块,包含基本窗口的创建、菜单栏、文本框、TreeView、按钮、滚动条、标签的设定等,另外包含了一些面向对象的GUI的简单示例。总的来说,Tkinter加上第三方的ttk,基本的GUI功能是都具备的,可以用来实现一些简单的小项目。对于大的项目来说,用PyQT/QT可能会是一个更加专业的选择。 阅读全文
posted @ 2024-04-16 11:27 DECHIN 阅读(163) 评论(0) 推荐(0) 编辑
摘要: MindSpore运行报错RuntimeError: Unsupported device target GPU解决方案 本文主要介绍了一个关于MindSpore运行报错RuntimeError的解决方案。这个报错的内容提示信息说的是安装完成MindSpore之后,找不到GPU的CUDA环境,只能使用CPU运行环境。出现这个报错是因为手动编译安装MindSpore之后,需要配置一些环境变量。而如果是使用pip或者conda安装mindspore的话,会自动的识别到CUDA环境并添加到环境变量中去。因此,解决这个报错,我们只需要把相关的CUDA环境路径添加到环境变量中即可。 阅读全文
posted @ 2024-04-15 14:37 DECHIN 阅读(17) 评论(0) 推荐(0) 编辑
摘要: 基于QUBO模型的多体分子对接 本文主要分享了文献Multibody molecular docking on a quantum annealer中的主要建模思路和初步的测试结果,可以实现QUBO模型求解多体分子对接的问题。在目前常见的分子对接软件中,更多的是实现的两体对接,多体对接的采样空间有可能会随着分子数量的增长而指数增长。而借助于量子退火机或者是量子计算机来求解这样的一个问题,不失为一个较好的思路。 阅读全文
posted @ 2024-04-12 10:19 DECHIN 阅读(150) 评论(0) 推荐(1) 编辑
摘要: MindSpore编译构建后Vmap模块的RuntimeError问题 在MindSpore编译计算图的过程中,会把从编译构建好的whl包中引入的模块视为第三方库,也就没有办法在即时编译的阶段入图。普通的math和numpy等第三方库不入图也不会影响计算。但如果是基于MindSpore本身开发的一些函数,如果用到了Jit、Grad和Vmap,那么有可能出现无法入图的问题,就会出现RuntimeError报错。解决方法就是设置一个跟即时编译有关的环境变量,把相关的第三方包引用修改为内部引用。 阅读全文
posted @ 2024-04-11 10:24 DECHIN 阅读(97) 评论(0) 推荐(0) 编辑
摘要: 单精度浮点数计算误差与消减方法 在使用浮点数计算时,尤其是在使用AI框架的过程中,我们往往使用的是float32单精度浮点数,这也跟GPU的硬件架构有关系。但是使用单精度浮点数的过程中,务必要考虑到累加误差和大数吃小数的问题,这两个问题在长时间的迭代过程中,有可能会直接导致计算结果就是错误的。而如果在计算的过程中使用Kahan求和公式,则可以避免这种大数吃小数的问题。Kahan求和公式的本质,就是把大数和小数分开进行计算,这样可以一定程度上达到接近于float64双精度浮点数的运算精度。 阅读全文
posted @ 2024-04-10 16:54 DECHIN 阅读(189) 评论(2) 推荐(2) 编辑
摘要: MindSpore自动微分小技巧 不同于符号微分和手动微分,基于链式法则的自动微分不仅有极高的速度,还不需要去手动推导微分,在深度学习领域有非常广泛的应用。本文主要通过几个案例,分别介绍了一下在MindSpore深度学习框架中,如何使用grad函数和GradOperation类,分别对函数和类进行自动微分计算。 阅读全文
posted @ 2024-04-09 17:31 DECHIN 阅读(118) 评论(0) 推荐(0) 编辑
摘要: IPython刷新函数模块 在IPython中或者Jupyter Notebook中,一个函数被加载以后,如果这个函数或者模块的主体被修改了,那么就算是在IPython中重新Import一次,在程序执行中也只是去加载内存中的模块,而不是我们修改之后的内容。而IPython支持了一些魔术命令配置,其中autoreload这个魔术命令可以允许我们去配置是否需要重载函数模块。其中不仅包含通用性的全局配置,还支持指向性的配置方法。 阅读全文
posted @ 2024-03-25 09:47 DECHIN 阅读(93) 评论(0) 推荐(0) 编辑
摘要: MindSponge分子动力学模拟——自建力场(2024.03) 基于力场的分子动力学模拟,其实可以看做是一个最简单的机器学习模型,具有计算成本低的特点,在药物研发、生物化学和计算物理学等研究领域存在广泛的应用。那么,如何去快速的开发一个新的力场,在传统的MD模拟软件中其实可能是一个不小的门槛,而基于MindSpore框架开发的MindSponge分子动力学模拟软件,则具有这种便捷开发的特性。本文通过一个简单的示例,介绍了如何在MindSponge分子动力学模拟框架内构建一个自定义的分子力场,可以正常的执行分子动力学模拟迭代过程并保存相应的结果和输出。 阅读全文
posted @ 2024-03-22 17:46 DECHIN 阅读(132) 评论(0) 推荐(0) 编辑
摘要: MindSpore报错处理:TypeError: For 'set_context', the parameter device_id can not be set repeatedly, origin value [0] has been in effect. 本文主要介绍了一个在使用MindSpore框架进行编程的时候遇到的一个小问题--重复设定运算设备的编号。之所以会出现这个问题,是因为在调用的包里面有对MindSpore的引用,里面还包含了一些基于MindSpore的运算和即时编译,因此如果不给定设备编号的话,MindSpore内部会默认分配一个设备编号。而如果我们在自己的测试案例中又希望指定一个设备编号,那么就要把这个set_context句柄放在引用的最前面。 阅读全文
posted @ 2024-03-22 10:13 DECHIN 阅读(20) 评论(0) 推荐(0) 编辑
摘要: MindSpore自定义算子中的张量维度问题 当我们使用GPU进行快速运算时,虽然可以用成熟的深度学习框架如MindSpore和PyTorch等进行实现,但其实从速度上来说,最快不过直接使用C/C++的CUDA来实现。也正是因为如此,在MindSpore框架中支持了对CUDA实现的算子的直接调用,只是在格式规范上有一定的要求。本文主要介绍MindSpore调用本地CUDA算子的一些规范化和技巧。 阅读全文
posted @ 2024-03-12 16:32 DECHIN 阅读(118) 评论(0) 推荐(0) 编辑
摘要: Python定位函数定义地址 Python众多的第三方库,为我们的日常代码开发带来了极大的便利性,同时在开发过程中也需要注意这样的一个问题:开发的代码中有些命名可能跟第三方库冲突,例如本文介绍的基于MindSpore框架开发的过程中,定义一个本地的Cell类之后,发现本地的函数get_parameters跟Cell类本身的get_parameters冲突,因此可以使用Python的内置函数__code__对冲突函数的地址进行定位,然后进行修改。 阅读全文
posted @ 2024-03-11 15:52 DECHIN 阅读(21) 评论(0) 推荐(0) 编辑
摘要: 将MindSpore运行结果输出到log文件 在Linux运行程序时,正确输出和错误输出会分成两条路线分别输出到不同的位置,默认输出是将两者按照顺序分别输出到屏幕上,而我们也可以通过设定将二者按照顺序输出到一个指定的log文件中。同时为了避免受到窗口交互的影响,我们可以使用Linux挂起的方式来运行一个程序,这样我们既不用担心任务被中断,也可以同时不断的通过log文件内容来查看任务的运行情况,还可以通过ps指令来查看任务进程运行的时长等信息。 阅读全文
posted @ 2024-03-11 10:30 DECHIN 阅读(94) 评论(0) 推荐(1) 编辑
摘要: CUDA指针数组Kernel函数 继上一篇文章学习使用C++存储一个不规则二维数组之后,这里介绍如何在C语言版的CUDA中实现一个不规则的二维数组。总体的实现思路跟前面一篇文章一样,使用了一个二维的指针数组来存储。其中主要的不同点大概就是在Host和Device之间的内存交互上,需要不断的分配、拷贝和释放内存,最终我们还是用一个CUDA的Kernel函数实现了一个不规则数组的输出。 阅读全文
posted @ 2024-03-07 17:42 DECHIN 阅读(130) 评论(0) 推荐(0) 编辑