|
|
51CTO旗下网站
|
|
移步端
  • 性能提升25倍:Rust开展取代C和C++,成为机器学习首选之Python此后端

    在机器学习开发领域,如果我们纵观全局,撇除所有微小的细节,这就是说就足以提炼出机器学习开发中的两大不变步骤。

    笔者:lpalmieri 来源:AI前线| 2020-01-21 22:25

    在机器学习开发领域,如果我们纵观全局,撇除所有微小的细节,这就是说就足以提炼出机器学习开发中的两大不变步骤:模型训练和预测(或推断)。现行,机器学习的首选语言是 Python(除非你的上班条件有部分不平凡的约束才会有所不同),而这篇文章会带你走过一段新的旅程。瞩望当你看到最后会发现,采用 Rust 表现 训练后端 和 布局平台 的呼声并不像听起来那样疯狂或令人困惑(除了标题提到的性质提升外,这种做法的功利其实还有很多)。

    为什么选择 Python?

    咱们可以花很多时间讨论机器学习开发中采用的各族工作流,但如果说我们常见是以一种 批判性 的措施来训练模型,这通常是没有争议之。你有一组数据,下一场把它们切成许多部分从而更好地了解它们,接着尝试各种方式来解决你所关切的一定问题。(在谷歌街景图片中识别出小猫?天道预报?抑或是作物产量优化?做什么你来定!)

    这一路上会有许多陷阱,说到底你尝试使用的绝大多数艺术都不是开箱即用之,故此重点在于 很快的原型设计 和 迭代 改善。

    对于像 Python 这样的常态编程语言,这是一番优秀的采取场景。

    更主要的是,你要考虑到大多数机器学习实践者会有哲学、考古学、物理或类似学位的全景,却不是计算机科学专家,具体地说他们(我也一样✋)几乎没有接到过软件工程实践和工具方面的教练。

    虽说 Python 同时支持函数式和面向对象的全封闭式,但你可以运用命令式风格,借助其脚本功能来快速上手。他的入门门槛很低,随着你的阅历提升,越来越精于此道,Python 也会与你一同成长。

    但是,仅仅易用是远远不够的:训练机器学习模型需要大量之麻烦运算,而 Python 绝对不是最快的编程语言。

    于是乎我们看来 NumPy(1995/2006)、SciPy(2001)、Pandas(2008)和 Scikit-learn(2007)鱼贯入场。如果没有这样一个用于机器学习和不利计算的、高质量且覆盖全面的工具包,Python 就不会取得今天的位置。

    然而,如果你深入背后探究一番,就会发现那里没有多少 Python 的岗位:你正在采取 Python 来编排和采取 一度 C 和 C++ 例程的强有力内核。

    Python 是那些系统之前端,他家用 Python 其一用户界面将它们轻松地粘合在总共。C 和 C++ 才是你的下端,是默默的魅力源泉。

    性能提升25倍:Rust有望取代C和C++,成为机器学习首选的Python后端

    活生生,这是 Python 经常被忽视的性状:采用其 外函数接口(FFI)与其他编程语言互操作相当容易。特别是,Python 库可以将急需大量数字运算的顺序代码委派给 C 和 C++,这是 Python 是的生态体系中 整整 基础库都在采取的方针。

    当然,艺术永远无法决定一切。热学因素对于绝大多数项目的成功(或消亡)都是首要的,即使有些人以为这难以收到。

    故此我们应有再补一些背景:Python 是一番开放源代码项目(嗨,MATLAB!),他在学术部门中的渗透水平是不足忽视的;而且事实上,顶深度学习走进聚光灯从时,与他相关的大多数科学生态体系已经成立完毕了。

    之后看来,名将 Python 视为会在机器学习领域占据统治地位的强有力候选者是很潇洒之作业,结果也并不出人意料。

    咱们之后还应当继续采用 Python 吗?

    眼前我们简要地介绍了将 Python 表现机器学习开发首选编程语言的一部分原因。

    但世界并不是一成不变不变的:前景环境的转移可以大大改观人们对哪种工具是“最佳工作工具”的认识。

    一部分最新动向可能会加强 Python 在机器学习领域的位置。

    微服务

    微服务架构目前在架构设计方法中占主导地位:商店用松散的容器化服务集合来运转他们的工作,该署劳务通过网络相互通信。

    运作一个 Polyglot 堆栈从未如此简单:你的主人翁应用程序和业务逻辑的精髓都得以用 Java 编纂——顶你想利用机器学习来确定某笔信用卡交易是合法还是欺诈时,你可以发射一个 POST 呼吁到一个 Python 微服务上。

    数量科学家和机器学习工程师用 Python 推行模型探索的生活已经一去不复返了,现行我们将全部内容移交给“生产团队”,后者会用公司选择的语言全面重写逻辑。

    DevOps

    你构建,你运行——Werner Vogels(亚马逊 CTO)

    既然我们讨论的是工作,那就不能不强调一点:机器学习模型不是凭空存在的,它们是企业要启动、多极化或改进的产品或过程的组成部分。

    故此,仅由数据科学家组成的团体就能取得明显的功绩——是很天真的想法。你需要的东西远不止这些。

    如果要拥有成功之机遇,则要求从产品到软件工程的各族艺术的结合。

    这就是说这样的团体应该使用哪种编程语言?

    牢记 JavaScript 的兴起历程:同一个人口采取 JavaScript 和 NodeJS,就足以同时处理系统之前端和今后端工作(“全栈”)。

    表现通用编程语言的 Python 提供了相同的方便。你可以将他正确堆栈用于机器学习开发,并应用人家框架(Django、Flask 和 FastAPI 等)拓展模型部署,再通过 REST 或 gRPC API 提供预测。

    很好,不是吗?

    连锁效应

    Python 获得一个庞大的机器学习生态体系;

    你愿意自己之机器学习算法或机器学习框架能把采纳:故此你利用 Python 编纂代码(或利用 FFI 为他提供 Python 绑定);

    Python 生态体系变得更有力了。

    循环往复。

    答案

    明日我们可能还是会用 Python 来编写机器学习软件。

    咱们会永远使用它吗?不太可能,这就像在问自己,副今天起 10 年以后计算机产业之前途会是什么样。

    但是我不会押注说未来 5 年我们就能收看 Python 的夕阳。

    故此呢?这篇文章不是中心谈 Rust 的吗?

    正确!

    但更主要的是,在初始谈论正题之前消除所有可能的误解。

    我不信任 Rust 会取代 Python 成为机器学习的首选语言——这事完全没有其他苗头,甭管是当天还是未来,这都不是什么样子。

    这两门语言无法迎合相同的人流,并且它们针对的是不同之约束条件,做了不同之僵化工作,消灭之是不可胜数不同之题材。

    但是 Rust 在机器学习世界中有友好之一席之地。

    Rust 具有 代表 C 和 C++,成为机器学习负载首选之 Python 此后端 的光辉动力。

    为什么是 Rust?

    没有比这本书的 序言 更好的答卷了:

    例如,“系统除”地处理内存管理、数量表示和并发性的底色细节。风上,这种编程领域被视为是地下的王国,只有个别部分已经花了足够的年华读书,以避免其臭名昭著陷阱的人们才能步入其中。即使是履行它的这些人们也要当心行事,以免他们的编码易受攻击、轻而易举崩溃或损坏。

    Rust 消除了这些旧有的骗局,并提供了一套自己而精致的工具来赞助你披荆斩棘,打破这些障碍。该署急需“深入”到较底层控制的程序员可以运用 Rust 来形成这一点,而不要承担崩溃或出现安全漏洞的宽广风险,也不必领悟多变的工具链的精华所在。更好的是,这种语言旨在引导你自然地开始采取在性能和内存使用方面效率出色之保险代码。

    Rust 以彻底领先的信念水平提供了与 C 和 C++ 方便的性质。

    你相信编译器知道你所不知晓的情节:扭亏增盈,你从“这到底是什么?”安全地转到了“让咱在生养中运行这些代码!”的这条总长线上。

    这大大降低了入门的秘诀。

    让更多的人数(又包括我✋)可以编写高性能的机器学习算法。

    越来越多之人数方可为她们每天使用的这些项目的下端做出贡献。

    这会催生一个更大的农牧区、更多的试验和更可持续的品种——扭亏增盈,催生一个更健康、更多样化的自然环境体系。

    回到我之前提到的这些趋势,你会再次发现全栈带来的强有力力量:承担模型探索的那个人(采用 Python)可以深入研究并利用 Rust 重写其热路径,来优化最终解决方案。。

    但在 实行 官方这样做的强度如何呢?

    用 Rust 贯彻聚类算法能快多少?

    我为 RustFest 2019 未雨绸缪了一番 联欢会:咱们采用 ndarray(一度 NumPy 的 Rust 等效方案)副零开始实现了 K-Means 聚类算法。

    几周前,我写了部分关于研讨会的 笔记,相关材料 可以在 GitHub 上找到:他由一系列测试驱动的演习构成,每个步骤都为尾声解决方案作出了奉献。

    我不能忽视这个题目:与 scikit-learn 相比之下,Rust 官方 K-Means 的老实现有多快?

    我和一起同样对此问题刚到好奇的人数在 RustFest 度过了两角 贯彻日,说到底给出了答案。

    如果没有 @sitegui、@dunnock 和 @ThomAub,其一过程会花费更长的年华:异常感谢你们的协助!

    贯彻

    我用 Rust crate 通告了一番清理过的 K-Means 贯彻:linfa-clustering(https://crates.io/crates/linfa-clustering)。linfa-clustering 是 linfa(https://crates.io/crates/linfa)的一个子集——咱们稍后会详细讨论后者。

    副源代码中你可以看到来,根本在于清晰易懂的僵化配置:他是 Lloyd 书法 的贯彻范例。

    绝大多数提速机会都没有得到利用,并且肯定还有进一步调优和打磨的蓝天——例如,他只将多点程用于分配步骤,而更新步骤还是单线程的。

    为了进行正面比较,我为此编写了 Python 绑定(https://github.com/LukeMathWalker/linfa-python):linfa is on PyPi(https://pypi.org/project/linfa/),表现 Python 库。

    我想重点对比一下:

  • 训练时间;
  • 推理时间,模型 表现一个 gRPC 微服务 公开时所测得的年华。
  • 咱们测量将模型作为微服务公开来提供预测需要的年华,这更贴近在现实生产条件中采用此代码的显示。

    你可以在 GitHub 上拥有重现基准测试的发明、结果和代码(https://github.com/LukeMathWalker/clustering-benchmarks)。

    训练基准测试

    采用 pytest-benchmark)在一番 100 万点之多寡集上训练 K-Means 模型时,linfa 的 训练 速度是 scikit-learn 的 1.3 倍。

    库平均训练时间(毫秒)

    Linfa(Rust 上的 Python 包装器)467.2

    Scikit Learn604.7(慢 1.3 倍)

    完全来讲,它们的进度比较接近——出于分配步骤是并行的,linfa 可能会稍微快一些。

    如果你对这个结果感到疑惑,请再想一想:咱们正在将一个只花了两角时间之 教学研讨会 贯彻与当前最完美的机器学习框架所采取的贯彻进行比较。

    太疯狂了。

    副基准测试代码中得以看出,linfa K-Means 贯彻提供了一番类似于 scikit-learn 的层面。

          
    1. from sklearn.datasets import make_blobs 
    2. import pytest 
    3. from linfa import KMeans 
    4. from sklearn.cluster import KMeans as sk_KMeans 
    5. @pytest.fixture(scope="session", autouse=True) 
    6. def make_data(): 
    7. return make_blobs(n_samples=1000000
    8.  
    9. def test_k_means_rust(benchmark, make_data): 
    10. dataset, cluster_index = make_data 
    11. model = KMeans(3, max_iter=100, tol=1e-4
    12. labels = benchmark(model.fit_predict, dataset) 
    13. assert len(labels) == len(cluster_index) 
    14.  
    15. def test_k_means_python(benchmark, make_data): 
    16. dataset, cluster_index = make_data 
    17. # Using the same algorithm 
    18. model = sk_KMeans(3, init="random", algorithm="full", max_iter=100, tol=1e-4, n_init=1
    19. labels = benchmark(model.fit_predict, dataset) 
    20. assert len(labels) == len(cluster_index) 

    我也想给你介绍 Rust 本子——规模看起来略有不同(由于某种原因,我可能会在另一篇博客文章中讨论此事),但是你可以轻松地找出相同的步子:

          
    1. use linfa::clustering::{generate_blobs, KMeans, KMeansHyperParams}; 
    2. use ndarray::array; 
    3. use ndarray_rand::rand::SeedableRng; 
    4. use rand_isaac::Isaac64Rng; 
    5. fn main() { 
    6. // Our random number generator, seeded for reproducibility 
    7. let mut rng = Isaac64Rng::seed_from_u64(42); 
    8.  
    9. // For each our expected centroids, generate 1000 data points around it (a "blob") 
    10. let expected_centroids = array![[10., 10.], [1., 12.], [20., 30.], [-20., 30.]]; 
    11. let dataset = generate_blobs(10000, &expected_centroids, &mut rng); 
    12.  
    13. // Configure our training algorithm 
    14. let n_clusters = 4
    15. let hyperparams = KMeansHyperParams::new(n_clusters) 
    16. .max_n_iterations(200
    17. .tolerance(1e-5
    18. .build(); 
    19.  
    20. // Infer an optimal set of centroids based on the training data distribution 
    21. let model = KMeans::fit(hyperparams, &dataset, &mut rng); 
    22.  
    23. // Assign each point to a cluster using the set of centroids found using `fit` 
    24. let labels = model.predict(&dataset); 

    推理基准测试

    如前所述,采用一个专用微服务为机器学习模型提供服务,在业界已是一种既定模式。

    但在这些微劳动中,往往很少或几乎没有业务逻辑:它们无非就是一番 远程函数调用 而已。

    给定一个队化的机器学习模型,咱们是否可以完全自动化 / 空泛 API 浮动?随着 Tensorflow Serving 越来越受欢迎,我之想法得到了检查。

    故此我决定针对三种现象进行基准测试:

  • scikit-learn 的 K-means 运作在 Python 的 gRPC 传感器上;
  • linfa 的 K-means(Python 包装器)运作在 Python 的 gRPC 传感器上;
  • linfa 的 K-means(Rust)运作在 Rust 的 gRPC 传感器(tonic,https://github.com/hyperium/tonic)上。
  • 我尚未在这些 gRPC Web 传感器上做其他形式的调优:咱们要评价的是开箱即用之性质。我再次邀请你查看源代码(Rust/Python)。

    Rust Web 传感器上的 linfa 每秒处理的呼吁数是 scikit-learn 的 25 倍,是 python gRPC 传感器上的 linfa(Python 包装器)的 7 倍。

    性能提升25倍:Rust有望取代C和C++,成为机器学习首选的Python后端

    延迟(提供响应需要多长时间)也是如此,其中 Rust Web 传感器上的 linfa 前后 比 scikit-learn 快 25 倍,比 Python Web 传感器上的 linfa(Python 包装器)快 6 倍。

    性能提升25倍:Rust有望取代C和C++,成为机器学习首选的Python后端

    Rust Web 传感器上的 linfa 在重负载下的产销率也是最低的。

    性能提升25倍:Rust有望取代C和C++,成为机器学习首选的Python后端

    新的工作流

    这项实验规模太小,无法得出确切的总结,而且我深信不疑你可以找到针对 K-Means 的 Lloyds 书法的更快实现。

    但我期望这些结果足以说服你,Rust 活生生可以在机器学习开发中发挥关键作用。整整人只要学一些 ndarray 的用法(可以试行研讨会提供的史料),就足以写出这样的 Rust 贯彻——可就因为 C 和 C++ 的入门门槛,数以十万计机器学习从业者浪费了若干潜能?

    如果这还缺乏,我还想告诉你,Rust 不仅可以替换掉 Python 的 C 和 C++ 此后端——他还可以采取人家不断开拓进取之异步生态体系来处理部署工作。

    做起来很简单:

  • 采用基于 Rust 的 Python 库识别候选模型;
  • 列化最终模型;
  • 提供最终模型的门路和投入数据的预料模式作为配置;
  • 收缴果实吧。
  • 这绝对是一番值得在 2020 年探索的想法。

    过往下去

    如前所述,linfa-clustering 是 linfa 的散文集,后者是 Rust 中的通用机器学习框架,我计划在 2020 年专注研究这个框架。

    甚至在这时将他称为一个框架还为时过早:linfa-clustering 对内就没什么东西了😀。

    要贯彻其大胆的沉重宣言还有很长的路途要走,但在机器学习及其相关领域,对 Rust 生态体系之兴趣愈加浓厚:https://github.com/rust-ml/discussion/issues/1,https://github.com/rust-lang/wg-governance/issues/11,https://github.com/rust-lang/wg-governance/issues/11。

    有时你只需点燃星星之火,即可期待它可以燃烧。

    实际上,我坚信只有社区努力推动,才能在 Rust 官方扶持、确立和维持一个机器学习生态体系——并没有捷径可言。

    Rust 生态体系确实包含丰富的机器学习 crates——探望在 crates.io 上寻找 machine learning 会 回到 若干东西吧。

    咱们无需从头开始重写所有内容:我将 linfa 视为一个元包,一度 Rust 生态体系中挑选的作法实现的集聚。他是满足你机器学习需求之首要站,就像是 Python 中的 scikit-learn 一样。

    如果这篇文章引起了你的共鸣,请看一看路线图 (https://github.com/LukeMathWalker/linfa/issues)——我盼望你的孝敬!

    【编纂推荐】

    1. 首个活体机器人诞生:青蛙细胞生成,超级计算机设计
    2. 必发娱乐手机版还是人为智障?该署想不到的特大型算法翻车现场
    3. 多师AI商店HR/面试官爆料:咱们是怎样招机器学习工程师的
    4. 为什么我用Go写机器学习部署平台,而偏偏不用Python?
    5. 如何理解量子计算机算的准不准?MIT、谷歌找到一妙招!
    【义务编辑: 张燕妮 TEL:(010)68476606】

    点赞 0
  • 机器学习  必发娱乐手机版  微机
  • 分享:
    大家都在看
    猜你喜欢
  • 订阅专栏+更多

    Python使用场景实战手册

    Python使用场景实战手册

    Python使用场景实战手册
    共3章 | KaliArch

    19人口订阅学习

    一步到位玩儿透Ansible

    一步到位玩儿透Ansible

    Ansible
    共17章 | 骏马金龙1

    195人口订阅学习

    云架构师修炼手册

    云架构师修炼手册

    云架构师之必不可少技能
    共3章 | Allen在路上

    35人口订阅学习

    订阅51CTO邮刊

    点击这里查看样刊

    订阅51CTO邮刊

    51CTO劳务号

    51CTO官微


    
       
    <object id="e3665319"></object>