精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

使用MLC-LLM支持RWKV-5推理的過程思考

jf_pmFSk4VX ? 來源:GiantPandaCV ? 2023-11-19 15:58 ? 次閱讀

自從2023年3月左右,chatgpt火熱起來之后,我把關注的一些知乎帖子都記錄到了這個markdown里面,:https://github.com/BBuf/how-to-optim-algorithm-in-cuda/tree/master/large-language-model-note ,從2023年3月左右到現在保持了持續動態更新整理,有關于LLM基礎知識,LLM訓練,LLM推理等各個方面的知乎文章鏈接,感興趣的讀者可以看一下。

0x0. 前言

繼續填 使用MLC-LLM將RWKV 3B模型跑在Android手機上(redmi k50每s可解碼8個token 這篇文章留下的坑。由于上面這篇文章支持的是RWKV4模型,不支持最近RWKV社區正在訓練的RWKV5模型,所以利用業余時間在MLC-LLM里面支持了最新的RWKV5模型的推理,同時也可以帶大家看一下RWKV5的3B模型表現是否有驚艷之處。目前我跑通了Metal和Android平臺的RWKV5推理(包含1.5B和3B),并且也編譯出了一個3B int8模式的apk提供給android用戶使用,地址為:https://github.com/BBuf/run-rwkv-world-4-in-mlc-llm/releases/download/v1.0.0/rwkv5-3b-int8.apk 。大家可以下載這個apk來體驗最新的RWKV-5-3B模型。

另外,我在測試RWKV-5-3B的時候也發現了RWKV4的表現和HuggingFace版本的表現相差比較多,也修復了這個bug。總的來說,在MLC-LLM里面適配一個新的RWKV5模型是比較麻煩的,我前后肝了幾個周末,并且在Hzfengsy的熱心幫助下解決了一個關鍵的TIR實現問題后。這篇文章我會分享一下適配過程中的主要問題是什么,給想使用MLC-LLM適配其它不支持的模型的讀者一個踩坑經驗。

關于RWKV模型的更多信息大家可以關注bo的兩篇博客:

RWKV-5 的訓練進展,與 SOTA GPT 模型的性能對比:https://zhuanlan.zhihu.com/p/659872347

RWKV-5 的訓練進展(之二),與 SotA GPT 模型的性能對比:https://zhuanlan.zhihu.com/p/664079347

再次感謝@Hzfengsy 在適配RWKV-5過程中的指導。

本文涉及到的工程代碼體現在下面的2個PR:

https://github.com/mlc-ai/mlc-llm/pull/1275 (MLC-LLM中支持RWKV5)

https://github.com/mlc-ai/tokenizers-cpp/pull/19 (對RWKV World Tokenzier的bug修復,也提升了RWKV-4-World系列模型的效果)

另外,目前MLC-LLM支持RWKV-5在Metal和Android的推理,但是在nvidia gpu上因為一個已知的tvm bug導致編譯失敗,如果要在Nvidia GPU上部署RWKV-5-World模型需要等官方完成這個bug fix,具體請關注 https://github.com/mlc-ai/mlc-llm/pull/1275 進展。

0x1. 筆者為何關注RWKV

對LLM的理解比較有限,從代碼實現的角度來說,RWKV的狀態和KV Cache不同,不依賴序列長度,這讓RWKV模型在各種長度下運行內存和運行速度都是趨于穩定的,所以我感覺工程價值是比基于Transformer架構比如Llama更好的,部署的性價比會天然更優。這個特點讓他在更長的序列比如100K長度下的推理也更有前景吧。但是,RWKV是否可以取得和Transformer主流架構相同的效果呢?我個人感覺還是需要等待時間的檢驗,目前最新的RWKV5模型最多scale up到7B,并且數據也是很有限只有1.12TB,這個信息我是從HuggingFace的項目看到的,如下圖所示。(這里的v2就是最新的RWKV5架構,內部小版本命名稍顯混亂,這一點也可以從ChatRWKV的model.py看出)。

ef65fd4e-86a6-11ee-939d-92fbcf53809c.png

所以如果RWKV架構真的可以取得和Transformer開源SOTA架構一樣的效果,前景是很好的。RWKV-5 的訓練進展(之二),與 SotA GPT 模型的性能對比:https://zhuanlan.zhihu.com/p/664079347 這里已經貼出一些BenchMark結果:

ef7f0172-86a6-11ee-939d-92fbcf53809c.png

從作者這里選取的一些數據集來看,RWKV-5-World 7B目前僅訓練30%的checkpoint的效果已經和Baichuan2-7B-Base非常接近了,還是值得期待一下的。

不過,這里存在的問題是這里的這些測試的數據集可能需要使用一些更加有說服力的,比如MMLU/CMMLU/HummanEval/MBPP/CMRC2018等等。這個屬于開源大模型評測的知識,大家應該能找到很多榜單,RWKV官方是否考慮去opencompass打一下榜,更全面的做個對比。

因為這里有個明顯的疑問就是,按照官方的說法,為什么使用1.12T數據訓練30%之后在上面的任務里面就可以幾乎持平使用2.6T數據進行全量預訓練的Baichuan2-7B-Base模型的效果呢?所以我個人感覺這里需要更多的榜單數據來看效果。

efac835e-86a6-11ee-939d-92fbcf53809c.png

在這里插入圖片描述

0x2. RWKV-5-3B模型在Mac上的一些文創和代碼生成效果演示

我個人感覺7B模型和3B模型就是為了手機上離線運行而生的尺寸,所以我這里使用上面編譯的Apk來演示一下使用MLC-LLM推理的RWKV-5-3B模型的一些文創效果和代碼生成效果。下面演示的文創問題大多數來自昆侖天工的Skywork-13B例子(https://github.com/SkyworkAI/Skywork),感謝。下面的User是我問的問題,Assistant是RWKV-5-3B模型的回答,運行環境為Mac M2 FP16模式。由于這個模型是基礎模型,所以對話效果會受到上下文多輪對話干擾,所以在測試不同種類的問題時,可以使用/reset來重置對話。

概念介紹

efc40506-86a6-11ee-939d-92fbcf53809c.png

在這里插入圖片描述

廣告文案

efe4dbb4-86a6-11ee-939d-92fbcf53809c.png

在這里插入圖片描述

作文生成

effc030c-86a6-11ee-939d-92fbcf53809c.png

在這里插入圖片描述

演講稿生成

f01226a0-86a6-11ee-939d-92fbcf53809c.png

在這里插入圖片描述

心得體會

f0283e5e-86a6-11ee-939d-92fbcf53809c.png

在這里插入圖片描述

科技文稿

f03c6a00-86a6-11ee-939d-92fbcf53809c.png

f05dc4e8-86a6-11ee-939d-92fbcf53809c.png

記錄文

f072e008-86a6-11ee-939d-92fbcf53809c.png

在這里插入圖片描述

評論評語

f08bf4d0-86a6-11ee-939d-92fbcf53809c.png

在這里插入圖片描述

問題生成

f0a8c9f2-86a6-11ee-939d-92fbcf53809c.png

在這里插入圖片描述

起名字

f0bbedb6-86a6-11ee-939d-92fbcf53809c.png

在這里插入圖片描述

簡單代碼

f0cb32a8-86a6-11ee-939d-92fbcf53809c.png

f0e36fc6-86a6-11ee-939d-92fbcf53809c.png

總的來說,對于大多數文學創作問題,RWKV-5-3B的回答還算像那回事,不過也可以明顯感覺到一些瑕疵以及指令跟隨的能力很有限,比如對數字非常不敏感,讓他說5個字他似乎不明白意思。此外,3b模型擁有了一定的代碼能力,可以寫有限的簡單代碼。

最后,我比較期待7b最終訓練完之后的效果,希望RWKV可以在opencompass榜單上證明自己。

0x3. MLC-LLM支持RWKV-5步驟

這一節可能會寫得流水賬一點。模型實現文件:https://github.com/mlc-ai/mlc-llm/pull/1275 里的 rwkv5.py

首先,由于MLC-LLM已經支持了RWKV4架構,所以我們大體上是可以使用RWKV4的實現的,然后把RWKV5的改動加上去。

我們可以從ChatRWKV的rwkv4/rwkv5模型實現(https://github.com/BlinkDL/ChatRWKV/blob/main/rwkv_pip_package/src/rwkv/model.py)看出rwkv4和rwkv5的不同之處主要在于RWKV5引入了多頭的線性Attention,代碼上體現為對Attention部分的重寫,包括state的個數也從5個變成了3個。從MLC-LLM的模型實現代碼上來看,如果要在同一個實現中進行兼容會相當麻煩,所以我使用了一個新的文件來實現RWKV5,接下來就是對著ChatRWKV修改代碼把RWKV5的初版本改上去。在RWKV5的prefill階段,會調用一個新的CUDA Kernel:https://github.com/BlinkDL/ChatRWKV/blob/main/rwkv_pip_package/src/rwkv/model.py#L465-L497 。而這個Kernel的原始實現則對應這里的Python公式:https://github.com/BlinkDL/RWKV-CUDA/blob/main/wkv5/run.py#L67-L87

f0f38014-86a6-11ee-939d-92fbcf53809c.png

在這里插入圖片描述

但需要注意的是,在真正的模型實現中,這里的state是需要更新的全局變量而非local的。由于這個函數有一個循環會在T的維度上進行迭代,而T是序列長度是可變的,所以這里需要類似于RWKV4的實現寫一個TIR來模擬這個python程序的邏輯,在馮博的幫助下得到了一版初始的TIR實現:

f10b2778-86a6-11ee-939d-92fbcf53809c.png

這個實現過程中也幫助發現一個DLight的bug,由@Hzfengsy在tvm里面進行了修復。https://github.com/apache/tvm/pull/16124

解決了上面的TIR問題之后就可以在MLC-LLM里面編譯RWKV5模型了,然后使用TVM的dump ir工具和ChatRWKV來對比精度,這里需要固定輸入的Tensor才行,為了方便我將輸入固定為一個全1的十個元素的ids。然后在對比精度的實現發現,上面實現的TIR的輸入的所有值都是可以對上的,但是TIR的輸出out卻是錯誤的。仍舊是馮博幫我解決了這個bug,原因是因為上面的版本中對于state來說T不應該是spatial的而是reduction。修復后的正確版本長這樣:

f11c2b68-86a6-11ee-939d-92fbcf53809c.png

在這里插入圖片描述

接著又從dump的結果觀察到attention部分的groupnorm的結果無法對上,但輸入都是可以對上的,然后我手動實現了一下groupnorm的過程(下面的237-247行)發現結果竟然是可以對上的。

f12c8d0a-86a6-11ee-939d-92fbcf53809c.png

后面經Hzfengsy提醒確認是開始的groupnorm調用參數寫錯了,修復之后繼續下一步。這一下attention和ffn的結果是可以對上了。

然后開始使用mlc chat程序嘗試進行對話,發現輸出會亂碼。又懷疑中間某個地方精度沒對齊,所以繼續完整模擬了一遍prefill+decode,發現prefill+第一輪decode的結果完全能對上,想擺爛了。。

然后我使用相同的問題問了一下ChatRWKV,發現ChatRWKV的結果也是亂碼。。。直覺告訴我一定是烏龍了,由于我這里對比的ChatRWKV是我自己fork的,可能不小心改了bug。我重新拉官方的ChatRWKV一一對比,找到了問題所在。是因為我的代碼里錯誤的去掉一個transpose op,我也忘記了為什么要這么做,但是這個transpose op去transpose的兩個維度的大小是相同的,所以輸出shape也是相同的,導致了對精度浪費了很多時間。

解決這個問題之后,發現輸出就是正常的了。但,真的正常嗎?

我在嘗試一些問題時發現輸出非常奇怪:

f144d69e-86a6-11ee-939d-92fbcf53809c.png

感覺這里一定還有bug,既然模型精度方面沒有bug,要么就是prompt技巧,tokenizer,sampling。sampling是比較正常并且經過眾多模型檢驗的,應該問題不大。然后恰好想起daquexian的faster-rwkv里面更新過tokenzier,之前的實現應該有bug:

接下來就是更新tokenzier的代碼修復bug,最后在review 初始化prompt的時候也發現了一個bug,將其修復。

f16ab68e-86a6-11ee-939d-92fbcf53809c.png

最終獲得的代碼效果就是0x2節展示的了,這些prompt的輸出和ChatRWKV相差不大,理論上來說應該是完成了正確的適配。

0x4. 總結

本文記錄了筆者使用 MLC-LLM 支持RWKV-5推理的過程以及對RWKV-5的一些思考,謝謝。

編輯:黃飛

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • Android
    +關注

    關注

    12

    文章

    3924

    瀏覽量

    127147
  • gpu
    gpu
    +關注

    關注

    28

    文章

    4702

    瀏覽量

    128709
  • LLM
    LLM
    +關注

    關注

    0

    文章

    274

    瀏覽量

    306

原文標題:0x4. 總結

文章出處:【微信號:GiantPandaCV,微信公眾號:GiantPandaCV】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    對比解碼在LLM上的應用

    為了改進LLM推理能力,University of California聯合Meta AI實驗室提出將Contrastive Decoding應用于多種任務的LLM方法。實驗表明,所提方法能有效改進
    發表于 09-21 11:37 ?593次閱讀
    對比解碼在<b class='flag-5'>LLM</b>上的應用

    【飛凌嵌入式OK3576-C開發板體驗】rkllm板端推理

    : ulimit -HSn 10240 最后,執行llm_demo可執行文件,并指定rkllm模型文件的路徑。這樣即可開始推理過程: ./llm_demo --model_path /path
    發表于 08-31 22:45

    思考驅動創新,創新驅動發展:基于假設(Assumption)的思考技術

    大跨度的聯想中得到啟迪,然后再用嚴密的邏輯加以驗證。” 胡適也說:“大膽假設,小心求證 。”2. 回顧:科學創新的思考技術 人類三項天賦的推理能力是:演繹推理、歸納推理和溯因
    發表于 12-21 10:23

    如何識別slc和mlc芯片及slc mlc區別

    如何識別slc和mlc芯片及slc mlc區別 slc mlc區別:     MLC(Multi-Level-Cell)技術,由英特爾
    發表于 07-17 10:01 ?6750次閱讀

    基準數據集(CORR2CAUSE)如何測試大語言模型(LLM)的純因果推理能力

    ? 因果推理是人類智力的標志之一。因果關系NLP領域近年來引起了人們的極大興趣,但其主要依賴于從常識知識中發現因果關系。本研究提出了一個基準數據集(CORR2CAUSE)來測試大語言模型(LLM
    的頭像 發表于 06-20 15:39 ?1766次閱讀
    基準數據集(CORR2CAUSE)如何測試大語言模型(<b class='flag-5'>LLM</b>)的純因果<b class='flag-5'>推理</b>能力

    MLC-LLM的編譯部署流程

    MLC-LLM部署在各種硬件平臺的需求,然后我就開始了解MLC-LLM的編譯部署流程和RWKV World模型相比于MLC-LLM已經支持
    的頭像 發表于 09-04 09:22 ?2859次閱讀
    <b class='flag-5'>MLC-LLM</b>的編譯部署流程

    mlc-llm對大模型推理的流程及優化方案

    MLC-LLM 部署RWKV World系列模型實戰(3B模型Mac M2解碼可達26tokens/s) 中提到要使用mlc-llm部署模型首先需要一個編譯過程,將原始的基于Rea
    發表于 09-26 12:25 ?861次閱讀
    <b class='flag-5'>mlc-llm</b>對大模型<b class='flag-5'>推理</b>的流程及優化方案

    如何使用MLC-LLM在A100/Mac M2上部署RWKV模型

    每一秒大概可以解碼8個token,我感覺速度勉強夠用了。由于RWKV5迭代到了第5個版本,后續希望能支持RWKV5的模型,當然也可以尋求新的優化機會提升解碼速度。
    的頭像 發表于 10-29 16:39 ?876次閱讀
    如何使用<b class='flag-5'>MLC-LLM</b>在A100/Mac M2上部署<b class='flag-5'>RWKV</b>模型

    Hugging Face LLM部署大語言模型到亞馬遜云科技Amazon SageMaker推理示例

    ?本篇文章主要介紹如何使用新的Hugging Face LLM推理容器將開源LLMs,比如BLOOM大型語言模型部署到亞馬遜云科技Amazon SageMaker進行推理的示例。我們將部署12B
    的頭像 發表于 11-01 17:48 ?896次閱讀
    Hugging Face <b class='flag-5'>LLM</b>部署大語言模型到亞馬遜云科技Amazon SageMaker<b class='flag-5'>推理</b>示例

    怎樣使用Accelerate庫在多GPU上進行LLM推理呢?

    大型語言模型(llm)已經徹底改變了自然語言處理領域。隨著這些模型在規模和復雜性上的增長,推理的計算需求也顯著增加。
    的頭像 發表于 12-01 10:24 ?1529次閱讀
    怎樣使用Accelerate庫在多GPU上進行<b class='flag-5'>LLM</b><b class='flag-5'>推理</b>呢?

    安霸發布N1系列生成式AI芯片支持前端設備運行本地LLM應用

    單顆 SoC 支持 1 至 340 億參數的多模態大模型(Multi-Modal LLM推理,實現前端低功耗生成式 AI。
    的頭像 發表于 01-09 15:19 ?908次閱讀

    自然語言處理應用LLM推理優化綜述

    當前,業界在將傳統優化技術引入 LLM 推理的同時,同時也在探索從大模型自回歸解碼特點出發,通過調整推理過程和引入新的模型結構來進一步提升推理性能。
    發表于 04-10 11:48 ?553次閱讀
    自然語言處理應用<b class='flag-5'>LLM</b><b class='flag-5'>推理</b>優化綜述

    什么是LLMLLM的工作原理和結構

    隨著人工智能技術的飛速發展,大型語言模型(Large Language Model,簡稱LLM)逐漸成為自然語言處理(NLP)領域的研究熱點。LLM以其強大的文本生成、理解和推理能力,在文本
    的頭像 發表于 07-02 11:45 ?6960次閱讀

    LLM大模型推理加速的關鍵技術

    LLM(大型語言模型)大模型推理加速是當前人工智能領域的一個研究熱點,旨在提高模型在處理復雜任務時的效率和響應速度。以下是對LLM大模型推理加速關鍵技術的詳細探討,內容將涵蓋模型壓縮、
    的頭像 發表于 07-24 11:38 ?776次閱讀

    魔搭社區借助NVIDIA TensorRT-LLM提升LLM推理效率

    “魔搭社區是中國最具影響力的模型開源社區,致力給開發者提供模型即服務的體驗。魔搭社區利用NVIDIA TensorRT-LLM,大大提高了大語言模型的推理性能,方便了模型應用部署,提高了大模型產業應用效率,更大規模地釋放大模型的應用價值。”
    的頭像 發表于 08-23 15:48 ?391次閱讀