jjzjj

性能达1.5+倍!昇腾AI助力分子动力学模拟研究

华为云开发者社区 2023-03-28 原文
摘要:在异构计算架构CANN的助力下,AI预测性能达到现有产品的1.5+倍,可预测规模较传统方法提升10000+倍,为光伏材料、新能源电池、半导体材料研究带来巨大的商业应用价值。

本文分享自华为云社区《性能达1.5+倍!昇腾AI助力分子动力学模拟研究》,作者:昇腾CANN。

研究背景

分子动力学是一套分子模拟方法,主要依靠牛顿力学来模拟分子体系运动,是研究微观世界的有效手段。但传统研究手段的时间复杂度较高,仅限于研究数千量级原子的小型系统,在应用中存在普遍局限性。而深势科技提出的DeePMD-kit可将AI技术成功应用于分子动力学模拟,并实现了上亿原子体系的模拟,目前该项技术已经发展成为端到端的开源解决方案,以科学智能(AI for Science)为分子动力学的行业应用带来了更多可能。

而昇腾AI凭借超强算力及完整软件栈配套,为科学智能提供了天然土壤,通过昇腾AI硬件及异构计算架构CANN,借助软硬件协同能力充分释放硬件算力,为DeePMD的大规模分子动力学模拟提供了高性能解决方案。

基于CANN自定义DeePMD高性能算子

对诸如DeePMD之类的神经网络模型进行加速的关键之一是对网络中的算子进行深度优化,从而发挥出硬件的澎湃算力,而作为专门面向AI场景的异构计算架构,CANN正是搭起了上层深度学习框架和底层AI硬件的桥梁。

基于CANN的算子编程接口,开发人员在DeePMD网络中开发相关的自定义算子,其中涉及到数据排序、读取与存储等离线操作,也涉及矩阵、标量的计算,这些自定义算子不但对精度有较高的要求,而且也很大程度上决定了模型整体的性能。

CANN能够高效协同昇腾不同异构单元自定义高性能算子,充分释放AI Core、AI CPU和Vector Core的异构算力。比如将离散的距离计算和排序部署在AI CPU上,将可以并行的矩阵、标量的计算部分部署在AI Core上,以发挥出每个计算单元的能力,充分发挥硬件计算性能。

高效协同昇腾不同异构单元自定义高性能算子

基于CANN的DeePMD融合规则及网络优化

算子融合也是网络性能优化重点之一,也是业界常用手段,在DeePMD原生实现中,算子融合就作为性能工程的主要手段之一。

而在DeePMD网络性能优化中,算子开发人员进一步结合网络特点,借助CANN设计新的融合规则,包括PAD算子支持动静合一、Mul支持NZ+ND和ND+NZ、MatMul + Add + TanhGrad支持Buffer融合等,这些融合在整网性能提升中起到了关键作用。同时借助CANN的智能调优工具AOE,自动化完成子图调优、算子调优,以及TransData消除等一系列优化,极大提升了模型调优效率。

DeePMD网络融合示例

此外项目优化了整网混合精度推理流程,将半精度和单精度混合使用,有效减少内存占用,充分释放硬件算力,进一步加速模型执行,在确保分子模拟精度的前提下带来最大性能收益。在不同场景对分子模拟的物理性质与仿真结果对比测试中,以铜拉伸应力应变模拟实验为例可以看到,昇腾AI基础软硬件平台的实验结果已经非常近似实际数据。

昇腾AI基础软硬件平台上铜的拉伸应力应变模拟结果

昇腾AI的整体优化解决方案使DeePMD-kit工具在分子动力学模拟计算上取得1.5+倍现有产品的性能提升成果,助力分子动力学服务成功商用。未来,昇腾AI将继续以超强算力和软硬协同能力助力科学计算进入科学智能新阶段,携手更多伙伴凝心聚力,共同向上发展,构筑科学智能领先格局,全面迈进数智时代。

 

点击关注,第一时间了解华为云新鲜技术~

有关性能达1.5+倍!昇腾AI助力分子动力学模拟研究的更多相关文章

  1. ruby - 如何模拟 Net::HTTP::Post? - 2

    是的,我知道最好使用webmock,但我想知道如何在RSpec中模拟此方法:defmethod_to_testurl=URI.parseurireq=Net::HTTP::Post.newurl.pathres=Net::HTTP.start(url.host,url.port)do|http|http.requestreq,foo:1endresend这是RSpec:let(:uri){'http://example.com'}specify'HTTPcall'dohttp=mock:httpNet::HTTP.stub!(:start).and_yieldhttphttp.shou

  2. ruby-on-rails - 在这种情况下我如何模拟一个对象?没有明显的方法可以用模拟替换对象 - 2

    假设我在Store的模型中有这个非常简单的方法:defgeocode_addressloc=Store.geocode(address)self.lat=loc.latself.lng=loc.lngend如果我想编写一些不受地理编码服务影响的测试脚本,这些脚本可能已关闭、有限制或取决于我的互联网连接,我该如何模拟地理编码服务?如果我可以将地理编码对象传递到该方法中,那将很容易,但我不知道在这种情况下该怎么做。谢谢!特里斯坦 最佳答案 使用内置模拟和stub的rspecs,你可以做这样的事情:setupdo@subject=MyCl

  3. ruby - "public/protected/private"方法是如何实现的,我该如何模拟它? - 2

    在ruby中,你可以这样做:classThingpublicdeff1puts"f1"endprivatedeff2puts"f2"endpublicdeff3puts"f3"endprivatedeff4puts"f4"endend现在f1和f3是公共(public)的,f2和f4是私有(private)的。内部发生了什么,允许您调用一个类方法,然后更改方法定义?我怎样才能实现相同的功能(表面上是创建我自己的java之类的注释)例如...classThingfundeff1puts"hey"endnotfundeff2puts"hey"endendfun和notfun将更改以下函数定

  4. ruby - 在 RSpec 中 stub /模拟全局常量 - 2

    我有一个gem,它有一个根据Rails.env的不同行为的方法:defself.envifdefined?(Rails)Rails.envelsif...现在我想编写一个规范来测试这个代码路径。目前我是这样做的:Kernel.const_set(:Rails,nil)Rails.should_receive(:env).and_return('production')...没关系,只是感觉很丑。另一种方法是在spec_helper中声明:moduleRails;end而且效果也很好。但也许有更好的方法?理想情况下,这应该有效:rails=double('Rails')rails.sho

  5. ruby-on-rails - rspec 模拟对象属性赋值 - 2

    我有一个rspec模拟对象,一个值赋给了属性。我正在努力在我的rspec测试中满足这种期望。只是想知道语法是什么?代码:defcreate@new_campaign=AdCampaign.new(params[:new_campaign])@new_campaign.creationDate="#{Time.now.year}/#{Time.now.mon}/#{Time.now.day}"if@new_campaign.saveflash[:status]="Success"elseflash[:status]="Failed"endend测试it"shouldabletocreat

  6. ruby - 如何使用 rspec stub /模拟对命令行的调用? - 2

    我正在尝试测试命令行工具的输出。如何使用rspec来“伪造”命令行调用?执行以下操作不起作用:it"shouldcallthecommandlineandreturn'text'"do@p=Pig.new@p.should_receive(:run).with('my_command_line_tool_call').and_return('resulttext')end如何创建stub? 最佳答案 使用newmessageexpectationsyntax:规范/虚拟规范.rbrequire"dummy"describeDummy

  7. 建模分析 | 平面2R机器人(二连杆)运动学与动力学建模(附Matlab仿真) - 2

    目录0专栏介绍1平面2R机器人概述2运动学建模2.1正运动学模型2.2逆运动学模型2.3机器人运动学仿真3动力学建模3.1计算动能3.2势能计算与动力学方程3.3动力学仿真0专栏介绍?附C++/Python/Matlab全套代码?课程设计、毕业设计、创新竞赛必备!详细介绍全局规划(图搜索、采样法、智能算法等);局部规划(DWA、APF等);曲线优化(贝塞尔曲线、B样条曲线等)。?详情:图解自动驾驶中的运动规划(MotionPlanning),附几十种规划算法1平面2R机器人概述如图1所示为本文的研究本体——平面2R机器人。对参数进行如下定义:机器人广义坐标

  8. ruby - 接收 block 作为参数的模拟方法 - 2

    我有一个或多或少这样的场景classAdefinitialize(&block)b=B.new(&block)endend我正在对A类进行单元测试,我想知道B#new是否正在接收传递给A#new的block。我使用Mocha作为模拟框架。这可能吗? 最佳答案 我用Mocha和RSpec都试过了,虽然我可以通过测试,但行为不正确。从我的实验中,我得出结论,验证block是否已通过是不可能的。问题:为什么要传递一个block作为参数?block将用于什么目的?什么时候调用?也许这确实是您应该用类似的东西测试的行为:classBlockP

  9. ruby - 如何模拟 Fixnum 变量的整数溢出? - 2

    我目前正在将一种算法从Java转换为Ruby,但由于Ruby中缺少整数溢出,我遇到了一些障碍。假设我的值为2663860877,它大于最大整数2147483648。在Java中,它环绕,我应该得到-1631106419。我找到了这段代码,但它似乎不起作用:defforce_overflow(i)ifi2147483647i&0xffffffffelseiendend并且'ing变量不会像您期望的那样强制它为负。 最佳答案 假设32位整数具有二进制补码负数,这应该可行:defforce_overflow_signed(i)force_

  10. ruby - 单元测试 ruby​​ 命令行应用程序的代码 - 如何模拟/传递 ARGV - 2

    我有一个命令行应用程序,它使用thor来处理选项的解析。我想使用test-unit和/或minitest针对代码对命令行功能进行单元测试。我似乎无法弄清楚如何确保ARGV数组(通常会保存命令行中的选项)保存我的测试选项,以便它们可以根据代码进行测试。具体应用代码:#myapp/commands/build.rbrequire'thor'moduleMyappmoduleCommands#DefinebuildcommandsforMyAppcommandlineclassBuild:test_unit#Definesourcerootofapplicationdefself.sourc

随机推荐