Python + Docker 还是 Rust + WebAssembly?

在不断发展的技术世界中,由大语言模型驱动的应用程序,通常被称为“LLM 应用”,已成为各种行业技术创新背后的驱动力。随着这些应用程序的普及,用户需求的大量涌入对底层基础设施的性能、安全性和可靠性提出了新的挑战。

Python 和 Docker 一直是构建机器学习应用程序的主流选择。然而,当涉及到为大型语言模型(LLM)应用程序构建基础设施时,这种组合的一些缺点变得更加严重,例如 Python 的性能问题和 Docker 的冷启动问题。本演讲重点关注为 LLM 生态构建基础设施的主要场景,并深入探讨 Python 和 Docker 组合的问题,更重要的是,为什么 Rust + WebAssembly (WASM) 优于 Python + Docker。最后,我们将演示如何在 flows.network 平台上构建一个代码检查机器人。

现有解决方案:Python + Docker 方法

在机器学习领域,Python 几乎称王,主要得益于以下三个特点:

  • 易于学习: Python 是一种高级语言,语法简单,易于学习和使用。对于 AI 新手或需要快速原型设计和测试想法的开发者,这可能至关重要。

  • 庞大的社区: Python 拥有庞大且活跃的开发者社区,这意味着有许多库和工具可用于 AI 开发。对于需要快速找到常见问题解决方案的开发者来说,这是个优势。

  • 灵活性: Python 用途多样,可用于广泛的 AI 任务,包括数据分析、机器学习和自然语言处理。对于需要从事多个 AI 项目的开发者而言很有吸引力。

Docker 容器作为当今最流行的容器管理工具之一,为应用部署提供了极大的便利:

  • 可移植性: Docker 容器被设计为可移植的,这意味着它们可以在不同环境之间轻松移动。对于需要将 AI 应用程序部署到多个平台或云提供商的开发者来说,这可能是一个优势。

  • 隔离: Docker 容器在应用程序和主机操作系统之间提供了高度的隔离,可以提高安全性和稳定性。对于需要高级别安全性的组织来说,这可能是一个优势。

  • 可扩展性: Docker 容器可以轻松扩展或缩小以满足不断变化的需求,这对于需要大量计算或需要处理大型数据集的 AI 应用程序来说是一个优势。

对于传统机器学习应用的开发和部署,Python+Docker 模式展现了其优势。然而,在 LLM 生态的基础设施建设中,却面临着挑战。

Python + Docker 的挑战

Python 和 Docker 的优点自然也带来了一些缺点。然而,在 LLM 生态基础设施建设的过程中,这些缺陷变得更加突出,成为关键障碍。让我们先看看 Python 存在的问题。

Python 的缺点

 性能瓶颈

Python 是一种解释性语言,这意味着它可能比 C++ 或 Rust 等编译语言慢。当处理需要大量计算的大型数据集或复杂模型时,这可能是一个缺点。

在图 1 中,前三行分别显示了用 Python、Java 和 C 编写的将两个 4096 x 4096 矩阵相乘的编程性能。从“运行时间(秒)”一栏的统计数据可以看出,(1)Java(作为静态编程语言)比 Python(作为动态编程语言)快 10 倍;(2) C(作为非 GC 编程语言)比 Python(作为 GC 编程语言)快 50 倍。

图片

图 1 程序性能工程的加速 将两个 4096×4096 矩阵相乘。

  • 并行性 Python 的全局解释器锁 (GIL) 通常被认为是并行执行时的限制。GIL 确保单个进程中一次只有一个线程执行 Python 字节码,这会阻碍多核处理器的充分利用并影响并行性能。

  • 内存管理 Python 的动态类型和垃圾收集会带来内存管理的开销。虽然垃圾收集器有助于自动内存管理,但有时会导致效率低下,特别是在实时性能至关重要的情况下。

混合编程:Python + C/C++/Rust

为了改善 Python 语言本身的性能问题,常见的做法是使用 Python 作为负责与用户交互的前端语言,同时选择 C/C++/Rust 等高性能编程语言作为后端 语言来处理繁重的计算任务。Python 生态中很多知名库都采用这种方式来满足高性能计算的需求,比如 Numpy。然而,这种混合编程方法不可避免地需要额外的工具(或库)作为“连接”两种不同编程语言的桥梁。因此,这个过程可能会带来新的问题。

 维护成本

假设我们想要“绑定” Python 和 C++ API,我们必须使用第三方库来自动化这个转换过程,例如 Pybind11。图 2 中的示例代码展示了如何使用 Pybind11 “绑定” C++ 和 Python 程序。不难看出,尽管 Pybind11 极大地简化了转换过程,但添加或删除任何 C++ API 都需要对转换代码进行相应的更改,并且更改的难度与变更内容密切相关。从成本角度来看,这个过程不仅增加了开发者的学习成本,也增加了项目的开发和维护成本。

图片

图片

图 2 将 C++ 和 Python“粘合”在一起。

 可移植性问题

  • 混合编程可能会带来可移植性挑战。由于 Python 与本机库交互的方式或不同环境中的系统级依赖关系存在差异,在一个平台上无缝运行的代码可能会在另一个平台上遇到问题。

 集成复杂性

  • 如图 2 所示,将 Python 与其他语言绑定通常需要仔细管理数据类型、内存分配和错误处理。尽管有第三方库可以改进绑定任务,例如 Pybind11,但这种“粘合”过程仍然容易出错,并且需要对 Python 和所使用的其他语言有深入的了解。这会在一定程度上增加开发时间和风险。

Docker 容器的局限性

 冷启动性能

  • Docker 容器虽然高效,但有时会面临冷启动性能的挑战。“冷启动”是指容器实例化后开始运行所需的时间。就 Docker 而言,启动时间通常为秒级。这可能看起来不多,但在快速扩展和响应能力至关重要的环境中,这些时间可能会导致明显的延迟并降低用户满意度。

 磁盘空间消耗

  • Docker 容器有时可能非常庞大,消耗的磁盘空间达到千兆字节 (GB) 的量级。当容器包含所有必要的依赖项和运行时环境时尤其如此。如此大的容器大小可能会导致存储成本增加、部署时间变慢以及管理和分发容器映像方面的挑战。

 硬件加速器支持

  • 虽然 Docker 容器可以利用硬件加速器来提高性能,但有一个问题。他们通常需要特定版本的软件来确保兼容性。这意味着组织可能需要维护多个版本的容器或更新其硬件加速器以满足软件要求,从而增加了复杂性和管理开销。

 可移植性问题

  • Docker 的主要卖点之一是它的可移植性。然而,这种可移植性有时取决于 CPU 架构。虽然 Docker 容器被设计为在不同环境中一致运行,但在不同 CPU 架构之间移动时可能会存在差异。这可能会给确保不同部署环境中的一致性能和行为带来挑战。

 安全依赖

  • Docker 容器依赖主机操作系统的用户权限来保证安全。这意味着容器的安全性在一定程度上依赖于底层操作系统的安全配置。如果主机操作系统受到损害或配置错误,则可能会使容器面临安全漏洞。

这些限制凸显了对替代解决方案的需求,例如 Rust + WebAssembly,它有望解决其中一些痛点,并为部署 LLM 应用程序提供更高效、更安全的环境。

AGI 将是由 Rust 和
WebAssembly 构建

为什么 Rust 和 WebAssembly 可以成为 AGI 的语言?

图片

Rust:AGI 时代的最佳选择

  • 性能。 Rust 是一种编译语言,以其极快的性能而闻名。当与基于堆栈的虚拟机的二进制指令格式 WebAssembly 结合使用时,这两个组合有望提供无与伦比的执行速度。

  • 内存安全。 Rust 的突出特点之一是它强调内存安全而不牺牲性能。这确保了应用程序既快速又安全。

  • 并发性。 Rust 的并发性方法是独一无二的。它确保在编译时捕获数据竞争(并发系统中最常见和最具挑战性的错误之一)。这意味着开发者可以编写并发代码,而不必担心引入难以检测的运行时错误。

  • 富有表现力的类型系统。 Rust 拥有强大且富有表现力的类型系统。该系统不仅有助于在编译时捕获错误,而且还允许开发者以清晰简洁的方式表达他们的意图。

  • 现代包管理。 Cargo,Rust 的包管理器,简化了管理依赖项、构建项目甚至发布库的过程。因其易用性和高效性而受到赞誉的工具。

  • 快速增长的生态。 Rust 的生态正在蓬勃发展。像“ndarray”、“llm”、“candle”和“burn”这样的库证明了社区积极参与扩展 Rust 的能力。

WASM 容器:更快、更轻、更安全

Shivraj Jadhav 从多个维度比较了 Docker 容器和 WASM。

图片

表 1 WASM 与 Docker

  • 可移植性。 WebAssembly 被设计为用于编译高级语言的可移植目标,允许部署在 Web 和 服务端,跨不同硬件。

  • 沙箱机制。 WebAssembly 引入了沙箱机制,提供更安全的生产环境。这可以确保代码在隔离的环境中运行,从而最大限度地减少潜在风险。

  • 保护用户数据和系统资源。 WebAssembly 的设计考虑了安全性。它确保用户数据和系统资源免受潜在威胁。

  • 字节码验证。 在执行之前,WebAssembly 字节码会经过验证过程,以防止恶意代码运行。这增加了额外的安全层。

  • 隔离执行环境。 WebAssembly 中的模块在隔离环境中运行。这意味着即使一个模块出现问题,也不会影响其他模块的正常运行。

  • 占用空间更小。 使用 Rust 和 WebAssembly,开发者可以事半功倍。编译后的代码通常要小得多,从而加快加载时间并提高执行效率。

 WASI-NN 标准

除了上述优点之外,WebAssembly 针对机器学习应用的 WASI-NN 标准也是一个重要因素。

  • 主流机器学习推理引擎。 WASI-NN 旨在与流行的机器学习推理引擎(如 TensorFlow、PyTorch 和 OpenVINO)无缝协作。

  • 大型语言模型的扩展。 借助“Llama2.c”和“llama.cpp”等工具和库,WASI-NN 提供为大型模型应用程序量身定制的功能,确保开发者拥有他们需要的的工具,以处理广泛的数据集和复杂的模型。

最新发布的 WasmEdge 0.13.5 已经支持使用 Rust 和 Wasm 运行 llama2 系列大模型,包括但不限于我们熟知的 Codellama、Mistral、OpenChat、BELLE-Llama2、Yi-34B 等等。详情请查看 llama-utils。

应用场景:代码检查代理(Agent)

在本节中,我们将演示如何使用“flows.network”平台构建代码检查代理。在深入讨论具体示例之前,我们首先看一下“Agent”和“flows.network”平台的概念模型。

Agent 的概念模型

这是 Lilian Weng 提出的基于 LLM 的 AI Agent 的概念框架。

图片

图 3 LLM 驱动的自治代理系统概述

在这个模型中,LLM 函数扮演了智能体大脑的角色,负责核心推理和决策,但它仍然需要额外的模块来启用关键能力:规划、长 / 短期记忆和工具使用。

“flows.network”平台是基于与 Lilian 提出的模型类似的理念构建的。图 4 显示了其主要组件。整个平台是用 Rust 编写的,编译为 wasm 模块,并在 WasmEdge Runtime 上运行。

图片

图 4 Flows.network 的主要组件

代码检查代理

在“flows.network”平台上,我们提供了一个代理(一个机器人模版)来帮助 GitHub 上开源项目的维护者审核 PR。将其命名为“代码检查机器人”。

代理的抽象设计如图 5 所示。图中中心的红色块code-review-function 定义了核心代理函数,而红色块周围的每个虚线圆圈与直接连接到图 3 中“代理”块的对应部分相匹配。

图片

图 5 Code Review Bot 抽象设计

图 6 描述了Code Review Bot的架构。除了 GitHub Service 等外部资源外,代理由 wasm 模块组成,并在 WasmEdge Runtime 上运行。集成 wasm 模块负责通过 Web API 将 WebAssembly 函数连接到外部资源。例如,“code-review-function” wasm 模块将审核中的代码提取为提示词,然后“openai-integration” wasm 模块将提示词发送到 ChatGPT 服务并等待响应;最后,将评论发送到 code-review-function wasm 模块。

图片

图.6 架构代码检查机器人

图 7 显示了 Code Review Bot 的 PR 检查摘要示例。它总结了目标 PR,列出了隐藏的风险和重大改变等。这些信息可以帮助检查者将注意力集中在关键部分,节省时间。

图片

图 7 代码检查机器人 PR 审核总结示例

代码检查机器人可以在几分钟内完成部署。如果你想在自己的项目中使用它,可参考本指南。

结     论

在 AI 基础设施开发领域,虽然 Python 和 Docker 为我们提供了很好的服务,但探索和采用能够带来更好性能、安全性和效率的新技术也至关重要。Rust 和 WebAssembly 的结合反映了这种演变,为开发者和组织提供了一个有吸引力的替代方案。

参考资料

flows.network: 驱动 AI 工作负载的低代码 Serverless 平台。https://flows.network/

llama-utils: 请访问 https://github.com/second-state/llama-utils

 作者简介

Sam Liu, QCon 北京 2023 演讲嘉宾,Second State 工程师,CNCF WasmEdge 维护者 & Miley Fu,CNCF 大使,WasmEdge DevRel。


完整幻灯片下载:
https://qcon.infoq.cn/202309/beijing/presentation/5466

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/180836.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AI助力钢铁产业数字化,python基于YOLOv5开发构建钢铁产业产品智能自动化检测识别系统

AI为工业产业智能化数字化赋能早已不是什么新鲜事,越来越多的行业和领域开始更大范围去拥抱AI,享受科技带来的变革力量,在我们之前的文章中也有很多相关领域项目的实践经历,本文的核心目标就是想要基于钢铁领域产品数据来开发构建…

【Unity细节】Default clip could not be found in attached animations list.(动画机报错)

👨‍💻个人主页:元宇宙-秩沅 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 本文由 秩沅 原创 😶‍🌫️收录于专栏:unity细节和bug 😶‍🌫️优质专栏 ⭐【…

LeeCode前端算法基础100题(3)- N皇后

一、问题详情: 按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上,并且使皇后彼此之间不能相互攻击。 给你一个整数 n ,返回所有不同的 n 皇后…

大宗商品贸易集团数据治理实践,夯实数字基座 | 数字化标杆

某大型央企是首批全国供应链创新与应用示范企业,在“十四五”规划期内以聚焦供应链管理核心主业作为主要战略发展方向。供应链运营管理以大宗商品贸易为主,其交易往往具有交易量巨大、交易环节复杂、风险交易难识别、风险客商难管控等痛点。 随着集团数…

数字乡村:科技赋能农村产业升级

数字乡村:科技赋能农村产业升级 数字乡村是指通过信息技术和数字化手段,推动农业现代化、农村经济发展和农民增收的一种新模式。近年来,随着互联网技术的飞速发展,数字乡村开始在全国范围内迅速兴起,为乡村经济注入了新…

超详细的pytest玩转HTML报告:修改、汉化和优化

前言 Pytest框架可以使用两种测试报告,其中一种就是使用pytest-html插件生成的测试报告,但是报告中有一些信息没有什么用途或者显示的不太好看,还有一些我们想要在报告中展示的信息却没有,最近又有人问我pytest-html生成的报告&a…

银河麒麟V10-ARM架构-postgresql安装与部署指南

提示:本人长期接收外包任务。 前言 本文详细介绍应用源码进行pgsql的安装步骤,本文以postgresql-12.0为例。 一、下载并解压安装包 ☆下载地址:https://ftp.postgresql.org/pub/source/ 解压安装包,创建安装路径: …

【C++】特殊类设计 {不能被拷贝的类;只能在堆上创建的类;只能在栈上创建的类;不能被继承的类;单例模式:懒汉模式,饿汉模式}

一、不能被拷贝的类 设计思路: 拷贝只会发生在两个场景中:拷贝构造和赋值重载,因此想要让一个类禁止拷贝,只需让该类不能调用拷贝构造以及赋值重载即可。 C98方案: 将拷贝构造与赋值重载只声明不定义,并…

虚拟机VMware客户机隔离灰色如何解决||实现本机复制粘贴到虚拟机

前言:本次镜像为win10,其他操作系统也欢迎尝试 现象:虚拟机设置选项不可编辑,且是否勾选都无法实现复制粘贴 可能存在的问题解决方案 Q1:未安装虚拟机工具:VMware Tools A1:安装工具&#xff…

解决“使用 CNKI 保存时发生错误。改为尝试用 DOI 保存。”【Bug Killed】

文章目录 简介解决办法跟新本地Zotero中茉莉花插件的非官方维护中文翻译器更新网页插件Zetero Connector中的Transtors 结语参考资料 简介 使用Chrome ➕ Zotero Connector保存中国知网(CNKI)的参考文献到本地的Zotero时无法正常保存,出现使…

ubuntu22.04在线安装redis,可选择版本

安装脚本7.0.5版本 在线安装脚本,默认版本号是7.0.5,可以根据需要选择需要的版本进行下载编译安装 sudo apt-get install gcc -y sudo apt-get install pkg-config -y sudo apt-get install build-essential -y#安装redis rm -rf ./tmp.log systemctl …

电脑键盘推荐

一、键盘分类 (1)键位个数 目前有75,84,87,98,104,108的。 (2)薄膜键盘和机械键盘 薄膜键盘就是大多数办公室常见的键盘,主要打一个便宜,耐造…

《人月神话》读书笔记

文章目录 一、书名和作者二、书籍概览2.1 主要论点和结构2.2 目标读者和应用场景 三、核心观点与主题3.1 人员组织管理主题3.2 项目时间进度管理主题3.3 项目成本风险管理主题3.4 软件工程内在本质 四、亮点与启发4.1 最有影响的观点4.2 对个人专业发展的启示 五、批评与局限性…

SQLite3 数据库学习(五):Qt 数据库高级操作

参考引用 SQLite 权威指南&#xff08;第二版&#xff09;SQLite3 入门 1. Qt 数据库密码加密 MD5 加密在线工具 1.1 加密流程 加密后的密码都是不可逆的 1.2 代码实现 loginsqlite.h #ifndef LOGINSQLITE_H #define LOGINSQLITE_H#include <QWidget> #include <Q…

博士研究生不会编程,也没有使用过Python,是否很失败

首先&#xff0c;对于博士研究生来说&#xff0c;虽然在学习和科研的过程中会涉猎到大量的专业知识&#xff0c;但是同样也会错过很多知识&#xff0c;对于非计算机相关专业的博士研究生来说&#xff0c;没有使用过Python&#xff0c;或者说编程能力比较弱也是比较正常的情况&a…

使用whisper实现语音转文本

项目地址&#xff1a;GitHub - openai/whisper: Robust Speech Recognition via Large-Scale Weak Supervision 1、需要py3.8环境 conda activate p38 2、安装 pip install -U openai-whisper 3、下载项目 pip install githttps://github.com/openai/whisper.git 4、安装…

Class文件转Java文件

目录 1、下载一个反编译工具2、在文件夹下打开命令窗口3、在此目录下随意建一个文件夹4、在打开的命令窗口输入命令5、返回解压目录下 1、下载一个反编译工具 下载链接&#xff1a;https://varaneckas.com/jad/ 下载的是第一个 下载后放至任意目录下解压即可 2、在文件夹下打…

E-R图与关系模式

1. E-R模型 英文全称&#xff1a;Entity-relationship model&#xff0c;即实体关系模型 把现实世界的 实体模型通过建模转换为信息世界的概念模型&#xff0c;这个概念模型就是E-R模型 2. 数据库设计流程 一般设计数据库分为三个步骤 把现实世界的实体模型&#xff0c;通…

手把手教你如何提交App备案

手把手教你如何提交App备案 随着工信部出台了《工业和信息化部关于开展移动互联网应用程序备案工作的通知》对于我司所使用的到的移动应用APP就需要做app备案&#xff0c;今天用游戏app手把手教你如何提交App备案。 基本操作流程 运营、市场 提供需要备案的APP名称、主体、A…

市场是变化的?这种悖论fpmarkets澳福一秒打破

你是不是始终认为市场是经常变化的&#xff0c;其实这是不对的&#xff0c;这种认识fpmarkets澳福今天一秒打破。 市场经常变化吗?众多投资者无需过多思考&#xff0c;就认为答案是肯定的。因为无论是在互联网的哪个角落&#xff0c;都可以看到这样的信息。即使我们没有深入研…