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

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

3天內不再提示

MLC-LLM的編譯部署流程

jf_pmFSk4VX ? 來源:GiantPandaCV ? 2023-09-04 09:22 ? 次閱讀

0x0. 前言

我的 ChatRWKV 學習筆記和使用指南 這篇文章是學習RWKV的第一步,然后學習了一下之后決定自己應該做一些什么。所以就在RWKV社區看到了這個將RWKV World系列模型通過MLC-LLM部署在各種硬件平臺的需求,然后我就開始了解MLC-LLM的編譯部署流程和RWKV World模型相比于MLC-LLM已經支持的Raven系列模型的特殊之處。

MLC-LLM的編譯部署流程在MLC-LLM的官方文檔已經比較詳細了,但這部分有一些隱藏的坑點需要你去發現,比如現在要支持的RWKV-World模型它的Tokenizer是自定義的,并不是Huggingface的格式,這就導致我們不能使用MLC-LLM去直接編譯這個模型,也不能使用預編譯好的MLC-LLM二進制庫去運行這個模型了。另外,在編譯MLC-LLM倉庫之前我們需要先編譯Relax倉庫而不是原始的TVM倉庫,Relax可以認為是TVM的一個fork,在此基礎上支持了Relax這個新一代的IR,這部分背景建議讀者看一下我這個倉庫的相關鏈接:

https://github.com/BBuf/tvm_mlir_learn

這個倉庫已經攬下1.4k star,謝謝讀者們支持。

從RWKV社區了解到,RWKV-World系列模型相比于Raven系列,推理代碼和模型都是完全一樣,不一樣的地方主要是tokenizer是自定義的,并且system prompt不同。

在編譯Relax的時候需要按需選擇自己的編譯平臺進行編譯,編譯完之后 MLC-LLM 會通過 TVM_HOME 這個環境變量來感知 Relax 的位置,并且Relax編譯時開啟的選項要和MLC-LLM編譯的選項匹配上,這樣才可以在指定平臺上進行正確的編譯和推理。

在適配 RWKV-World 1.5B時,由于模型比較小對逗號比較敏感,導致第一層就炸了精度,最終掛在sampler里面,這個地方我定位2個晚上,后來mlc-ai官方的馮思遠告訴我在 MLC-LLM 里如何逐層打印精度之后,我最終定位到了問題。并且在 RWKV 社區里面了解到了這個現象之前就出現過,那就是1.5B的模型第一層需要用FP32來計算,不然會炸精度,我后續實驗了RWKV-4-World 3B/7B,這個現象就沒有了。

另外,模型的組織格式也是值得注意的一點,并不是在任意位置編譯好模型都可以在運行時被 MLC-LLM 正確發現。我大概花了快一周工作外時間在 MLC-LLM 上來支持 RWKV-World 系列模型,工作內容主要為:

將大缺弦的 https://github.com/daquexian/faster-rwkv 倉庫中的 RWKV World模型tokenizer實現掛到 mlc-ai 的 tokenizers.cpp 中,作為一個 3rd 庫提供給MLC-LLM。合并的PR為:https://github.com/mlc-ai/tokenizers-cpp/pull/14。

在上面的基礎上,在MLC-LLM中支持 RWKV World系列模型的部署,對齊 World 系列模型的 Prompt ,獲得良好的對話效果。分別在 Apple M2和A800顯卡上進行了部署和測試。PR為:https://github.com/mlc-ai/mlc-llm/pull/848 ,這個pr還wip,如果你現在要使用的話可以直接切到這個pr對應的分支就可以了。

debug到1.5B RWKV World小模型會炸精度的bug,相當于踩了個大坑。

我要特別感謝 mlc-ai 官方的馮思遠在我部署過程中提供的支持以及幫我Review讓代碼合并到 mlc-ai 社區,以及感謝大缺弦的 RWKV World Tokenizer c++實現以及在編譯第三方庫時幫我解決的一個bug。

以下是MLC-LLM 部署RWKV World系列模型教程,盡量提供大家部署最不踩坑的實踐。

效果:

9e285d84-4937-11ee-97a6-92fbcf53809c.png在這里插入圖片描述

0x1. 將RWKV-4-World-7B部署在A800上

準備工作

RWKV-4-World模型地址:https://huggingface.co/StarRing2022/RWKV-4-World-7B

下載這里:https://github.com/BBuf/rwkv-world-tokenizer/releases/tag/v1.0.0 的 tokenizer_model.zip并解壓為tokenizer_model文件,這是RWKV World系列模型的Tokenizer文件。

克隆好 https://github.com/mlc-ai/mlc-llm 和 https://github.com/mlc-ai/relax ,注意克隆的時候一定要加上 --recursive 參數,這樣才會把它們依賴的第三方庫也添加上。

編譯Relax

git clone --recursive git@github.com:mlc-ai/relax.git
cd relax
mkdir build
cd build
cp ../cmake/config.cmake ./

然后修改build目錄下的config.cmake文件,由于我這里是在A800上面編譯,我改了以下設置:

set(USE_CUDA ON)
set(USE_CUTLASS ON)
set(USE_CUBLAS ON)

即啟用了CUDA,并開啟了2個加速庫CUTLASS和CUBLAS。然后在build目錄下執行cmake .. && make -j32 即可。

最后可以考慮把Relax添加到PYTHONPATH環境變量里面使得全局可見,在~/.bashrc上輸入以下內容:

export TVM_HOME=/bbuf/relax
export PYTHONPATH=$TVM_HOME/python:${PYTHONPATH}

然后source ~/.bashrc即可。

編譯和安裝MLC-LLM

git clone --recursive git@github.com:mlc-ai/mlc-llm.git
cd mlc-llm/cmake
python3 gen_cmake_config.py

執行python3 gen_cmake_config.py 可以按需選擇需要打開的編譯選項,比如我這里就選擇打開CUDA,CUBLAS,CUTLASS,另外需要注意的是這里的 TVM_HOME 路徑需要設置為上面編譯的Relax路徑。

然后執行下面的操作編譯:

cd ..
mkdir build
cp cmake/config.cmake build
cd build
cmake ..
make -j32

這里編譯時還需要安裝一下rust,按照建議的命令安裝即可,編譯完成之后即安裝上了mlc-llm提供的聊天程序mlc_chat_cli。然后為了做模型轉換和量化,我們還需要在mlc-llm目錄下執行一下pip install .安裝mlc_llm包。

模型轉換

模型轉換這里基本就是參考這個教程了:https://mlc.ai/mlc-llm/docs/compilation/compile_models.html 。

例如我們執行python3 -m mlc_llm.build --hf-path StarRing2022/RWKV-4-World-7B --target cuda --quantization q4f16_1 就可以將RWKV-4-World-7B模型權重量化為4個bit,然后activation還是以FP16的方式存儲。

9e4b1a40-4937-11ee-97a6-92fbcf53809c.pngtarget 則指定我們要在什么平臺上去運行,這里會將整個模型構成的圖編譯成一個動態鏈接庫(也就是TVM的IRModule)供后續的mlc_chat_cli程序(這個是在編譯mlc-llm時產生的)調用。

這里默認會在當前目錄下新建一個dist/models文件夾來存量化后模型和配置文件以及鏈接庫,轉換和量化好之后的模型會存儲在當前命令所在目錄的dist子目錄下(會自動創建),你也可以手動克隆huggingface模型到dist/models文件夾下。量化完之后的模型結構如下:

9e74cda4-4937-11ee-97a6-92fbcf53809c.png9e8a8a2c-4937-11ee-97a6-92fbcf53809c.png這里的mlc-chat-config.json指定來模型生成的一些超參數比如top_p,temperature等。

最后在推理之前,我們還需要把最開始準備的tokenizer_model文件拷貝到這個params文件夾中。

執行推理

我們在mlc-llm的上一層文件夾執行下面的命令:

./mlc-llm/build/mlc_chat_cli--modelRWKV-4-World-7B-q0f16

RWKV-4-World-7B-q0f16可以換成你量化模型時的名字,加載完并運行system prompt之后你就可以愉快的和RWKV-4-World模型聊天了。

9e285d84-4937-11ee-97a6-92fbcf53809c.png程序有一些特殊的指令來退出,查看速度等等:9ec1c3a2-4937-11ee-97a6-92fbcf53809c.png

性能測試

硬件 量化方法 速度
A800 q0f16 prefill: 362.7 tok/s, decode: 72.4 tok/s
A800 q4f16_1 prefill: 1104.7 tok/s, decode: 122.6 tok/s

這里給2組性能數據,大家感興趣的話可以測測其它配置。

逐層debug方法

在適配1.5B模型時出現了推理結果nan的現象,可以用mlc-llm/tests/debug/dump_intermediate.py這個文件來對齊輸入和tokenizer的結果之后進行debug,可以精準模擬模型推理并打印每一層的中間值,這樣我們就可以方便的看到模型是在哪一層出現了nan。

0x2. 將RWKV-4-World-3B部署在Apple M2上

在mac上部署和cuda上部署并沒有太大區別,主要是編譯relax和mlc-llm的時候編譯選項現在要選Metal而不是cuda了。我建議最好是在一個anconda環境里面處理編譯的問題,不要用系統自帶的python環境。

在編譯relax的時候需要同時打開使用Metal和LLVM選項,如果系統沒有LLVM可以先用Homebrew裝一下。

在mlc-llm中生成config.cmake時使用下面的選項:

9edbde54-4937-11ee-97a6-92fbcf53809c.png編譯完并pip install .之后使用下面的命令量化模型:

python3 -m mlc_llm.build --hf-path StarRing2022/RWKV-4-World-3B --target metal --quantization q4f16_1

量化過程中日志如下:

(base) bbuf@MacBook-Pro RWKV % python3 -m mlc_llm.build --hf-path StarRing2022/RWKV-4-World-3B --target metal --quantization q4f16_1
Weights exist at dist/models/RWKV-4-World-3B, skipping download.
Using path "dist/models/RWKV-4-World-3B" for model "RWKV-4-World-3B"
[0908] /Users/bbuf/工作目錄/RWKV/relax/src/runtime/metal/metal_device_api.mm Intializing Metal device 0, name=Apple M2
Host CPU dection:
  Target triple: arm64-apple-darwin22.3.0
  Process triple: arm64-apple-darwin22.3.0
  Host CPU: apple-m1
Target configured: metal -keys=metal,gpu -max_function_args=31 -max_num_threads=256 -max_shared_memory_per_block=32768 -max_threads_per_block=1024 -thread_warp_size=32
Host CPU dection:
  Target triple: arm64-apple-darwin22.3.0
  Process triple: arm64-apple-darwin22.3.0
  Host CPU: apple-m1
Automatically using target for weight quantization: metal -keys=metal,gpu -max_function_args=31 -max_num_threads=256 -max_shared_memory_per_block=32768 -max_threads_per_block=1024 -thread_warp_size=32
Start computing and quantizing weights... This may take a while.
Finish computing and quantizing weights.
Total param size: 1.6060066223144531 GB
Start storing to cache dist/RWKV-4-World-3B-q4f16_1/params
[0808/0808] saving param_807
All finished, 51 total shards committed, record saved to dist/RWKV-4-World-3B-q4f16_1/params/ndarray-cache.json
Finish exporting chat config to dist/RWKV-4-World-3B-q4f16_1/params/mlc-chat-config.json
[0940] /Users/bbuf/工作目錄/RWKV/relax/include/tvm/topi/transform.h Warning: Fast mode segfaults when there are out-of-bounds indices. Make sure input indices are in bound
[0941] /Users/bbuf/工作目錄/RWKV/relax/include/tvm/topi/transform.h Warning: Fast mode segfaults when there are out-of-bounds indices. Make sure input indices are in bound
Save a cached module to dist/RWKV-4-World-3B-q4f16_1/mod_cache_before_build.pkl.
Finish exporting to dist/RWKV-4-World-3B-q4f16_1/RWKV-4-World-3B-q4f16_1-metal.so

同樣也需要把tokenizer_model文件拷貝到量化后模型文件夾的params目錄下,然后執行下面的命令啟動聊天程序:

./mlc-llm/build/mlc_chat_cli --model RWKV-4-World-3B-q0f16

9f00d2d6-4937-11ee-97a6-92fbcf53809c.png最后也來一個Mac M2的速度測試:

硬件 量化方法 速度
Apple M2 q0f16 204.9 tok/s, decode: 12.1 tok/s
Apple M2 q4f16_1 prefill: 201.6 tok/s, decode: 26.3 tok/s

建議使用q4f16的配置,這樣回復會快一些。

0x3. 總結

這篇文章介紹了一下筆者最近給mlc-llm做適配的工作,歡迎大家體驗MLC-LLM和RWKV-World模型。

審核編輯:彭菁

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

    關注

    1

    文章

    2790

    瀏覽量

    47916
  • 編譯
    +關注

    關注

    0

    文章

    624

    瀏覽量

    32457
  • LLM
    LLM
    +關注

    關注

    0

    文章

    217

    瀏覽量

    246

原文標題:0x3. 總結

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

收藏 人收藏

    評論

    相關推薦

    低比特量化技術如何幫助LLM提升性能

    針對大語言模型 (LLM) 在部署過程中的性能需求,低比特量化技術一直是優化效果最佳的方案之一,本文將探討低比特量化技術如何幫助 LLM 提升性能,以及新版 OpenVINO 對于低比特量化技術的支持。
    的頭像 發表于 12-08 15:26 ?732次閱讀
    低比特量化技術如何幫助<b class='flag-5'>LLM</b>提升性能

    鴻蒙實戰開發-本地部署、SmartPerf 編譯部署指導文檔

    install 在項目目錄下運行命令: npm run build 編譯成功后會有main 可執行文件生成。 項目部署 直接運行 ./main 可執行程序,完成項目的部署。 訪問項目 在瀏覽器上打開
    發表于 05-09 14:23

    Flash---SLC與MLC

    系列的是MCL結構的NANDFLASHSLC與MLC結構FLASH的區別什么是通常所說的SLC與MLCMLC是英特爾(Intel)在1997年9月最先開發成功的,其作用是將兩個位的信息存入一個浮動柵
    發表于 03-16 21:07

    請問SLC、MLC和TLC的差別是什么?

    與讀取,不過此技術受限于硅效率(Silicon efficiency)的問題,必須要由較先進的流程強化技術(Process enhancements),才能向上提升SLC制程技術。MLC
    發表于 06-21 14:57

    是買SLC還是MLC閃存芯片的呢?

    許多人對閃存的SLC和MLC區分不清。就拿目前熱銷的MP3隨身聽來說,是買SLC還是MLC閃存芯片的呢?在這里先告訴大家,如果你對容量要求不高,但是對機器質量、數據的安全性、機器壽命等方面要求較高
    發表于 07-22 08:57

    Unico上MLC的使用

    Unico為ST可編程傳感器提供了一個UI界面,方便用戶設計/調試MLC功能? 在Unico選擇了帶MLC的器件(如LSM6DSOX)后,在GUI中會導入MLC的配置和調試窗口
    發表于 09-06 07:00

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

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

    ARM代碼編譯鏈接的工作流程

    ARM處理器在市面上到處都是ARM7、ARM9、Cortex-M、Cortex-R、Cortex-A包含的種類繁多,今天我們就來了解一下ARM代碼編譯鏈接的工作流程,以及過程中需要的相關概念信息
    的頭像 發表于 12-22 16:57 ?1942次閱讀

    基于LLAMA的魔改部署

    ? 借著熱點,簡單聊聊 大模型的部署方案 ,作為一個只搞過CV部署的算法工程師,在最近LLM逐漸改變生活的大背景下,猛然意識到LLM部署也是
    的頭像 發表于 05-23 15:08 ?4708次閱讀
    基于LLAMA的魔改<b class='flag-5'>部署</b>

    基于一個完整的 LLM 訓練流程

    ? ? 在這篇文章中,我們將盡可能詳細地梳理一個完整的 LLM 訓練流程。包括模型預訓練(Pretrain)、Tokenizer 訓練、指令微調(Instruction Tuning)等環節。 文末
    的頭像 發表于 06-29 10:08 ?1369次閱讀
    基于一個完整的 <b class='flag-5'>LLM</b> 訓練<b class='flag-5'>流程</b>

    Unico上MLC的使用

    電子發燒友網站提供《Unico上MLC的使用.pdf》資料免費下載
    發表于 07-31 15:21 ?0次下載
    Unico上<b class='flag-5'>MLC</b>的使用

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

    MLC-LLM 部署RWKV World系列模型實戰(3B模型Mac M2解碼可達26tokens/s) 中提到要使用mlc-llm部署模型首先需要一個
    發表于 09-26 12:25 ?520次閱讀
    <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 ?564次閱讀
    如何使用<b class='flag-5'>MLC-LLM</b>在A100/Mac M2上<b class='flag-5'>部署</b>RWKV模型

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

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

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

    LLM的理解比較有限,從代碼實現的角度來說,RWKV的狀態和KV Cache不同,不依賴序列長度,這讓RWKV模型在各種長度下運行內存和運行速度都是趨于穩定的,所以我感覺工程價值是比基于Transformer架構比如Llama更好的,部署的性價比會天然更優。
    的頭像 發表于 11-19 15:58 ?607次閱讀
    使用<b class='flag-5'>MLC-LLM</b>支持RWKV-5推理的過程思考
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>