技术背景

上一篇博客中我们介绍了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 prips
Downloading 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:00
Installing build dependencies ... done
Getting requirements to build wheel ... done
Installing backend dependencies ... done
Preparing metadata (pyproject.toml) ... done
Building wheels for collected packages: prips
Building wheel for prips (pyproject.toml) ... done
Created wheel for prips: filename=prips-1.4-cp37-cp37m-linux_x86_64.whl size=4182966 sha256=dec62c0a31359dfda10b67f1cac94a4648e800284bc575014ad24f5984acb393
Stored 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 SPONGE

Version: 1.4
Path: /usr/local/python-3.7.5/lib/python3.7/site-packages/prips/_prips.so Error:
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-cuda11x
Downloading 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 SPONGE

Version: 1.4
Path: /usr/local/python-3.7.5/lib/python3.7/site-packages/prips/_prips.so Usage:
1. Copy the path printed above
2. Paste it to the value of the command "plugin" of SPONGE

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

CudaSPONGE-pyplugin测试

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

case1 Minimization

mode = Minimization
minimization_dynamic_dt 1
default_in_file_prefix = protein/case1 pbc=0
cutoff=999 dt = 1e-02
step_limit = 500
write_information_interval = 50 rst = restart coordinate_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 Sponge

def 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 Sponge

Sponge.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 Sponge

Sponge.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 Minimization

mode = Minimization
minimization_dynamic_dt 1
default_in_file_prefix = protein/case1 pbc=0
cutoff=999 dt = 1e-02
step_limit = 1
write_information_interval = 1 rst = restart coordinate_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 Sponge

Sponge.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 Sponge

Sponge.controller.Step_Print_Initial("Force_SUM", "%2f")

def Calculate_Force():
Sponge.md_info.frc *= 100 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 = -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

CudaSPONGE之Python接口的更多相关文章

  1. caffe的python接口学习(7):绘制loss和accuracy曲线

    使用python接口来运行caffe程序,主要的原因是python非常容易可视化.所以不推荐大家在命令行下面运行python程序.如果非要在命令行下面运行,还不如直接用 c++算了. 推荐使用jupy ...

  2. Windows+Caffe+VS2013+python接口配置过程

    前段时间在笔记本上配置了Caffe框架,中间过程曲曲折折,但由于懒没有将详细过程总结下来,这两天又在一台配置较高的台式机上配置了Caffe,配置时便非常后悔当初没有写到博客中去,现已配置好Caffe, ...

  3. 机器学习caffe环境搭建——redhat7.1和caffe的python接口编译

    相信看这篇文章的都知道caffe是干嘛的了,无非就是深度学习.神经网络.计算机视觉.人工智能这些,这个我就不多介绍了,下面说说我的安装过程即遇到的问题,当然还有解决方法. 说下我的环境:1>虚拟 ...

  4. Caffe + Ubuntu 14.04 64bit + 无CUDA(linux下安装caffe(无cuda)以及python接口)

    安装Caffe指导书 环境: Linux 64位 显卡为Intel + AMD,非英伟达显卡 无GPU 一. 安装准备工作 1. 以管理员身份登录 在左上角点击图标,搜索terminal(即终端),以 ...

  5. caffe的python接口学习(1):生成配置文件

    caffe是C++语言写的,可能很多人不太熟悉,因此想用更简单的脚本语言来实现.caffe提供matlab接口和python接口,这两种语言就非常简单,而且非常容易进行可视化,使得学习更加快速,理解更 ...

  6. Caffe学习系列(11):数据可视化环境(python接口)配置

    参考:http://www.cnblogs.com/denny402/p/5088399.html 这节配置python接口遇到了不少坑. 1.我是利用anaconda来配置python环境,在将ca ...

  7. caffe中python接口的使用

    下面是基于我自己的接口,我是用来分类一维数据的,可能不具通用性: (前提,你已经编译了caffe的python的接口) 添加 caffe塻块的搜索路径,当我们import caffe时,可以找到. 对 ...

  8. Caffe学习系列(13):数据可视化环境(python接口)配置

    caffe程序是由c++语言写的,本身是不带数据可视化功能的.只能借助其它的库或接口,如opencv, python或matlab.大部分人使用python接口来进行可视化,因为python出了个比较 ...

  9. Python接口自动化——soap协议传参的类型是ns0类型的要创建工厂方法纪要

    1:在Python接口自动化中,对于soap协议的xml的请求我们可以使用Suds Client来实现,其soap协议传参的类型基本上是有2种: 第一种是传参,不需要再创建啥, 第二种就是ns0类型的 ...

  10. python接口自动化(十)--post请求四种传送正文方式(详解)

    简介 post请求我在python接口自动化(八)--发送post请求的接口(详解)已经讲过一部分了,主要是发送一些较长的数据,还有就是数据比较安全等.我们要知道post请求四种传送正文方式首先需要先 ...

随机推荐

  1. 小tips:微信小程序登录后返回登录前的页面继续操作(保留参数)

    在app.js中添加如下两个方法即可: // 设置需要回调的地址 setCallbackUrl: function(mode) { return new Promise((resolve,reject ...

  2. Naming Conversion & Case Style 命名规范

    前言 写代码有 2 个点很重要 第一是表达 (不要词不达意) 要达到这点, 就要多参考其它人如何表达. 第二是一致性 (一样的东西就用一样的写法) 要达到这点就要建立规范 以前的笔记 命名规范 nam ...

  3. SSD-KD:天翼云&清华出品,最新无原始数据的蒸馏研究 | CVPR'24

    无数据知识蒸馏能够利用大型教师网络所学到的知识,来增强较小型学生网络的训练,而无需访问原始训练数据,从而避免在实际应用中的隐私.安全和专有风险.在这方面的研究中,现有的方法通常遵循一种反演蒸馏的范式, ...

  4. 简单粗暴的实现 Blazor Server 登录鉴权

    既然是简单粗暴,那么就不用关心诸如 IDentityServer4,OAuth 之类的组件,也不使用 AuthenticationStateProvider.IAuthService, razor 页 ...

  5. usb请求块以及提交方式

    URB结构体 struct urb { /* private: usb core and host controller only fields in the urb */ struct kref k ...

  6. Pytorch 实现 GAN 网络

    Pytorch 实现 GAN 网络 原理 GAN的基本原理其实非常简单,假设我们有两个网络,G(Generator)和D(Discriminator).它们的功能分别是: G 是一个生成网络,它接收一 ...

  7. 2024年4月中国数据库排行榜:OceanBase再度登顶,KingBase稳步上升进前五

    春风劲吹,迎来了2024年4月中国流行度排行榜.纵观本月榜单,各家数据库产品你追我赶,名次呈现微妙变动,它们正以不可忽视的力量,推动着中国乃至全球的数据管理革新.在这春意盎然的四月,让我们继续关注这些 ...

  8. 墨天轮沙龙 | Proxima 刘方:阿里巴巴大规模向量检索实时服务化引擎 Proxima SE

    导读 随着 AI 技术的广泛应用,以及数据规模的不断增长,向量检索也逐渐成了 AI 技术链路中不可或缺的一环. 在11月16日举办的[墨天轮数据库沙龙-向量数据库专场]邀请到阿里巴巴高级技术专家刘方, ...

  9. 理解 keep-alive

    keep-alive 是 Vue 内置的一个组件,可以使被包含的组件保留状态,避免重新渲染 : 对应两个钩子函数 activated 和 deactivated ,当组件被激活时,触发钩子函数 act ...

  10. Nuxt.js 应用中的 ready 事件钩子详解

    title: Nuxt.js 应用中的 ready 事件钩子详解 date: 2024/10/12 updated: 2024/10/12 author: cmdragon excerpt: read ...