Rust 有望取代 C 和 C++,成为机器学习首选的 Python 后端

发表于 4年以前  | 总阅读数:1837 次

在机器学习开发领域,如果我们纵观全局,撇除所有微小的细节,那么就可以提炼出机器学习开发中的两大不变步骤:模型训练和预测(或推断)。如今,机器学习的首选语言是 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++ 才是你的后端,是幕后的魔力源泉。

确实,这是 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 的界面。

from sklearn.datasets import make_blobs
import pytest
from linfa import KMeans
from sklearn.cluster import KMeans as sk_KMeans

@pytest.fixture(scope="session", autouse=True)
def make_data():
return make_blobs(n_samples=1000000)

def test_k_means_rust(benchmark, make_data):
    dataset, cluster_index = make_data
    model = KMeans(3, max_iter=100, tol=1e-4)
    labels = benchmark(model.fit_predict, dataset)
    assert len(labels) == len(cluster_index)

def test_k_means_python(benchmark, make_data):
    dataset, cluster_index = make_data
    # Using the same algorithm
    model = sk_KMeans(3, init="random", algorithm="full", max_iter=100, tol=1e-4, n_init=1)
    labels = benchmark(model.fit_predict, dataset)
    assert len(labels) == len(cluster_index)

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

use linfa::clustering::{generate_blobs, KMeans, KMeansHyperParams};
 use ndarray::array;
 use ndarray_rand::rand::SeedableRng;
 use rand_isaac::Isaac64Rng;

 fn main() {
     // Our random number generator, seeded for reproducibility
     let mut rng = Isaac64Rng::seed_from_u64(42);

    // For each our expected centroids, generate 1000 data points around it (a "blob")
    let expected_centroids = array![[10., 10.], [1., 12.], [20., 30.], [-20., 30.]];
    let dataset = generate_blobs(10000, &expected_centroids, &mut rng);

    // Configure our training algorithm
    let n_clusters = 4;
    let hyperparams = KMeansHyperParams::new(n_clusters)
        .max_n_iterations(200)
        .tolerance(1e-5)
        .build();

    // Infer an optimal set of centroids based on the training data distribution
    let model = KMeans::fit(hyperparams, &dataset, &mut rng);

    // Assign each point to a cluster using the set of centroids found using `fit`
    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 倍。

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

Rust Web 服务器上的 linfa 在重负载下的错误率也是最低的。

新的工作流

这项实验规模太小,无法得出确切的结论,而且我相信你可以找到针对 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)——我期待你的贡献!

非常欢迎你提供关于本文的注释、建议和反馈:你可以在 Twitter 上 @algo_luca,在 GitHub 上 @LukeMathWalker,或通过电子邮件 rust@lpalmieri.com 与我联系。

作者丨lpalmieri 译者丨王强 策划丨蔡芳芳

本文由哈喽比特于4年以前收录,如有侵权请联系我们。
文章来源:https://mp.weixin.qq.com/s/GShVD0y-gdsrAzcFELO50w

 相关推荐

刘强东夫妇:“移民美国”传言被驳斥

京东创始人刘强东和其妻子章泽天最近成为了互联网舆论关注的焦点。有关他们“移民美国”和在美国购买豪宅的传言在互联网上广泛传播。然而,京东官方通过微博发言人发布的消息澄清了这些传言,称这些言论纯属虚假信息和蓄意捏造。

发布于:1年以前  |  808次阅读  |  详细内容 »

博主曝三大运营商,将集体采购百万台华为Mate60系列

日前,据博主“@超能数码君老周”爆料,国内三大运营商中国移动、中国电信和中国联通预计将集体采购百万台规模的华为Mate60系列手机。

发布于:1年以前  |  770次阅读  |  详细内容 »

ASML CEO警告:出口管制不是可行做法,不要“逼迫中国大陆创新”

据报道,荷兰半导体设备公司ASML正看到美国对华遏制政策的负面影响。阿斯麦(ASML)CEO彼得·温宁克在一档电视节目中分享了他对中国大陆问题以及该公司面临的出口管制和保护主义的看法。彼得曾在多个场合表达了他对出口管制以及中荷经济关系的担忧。

发布于:1年以前  |  756次阅读  |  详细内容 »

抖音中长视频App青桃更名抖音精选,字节再发力对抗B站

今年早些时候,抖音悄然上线了一款名为“青桃”的 App,Slogan 为“看见你的热爱”,根据应用介绍可知,“青桃”是一个属于年轻人的兴趣知识视频平台,由抖音官方出品的中长视频关联版本,整体风格有些类似B站。

发布于:1年以前  |  648次阅读  |  详细内容 »

威马CDO:中国每百户家庭仅17户有车

日前,威马汽车首席数据官梅松林转发了一份“世界各国地区拥车率排行榜”,同时,他发文表示:中国汽车普及率低于非洲国家尼日利亚,每百户家庭仅17户有车。意大利世界排名第一,每十户中九户有车。

发布于:1年以前  |  589次阅读  |  详细内容 »

研究发现维生素 C 等抗氧化剂会刺激癌症生长和转移

近日,一项新的研究发现,维生素 C 和 E 等抗氧化剂会激活一种机制,刺激癌症肿瘤中新血管的生长,帮助它们生长和扩散。

发布于:1年以前  |  449次阅读  |  详细内容 »

苹果据称正引入3D打印技术,用以生产智能手表的钢质底盘

据媒体援引消息人士报道,苹果公司正在测试使用3D打印技术来生产其智能手表的钢质底盘。消息传出后,3D系统一度大涨超10%,不过截至周三收盘,该股涨幅回落至2%以内。

发布于:1年以前  |  446次阅读  |  详细内容 »

千万级抖音网红秀才账号被封禁

9月2日,坐拥千万粉丝的网红主播“秀才”账号被封禁,在社交媒体平台上引发热议。平台相关负责人表示,“秀才”账号违反平台相关规定,已封禁。据知情人士透露,秀才近期被举报存在违法行为,这可能是他被封禁的部分原因。据悉,“秀才”年龄39岁,是安徽省亳州市蒙城县人,抖音网红,粉丝数量超1200万。他曾被称为“中老年...

发布于:1年以前  |  445次阅读  |  详细内容 »

亚马逊股东起诉公司和贝索斯,称其在购买卫星发射服务时忽视了 SpaceX

9月3日消息,亚马逊的一些股东,包括持有该公司股票的一家养老基金,日前对亚马逊、其创始人贝索斯和其董事会提起诉讼,指控他们在为 Project Kuiper 卫星星座项目购买发射服务时“违反了信义义务”。

发布于:1年以前  |  444次阅读  |  详细内容 »

苹果上线AppsbyApple网站,以推广自家应用程序

据消息,为推广自家应用,苹果现推出了一个名为“Apps by Apple”的网站,展示了苹果为旗下产品(如 iPhone、iPad、Apple Watch、Mac 和 Apple TV)开发的各种应用程序。

发布于:1年以前  |  442次阅读  |  详细内容 »

特斯拉美国降价引发投资者不满:“这是短期麻醉剂”

特斯拉本周在美国大幅下调Model S和X售价,引发了该公司一些最坚定支持者的不满。知名特斯拉多头、未来基金(Future Fund)管理合伙人加里·布莱克发帖称,降价是一种“短期麻醉剂”,会让潜在客户等待进一步降价。

发布于:1年以前  |  441次阅读  |  详细内容 »

光刻机巨头阿斯麦:拿到许可,继续对华出口

据外媒9月2日报道,荷兰半导体设备制造商阿斯麦称,尽管荷兰政府颁布的半导体设备出口管制新规9月正式生效,但该公司已获得在2023年底以前向中国运送受限制芯片制造机器的许可。

发布于:1年以前  |  437次阅读  |  详细内容 »

马斯克与库克首次隔空合作:为苹果提供卫星服务

近日,根据美国证券交易委员会的文件显示,苹果卫星服务提供商 Globalstar 近期向马斯克旗下的 SpaceX 支付 6400 万美元(约 4.65 亿元人民币)。用于在 2023-2025 年期间,发射卫星,进一步扩展苹果 iPhone 系列的 SOS 卫星服务。

发布于:1年以前  |  430次阅读  |  详细内容 »

𝕏(推特)调整隐私政策,可拿用户发布的信息训练 AI 模型

据报道,马斯克旗下社交平台𝕏(推特)日前调整了隐私政策,允许 𝕏 使用用户发布的信息来训练其人工智能(AI)模型。新的隐私政策将于 9 月 29 日生效。新政策规定,𝕏可能会使用所收集到的平台信息和公开可用的信息,来帮助训练 𝕏 的机器学习或人工智能模型。

发布于:1年以前  |  428次阅读  |  详细内容 »

荣耀CEO谈华为手机回归:替老同事们高兴,对行业也是好事

9月2日,荣耀CEO赵明在采访中谈及华为手机回归时表示,替老同事们高兴,觉得手机行业,由于华为的回归,让竞争充满了更多的可能性和更多的魅力,对行业来说也是件好事。

发布于:1年以前  |  423次阅读  |  详细内容 »

AI操控无人机能力超越人类冠军

《自然》30日发表的一篇论文报道了一个名为Swift的人工智能(AI)系统,该系统驾驶无人机的能力可在真实世界中一对一冠军赛里战胜人类对手。

发布于:1年以前  |  423次阅读  |  详细内容 »

AI生成的蘑菇科普书存在可致命错误

近日,非营利组织纽约真菌学会(NYMS)发出警告,表示亚马逊为代表的电商平台上,充斥着各种AI生成的蘑菇觅食科普书籍,其中存在诸多错误。

发布于:1年以前  |  420次阅读  |  详细内容 »

社交媒体平台𝕏计划收集用户生物识别数据与工作教育经历

社交媒体平台𝕏(原推特)新隐私政策提到:“在您同意的情况下,我们可能出于安全、安保和身份识别目的收集和使用您的生物识别信息。”

发布于:1年以前  |  411次阅读  |  详细内容 »

国产扫地机器人热销欧洲,国产割草机器人抢占欧洲草坪

2023年德国柏林消费电子展上,各大企业都带来了最新的理念和产品,而高端化、本土化的中国产品正在不断吸引欧洲等国际市场的目光。

发布于:1年以前  |  406次阅读  |  详细内容 »

罗永浩吐槽iPhone15和14不会有区别,除了序列号变了

罗永浩日前在直播中吐槽苹果即将推出的 iPhone 新品,具体内容为:“以我对我‘子公司’的了解,我认为 iPhone 15 跟 iPhone 14 不会有什么区别的,除了序(列)号变了,这个‘不要脸’的东西,这个‘臭厨子’。

发布于:1年以前  |  398次阅读  |  详细内容 »
 相关文章
 目录