讓你的AI模型盡可能的靠近資料來源

2022-08-25 09:42:09 字數 2961 閱讀 2288

簡介

今天我們發布了乙個 redisai 的預覽版本,預整合了[tensor]werk元件。redisai 是乙個可以服務 tensors 任務和執行深度學習任務的 redis 模組。在這篇部落格中,我們將介紹這個新模組的功能,並解釋我們為什麼會認為它能顛覆機器學習(ml)、深度學習(dl)的解決方案。

redisai 的產生有兩大原因:首先,把資料遷移到執行 ai 模型的主機上成本很高,並且對實時性的體驗很大的影響;其次,serving 模型一直以來都是 ai 領域中 devops 的挑戰。我們構建 redisai 的目的,是讓使用者可以在不搬遷redis 多節點資料的情況下,也能很好地服務、更新並整合自己的模型。

資料位置很重要

為了證明執行機器學習、深度學習模型中資料位置的重要性,我們舉乙個聊天機械人的例子。聊天機械人通常使用遞迴神經網路模型(rnn),來解決一對一(seq2seq)使用者問答場景。更高階的模型使用兩個輸入向量、兩個輸出向量,並以數字中間狀態向量的方式來儲存對話的上下文。模型使用使用者最後的訊息作為輸入,中間狀態代表對話的歷史,而它的輸出是對使用者訊息和新中間狀態的響應。

為了支援使用者自定義的互動,這個中間狀態必須要儲存在資料庫中,所以 redis +redisai是乙個非常好的選擇,這裡將傳統方案和 redisai 方案做乙個對比。

1、傳統方案

使用 flask 應用或其它方案,整合 spark 來構建乙個聊天機械人。當收到使用者對話訊息時,服務端需要從 redis 中獲取到中間的狀態。因為在 redis 中沒有原生的資料型別可用於 tensor,因此需要先進行反序列化,並且在執行遞迴神經網路模型(rnn)之後,保證實時的中間狀態可以再序列化後儲存到 redis 中。

考慮到 rnn 的時間複雜度,資料序列化/反序列化上 cpu 的開銷和巨大的網路開銷,我們需要乙個更優的解決方案來保證使用者體驗。

2、redisai 方案

在 redisai 中,我們提供了一種叫 tensor 的資料型別,只需使用一系列簡單的命令,即可在主流的客戶端中對 tensor向量進行操作。同時,我們還為模型的執行時特性提供了另外兩種資料型別:models 和 scripts。

models 命令與執行的裝置(cpu 或 gpu)和後端自定義的引數有關。redisai 內建了主流的機器學習框架,如 tensorflow、pytorch 等,並很快能夠支援 onnx runtime 框架,同時增加了對傳統機器學習模型的支援。然而,很棒的是,執行 model 的命令對其後端是不感知的:

ai.modelrun model_key inputs input_key1 …  outputs output_key1 ..

這允許使用者將後端選擇(通常由資料專家來決定)和應用服務解耦合開來,置換模型只需要設定乙個新的鍵值即可,非常簡單。redisai 管理所有在模型處理佇列中的請求,並在單獨的執行緒中執行,這樣保障了 redis依然可以響應其它正常的請求。scripts 命令可以在 cpu 或gpu 上執行,並允許使用者使用 torchscript 來操作tensors 向量,torchscript 是乙個可操作 tensors 向量的類 python 自定義語言。這可以幫助使用者在執行模型前對資料進行預處理,也可以用在對結果進行後處理的場景中,例如通過整合不同的模型來提高效能。

我們計畫未來通過 dag 命令支援批量執行命令,這會允許使用者在乙個原子性操作中批量執行多個 redisai 命令。例如在不同的裝置上執行乙個模型的不同例項,通過指令碼對執行結果做平均**。使用 dag 命令,就可並行地進行計算,再執行聚合操作。如果需要全量且更深的特性列表,可以訪問 redisai.io。新的架構可以簡化為:

模型服務可以更簡單

在生產環境中,使用 jupyter notebooks 來編寫**並將其部署在flask 應用並不是最優方案。使用者如何確定自己的資源是最佳的呢?如果使用者主機宕機之後,上述聊天機械人的中間狀態會發生什麼呢?使用者可能會重複造輪子,實現已有的 redis 功能來解決問題。另外,由於組合方案的複雜度往往超出預期,固執地堅持原有的解決方案也會非常有挑戰性。redisai 通過 redis 企業級的資料儲存方案,支援深度學習所需要的 tensors、models 和 scripts等資料型別,很好的實現了 redis 和 ai 模型的深度整合。如果需要擴充套件模型的計算能力,只需要簡單的對redis 集群進行擴容即可,所以使用者可以在生產環境中增加盡可能多的模型,從而降低基礎設施成本和總體成本。最後,redisai 很好地適應了現有的 redis 生態,允許使用者執行指令碼來預處理、後處理使用者資料,可使用 redisgear 對資料結構做正確的轉換,可使用redisgraph 來保持資料處於最新的狀態。 

結論和後續計畫

1、短期內,我們希望使用redisai 在支援 3 種主流後端(tensorflow、pytorch 和 onnx runtime)的情況下,盡快穩定下來並達到穩定狀態。

2、我們希望可以動態載入這些後端,使用者可以自定義的載入指定的後端。例如,這將允許使用者使用tensorflow lite 處理邊緣用例。3、計畫實現自動排程功能,可以實現在同一模型中實現不同佇列的自動合併。4、redisai會統計模型的執行資料,用於衡量模型的執**況。

5、完成上文中解釋的dag 特性。

盡可能地推遲變數的定義

是的,我們同意c語言中變數要放在模組頭部定義的規定 但在c 中,還是取消這種做法吧,它沒必要,不自然,而且昂貴。還記得嗎?如果定義了乙個有建構函式和析構函式的型別的變數,當程式執行到變數定義之處時,必然面臨構造的開銷 當變數離開它的生命空間時,又要承擔析構的開銷。這意味著定義無用的變數必然伴隨著不必...

盡可能擺脫對HttpContext的依賴

在asp.net mvc中負責 轉化資料 的層次為model binder。關於這一點,現有的 示例 大都關注把form或querystring中的資料轉化為action引數上,不過model binder可用的地方其實更多。例如在 最佳實踐 的 中,原本accountcontroller的dele...

如何盡可能的避免漏測

在總結線上問題的時候,我們發現大部分的線上問題是由於功能漏測所導致的。原本應該測試的流程沒有測到,或者是根本沒有考慮到一些情況,這些都會產生漏測。在大部分的產品中,漏測是難以避免的,只要不出大問題,漏測的危害會被人為的粉飾和縮小,但是在某些跟貨幣或貨幣等價物打交道的行業,漏測往往意味著經濟損失,一次...