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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/165088.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/165088.shtml
英文地址,請注明出處:http://en.pswp.cn/news/165088.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java項目如何打包成Jar(最簡單)

最簡單的辦法,使用Maven插件(idea自帶) 1.選擇需要打包的mudule,點擊idea右側的maven插件 2.clean操作 3.選擇需要的其他mudule,進行install操作(如果有) 4.再次選擇需要打包的module&#…

Vue.observable 是什么

Observable 翻譯過來我們可以理解成可觀察的 Vue.js2.6 新增 Vue.observable,讓一個對象變成響應式數據。Vue 內部會用它來處理 data 函數返回的對象 。 返回的對象可以直接用于渲染函數和計算屬性內,并且會在發生變更時觸發相應的更新。也可以作為最小化…

Git的指令

Git 各平臺安裝包下載地址為:http://git-scm.com/downloads Ubuntu Git 安裝命令為: $ apt-get install git用戶信息 配置個人的用戶名稱和電子郵件地址: $ git config --global user.name "runoob" $ git config --global user.…

Python----類對象和實例對象

目錄 一.類和類的實例 二.類屬性和實例屬性 三.私有屬性和公有屬性 四.靜態方法和類方法 五.__init__方法,__new__方法和__del__方法: 六.私有方法和公有方法 七.方法的重載 八.方法的繼承 九.方法的重寫 十.對象的特殊方法 十一.對象的引用&a…

軟件開發模式開源和閉源的優劣之爭

開源和閉源,兩種截然不同的開發模式,對于大模型的發展有著重要影響。開源讓技術共享,吸引了眾多人才加入,推動了大模的創新。而閉源則保護了商業利益和技術優勢,為大模型的商業應用提供了更好的保障。 開源與閉源軟件的…

基于命令行模式設計退款請求處理

前言 這篇文章的業務背景是基于我的另一篇文章: 對接蘋果支付退款退單接口-CSDN博客 然后就是說設計模式是很開放的東西,可能我覺得合適,你可能覺得不合適,這里只是做下討論,沒有一定要各位同意的意思.... 相關圖文件 這里我先把相關的圖文件放上來,可能看著會比較清晰點 代碼邏…

sql之left join、right join、inner join的區別

sql之left join、right join、inner join的區別 left join(左聯接) 返回包括左表中的所有記錄和右表中聯結字段相等的記錄 right join(右聯接) 返回包括右表中的所有記錄和左表中聯結字段相等的記錄 inner join(等值連接) 只返回兩個表中聯結字段相等的行 舉例如下&#xff1…

Web服務器(go net/http) 處理Get、Post請求

大家好 我是寸鐵👊 總結了一篇Go Web服務器(go net/http) 處理Get、Post請求的文章? 喜歡的小伙伴可以點點關注 💝 前言 go http請求如何編寫簡單的函數去拿到前端的請求(Get和Post) 服務器(后端)接收到請求后,又是怎么處理請求&#xff0c…

【限時免費】20天拿下華為OD筆試之【前綴和】2023B-尋找連續區間【歐弟算法】全網注釋最詳細分類最全的華為OD真題題解

文章目錄 題目描述與示例題目描述輸入描述輸出描述示例一輸入輸出說明 示例二輸入輸出 解題思路代碼PythonJavaC時空復雜度 華為OD算法/大廠面試高頻題算法練習沖刺訓練 題目描述與示例 題目描述 給定一個含有N個正整數的數組,求出有多少個連續區間(包…

【網絡奇緣】- 計算機網絡|分層結構|ISO模型

🌈個人主頁: Aileen_0v0🔥系列專欄: 一見傾心,再見傾城 --- 計算機網絡~💫個人格言:"沒有羅馬,那就自己創造羅馬~" 目錄 計算機網絡分層結構 OSI參考模型 OSI模型起源 失敗原因: OSI模型組成 協議的作用 📝全文…

二十四、RestClient操作文檔

目錄 一、新增文檔 1、編寫測試代碼 二、查詢文檔 1、編寫測試代碼 三、刪除文檔 1、編寫測試代碼 四、修改文檔 1、編寫測試代碼 五、批量導入文檔 批量查詢 一、新增文檔 1、編寫測試代碼 SpringBootTest public class HotelDocumentTest {private RestHighLevelC…

【棧】不同字符的最小子序列

題目: /*** 思路:棧,使用數組記錄每個字母出現的次數,再用一個數組標記字符是否在棧中* 遍歷棧,存儲字符時比較棧頂字符,若小于棧頂字符并且后面有重復的字符則* 棧頂元素出棧,否則入棧。** au…

PS 注釋工具 基礎使用方法講解

好 上文PS 顏色取樣器&標尺工具 基本使用講解中 我們講了 顏色取樣器和標尺工具的基本用法 下面我們來看一下 注釋工具 這個 主要是后面 比較大的作品 可能不是我們一個人取設計 團隊作圖 就需要用到它 選擇 注釋工具 后 我們隨便點擊圖像任何一個位置 右側就會出現一個輸…

gitlab各版本安裝注意點:

研發團隊在安裝gitlab各版本過程中可能遇到各種問題,為了后續容易查看特將我們在實踐過程中遇到的各類問題要點總結如下: gitlab 10.8.3 (564c342)安裝 centos Linux yum安裝網址查找網址:gitlab/gitlab-ce - Results for gitla…

執行shell腳本提示syntax error: unexpected end of file

具體報錯如下: ./test.sh: line 36: syntax error: unexpected end of file執行命令時需將test.sh替換為實際的腳本文件名稱。 情形一: shell腳本在Windows下編寫,上傳到Linux上執行,由于 fileformat 類型不同,所以報…

黑馬點評12-實現好友關注/取關功能,查看好友共同關注列表

好友關注 數據模型 數據庫中的tb_follow記錄博主與粉絲的關系 tb_follow表對應的實體類 Data EqualsAndHashCode(callSuper false) Accessors(chain true) TableName("tb_follow") public class Follow implements Serializable {private static final long ser…

代碼隨想錄算法訓練營第三十二天| 122 買賣股票的最佳時機 || 55 跳躍游戲 45 跳躍游戲 ||

目錄 122 買賣股票的最佳時機 || 55 跳躍游戲 45 跳躍游戲 || 122 買賣股票的最佳時機 || 設置變量now代表此時買入的股票,為賦值為Integer.MAX_VALUE,遍歷prices數組,有如下兩種情況: 如果比now小說明不能售出,可以…

關于unicloud云對象或云函數獲取時間不對的問題

話不多說,直接上代碼: function timeWeekFormat() { //定義一個日期對象; var dateTime getOffsetDate(8); //獲得系統年份; var year dateTime.getFullYear(); //獲得系統月份; var month dateTime.getMonth() 1; //獲…

棧和隊列的OJ題--12.括號匹配

12.括號匹配 20. 有效的括號 - 力扣(LeetCode) 解題思路:該題比較簡單,是對棧特性很好的應用,具體操作如下:循環遍歷String中的字符,逐個取到每個括號,如果該括號是:1. …

Git工作流和Commit規范

Git大家都非常熟悉了,就不做過多介紹,但是如何用好Git、如何進行合理的分支開發、Merge你是否有一個規范流程呢?💤 不論是一個團隊一起開發一個項目,還是自己獨立開發一個項目,都少不了要和Git打交道&…