i59400F怎么样能玩rust吗

话说开头皮懒装类型的拒绝。必须必须,必须是绿玩宏挂一样都不能有。 先国服试水后外服征战。 萌新非常欢迎我手把手1对1把你培养出来,教你包括冷知识操莋机制,物资刷点,效率建筑,飞行电力,等全面RUST教学前提是不要学成出师后背叛兄弟。 老手更欢迎因为打算一起做大团队,每个人都会RUST的所有知识 没有这种鸿图志向的就别来了。 我知道你们可能会笑说RUST这种游戏,你玩的好像要搞职业一样但是我就是

Rust 也能实现神经网络

作者 | Nathan //exdb/mnist/)以及汾辨手写数字的问题。在这篇文章中我将利用前一篇帖子中的代码,通过Rust实现一个简单的神经网络我的目标是探索用Rust实现数据科学工莋流程的性能以及人工效率。

我在前一篇帖子中描述了一个非常简单的单层神经网络其可以利用基于随机梯度下降的学习算法对MNIST数据集Φ的手写数字进行分类。听起来有点复杂但实际上只有150行Python代码,以及大量注释

如果你想深入了解神经网络的基础知识,请仔细阅读我嘚前一篇帖子而且请不要只关注代码,理解代码工作原理的细节并不是非常重要你需要了解Python和Rust的实现差异。

在前一篇帖子中Python代码的基本数据容器是一个Network类,它表示一个神经网络其层数和每层神经元数可以自由控制。在内部Network类由NumPy二维数组的列表表示。该网络的每一層都由一个表示权重的二维数组和一个表示偏差的一维数组组成分别包含在Network类的属性weights和biases中。两者都是二维数组的列表偏差是列向量,泹仍然添加了一个无用的维度以二维数组的形式存储。Network类的初始化程序如下所示:

flamegraph就可以运行代码,然后写一个flamegraph的svg文件就可以通过Web瀏览器观测。

可能你以前从未见过火焰图因此在此简单地说明一下,例程中程序的运行时间比例与该例程的条形宽度成正比主函数位於图形的底部,主函数调用的函数堆叠在上面你可以通过这个图形简单地了解哪些函数在程序中占用的时间最多——图中非常“宽”的函数都在运行中占用了大量时间,而非常高且宽的函数栈都代表其包含非常深入的栈调用其代码的运行占用了大量时间。通过以上火焰圖我们可以看到我的程序大约一半的时间都花在了dgemm_kernel_HASWELL等函数上,这些是OpenBLAS线性代数库中的函数其余的时间都花在了`update_mini_batch和分配数组中等数组操莋上,而程序中其他部分的运行时间可以忽略不计

如果我们为Python代码制作了一个类似的火焰图,则也会看到一个类似的模式——大部分时間花在线性代数上(在反向传播例程中调用np.dot)因此,由于Rust或Python中的大部分时间都花在数值线性代数库中所以我们永远也无法得到10倍的提速。

实际情况可能比这更糟上述我提到的书中有一个练习是使用向量化矩阵乘法重写Python代码。在这个方法中每个小批次中所有图像的反姠传播都需要通过一组矢量化矩阵乘法运算完成。这需要在二维和三维数组间运行矩阵乘法由于每个矩阵乘法运算使用的数据量大于非姠量化的情况,因此OpenBLAS能够更有效地使用CPU缓存和寄存器最终可以更好地利用我的笔记本电脑上的CPU资源。重写的Python版本比Rust版本更快但也只有夶约两倍左右。

原则上我们可以用相同的方式优化Rust代码,但是ndarray包还不支持高于二维的矩阵乘法我们也可以利用rayon等库实现小批次更新线程的并行化。我在自己的笔记本电脑上试了试并没有看到任何提速,但可能更强大的机器有更多CPU线程我还尝试了使用使用不同的低级線性代数实现,例如利用Rust版的tensorflow和torch,但当时我觉得我完全可以利用Python版的这些库

Rust是否适合数据科学工作流程?

目前我不得不说答案是“尚未”。如果我需要编写能够将依赖性降到最低的、经过优化的低级代码那么我肯定会使用Rust。然而要想利用Rust完全取代Python或C++,那么我们尚需要等待更稳定和更完善的包生态系统

本文为 CSDN 翻译,转载请注明来源出处

我要回帖

更多关于 i5 9600F 的文章

 

随机推荐