CudaSPONGE之Python接口

技术背景

在上一篇博客中我们介绍了CudaSPONGE的基本安装和使用方法。为了性能考虑,CudaSPONGE是基于纯CUDA C开发的,但是现在很多轮子都是Python开发的。为兼容更多的框架和平台,CudaSPONGE也提供了相应的Python API,方便Python开发者调用与二次开发。

接口逻辑

虽然安装和操作的过程并不复杂,但是这里面的交互逻辑还是得大概梳理一下。CudaSPONGE本身支持从plugin中调用几个固定的接口函数,如Calculate_Force()用于更新作用力,还有Mdout_Print()打印输出回调函数等等。调用的方式是通过动态链接库加载,也就是说,plugin的开发逻辑是先有一个python文件或者C语言文件,其中的API要跟CudaSPONGE对齐,然后编译成so动态链接库,供CudaSPONGE模拟的过程去调用,这是一个CudaSPONGE plugin开发的逻辑链条。

此外还有另外一个形式的plugin开发,可以参考本文的参考链接1中的内容,CudaSPONGE官方提供了一个prips插件,这个Python插件的逻辑是两头调用,本质上是对上述动态链接库接口的进一步封装。这就使得我们可以直接从Python文件中调用相应的接口函数,而不需要再编译成一个动态链接库文件,大大简化了Python Plugin开发的工作量。两种模式的差异如下图所示(非官方,个人理解):

prips安装与测试

prips插件支持pip直接安装:

$ python3 -m pip install prips
Looking in indexes: http://mirrors.aliyun.com/pypi/simple/
Collecting pripsDownloading http://mirrors.aliyun.com/pypi/packages/d1/c0/35e829fb82fd6d4bcb5debd0a0fa7cfeec85325f9d015a2babb68123a3ee/prips-1.4.tar.gz (78 kB)━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 78.4/78.4 kB 1.9 MB/s eta 0:00:00Installing build dependencies ... doneGetting requirements to build wheel ... doneInstalling backend dependencies ... donePreparing metadata (pyproject.toml) ... done
Building wheels for collected packages: pripsBuilding wheel for prips (pyproject.toml) ... doneCreated wheel for prips: filename=prips-1.4-cp37-cp37m-linux_x86_64.whl size=4182966 sha256=dec62c0a31359dfda10b67f1cac94a4648e800284bc575014ad24f5984acb393Stored in directory: /root/.cache/pip/wheels/66/cd/8d/0fe470330380020b3d2395589216cb37387027eb687a203672
Successfully built prips
Installing collected packages: prips
Successfully installed prips-1.4

测试安装可以直接在命令行中执行:

$ python3 -c "import prips"PRIPS: Python Runtime Interface Plugin of SPONGEVersion: 1.4
Path: /usr/local/python-3.7.5/lib/python3.7/site-packages/prips/_prips.soError: PRIPS replies on the python package "cupy".Please install cupy

这里发现少装了一个cupy,那就用pip装一个跟本地CUDA驱动匹配的cupy版本:

$ python3 -m pip install cupy-cuda11x
Looking in indexes: http://mirrors.aliyun.com/pypi/simple/
Collecting cupy-cuda11xDownloading http://mirrors.aliyun.com/pypi/packages/31/36/38a34d8bf2bcf9ac44be99c072e6a97bf882892ac506fa69cb70925a845f/cupy_cuda11x-11.6.0-cp37-cp37m-manylinux1_x86_64.whl (90.2 MB)━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 90.2/90.2 MB 3.8 MB/s eta 0:00:00
Requirement already satisfied: numpy<1.27,>=1.20 in /usr/local/python-3.7.5/lib/python3.7/site-packages (from cupy-cuda11x) (1.21.6)
Collecting fastrlock>=0.5 (from cupy-cuda11x)Using cached http://mirrors.aliyun.com/pypi/packages/42/4e/8bff5aa98ba1406c23a7dded13fea0bf2f536b4f8f7096fcbea0303e9cf5/fastrlock-0.8.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_24_x86_64.whl (47 kB)
Installing collected packages: fastrlock, cupy-cuda11x
Successfully installed cupy-cuda11x-11.6.0 fastrlock-0.8.2

再次运行测试:

$ python3 -c "import prips"PRIPS: Python Runtime Interface Plugin of SPONGEVersion: 1.4
Path: /usr/local/python-3.7.5/lib/python3.7/site-packages/prips/_prips.soUsage:1. Copy the path printed above2. Paste it to the value of the command "plugin" of SPONGE

这表示安装成功了,并且给出了具体的动态链接库地址,方便我们直接把这个动态链接库地址拷贝到CudaSPONGE运行的mdin配置文件中。

CudaSPONGE-pyplugin测试

如果上述章节显示安装成功,并且本地已经配置好CudaSPONGE的环境,那就可以开始测试简单案例了。例如使用上一篇博客中的能量极小化的案例,来一个基础的CudaSPONGE版本的hello world

case1 Minimizationmode = Minimization 
minimization_dynamic_dt 1
default_in_file_prefix = protein/case1pbc=0 
cutoff=999dt = 1e-02
step_limit = 500
write_information_interval = 50rst = restartcoordinate_in_file =  protein/case1_coordinate.txt
plugin = /usr/local/python-3.7.5/lib/python3.7/site-packages/prips/_prips.so
py = test.py

其中test.py的文件内容为:

import Spongedef Mdout_Print():print("Hellow SPONGE World!")

直接使用$ ../SPONGE -mdin minimize.txt命令行运行结果输出为:

------------------------------------------------------------------------------------------------------------
Hellow SPONGE World!step =              50,            time =           0.000,     temperature =            0.00, potential =       120784.66,              LJ =          191.83,         Coulomb =         -134.70, nb14_LJ =       119114.87,         nb14_EE =          -20.69,            bond =            4.54, angle =         1535.60,        dihedral =           93.22, 
------------------------------------------------------------------------------------------------------------
Hellow SPONGE World!step =             100,            time =           0.000,     temperature =            0.00, potential =        47867.34,              LJ =          192.20,         Coulomb =         -134.83, nb14_LJ =        46200.27,         nb14_EE =          -20.75,            bond =            8.92, angle =         1528.36,        dihedral =           93.18, 
------------------------------------------------------------------------------------------------------------
Hellow SPONGE World!step =             150,            time =           0.000,     temperature =            0.01, potential =        21746.57,              LJ =          192.48,         Coulomb =         -134.96, nb14_LJ =        20079.19,         nb14_EE =          -20.75,            bond =           15.94, angle =         1521.55,        dihedral =           93.14, 
------------------------------------------------------------------------------------------------------------
Hellow SPONGE World!step =             200,            time =           0.000,     temperature =            0.02, potential =        11373.98,              LJ =          192.42,         Coulomb =         -135.10, nb14_LJ =         9703.54,         nb14_EE =          -20.71,            bond =           26.00, angle =         1514.73,        dihedral =           93.10, 
------------------------------------------------------------------------------------------------------------
Hellow SPONGE World!step =             250,            time =           0.000,     temperature =            0.05, potential =         7180.14,              LJ =          191.38,         Coulomb =         -135.23, nb14_LJ =         5504.79,         nb14_EE =          -20.65,            bond =           39.29, angle =         1507.51,        dihedral =           93.06, 
------------------------------------------------------------------------------------------------------------
Hellow SPONGE World!step =             300,            time =           0.000,     temperature =            0.13, potential =         5464.48,              LJ =          187.58,         Coulomb =         -135.35, nb14_LJ =         3785.66,         nb14_EE =          -20.68,            bond =           55.14, angle =         1499.09,        dihedral =           93.04, 
------------------------------------------------------------------------------------------------------------
Hellow SPONGE World!step =             350,            time =           0.000,     temperature =            0.32, potential =         4587.00,              LJ =          177.15,         Coulomb =         -135.43, nb14_LJ =         2914.02,         nb14_EE =          -20.95,            bond =           71.93, angle =         1487.24,        dihedral =           93.03, 
------------------------------------------------------------------------------------------------------------
Hellow SPONGE World!step =             400,            time =           0.000,     temperature =            0.63, potential =         3817.87,              LJ =          154.56,         Coulomb =         -135.67, nb14_LJ =         2169.29,         nb14_EE =          -21.40,            bond =           92.39, angle =         1465.65,        dihedral =           93.05, 
------------------------------------------------------------------------------------------------------------
Hellow SPONGE World!step =             450,            time =           0.000,     temperature =            0.96, potential =         2990.47,              LJ =          119.14,         Coulomb =         -136.70, nb14_LJ =         1380.29,         nb14_EE =          -21.51,            bond =          136.01, angle =         1420.15,        dihedral =           93.09, 
------------------------------------------------------------------------------------------------------------
Hellow SPONGE World!step =             500,            time =           0.000,     temperature =            1.11, potential =         2276.00,              LJ =           82.45,         Coulomb =         -139.29, nb14_LJ =          725.04,         nb14_EE =          -20.48,            bond =          215.85, angle =         1319.28,        dihedral =           93.16, 
------------------------------------------------------------------------------------------------------------

可以看到,在每一个打印环节都会调用py文件中的打印内容。如果需要看帮助文档,可以将test.py的内容修改为:

import Sponge
help(Sponge.controller)
help(Sponge.cv_controller)
help(Sponge.md_info)

但是这里我建议要看文档还是直接进Gitee仓库直接看。关于这里面可以访问的force的数据类型,我们也可以打印出来看一下:

import SpongeSponge.controller.Step_Print_Initial("Force_TYPE", "%s")def Mdout_Print():Sponge.controller.Step_Print("Force_TYPE", type(Sponge.md_info.frc))

输出内容为:

------------------------------------------------------------------------------------------------------------step =             500,            time =           0.000,     temperature =            1.11, potential =         2276.00,      Force_TYPE = <class 'cupy.ndarray'>,              LJ =           82.45, Coulomb =         -139.29,         nb14_LJ =          725.04,         nb14_EE =          -20.48, bond =          215.85,           angle =         1319.28,        dihedral =           93.16, 
------------------------------------------------------------------------------------------------------------

可以看到是一个封装好的cupy的数组类型。那么我们也可以查看相应参量的Shape:

import SpongeSponge.controller.Step_Print_Initial("Force_Shape_0", "%d")
Sponge.controller.Step_Print_Initial("Force_Shape_1", "%d")def Mdout_Print():Sponge.controller.Step_Print("Force_Shape_0", Sponge.md_info.frc.shape[0])Sponge.controller.Step_Print("Force_Shape_1", Sponge.md_info.frc.shape[1])

输出内容大概是这样的:

------------------------------------------------------------------------------------------------------------step =              50,            time =           0.000,     temperature =            0.00, potential =       120784.66,   Force_Shape_0 =              57,   Force_Shape_1 =               3, LJ =          191.83,         Coulomb =         -134.70,         nb14_LJ =       119114.87, nb14_EE =          -20.69,            bond =            4.54,           angle =         1535.60, dihedral =           93.22, 
------------------------------------------------------------------------------------------------------------

这个Shape也就是我们输入的分子体系的Shape了。

为了方便查看结果,我们把mdin改成单步的优化:

case1 Minimizationmode = Minimization 
minimization_dynamic_dt 1
default_in_file_prefix = protein/case1pbc=0 
cutoff=999dt = 1e-02
step_limit = 1
write_information_interval = 1rst = restartcoordinate_in_file =  protein/case1_coordinate.txt
plugin = /usr/local/python-3.7.5/lib/python3.7/site-packages/prips/_prips.so
py = test.py

然后输出一个force求和的数据结果:

import SpongeSponge.controller.Step_Print_Initial("Force_SUM", "%2f")def Mdout_Print():Sponge.controller.Step_Print("Force_SUM", Sponge.md_info.frc.sum())

输出结果为:

------------------------------------------------------------------------------------------------------------step =               1,            time =           0.000,     temperature =            0.00, potential =       424228.34,       Force_SUM =       -0.258057,              LJ =          191.39, Coulomb =         -134.55,         nb14_LJ =       422551.28,         nb14_EE =          -20.52, bond =            2.78,           angle =         1544.69,        dihedral =           93.28, 
------------------------------------------------------------------------------------------------------------

可以看到正常大概是在0.x这个数量级,如果我们对这个force进行操作,使用Calculate_Force()函数将其放大100倍,再看看结果:

import SpongeSponge.controller.Step_Print_Initial("Force_SUM", "%2f")def Calculate_Force():Sponge.md_info.frc *= 100def Mdout_Print():Sponge.controller.Step_Print("Force_SUM", Sponge.md_info.frc.sum())

输出内容为:

------------------------------------------------------------------------------------------------------------step =               1,            time =           0.000,     temperature =            0.00, potential =       424228.34,       Force_SUM =      -30.750000,              LJ =          191.39, Coulomb =         -134.55,         nb14_LJ =       422551.28,         nb14_EE =          -20.52, bond =            2.78,           angle =         1544.69,        dihedral =           93.28, 
------------------------------------------------------------------------------------------------------------

可以看到这是一个被放大100倍之后的结果,数量级已经不一样了。关于CudaSPONGE-python调用的案例就先介绍这么多,在这个基础上去扩展一些Force Wrapper的应用应该是很容易的。

总结概要

本文介绍了高性能GPU分子动力学模拟软件CudaSPONGE的Python API接口,通过官方开发的prips插件,使得我们可以在Python框架下很方便的开发一些分子动力学模拟的Force Wrapper,例如Meta Dynamics中就有很多可以外界的工具,非常方便开发者的二次开发,同时又能够兼顾到性能。

版权声明

本文首发链接为:https://www.cnblogs.com/dechinphy/p/sponge-python.html

作者ID:DechinPhy

更多原著文章:https://www.cnblogs.com/dechinphy/

请博主喝咖啡:https://www.cnblogs.com/dechinphy/gallery/image/379634.html

参考链接

  1. https://gitee.com/gao_hyp_xyj_admin/prips

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/842771.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

行业专家推荐2024年CRM系统Top 5

商业环境瞬息万变,客户关系管理(CRM)系统帮助企业更好地连接客户、理解客户、服务客户,已成为企业不可或缺的战略资产。 企业在选择CRM系统时,应做好充分的市场调查。为了帮助企业更好地把握市场机遇,提升客户体验,本文根据搜索结果和行业专家的评价,推荐2024年各方面排…

论文解读《Neural Cleanse: Identifying and Mitigating Backdoor Attacks in Neural Networks》

发表时间:2019期刊会议:IEEE Symposium on Security and Privacy (S&P)论文单位:UC Santa Barbara论文作者:Bolun Wang, Yuanshun Yao, Shawn Shan, Huiying Li, Bimal Viswanath, Haitao Zheng, Ben Y. Zhao方向分类:Backdoor Attack论文链接开源代码摘要 深度神经网…

TIA下梯形图做单灰仓脉冲阀喷吹控制练习

假设有这样一个应用需求,一个会仓,上面有10个脉冲阀,按照顺序进行喷吹,每个阀喷吹后,间隔一定时间下一个阀喷吹,可以设置总的喷吹次数,达到次数后停止喷吹,如果总喷吹次数设置为0,那么就一直喷吹下去。如果点击了开始按钮开始喷吹动作,再次点击开始按钮,不会重新开始…

如何提升日用品行业生产效率?数字化管理成关键

在日用品行业,快速反应和高效生产是生存之道。从采购、生产到物流配送,每一个环节都充满挑战。市场需求瞬息万变,交付周期日益缩短,任何一个环节的滞后都可能导致整个供应链的断裂。如何在繁忙的工作中保持高效协作、精准调度,并确保及时交付,是许多企业迫切需要解决的问…

从需求到交付,如何有效控制客户的预期?

在现代企业管理中,客户预期的管理是项目成功的关键因素之一。无论是软件开发、产品设计还是咨询服务,项目能否成功完成往往取决于客户对于项目成果的预期。如果没有正确的预期管理,客户的需求与项目交付之间就容易产生偏差,进而影响客户的满意度和项目的最终成果。因此,如…

PIDNet-PagFM-特征融合

import torch.nn as nn import torch import torch.nn.functional as F class PagFM(nn.Module):# 选择性特征融合 直接融合细节和低频上下文 容易导致细节丢失def __init__(self, in_channels, mid_channels, after_relu=False, with_channel=False, BatchNorm=nn.BatchNorm2…

基于改进自适应分段线性近似(IAPLA)的微分方程数值解法研究: 从简单动力系统到混沌系统的应用分析

微分方程作为一种数学工具在物理学、金融学等诸多领域的动态系统建模中发挥着关键作用。对这类方程数值解的研究一直是学术界关注的重点。 数值方法是一类用于求解难以或无法获得解析解的数学问题的算法集合。这类方法主要处理描述函数在时间或空间维度上演化的微分方程,采用逐…

大模型--QLoRA、GPTQ:模型量化02--24

目录1. 参考2. 量化简介3. QLoRANF4 数据类型4. GPTQOBD:Optimal Brain DamageOBS:Optimal Brain SurgeonOBCGPTQ 的创新点5 各大开源模型量化实现6 后续方向探讨 1. 参考 https://zhuanlan.zhihu.com/p/646210009?utm_psn=1845389883864133633 2. 量化简介 模型量化是将浮点…

Oracle生成awr报告操作步骤

1、cmd命令窗口 以sysdba身份登录Oracle 2、执行@?/rdbms/admin/awrrpt命令,并选择报告类型为HTML。输入天数以选择生成报告的时间段,一般默认为最近7天。输入报告开始和结束时间对应的快照ID。输入报告名称,如awr.html,系统将自动生成并显示报告名。 3. 查看AWR报告。 AW…

聚焦银行业数智化转型,火山引擎数据飞轮系列白皮书重磅发布

随着金融科技的快速发展,银行业也在不断提升数字化水平。通过大数据、人工智能等技术的应用,银行可以更加精准地了解客户需求,提供个性化的金融产品和服务,还能降低运营成本,提升风险管理能力,创造更多业务价值。《金融科技发展规划(2022~2025年)》也明确指出,以加强金…

字节面试:聊聊 CAP 定理?哪些中间件是AP? 哪些是CP? 说说 为什么?

本文原文链接 文章很长,且持续更新,建议收藏起来,慢慢读!疯狂创客圈总目录 博客园版 为您奉上珍贵的学习资源 : 免费赠送 :《尼恩Java面试宝典》 持续更新+ 史上最全 + 面试必备 2000页+ 面试必备 + 大厂必备 +涨薪必备 免费赠送 :《尼恩技术圣经+高并发系列PDF》 ,帮你 …

智能探针技术:实现可视、可知、可诊的主动网络运维策略

网络维护的重要性 网络运维是确保网络系统稳定、高效、安全运行的关键活动。在当今这个高度依赖信息技术的时代,网络运维的重要性不仅体现在技术层面,更关乎到企业运营的方方面面。网络运维具有保障网络的稳定性、提升网络运维性能、降低企业运营成本等多方面好处,是企业信息…