9月7日,Modular公司宣布正式发布Mojo:Mojo现在已经开放本地下载——初步登陆Linux系统,并将很快提供Mac与Windows版本。据介绍,Mojo最初的目标是比Python快35000倍,近日该团队表示,Mojo将动态与静态语言的优点结合起来,一举将性能提升达Python的68000倍。那么未来的人工智能的语言,是Rust还是Mojo?张汉东从Rust和Mojo语言的特性、生态和其在LLM大模型时代的角色进行了剖析。
编程语言是推动时代齿轮的抓手我从2006年入软件行业,截止今年我的职业生涯已经走过十七个年头。
这十七年我虽然没有什么光彩履历,但却很幸运,我还能在这个行业坚守,并能不断成长。同样很幸运,我经历了桌面软件没落,崛起,以及移动互联网的兴盛,当下基础设施系统软件开始复兴的诸多历程。
这么多年我思考最多的两个问题就是:
编程语言对于程序员来说到底意味着什么?
我们为什么要不断地学习新的编程语言?能不能学一门就行?
这两个问题的答案,取决于你如何看待编程语言。
在社区经常会听到一句话:“编程语言就是工具”。编程语言确实是工具,用于谋生的工具,用于编写软件的工具。在我看来,编程语言不仅仅是工具,更是思想的集合时代的缩影。编程语言的发展跟随计算机的发展一路走来,其中蕴含着推动时代变革的解决不同问题的思想。
编程语言背后都有共同的东西,比如计算机基础和其他领域知识。这些是可以在不同语言之间迁移的知识,只需要学一遍。但是编程语言的设计思想却是不同的,这就是编程语言吸引人的地方之一。就像同样都叫威士忌,可能会有不同的味道。
编程语言如何设计,一般都和它想要解决的问题有关。而它想解决的问题,通常都与语言创造者所处的时代和眼界有关。
C语言的诞生,是为了解决操作系统快速交付的难题,背后是70年代操作系统的发展;Cpp语言的诞生,是为了给C语言引入面向对象,提升开发效率,背后是80年代工业软件快速增长需求;Python/Java语言的诞生,是为了让开发者专注于业务而非语言细节,背后是90年代日益增长的Web开发需求。
回顾历史,我们看得出来。时代在不断变化,编程语言是推动时代齿轮的抓手。当新的时代到来时,有些语言是必须要学习的。让我们从Rust和Mojo语言的特性、生态和其在LLM大模型时代的角色来探索这两门语言的未来。
RustvsMojo:雄心与现状Rust语言Rust[1]语言之父Graydon带着内存安全和性能并重的设计初衷于2009年创立了Rust语言,幸运的是,这颗种子是种在了Mozilla这片开放的土壤中,在2015年结出了开放的花朵。
Rust语言并不是要百分百地解决内存安全问题,而是消除过去五十年导致系统编程语言中70%安全Bug中的内存安全问题:
引用空指针。
使用未初始化内存。
释放后使用,即悬垂指针。
缓冲区溢出,比如数组越界。
非法释放已释放过或未分配的内存。
并发场景下的数据竞争。
为了达成此目标,语言设计需要在六个原则中进行权衡:
可靠性。代码编译即正确。
高性能。代码执行效率可以媲美C/Cpp。
支持性。为用户提供多方面支持,比如IDE、用户友好的编译错误信息等。
生产力。让开发更有效率,事半功倍。
透明性。让用户对底层资源具有透明控制力。
多样性。多个领域都可以用Rust。
Rust语言是在这些原则中权衡的结果,客观情况无法做到同时满足这六大原则。所以,导致的问题就是学习曲线较其他语言更高,对学习和使用者的基础有一定的要求。
因为Rust语言面对的这个问题领域本身就非常复杂。从Rust语言架构层面来看,Rust语言为了解决内存安全和高性能并重的问题,给出的方案其实非常简洁。
首先,Rust语言是一门编译语言。Rustc是其编译前端,在编译过程中,通过精心设计的类型系统,通过对代码中类型的检查,来实现对内存安全进行管理,以及更好地优化代码。编译后端包括LLVM和Cranelift,以及正在支持的GCC后端和SPIR-VGPUIR。
其次,在类型系统之上,Rust语言也提供了更高级的抽象范式,支持面向对象风格和函数式编程风格,甚至可以直接向写C那样遵循过程式范式。并且引入了很多现代化语言特性,比如trait和enum,允许开发者易于编写出更具可扩展性的系统。
从2015年稳定版发布到写本文之时(2023年9月),Rust已经发布了72个语义化版本,三个Edition版次(每三年发布一次的大版本)。在Stackoverflow的年度调研报告中,Rust连续八年收获最受欢迎语言称号。
一门语言最重要的就是其生态。截止目前,上面crate数量已经超12万,下载量已达到393亿次。虽然,Rust学习曲线较高,但也没有阻碍生态的发展。
并且其生态从2020年起,每年下载量以1.7倍速度增长。
并且其生态基本能覆盖到C/Cpp/Java/Go等语言的应用领域。
截止今年,Rust语言已经证明了其在系统编程领域的优势。曾经流行的RewriteitinRust梗,已经变为了现实,目前能用Rust重写的基本都已经用Rust重写了。包括一些新的系统,Rust也是第一选择。这里说的系统,目前是指基础设施领域的系统,包括AI基础设施。
Mojo语言据Mojo官方声称,Chris在2022年创建Modular公司时,并未打算创造Mojo语言。他们在构建下一代推理引擎Modular时,发现整个技术栈的编程模型过于复杂,并且手动编写了大量的MLIR,开发效率极低。因此,他们萌生了创建新的编程语言来统一整个技术栈的想法,Mojo就诞生了。
Mojo想要的是一种创新且可扩展的编程模型,能够针对在人工智能领域中普遍存在的加速器和其他异构系统进行编程。这意味Mojo要成为一种具有强大的编译时元编程能力、集成自适应编译技术、在整个编译流程中进行缓存以及其他现有语言不支持的功能的编程语言。
从Mojo语言架构层面来看,Mojo如何解决这个问题:
首先,Mojo的语法兼容了Python语法。因为AI生态中Python库占据生态位,想要一统天下,必须坐拥Python。曾经Chris在Apple就有过类似经历,Swift可以与ObjectiveC的库混编,用了五年时间完成了语言之间的过渡。
$():print("helloworld")forxinrange(9,0,-3):print(x)$$复制代码
语法虽然与Python相似,但是Mojo的def定义中允许强类型检查。因为Mojo是Python的超集。
structMyPair:varfirst:Intvarsecond:Interror:'OurBool'doesnotimplementthe'__copyinit__'methodletb=a
复制代码
创建一个a,然后将其赋值给b,则会报错。因为Mojo语言中默认为值语义,OurBool并未实现copyinit方法,所以无法复制。
@register_passable("trivial")structOurBool:varvalue:__mlir___init__()-Self:returnSelf{value:__mlir_op.``[value:__mlir_attr.`false`,]()}复制代码
通过为结构体增加装饰器@register_passable(“trivial”),就可以复制其实例变量了。trivial代表是“平凡的”或“平平无奇的”简单值,可以安全复制。这里有点类似于Rust语言的复制语义。
MLIR是模块化和可扩展的。MLIR由越来越多的“方言(Dialects)”组成。每个方言定义了算子(Operation)和优化:例如,“math”方言提供了诸如正弦和余弦等数学操作,“amdgpu”方言提供了针对AMD处理器的特定操作,等等。方言经过降级之后,Mojo代码将被编译到指定平台的机器指令。
MLIR的每个方言都可以互操作。这就是为什么说MLIR可以解锁异构计算的原因。随着新的、更快的处理器和架构的开发,新的MLIR方言被实现以生成适用于这些环境的最优代码。任何新的MLIR方言都可以无缝地转换为其他方言,因此随着更多方言的添加,所有现有的MLIR都变得更加强大。
利用MLIR这种特性,就实现了底层异构系统大统一。这就是Mojo解决问题的方式。
RustvsMojo:对立还是融合?Mojo官方观点七月份,Modular官方博客发布标题为《未来的人工智能的语言,是Rust还是Mojo?》[2]的一篇文章。其中谈到Rust的语言特性,在AI领域相比于Python和Cpp,是一门更好的语言,这是一种认可。但是因为Rust语言是从零开始设计,其在AI领域的生态位还相当年轻,不如Python和Cpp。虽然生态中有一些Rust绑定库,比如OpenCV-rust[3]或者libonnxruntime的绑定ort[4],都是独立贡献者维护的,从2019年到现在进展不大。虽然现在也有更好的Rust实现,比如tract-onnx[5],但是缺乏贡献者和运营者,进展缓慢。并且声称绝大多数人工智能研究人员都是使用Python,而且对学习Rust不感兴趣,因此很不可能在机器学习领域得到广泛应用。
反观Mojo,可以复用任何一个Python库。并且在语法上兼容Python,会受到广大人工智能研究人员的喜爱。除此之外,Mojo也能简化当前Python+Cpp的麻烦,比如如果想加速代码,可能还得学习如何在C++中使用SIMD指令集作为备选方案等。官方给出了一个用Mojo做快速均值模糊(BoxBlur)的示例。其中用到了MLIR提供的SIMD功能和自己编写的用于将表示地址的Python整数转换为具有给定数据类型的Mojo指针的功能(代码如下)。
fromDTypeimportDTypefromPointerimportDTypePointerfnnumpy_data_pointer(numpy_array:PythonObject)raises-DTypePointer[]:returnDTypePointer[](__mlir_op.`_to_pointer`[_type:__mlir_type.`!`](SIMD[,1](numpy_array.__array_interface__['data'][0].__index__(",1")).value))复制代码
其中,pop是Modular团队开发的MLIR方言。它并不是为了普通程序员需要理解这个语法,随着时间的推移,有用的东西将会被编译器工程师封装成一个漂亮的API,供系统工程师和Python程序员(未来的Mojo程序员)在更高的层次上使用。但开发者仍然有能力定义自己的方言或使用MLIR生态系统中已经定义好的方言之一,这使得供应商可以轻松加速他们的硬件,例如gpu方言[6]。
以上,是Mojo官方的观点。总结为一句话就是:Rust很好,但其生态位不足;Mojo才是AI的未来。
Mojo官方忽略的问题:大模型时代开启,资本推动与时间差Mojo官方提供的观点论据都很足,很有道理。但是我认为官方忽视了一个重要问题:一门语言成熟所需的周期。
虽然MLIR功能强大极具潜力,但Mojo语言当前还是一个小火苗。它还需要很长时间来兑现它的承诺:安全、高性能、像Python一样简单易用。Rust语言从发布到成熟,花了八年;Go语言十三年;Swift差不多也是八年。那么Mojo语言需要几年呢?
从上面官方给出的各种示例中发现,Mojo标准库目前还未建立,如果用Mojo开发,还需要开发者懂MLIR各种方言,这学习曲线也许比Rust更高一个量级。难道这就是Python开发者喜欢的?
Mojo语言目前只被用于其母公司产品Modular推理引擎的开发中。从小道消息处得知,有些AI公司也已经投入了Mojo的前期培训。
而Rust语言,2023年之前确实在AI生态上进展缓慢,但今年大语言模型时代开启,资本大量涌入AI生态。在Mojo兑现承诺的这段时间差中,Rust语言极有可能在AI生态中占据一席之地。
因为,据我观察,2023年AI领域的一些独角兽已经开始采用Rust了。
Rust的AI生态位我们简单盘点一下当前Rust在AI领域的生态位。
AI领域涉及模型训练、模型部署、到智能应用这一系列流程。在这整个流程过程中,都能看到Rust语言的影子。我们简单将其分为下面五类:
高性能数据分析
深度学习框架及其依赖
推理引擎
开源大模型
大模型应用相关基础设施
高性能数据分析Polars在数据操作层面,每个人都喜欢Pandas的API。它快速、简单且有据可查。但在生产方面,Pandas有点棘手。Pandas不能很好地扩展……没有多线程……它不是线程安全的……它不是内存效率。这一切都是Rust存在的理由。
Polars[7]用Rust实现的新Dataframe库,具有方便的Python绑定。它试图做到以线程安全的方式进行读取、写入、过滤、应用函数、分组和合并。Polars建立在ApacheArrow规范[8]的安全Arrow2实现[9]之上,可实现高效的资源使用和处理性能。它还可以与Arrow生态系统中的其他工具无缝集成。
Polars有两个优势:
它是性能杀手,参考db-benchmark[10]。
它的API非常简单。哪怕不懂Rust语法也能看懂该接口要做什么。
也有三个缺点:
构建DataframeAPI很困难,Pandas花了12年才达到1.0.0,而Polars很年轻,所以目前还不够成熟。
使用它的时候,不仅仅要熟悉PolarsAPI,还需要熟悉ArrowAPI,因为很多繁重工作是arrow来完成的。
编译时间太慢,可能需要6分钟左右。
Polars现在主要由Xomnia[11]公司赞助。Xomnia是荷兰一家人工智能公司,在研究自动驾驶船只,被人称为水上特斯拉。
Linfa
Linfa[12]是一组Rust高级库的集合,提供了常用的数据处理方法和机器学习算法。Linfa对标Python上的scikit-learn,专注于日常机器学习任务常用的预处理任务和经典机器学习算法,目前Linfa已经实现了scikit-learn中的全部算法,这些算法按算法类型组织在各子包中。
目前Linfa的中期Roadmap[13]距离与Python的scikit-learn目前可用的ML算法和预处理程序相媲美的实现的最终目标。
其他
nalgebra[14],是Rust的通用线性代数库,和Rapier一起都是,Dimforge开源组织[15]开发的。
深度学习框架及其依赖HuggingFace出品:Candle
candle[16]是AI独角兽HuggingFace出品的专注于性能(包括GPU支持)和易用性的Rust极简机器学习框架。
candle框架的特点是:
语法简单,看起来和使用起来都像PyTorch。多后端支持。
优化的CPU后端,可选支持x86的MKL和mac的Accelerate
CUDA后端以高效地在GPU上运行,通过NCCL实现多GPU分布。
WASM支持,允许在浏览器中运行模型。
多模型支持。
LLMs:LLaMAv1和v2,Falcon,StarCoder。
Whisper(多语言支持)。
StableDiffusion。
计算机视觉:DINOv2,EfficientNet,yolo-v3,yolo-v8。
支持从safetensors、npz、ggml或PyTorch文件中加载模型
支持在CPU上Serverless部署
使用的量化类型来支持量化
Candle的核心目标是实现无服务器推理。像PyTorch这样的完整机器学习框架非常庞大,这使得在集群上创建实例变得缓慢。Candle允许部署轻量级二进制文件。
HuggingFace其他Rust开源库:
safetensors[17],安全存储和分发张量(tensor),并且是高性能(零拷贝)。该库主要是为了消除默认情况下使用的pickle的需要,因为pickle是不安全的,有运行任意代码风险。
tokenizers[18].
新晋开源框架:Burn
Burn[19]是一款开源的致力于成为全面的深度学习框架。它提供卓越的灵活性,并且使用Rust语言实现。目标是通过简化实验、训练和部署模型的过程,为研究人员和实践者提供服务。
Burn的进展非常快,目前已经发布0.9版本。它的特点是:
可定制、直观且用户友好的神经网络模块。
全面的训练工具,包括metrics、logging和checkpointing。
多功能的张量可插拔的后端工具箱:
Torch[20]后端,支持CPU和GPU
Ndarray[21]后端与no_std兼容性,确保了通用平台的适应性
WebGPU[22]后端,提供跨平台、包含浏览器的基于GPU的计算
Candle[23]后端。
Autodiff[24]自动微分后端。
Dataset[25]包含各种实用工具和资源的容器。
Import[26],是用于导入一个简化预训练模型集成的包。
学习更多内容可以参考BurnBook[27]。
社区也有第三方基于Burn实现了开源大模型:
stable-diffusion-burn[28],将移植到Burn框架中。
stable-diffusion-xl-burn[29],将stablediffusionxl移植到Rust深度学习框架burn中。
llama2-burn[30],将Meta的大型语言模型Llama2移植到Rust深度学习框架Burn上。
whisper-burn[31],是使用Rust深度学习框架Burn实现的OpenAIWhisper转录模型的Rust版本。
其他框架
tch-rs[32]是Pytorch的CppAPI的Rust绑定,目前正在活跃维护中。
tensorflow-rs[33],是Tensorflow官方提供的Rust绑定,目前正在活跃维护中。
dfdx[34],是一个强大的crate,其中包含了类型中的形状。这样一来,编译器就可以立即检测到形状不匹配的问题,从而避免了很多麻烦。
潜力股:自动微分器EnzymeADRust前端
Enzyme[35]是MIT提出的自动微分框架,用于对可静态分析的LLVM和MLIR进行自动微分。当前,PyTorch、TensorFlow等机器学习框架已经成为了人们开发的重要工具。计算反向传播、贝叶斯推理、不确定性量化和概率编程等算法的梯度时,我们需要把所有的代码以微分型写入框架内。这对于将机器学习引入新领域带来了问题:在物理模拟、游戏引擎、气候模型中,原领域组件不是由机器学习框架的特定领域语言(DSL)编写的。因此在将机器学习引入科学计算时,重写需求成为了一个挑战。
为了解决这一问题,现在的发展趋势包含构建新的DSL,让重写过程变得简单,或者在编程时直接进行构建。这些方法可以让我们获得有效的梯度,但是仍然需要使用DSL或可微分的编程语言进行重写。为了方便开发者,来自MIT的研究者开源了Enzyme。
目前,Enzyme团队forkRust语言项目开始实施EnzymeADRust前端[36],工作正在进行中。
依赖的基础库
pyo3[37]主要用于创建原生Python的扩展模块。PyO3还支持从Rust二进制文件运行Python代码并与之交互,可以实现Rust与Python代码共存。因此,pyo3是Rust和AI生态中的Python库交互必不可少的依赖库。目前pyo3维护非常活跃。
llm[38],是一个用于处理大型语言模型的Rust库生态系统-它是基于快速高效的GGML[39]机器学习库构建的。llm由ggml张量库提供支持,旨在将Rust的稳健性和易用性带入大型语言模型的世界。目前,推理仅在CPU上进行,但后续希望通过备用后端在将来支持GPU推理。
推理引擎tract:为嵌入式而生的推理引擎
Sonos[40]是一款家庭智能音箱,该公司开源了一款Rust实现的推理引擎tract[41]。tract的设计是为了在小型嵌入式CPU上运行神经网络。
AI大模型时代,算力是一个很大的问题。目前AI基本是被部署到云端,推理在云端完成:用户数据将被发送到云端,经过模型处理后,结果将被发送回终端用户的设备。有时候使用云服务并不是一个好的选择。自动驾驶汽车不能在进入隧道时停止行驶。当世界另一边的数据中心出现问题时,人们不应该被锁在家外面。而且,我们中的一些人只愿意与自己拥有的设备进行交互,而不是与那个神秘的云共享生活的一部分。所以,AI芯片通常分为三个关键应用领域:云端训练、云端推理和边缘推理。
边缘推理场景下,大模型可以在消费级终端上面进行推理,包括HuggingFace开源的candle也是为了边缘计算。这背后有个大的目标就是万物大模型。
tract架构背景
模型训练和推理是两个独立过程。训练模型是一项艰巨且复杂的任务,而推理则相对简单。模型设计和训练也是该领域大部分研究的重点。
在模型设计和训练过程中,机器学习团队注重预测的准确性。虽然整体计算预算是一个已知的限制条件,但目标是找出最佳的模型设计和训练过程,以获得最佳的准确性。
在推理过程中,效率至关重要。模型和硬件在这个阶段是固定的实体:问题是尽可能高效地使给定的模型在给定的硬件上运行。首先,要适应硬件,然后尽可能释放更多资源以供未来的发展使用。
一旦网络训练完成并冻结,训练的相关性就消失了。随之而来的是许多对模型设计和训练有用的抽象变得多余:当执行两个值的乘法时,CPU并不太关心这个操作属于哪个高级神经网络概念,比如卷积或者归一化层。
当今AI生态中ONNX(OpenNeuralNetworkeXchange)非常重要,ONNX构建了一个开放的生态系统,它使人工智能开发人员在推进项目时选择合适的工具,不用被框架或者生态系统所束缚。这种针对机器学习所设计的开放式的文件格式,用于存储训练好的模型,得不同的人工智能框架(如Pytorch、MXNet)可以采用相同格式存储模型数据并交互。
但ONNX仍然非常注重模型设计和训练。从推理引擎实现的角度来看,它仍然包含许多冗余的运算符。2017年由开源组织KhronosGroup制定的NNEF神经网络交换标准则使用了一个更低级的表示,其中训练语义被抹去了。
NNEF格式对于推理目的来说几乎是理想的,但该格式并不够主流,大多数软件集成商希望能够直接支持ONNX或TensorFlow。所以,tract引入了tract-opl,它在语义上与NNEF非常接近:专注于简单操作,而不考虑ONNX和TensorFlow格式编码的高级训练特性。它被设计为一组NNEF扩展:如果模型不使用NNEF不包含的任何特性或运算符,tract实际上可以将tract-opl序列化为纯NNEF。这也意味着tract可以从ONNX和TensorFlow转换为NNEF。
模型推理是计算密集型的任务。神经网络背后都会涉及到卷积和矩阵运算。tract为了提供高性能和跨平台,利用Rust和SIMD,以及内联汇编技术,来优化卷积和矩阵运算。比如自2014年至今移动SoCs最广泛使用的CPU架构Cortex-A53,以及苹果M1采用的ARMv8芯片,如果想充分利用这类芯片的性能,则需要汇编的加持。
目前tract还算是RustAI生态中比较流行的推理引擎。该框架也处于积极维护中。
开源大模型而SashaRush是HuggingFace的工程师。看来HuggingFace内部对于Rust语言很是喜欢。
的目标是在CPU上进行推理,这样的好处就是,想要部署开源大模型的公司不必要专门去寻找包括GPU的机器了,也算是降本增效吧?
商业大模型Deepgram[43]是一家基础人工智能公司,提供语音转文本和语言理解能力,使数据能够被人类或机器读取和应用。Deepgram是人类语音识别领域真正的专家。该服务使用先进的技术将音频文件无缝转换为文本。这家自然语言处理公司提供使用该服务转换电话、会议等的选项。所有这些都可以使公司的工作变得更加简单。去年年底完成7200万美元B轮融资。
Rust重写之后为他们解决了下列问题:
内存占用极大地降低了。
可以放心地引入并发,解决了CPU和GPU的性能瓶颈。在这之前,因为音频识别领域需要靠CPU处理很多前置工作,比如解码之类,之前用Python,导致CPU的性能跟不上GPU而导致了性能瓶颈。用了Rust之后,可以放心地使用并发,并期待GPU成为瓶颈了。让
开发人员专注于业务,而非把时间浪费在改Bug找Bug。
大模型应用相关基础设施BlindAI:快速且注重隐私的RustAI部署解决方案
如今,大多数人工智能工具都没有隐私保护机制,因此当数据被发送给第三方进行分析时,数据就会暴露在恶意使用或潜在泄露的风险之中。比如使用AI语音助手时,音频录音经常被发送到云端进行分析,这样会导致对话内容暴露在外,被未经用户知情或同意的情况下进行泄露和未受控制的使用。尽管可以通过TLS安全地发送数据,但在其中一些利益相关者的环节中,仍然有可能被看到和暴露数据:租用机器的人工智能公司、云服务提供商或恶意内部人员。
BlindAI[45]是一个利用安全隔离技术的AI部署解决方案,使远程托管的AI模型更加注重隐私保护。利用tract[46]项目作为推理引擎,在隔离环境中提供ONNX格式的AI模型服务。还使用RustSGXSDK[47],在安全隔离环境中使用Rust语言。用户可以从云中的AI模型中受益,而无需向AI提供商或云提供商披露其明文数据。
bastionlab[48]提供一个简单的隐私框架,用于数据科学协作,涵盖数据探索和人工智能训练。允许数据所有者和数据科学家可以在不暴露数据的情况下安全地合作,为那些过于冒险而不敢考虑的项目铺平道路。项目使用Polars进行数据探索,还使用了Torch(tch-rs),这是一个流行的用于AI训练的库。
其主公司MithrilSecurity目前处于PreSeed融资,120万欧元。
向量数据库商业向量数据库Pinecone向量数据库随着大语言模型时代的开启而迅速走上风口,Pinecone则属于向量数据库行业内的独角兽。
Pinecone虽然是闭源产品,但其在官方博客和Rust社区活动中都有相关的技术输出。就在去年年底,官方博客发表一篇文章《用Rust重写一个高性能的向量数据库》[49],其中记录了Pinecone从Python+Cpp到Rust重写的心路历程。
Pinecone在Python+Cpp的版本下,经常会遇到性能问题,但是却很难找到同时具备Python和C++经验的开发人员来解决这些问题。所以Pinecone就用Rust重写了整个数据库。2023年4月,Pinecone拿到了1亿美元B轮融资。
虽然Pinecone用Rust重写了整个数据库,但并不意味着他们可以摆脱Python,毕竟Python是AI应用场景中占主导地位的语言。就在前几天,Pinecone工程师发文吐槽《Python的痛苦与诗意》[50],并指明期待Mojo语言的到来。文中痛斥了Python项目的打包、测试、分发和测试工具生态系统,并使用Poetry来管理PineconePython客户端,可以使用它来创建、更新和查询Pinecone向量数据库索引,因为他们认为它对Pinecone的内部维护人员、客户和社区贡献者提供了最多的好处。
开源向量数据库向量数据库作为大语言模型的「长期记忆」能力,当下很火。qdrant目前融资750万美元种子轮。
开源AIAgentChidor[52]也许是一个LangChain的替代品,同样可以方便的构建AIAgent,主要优势是反应式编程。由Rust开发,能支持Python、Nodejs和Rust构建Agent。它目前处于alpha阶段,尚未准备好投入生产使用。以下是它的一些特点:
从头开始构建代理
运行时由Rust编写,开箱即支持Python和
构建可实际运行的代理
LLM缓存可最大限度地降低开发成本
针对长时间运行的人工智能工作流进行了优化嵌入式代码解释器
支持时间旅行调试
Chidori是火影忍者中卡卡西忍术的名称,它在日语中得名称是ThousandBirds(千鸟),而千鸟是指一群鸟(或称为鸟群)以及由它们之间的互动产生的群体行为。千鸟是对长时间运行的代理人行为、它们内部执行的LLM单元以及由它们之间的互动产生的群体行为的一个很好的类比。
infino[54],是Rust实现的一个可观测性平台,用于大规模存储指标和日志,并以更低的成本实现。可以集成到不同平台中,尤其是用于大模型相关基础设施和应用的可观测性。
总结Rust语言发布后,经过八年的发展,已经成为当下系统编程语言的最佳选择,目前常用于构建基础设施,包括AI基础设施。
Mojo语言在AI领域极具潜力,但目前还未成熟,还需要很长时间来给开发者兑现承诺。
大模型时代开启,商业竞争激烈,资本推动下,Rust将在Mojo成长的这段时间差内抢占一定比例的AI生态位。而Mojo目前唯一的应用很可能只是Modular推理引擎,这个状态和Rust早期与Servo浏览器内核共同演进的历史非常相似。
所以,短期内,Rust和Mojo在各自适合的场景内逐渐发展。长期来看,Mojo如果发展的好,就可以顺利地将Python生态过渡到Mojo,从而抢占一定的AI生态位。Mojo还有一个更大的野心,就是也想成为通用语言。如果Mojo成熟到一定地步,那么会和Rust产生竞争,毕竟Mojo的语法相比Rust更好上手,但学习曲线不一定更低。在被Rust抢占的AI生态位,Mojo也会与Rust进行交互融合。
[1]Rust:
[2]《未来的人工智能的语言,是Rust还是Mojo?》:
[3]OpenCV-rust:
[4]ort:
[5]tract-onnx:
[6]gpu方言:
[7]Polars:
[8]ApacheArrow规范:
[9]安全Arrow2实现:
[10]db-benchmark:
[11]Xomnia:
[12]Linfa:
[13]Linfa的中期Roadmap:
[14]
[15]
[16]candle:
[17]safetensors:
[18]tokenizers:
[19]Burn:
[20]Torch:
[21]Ndarray:
[22]WebGPU:
[23]Candle:
[24]Autodiff:
[25]Dataset:
[26]Import:
[27]BurnBook:
[28]stable-diffusion-burn:
[29]stable-diffusion-xl-burn:
[30]llama2-burn:
[31]whisper-burn:
[32]
[33]tensorflow-rs:
[34]dfdx:
[35]Enzyme:
[36]EnzymeADRust前端:
[37]pyo3:
[38]llm:
[39]GGML:
[40]Sonos:
[41]tract:
[42]LLama2的纯Rust实现:
[43]Deepgram:
[44]介绍了其平台为何使用Rust重写:
[45]BlindAI:
[46]tract:
[47]RustSGXSDK:
[48]bastionlab:
[49]《用Rust重写一个高性能的向量数据库》:
[50]《Python的痛苦与诗意》:
[51]Qdrant:
[52]Chidori:
[53]llm-chain:
[54]infino: