一個對數學或神經網絡知之甚少的人編寫的語言模型的RWKV方法的示例。初始版本非常非常基於驚人的信息和python示例:https://johanwind.github.io/2023/03/23/rwkv_details.html
另請參閱RWKV創建者的存儲庫:https://github.com/blinkdl/chatrwkv/
如果以32位模式加載,則使用很多內存。 3B型號使用約11GB RAM,而7B可能只適合您願意關閉其他應用程序或處理某些交換的32GB機器。即使在8位模式下加載也使用相當多的內存,但是一旦加載完成,它也會下降。
您需要設置生鏽和貨物:https://www.rust-lang.org/learn/get-started
您將需要下載RWKV模型。這是一個鏈接,可以讓您開始(約820MB):https://huggingface.co/blinkdl/rwkv-4-pile-430m/resolve/main/rwkv-4-pile-430m-20220808-8066.pth
也在這裡的令牌:https://github.com/blinkdl/chatrwkv/blob/main/main/20b_tokenizer.json
可以直接加載Pytorch模型文件。如果文件以.pt或.pth結尾,則將以Pytorch型號加載。如果以.st或.safetensors結束,則將其作為安全器加載。注意:Pytorch支持當前是實驗性的,並且可能無法正常運行。如果存在問題,您可能會立即遇到錯誤,因此嘗試該方法不應該是危險的。如果需要,您可以禁用torch功能,而只能為SafetEnsors格式文件構建支持。
之後,您應該可以cargo run --release 。您可以嘗試無需--release即可進行編譯,但一切都可能會變得瘋狂。還可以嘗試cargo run --release -- --help來查看命令行選項。
注意:默認值是使用所有邏輯內核,請參閱命令行選項。
您可以選擇將.pth模型文件轉換為SafetEnsors格式。查看utils/pth_to_safetensors.py的示例。為此,您需要設置的safetensors和torch Python軟件包。我建議在虛擬環境中這樣做。當前,此步驟沒有太大的優勢,因為火炬文件可以直接加載到當前版本中。
GGML支持當前需要llama-rs項目中的ggml和ggml-sys的修補版本。
Cargo.toml設置為指向我的叉子中正確的分支,但是一旦將必要的更改合併為GGML,這將消失。自然會更新此存儲庫,但是請記住,如果您嘗試使用舊版本,您的編譯最終可能會開始失敗,因為最終將刪除該分支。
注意:這部分現在已經過時了。不過,我仍然建議閱讀以下鏈接。還請注意,該描述基於RWKV模型的更簡單版本,每層只有四個狀態。完整版有五個。
這是評估模型所涉及的步驟的(可能是錯誤的)高級描述。您需要在smolrwkv/src/simple/model.rs中引用源,以使其有意義。
另外,強烈考慮首先閱讀這些內容:
順便說一句,有趣的事實:“張量”聽起來很幻想,但這基本上只是一個數組。一個維張量只是一個維數陣列,二維維度張量是二維陣列。他們可以擁有特殊的特性(例如不變的),但這對於理解總體上的概念並不重要。如果您知道數組,那麼您已經有了張量的一般想法。
評估一個令牌:
ln0的x的初始值。x送入每個層,以下x為下一個生成的圖層。xln1應用於x並將其饋送到時間混合。這使用了模型的FFN部分中的張量。tm_state ,並將其稱為last_x 。 (為什麼?誰知道!)tm_num和tm_den為last_num , last_den 。tm_[state,num,den]的新值,因此使用這些值更新您的圖層狀態。x 。x從時間混合添加到x ( x += time_mixing_x )。ln2塗在x上,並將其饋入通道混合。這使用了模型的Feed向前網絡部分中的張量。cm_state並將其稱為last_x 。cm_state ,因此更新圖層狀態。x ,該X由通道混合計算產生。x從通道混合添加到xx上。該模型具有“知道”的令牌列表。有時,令牌等於一個單詞,有時只是一個單詞的一部分。通常有大量令牌,範圍為30,000-60,000。我相信當前的RWKV型號具有50,277個令牌。無論如何,運行模型後,您將獲得50,277浮點數的列表。
該列表的最高值是該模型預測的令牌是最可能的延續等等。如果您生成了前10-40左右的象徵概率的排序列表,然後隨機選擇一個列表,則相對而言,您將獲得相當合理的輸出。公平地說,一個微小的430m型號通常不會產生最合理的輸出。
一旦有概率列表,如何處理下一步的很好解釋:https://huggingface.co/blog/how-to-generate
評估模型有各種複雜的數學內容,但真正重要的是矩陣乘法(源中的pardot )。在RWKV的情況下,它的矩陣矢量乘法(一個2D數組乘以1D數組)。 > 90%的時間評估模型的時間是在那些矩陣乘法調用中。
在非GGGML模式下,此處的數學/數組處理使用ndarray板條箱。它提供了一個.dot函數,但是即使板條箱聲稱螺紋支持,這也永遠不會並行計算矩陣向量乘法。由於此計算對於性能至關重要,因此我最終編寫了自己的功能,將計算分為塊並並行運行。請參閱smolrwkv/src/util.rs中的dumdot模塊中的功能。
您可以從模型中獲得概率列表以及沒有明確的“答案”的事實似乎是對LLMS是或可以在某種程度上有意識的想法的不錯的反駁。當您查看LLM的輸出時,很多時候您甚至都不會看到最可能的令牌。另外,有趣的事實:當您將提示提示為模型時,它會帶有概率列表,就像您要求響應時一樣。但是,除了處理最後一個提示令牌後的結果外,這些概率只是丟棄了。
提示以粗體。那麼,龍是樹蛇還是狗?世界可能永遠不會知道!
* Loading tokenizer from: ./20B_tokenizer.json
* Loading model from: ./RWKV-4-Pile-430M-20220808-8066.safetensors
* Discovering model structure.
- Loading layer 1/24
[...]
- Loading layer 24/24
* Loading non-layer tensors.
* Loaded: layers=24, embed=1024, vocab=50277
在一個令人震驚的發現中,科學家發現了一群生活在西藏的遙遠,未開發的山谷中的龍。對於研究人員來說,更令人驚訝的是,龍會說完美的中文。
這些巨龍都講了不同的方言,這些方言與狗的母語不符。
為了破譯這些龍說話,他們稱之為龍,發現他們的語言與人類不同。
研究小組對蒙加貝說:“龍理解人類的單詞和更精確的人類語言。龍說了人類的語言。他們也理解了中文規則。”
通過進行這項研究,他們希望闡明世界上偏遠地區的龍的神秘歷史,尤其是在西藏。
該研究項目發表在《開放科學》雜誌上,還表明龍實際上是爬行動物或又名樹蛇。
龍,不是蛇
根據研究小組的說法,在西藏發現的龍是狗的種族,而不是爬行動物。
儘管研究小組仍然無法就這些龍居住在西藏的原因做出任何解釋,但以前認為它們很可能是在藏族高原附近的土地上存在的。
“龍是偉大的青海地基高原的一部分,幾乎完全沒有受到干擾,整個青海地天高原逐漸被逐漸轉化為農業狀態。因此,它們在樹上有獨特的咀嚼模式,並且可能不會太大的動物在自然界中被保留在自然界中,”研究人員解釋說。