1.分子对接程序DSDP的安装和使用
2.极智开发 | 解读英伟达软件生态 一切的基础CUDA
3.MindSpore环境配置记录(一):centos 7.6 aarch 64版本下安装Anaconda,升级GLIBC,make 升级,Gcc升级
4.ML system 入坑指南
5.Gumbel-Softmax的MindSpore实现
6.MindSpore从Pytorch迁移至MindSpore——数据处理(实战篇)
分子对接程序DSDP的安装和使用
今年8月,我有幸参加了由北大高毅勤老师团队和华为联合举办的MindSpore SPONGE暑期学校。在这次活动中,flag的源码我了解了DSDP分子对接程序,该程序的相关论文于今年6月发表在《J. Chem. Inf. Model. , , , –》期刊上。
DSDP程序将传统分子对接算法与机器学习相结合,实现了GPU加速的高性能分子对接。与常用的AutoDock Vina、DiffDock等分子对接程序相比,DSDP在盲对接的速度与精度上均有显著提升。此外,该程序还可在已知结合位点的前提下进行重对接和虚拟筛选。项目源码已发布于github。
在暑期学校期间,开发者张宏老师对DSDP程序进行了介绍。以下是我对DSDP程序安装和使用的初步总结,如有疏漏,请大家务必指出。
安装方法:
1. 下载DSDP源码。根据测试,在Ubuntu .(官方文档)和Rocky 9环境中均可使用。
2. 将项目保存在固定目录,我保存在/run/media/Programs/DSDP。
3. 使用Anaconda建立虚拟环境。
注意:务必检查torch的版本,以与cuda环境匹配。如果需要,可直接在DSDP.yml文件中更改torch版本。我这里由于通过配置文件无法正常安装,直接参考官方文档安装了2.0.1+cu版本。
4. 激活虚拟环境(后续每次使用盲对接都需要激活该环境)。
5. 编译各组件。
使用方法:盲对接
项目示例文件的test_dataset包含三个数据集,分别是DSDP_dataset、DUD-E数据集和PDBBind时间分割数据集。
对于要预测的每组复合物,需要建立一个独立的目录,其中存放配体和受体(需按规定命名)。例如,通过tree DSDP_dataset/ | head查看的示例目录结构如下:
DSDP的输入文件为pdbqt格式,可以通过AutoDockTools生成。
注:python 3版本的AutoDockTools,已经有几名Python之狐完成了部分升级,安装好之后直接用prepare_ligand4和prepare_receptor4两个命令就可以调用。
在项目根目录运行如下命令:
参数解释:
重对接
本例使用1a2b蛋白。在工作目录(不一定是项目目录)准备受体和配体的pdbqt文件,命名为protein.pdbqt和ligand.pdbqt。
运行:
注:重对接的盒子信息(沿x y z轴的最小值和最大值)需要用户提供。本例的36氪网页源码盒子信息仅适用于本例的1a2b蛋白。
参数解释:
此外,年9月日更新的版本中,每个DSDP组件都支持--help命令来输出有关参数的信息。
DSDP数据训练
DSDP的结合位点预测部分根据PUResNet进行修改。文件train_example包含用于训练当前工作中使用的模型的脚本。应该注意的是,该文件中的训练数据集只是一个示例。整个训练数据集是EquiBind中使用的PDBBind的子集(EquiBind: Geometric Deep Learning for Drug Binding Structure Prediction)。可以从他们的网站下载此数据集:Zenodo。
测试
以PET酶IsPETase为例,下载晶体结构,去水加氢、另存为PET_protein.pdbqt,并与PET_ligand.pdbqt存放于PET目录下。通过上述命令进行盲对接,结果如图1所示。
可以看到,结合位点的搜索十分准确,且将底物定位到了SHD三联体,这与催化机理完全一致。但酯键的方向理应指向蛋白主链形成的氧负离子穴区域,这里所得结构朝向另一侧,可见盲对接的精度略有不足。
进一步在该位点的基础上进行重对接,如图2所示。(盒子中心为催化三联体,边长为 Å)
可以看到,重对接所得的构象中,羰基已经处于正确的朝向,指向Y和M的主链酰胺。以上测试证实了DSDP盲对接和重对接的可行性。
其他
重对接可以在任意目录进行,但盲对接不经修改的话只能在项目根目录进行,其中用到的文件需要自行准备并在命令行指定。个人认为这样稍有不便,因此对源码做了修改,可像重对接一样在任意目录直接进行盲对接,如下。
编译方法和重对接方法同上。盲对接方法如下,其中dataset在当前目录:
注意每次使用盲对接前都需要激活DSDP虚拟环境。
极智开发 | 解读英伟达软件生态 一切的基础CUDA
欢迎关注我的公众号 [极智视界],获取我的更多经验分享
大家好,我是极智视界,本文来介绍一下 解读英伟达软件生态 一切的基础CUDA。
邀您加入我的知识星球「极智视界」,星球内有超多好玩的项目实战源码下载,链接: t.zsxq.com/0aiNxERDq
CUDA,全称为 Compute Unified Device Architecture,是英伟达于 年推出的一个平行计算平台和应用编程接口 API 模型。CUDA 之于英伟达的速递跑腿服务源码重要性主要体现在下面几个方面:
所以,解读英伟达软件生态,必须要从 CUDA 说起。虽然 CUDA 再往下还有如 PTX 的指令集加速层级,但是PTX 的普及程度其实并不高,甚至可能很多朋友都没听说过 PTX,其实也算正常,因为基本上的 N 卡开发者,根本没必要接触到 PTX,把 CUDA 学好就足够够的了。
把 CUDA 作为标杆,似乎是很多 AI 芯片厂商 "共同的做法",比较有代表性的是升腾的 Ascend C、寒武纪的 Bang C,但是其实这几个之间有相似但又有不相似的地方。相似的地方在于不管是升腾还是寒武纪都想提供一套类似 CUDA 的可以充分调用自己 NPU 硬件加速的对外接口,提高客制化的灵活性。不相似的地方一方面在于我们是在学人家,很多接口其实是为了贴近 CUDA 的接口而进行的高级封装,毕竟大部分开发者其实已经形成了 CUDA 的开发习惯,这个时候让大家切换起来更加顺手的做法就是 "模仿",而要做这种程度的 "模仿" 势必要协调好硬件架构和软件接口的映射;不相似的另外一方面体现在软件生态的层次清晰度,这个拿升腾来专门说,升腾 Ascend C 的发布时间在 年 5 月 6 日,而反观英伟达 CUDA 的发布时间是 年。什么意思呢,很明显可以看到英伟达的软件生态是以 CUDA 为基础然后层层往上叠的,而升腾是先有了 CANN,先有了 MindSpore 这些 "高层建筑",然后往下才有了 Ascend C,这种软件生态的层次结构就没有那么清晰,当然这种说法也只是基于时间上的,这并不影响它在空间上还是具备不错的软件生态层次结构。
再回到 CUDA 本身,需要清楚的一点是,CUDA 其实一开始主要是面向优化计算密集型计算 (Compute-Bound),因为不管是最开始的通用科学计算还是后来的以 CNN 为主流的深度学习计算都是计算密集型,但是后来 Transformer 又逐渐流行,所以 CUDA 也是不断在 "与时俱进" 在做平衡、做兼顾,比如在 A 开始,CUDA 新增了从 L1 Cache 到 HBM Global Memory 数据直接异步拷贝的指令,其实也是在丰富自身对于访存密集型计算 (Memory-Bound) 的优化。
我之前写过挺多关于 CUDA 的分享,罗列一些,
CUDA 是一种硬件强相关的编程模型,要掌握好 CUDA,需要先看懂 GPU 硬件架构,从而映射到 CUDA 内存模型、线程模型上,这点跟 C 语言、跟 C++ 这类 "高级" 编程语言就很不一样,源码和环境绑定所以很多朋友会觉得 CUDA C 比较难写,特别是要写出高性能的 CUDA C,比较难。确实,这是事实,特别是对于写出高性能的 CUDA C,会涉及资源的高效调度,比如 Shared Memory、L1 Cache 等的调度;会涉及适应硬件架构超参的配置,比如 Thread、Block、Grid 等的配置。
总之,对于 CUDA 的深入学习,是一门 "稳挣不亏" 的 "买卖",原因不再过多赘述,主要体现在它的重要性上。
好了,以上分享了 解读英伟达软件生态 一切的基础CUDA,希望我的分享能对你的学习有一点帮助。
公众号传送
MindSpore环境配置记录(一):centos 7.6 aarch 版本下安装Anaconda,升级GLIBC,make 升级,Gcc升级
在centos 7.6 aarch 版本下,安装Anaconda时遇到了最低要求GLIBC为2.的问题。初始版本的GNU libc为2.,这意味着需要进行升级。然而,直接升级GLIBC存在风险,可能导致系统崩溃,因此建议在个人环境中反复测试确保无误后再在生产环境操作,且不要直接从2.跳到2.,应逐版本升级。
尝试以root权限直接升级到2.失败,导致系统崩溃。遇到问题后,有人建议可以制作引导盘进行恢复,但尝试失败。因此,建议谨慎处理Glibc升级,最好逐版本升级,并在docker中进行测试。
在处理过程中,为了避免系统崩溃,先在新创建的用户MStest下进行GCC和Make的升级。首先,添加新用户并下载所需依赖到Downloads目录,然后验证并安装了Make 4.3。尽管Make升级成功,但gmake版本仍需更新。在确认需要升级GCC后,视频分享播放源码从GCC 4.8开始,通过下载源码、安装依赖并编译来完成升级。
尽管GCC升级过程复杂,还需要配置环境变量,但最终遇到的问题是升级glibc时,发现Python版本不匹配。解决Python和zlib问题后,编译glibc时仍然遇到了问题,尝试使用非root用户失败,导致系统崩溃。最后,由于一系列问题,只能选择重装系统。
总结教训:避免直接跨版本升级Glibc,尤其是作为root用户,务必在备份后进行,并考虑在低版本环境中编译应用或选择特定版本的安装包。更多详细步骤和经验可以在后续文章中找到。
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,涉及自动微分、张量、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编译器、模型优化技术、系统设计和实现等方面的知识,对于构建高效、可扩展的机器学习系统至关重要。
Gumbel-Softmax的MindSpore实现
在一段时间的间隔后,我将注意力转向了MindSpore的相关内容。起因是一位同学询问关于模型迁移的问题,目标是诺亚的一篇ICML论文《SparseBERT: Rethinking the Importance Analysis in Self-attention》中使用了Pytorch特有的Gumbel-Softmax实现,但该实现难以直接移植到MindSpore。因此,我针对这个问题进行了深入研究,并撰写了一篇关于如何在MindSpore中实现Gumbel-Softmax的文章。
Gumbel-Softmax是一种离散采样的可微近似方法,常用于生成模型中,如GAN和VAE,它解决了离散分布采样不可微的问题。具体来说,它通过Gumbel-Max trick和softmax函数构建了一个连续分布,近似离散类别分布,允许反向传播。Gumbel分布通过从均匀分布中随机抽取并计算得出,而Softmax则用于近似argmax操作。
在MindSpore的实现中,我参考了Pytorch的源码和Tensorflow的手写实现,对三个关键点进行了适配,并通过单元测试验证了正确性。测试包括输出的one-hot特性、采样值分布以及与softmax概率的一致性。最终,我用MindSpore实现的Gumbel-Softmax应用于VAE实验,结果与Pytorch版本的Loss下降趋势基本一致,展示了其在实际应用中的可行性。
尽管这篇文章拖延了很长时间,但为了满足对Gumbel-Softmax需求的开发者,我会将其添加到MindSpore的主要仓库中,供更多人使用和开发。如果你对这个功能感兴趣,可以下载代码进行训练对比,或尝试将其应用到其他GAN网络中。
MindSpore从Pytorch迁移至MindSpore——数据处理(实战篇)
在转换至MindSpore的数据处理领域,我们首先回顾了从Pytorch迁移至MindSpore的基本概念与方法。这里以Yolov5源码作为实例,深入解析数据集导入和处理的迁移过程,展示MindSpore与Pytorch在数据加载方面的差异与优劣。
在Yolov5的Pytorch源码中,数据集导入主要依赖于`create_dataloader`函数,其中包含了数据集的创建和数据加载器的创建。重点观察了`LoadImagesAndLabels`类的实现,该类负责图像的导入、预处理以及数据集的相关操作。其中,`__getitem__`函数对图像进行各种变换,包括但不限于mosaic、mixup等,而`albumentations`库的使用体现了其在图像处理效率和全面性方面的优势。对于这些函数,直接使用即可,无需迁移。
在MindSpore中,我们采用了一种更加灵活和高效的数据处理策略。为了简化参数管理,直接在初始化函数中设置超参数,并通过字典管理图像变换方法,显著提高了代码的可读性。针对`len`函数和`getitem`函数的实现,我们明确指定了哪些列在获取单个样本时返回,以及在组合成批次时应返回的列,进一步优化了数据处理流程。
尽管迁移过程在模型导入、流程控制等方面仍有待深入探索,但通过上述实例,我们能够清晰地看到MindSpore在数据处理方面的独特优势和灵活性。与Pytorch相比,MindSpore提供了更为高效的数据加载和处理机制,这有助于提升模型训练的速度和性能。
迁移过程中,我们关注于关键数据处理模块的改进与优化,以确保模型在MindSpore环境下的高效运行。通过比较Pytorch与MindSpore在数据集导入、处理方面的差异,我们可以发现,MindSpore在实现类似Yolov5算法时,不仅提供了与原生环境相媲美的功能,还通过优化数据处理流程,进一步增强了模型的训练效率。
总结而言,从Pytorch迁移到MindSpore的数据处理过程中,关键在于理解两者在数据集导入和处理机制上的异同,并据此调整代码,以充分利用MindSpore在数据处理方面的优势。这一过程不仅为Yolov5算法的迁移提供了实际的指导,也为其他模型在MindSpore环境下的实现提供了参考与借鉴。
基于Mindspore2.0的GPT2预训练模型迁移教程
摘要:本文旨在清晰地阐述如何运用MindSpore2.0进行模型迁移,旨在为开发者提供一个从基础准备到网络迁移,再到验证的全面流程指南。文章以实际操作为基础,结合MindSpore2.0的特性,详细介绍了迁移工作中的关键步骤与注意事项,旨在帮助读者理解迁移模型的基本逻辑与操作方法。 前言动机:本文作者Super_WZB,基于对MindSpore2.0的深入理解和实际应用经验,撰写了一篇基于MindSpore2.0的GPT2预训练模型迁移教程,旨在帮助开发者掌握使用MindSpore2.0进行模型迁移的全过程,从环境配置、代码查找与准备,到迁移流程与验证,提供了一套完整、易于理解的指南。 目的:本文主要目标是详细说明如何用MindSpore2.0进行模型迁移,专注于整体开发流程的介绍,提供示例代码与文档链接,旨在使读者明确迁移模型的步骤、如何操作以及验证方法。1、前期准备
本章节重点介绍迁移工作的前期准备工作,包括环境配置、MindSpore安装及查找迁移参考代码的方法。基本操作可通过网络查找获取详细步骤,对于经验丰富的用户,这部分内容可略过。1.1 寻找参照样例
确定迁移目标模型后,查找开源代码。通常知名模型的代码可通过GitHub等平台获取。建议将参考代码本地克隆,便于查阅、搜索依赖函数。1.2 Git操作
对于在GitHub上的代码,推荐使用Git进行本地操作,便于高效查阅、跳转及搜索。1.3 环境配置
1.3.1 自有硬件
配置本地硬件环境,包括安装MindSpore所需软件与包。推荐使用国内镜像源以优化下载速度。1.3.2 启智社区
利用启智社区提供的免费云端算力资源,支持GPU/NPU,提供便捷的在线开发环境。1.4 安装MindSpore
MindSpore官网提供详细的安装指南,包括基本环境的准备与MindSpore的安装步骤。2、网络迁移
网络迁移可以理解为将一个模型的结构与功能在不同框架之间进行转换。利用MindSpore2.0丰富的API,通过API映射实现不同框架间的代码迁移。2.1 源码下载
下载参考模型的源码,并进行基本的代码结构准备。对于迁移的源码,推荐从huggingface/transformers仓库下载。2.2 API映射
迁移过程中,关键在于API映射。MindSpore2.0 API与主流框架如PyTorch或TensorFlow具有高度兼容性,通过API映射表快速实现代码迁移。2.3 API差异
迁移时需注意API命名差异、参数差异及功能差异。利用API映射表进行查询,确保准确转换。2.4 API缺失
若遇MindSpore2.0中缺少某些API,可通过其他方法实现功能替换,如使用等效的MindSpore函数。2.5 注意事项
在迁移过程中,特别注意Tensor操作的连续性与设备转换,确保迁移的网络结构与功能正确无误。3、迁移验证
完成网络迁移后,通过单模块验证、整网验证及checkpoint验证确保迁移模型的正确性。3.1 单模块验证
验证迁移的模块是否正确实现功能,通过输入相同数据比较输出结果。3.2 整网验证
对完整网络进行验证,确保网络结构与功能正确。3.3 checkpoint验证
导入预训练模型参数,验证迁移模型在实际应用中的性能。总结
本文旨在提供一个全面的MindSpore2.0模型迁移指南,从准备工作到迁移流程、验证方法,帮助开发者深入了解与掌握迁移模型的关键步骤。通过实际操作与API映射,MindSpore2.0展现出其易于使用的特性,为开发者提供了强大的模型迁移工具。