#AIGC創(chuàng)新先鋒者征文大賽# 告訴你一個(gè)小秘密!樹莓派跑LLM難上手?為什么不試試Intel 原創(chuàng) 精華
【本文正在參與 AI.x社區(qū)AIGC創(chuàng)新先鋒者征文大賽】http://www.scjtxx.cn/aigc/2223.html
前言
大型語(yǔ)言模型(LLM)通過(guò)其卓越的文本理解與生成能力,為機(jī)器智能帶來(lái)了革命性的進(jìn)步。然而,這些模型的運(yùn)行通常需要消耗大量的計(jì)算資源,因此它們主要部署在性能強(qiáng)大的服務(wù)器上。
隨著技術(shù)的發(fā)展和邊緣計(jì)算的興起,現(xiàn)在有潛力在更小巧、便攜的設(shè)備上部署這些模型。例如,Raspberry Pi 樹莓派和 Intel 哪吒開發(fā)套件等單片機(jī)。盡管體積小巧,但它們具備足夠的能力運(yùn)行某些精簡(jiǎn)版本的模型。本文就兩款單片機(jī)上運(yùn)行LLM做一個(gè)對(duì)比,先嘗試在Raspberry Pi 4B運(yùn)行大模型,然后將該方案在哪吒開發(fā)板重建。
一、Raspberry Pi4 上運(yùn)行大模型Qwen2 0.5B
一般情況下,模型需要兩倍內(nèi)存大小才能正常運(yùn)行。因此,本方案使用的8GB的Raspberry Pi4 4B來(lái)做推理。
1、環(huán)境部署
一般情況下,模型需要兩倍內(nèi)存大小才能正常運(yùn)行。因此,本方案使用的8GB的Raspberry Pi4 4B來(lái)做推理。
#部署虛擬環(huán)境
sudo apt update && sudo apt install git
mkdir my_project
cd my_project
python -m venv env source env/bin/activate
#下載依賴庫(kù)
python3 -m pip install torch numpy sentencepiece
sudo apt install g++ build-essential
#下載llama.cpp代碼庫(kù)
git clone https://github.com/ggerganov/llama.cpp
#編譯環(huán)境
cd llama.cpp
make
2、模型下載
樹莓派4b的8GB RAM,即使樹莓派5,都不太適合做模型的量化。只能在PC機(jī)上做好量化后,再把量化后的模型文件拷貝到樹莓派上部署。具體方式是使用LLaMA.cpp中的convert-hf-to-gguf.py將原模型轉(zhuǎn)化成GGUF格式。
鑒于Raspberry Pi只有CPU,我們需要優(yōu)先考慮可以在CPU上運(yùn)行的模型。本次選擇的大模型是Qwen2 0.5B。
Qwen2 0.5B是阿里云開源的新一代大語(yǔ)言模型,模型規(guī)模為0.49B參數(shù),支持最長(zhǎng)達(dá)32K tokens的上下文長(zhǎng)度,在多個(gè)評(píng)測(cè)基準(zhǔn)上表現(xiàn)優(yōu)異,超越了Meta的Llama-3-70B。
這里我們直接從魔搭社區(qū)魔搭社區(qū)下載已經(jīng)量化過(guò)的GGUF模型文件。
#模型下載
wget https://www.modelscope.cn/models/qwen/Qwen2-0.5B-Instruct-GGUF/resolve/master/qwen2-0_5b-instruct-q5_k_m.gguf
3、模型運(yùn)行
大模型推理引擎使用的是llama.cpp,實(shí)現(xiàn)模型推理對(duì)話。
./llama-cli -m /home/pi/qwen2-0_5b-instruct-q5_k_m.gguf -n 512 -co -i -if -f ../../prompts/chat-with-qwen.txt --in-prefix "<|im_start|>user\n" --in-suffix "<|im_end|>\n<|im_start|>assistant\n" -ngl 24 -fa
4、總結(jié)
經(jīng)過(guò)一番折騰,配置環(huán)境和編譯,耗去了幾天時(shí)間,樹莓派終于成功運(yùn)行大模型了。雖然可以,但比較吃力??戳司W(wǎng)上其他人的嘗試,即使換用具有更強(qiáng)大處理能力的樹莓派5,運(yùn)行作為資源有限設(shè)備設(shè)計(jì)的Phi-2-Q4(27億參數(shù)),由于沒有GPU支撐,所以速度也只有5.13 tokens/s。
所以說(shuō),樹莓派5在處理速度上相較于4B有了顯著提升,但在處理大型LLM時(shí)仍受到諸多限制??偨Y(jié)樹莓派跑大模型的痛點(diǎn):一是它無(wú)法做模型量化,要么在本地PC機(jī)上做好量化再拷貝過(guò)來(lái),要么直接下載使用GGUF模型文件。二是它只有CPU,計(jì)算能力的提升空間基本被鎖死了。如果要在樹莓派上跑模型,只能選用內(nèi)存占用較小且僅在 CPU 上運(yùn)行的模型??淳W(wǎng)上有高人設(shè)想了一些解決方案,比如:
- 將樹莓派上的小GPU用起來(lái)。樹莓派5有個(gè)VideoCore GPU,支持Vulkan編程,而llama.cpp也有Vulkan后端,理論上是有可能的。但運(yùn)行上有些問(wèn)題,包括死鎖、輸出亂碼等,推測(cè)可能和shader有關(guān),還需要進(jìn)一步研究。
- 用類似T-MAC的方法,加速樹莓派CPU的推理。T-MAC提出用look-up table (LUT) 代替計(jì)算,對(duì)于低比特量化的模型會(huì)很有幫助。例如4-bit相乘,只需要一個(gè)16x16的表就能預(yù)存所有可能的結(jié)果,把乘法變成了查表。
- 采用新的更高效的模型架構(gòu),例如RWKV?
但這些方法都還只是停留在理論設(shè)想階段,沒有落地實(shí)踐,那為什么不直接試下Intel 哪吒呢?
二、Intel 哪吒開發(fā)套件上運(yùn)行大模型Qwen2.5
Intel 哪吒開發(fā)套件搭載了英特爾N97處理器(3.6GHz),配備64GB eMMC存儲(chǔ)和8GB LPDDR5內(nèi)存。英特爾N97處理器屬于 Intel Alder Lake-N 系列,采用僅 E-Core 的設(shè)計(jì),專為輕量級(jí)辦公、教育設(shè)備和超低功耗筆記本電腦設(shè)計(jì),成本和功耗更低,更適合嵌入式設(shè)備。
關(guān)鍵點(diǎn)來(lái)了!Intel 哪吒最大的優(yōu)勢(shì)就是自帶集成顯卡,Intel UHD Graphics,我們可以在iGPU上使用OpenVINO來(lái)運(yùn)行大模型。
說(shuō)干就干!
(一)安裝OpenVINO配置環(huán)境
1、安裝OpenVINO
從OpenVINO官網(wǎng)下載linux版本的壓縮包,再解壓,安裝依賴,配置環(huán)境變量。
#解壓
tar -zxvf l_openvino_toolkit_ubuntu22_2024.3.0.16041.1e3b88e4e3f_x86_64.tgz
#安裝依賴包
cd l_openvino_toolkit_ubuntu22_2024.3.0.16041.1e3b88e4e3f_x86_64/
sudo -E ./install_dependencies/install_openvino_dependencies.sh
#配置環(huán)境變量
source ./setupvars.sh
2、安裝OpenCL runtime packages
既然我們要充分發(fā)揮Intel 哪吒的集成顯卡優(yōu)勢(shì),就還要另外安裝OpenCL runtime packages來(lái)把模型部署到iGPU上。具體參考官方文檔,Configurations for Intel? Processor Graphics (GPU) with OpenVINO? — OpenVINO? documentation參考網(wǎng)上經(jīng)驗(yàn),我使用deb包的方式進(jìn)行安裝,從https://github.com/intel/compute-runtime/releases/tag/24.35.30872.22先下載11個(gè)deb包到開發(fā)板上,然后再dpkg安裝。
#Create temporary directory
mkdir neo
#Download all *.deb packages
cd neo
wget https://github.com/intel/intel-graphics-compiler/releases/download/igc-1.0.17537.20/intel-igc-core_1.0.17537.20_amd64.deb
wget https://github.com/intel/intel-graphics-compiler/releases/download/igc-1.0.17537.20/intel-igc-opencl_1.0.17537.20_amd64.deb
wget https://github.com/intel/compute-runtime/releases/download/24.35.30872.22/intel-level-zero-gpu-dbgsym_1.3.30872.22_amd64.ddeb
wget https://github.com/intel/compute-runtime/releases/download/24.35.30872.22/intel-level-zero-gpu-legacy1-dbgsym_1.3.30872.22_amd64.ddeb
wget https://github.com/intel/compute-runtime/releases/download/24.35.30872.22/intel-level-zero-gpu-legacy1_1.3.30872.22_amd64.deb
wget https://github.com/intel/compute-runtime/releases/download/24.35.30872.22/intel-level-zero-gpu_1.3.30872.22_amd64.deb
wget https://github.com/intel/compute-runtime/releases/download/24.35.30872.22/intel-opencl-icd-dbgsym_24.35.30872.22_amd64.ddeb
wget https://github.com/intel/compute-runtime/releases/download/24.35.30872.22/intel-opencl-icd-legacy1-dbgsym_24.35.30872.22_amd64.ddeb
wget https://github.com/intel/compute-runtime/releases/download/24.35.30872.22/intel-opencl-icd-legacy1_24.35.30872.22_amd64.deb
wget https://github.com/intel/compute-runtime/releases/download/24.35.30872.22/intel-opencl-icd_24.35.30872.22_amd64.deb
wget https://github.com/intel/compute-runtime/releases/download/24.35.30872.22/libigdgmm12_22.5.0_amd64.deb
#Verify sha256 sums for packages
wget https://github.com/intel/compute-runtime/releases/download/24.35.30872.22/ww35.sum
sha256sum -c ww35.sum
#install required dependencies
apt install ocl-icd-libopencl1
#Install all packages as root
sudo dpkg -i *.deb
(二)模型下載和轉(zhuǎn)換量化
1、模型下載
本次采用的大模型是Qwen 2.5-0.5B。Qwen2.5是阿里通義團(tuán)隊(duì)近期最新發(fā)布的文本生成系列模型,基于更富的語(yǔ)料數(shù)據(jù)集訓(xùn)練,相較于 Qwen2,Qwen2.5 獲得了顯著更多的知識(shí)(MMLU:85+),并在編程能力(HumanEval 85+)和數(shù)學(xué)能力(MATH 80+)方面有了大幅提升。此外,新模型在指令執(zhí)行、生成長(zhǎng)文本(超過(guò) 8K 標(biāo)記)、理解結(jié)構(gòu)化數(shù)據(jù)(例如表格)以及生成結(jié)構(gòu)化輸出特別是 JSON 方面取得了顯著改進(jìn)。Qwen2.5 模型總體上對(duì)各種 system prompt 更具適應(yīng)性,增強(qiáng)了角色扮演實(shí)現(xiàn)和聊天機(jī)器人的條件設(shè)置功能。Qwen2.5 語(yǔ)言模型支持高達(dá) 128K tokens,并能生成最多 8K tokens 的內(nèi)容。本次使用的是指令調(diào)優(yōu)的0.5B模型,其特點(diǎn)如下:
? 類型:因果語(yǔ)言模型
? 訓(xùn)練階段:預(yù)訓(xùn)練與后訓(xùn)練
? 架構(gòu):使用RoPE、SwiGLU、RMSNorm、注意力QKV偏置和綁定詞嵌入的transformers
? 參數(shù)數(shù)量:0.49億
? 非嵌入?yún)?shù)數(shù)量:0.36億
? 層數(shù):24
? 注意力頭數(shù)(GQA):查詢14個(gè),鍵值對(duì)2個(gè)
? 上下文長(zhǎng)度:完整32,768token,生成最多8192token
下載模型首選魔搭社區(qū),直接下載到Intel哪吒開發(fā)板上。
#安裝lfs
git lfs install
#下載模型
git clone https://www.modelscope.cn/qwen/Qwen2.5-0.5B-Instruct.git
2、模型轉(zhuǎn)換量化
在部署模型之前,我們首先需要將原始的 PyTorch 模型轉(zhuǎn)換為 OpenVINO? 的 IR 靜態(tài)圖格式,并對(duì)其進(jìn)行壓縮,以實(shí)現(xiàn)更輕量化的部署和最佳的性能表現(xiàn)。
(1)環(huán)境配置
新建一個(gè)虛擬環(huán)境,安裝依賴。
python3 -m venv openvino_env
source openvino_env/bin/activate
python3 -m pip install --upgrade pip
pip install wheel setuptools
pip install -r requirements.txt
(2)轉(zhuǎn)換和量化
通過(guò) Optimum 提供的命令行工具 optimum-cli,我們可以一鍵完成模型的格式轉(zhuǎn)換和權(quán)重量化任務(wù)。
optimum-cli export openvino --model './local_dir' --task text-generation-with-past --weight-format int4 --group-size 128 --ratio 0.8 Qwen2.5-0.5B-Instruct-int4-ov
我們也可以根據(jù)模型的輸出結(jié)果,調(diào)整其中的量化參數(shù),包括:
–weight-format:量化精度,可以選擇fp32,fp16,int8,int4,int4_sym_g128,int4_asym_g128,int4_sym_g64,int4_asym_g64
–group-size:權(quán)重里共享量化參數(shù)的通道數(shù)量
–ratio:int4/int8 權(quán)重比例,默認(rèn)為1.0,0.6表示60%的權(quán)重以 int4 表,40%以 int8 表示
–sym:是否開啟對(duì)稱量化
開始轉(zhuǎn)換,經(jīng)過(guò)一段不算漫長(zhǎng)的等待,轉(zhuǎn)換成功!
(三)模型部署
OpenVINO? 目前提供兩種針對(duì)大語(yǔ)言模型的部署方案,一種是基于 Python 接口的 Optimum-intel 工具來(lái)進(jìn)行部署,可以直接用 Transformers 庫(kù)的接口來(lái)部署模型;另一種是GenAI API 方式,它同時(shí)支持 Python 和 C++ 兩種編程語(yǔ)言,安裝容量不到200MB,提供更極致的性能和輕量化的部署方式,更適合邊緣設(shè)備上部署大模型。
本文采用的是后者,即GenAI API 方式。GenAI API 提供了 chat 模式的構(gòu)建方法,通過(guò)聲明 pipe.start_chat()以及pipe.finish_chat(),多輪聊天中的歷史數(shù)據(jù)將被以 kvcache 的形態(tài),在內(nèi)存中進(jìn)行管理,從而提升運(yùn)行效率。
import openvino_genai as ov_genai
pipe = ov_genai.LLMPipeline(llm_model_path, "GPU")
pipe.generate(prompt, eos_token_id=151645, max_length=500)
def streamer(subword):
print(subword, end='', flush=True)
return False
pipe.generate(prompt, eos_token_id=151645, max_length=500, streamer=streamer)
好了,模型啟動(dòng)了,我們讓它做個(gè)自我介紹。
看來(lái)回答得非常流暢絲滑!
三、Intel 哪吒開發(fā)套件上運(yùn)行大模型Phi-3.5-mini
還不死心,繼續(xù)上難度,再換一個(gè)尺寸更大的模型,看看Intel哪吒是否hold住?
這次我們選用的是Phi-3.5-mini,它是微軟推出的新一代 AI 模型系列中的輕量級(jí)模型,專為資源受限的環(huán)境設(shè)計(jì),特別適合在資源受限的環(huán)境中進(jìn)行復(fù)雜的語(yǔ)言處理任務(wù)。該模型具有以下特點(diǎn):
- 模型參數(shù)和結(jié)構(gòu):
? Phi-3.5-mini 擁有38億參數(shù),是一個(gè)密集的僅解碼器Transformer模型,使用與Phi-3 Mini相同的分詞器。
? 該模型基于Phi-3的數(shù)據(jù)集構(gòu)建,包括合成數(shù)據(jù)和經(jīng)過(guò)篩選的公開網(wǎng)站數(shù)據(jù),重點(diǎn)關(guān)注高質(zhì)量、推理密集的數(shù)據(jù)。 - 應(yīng)用和性能:
? Phi-3.5-mini 特別適合在嵌入式系統(tǒng)和移動(dòng)應(yīng)用中進(jìn)行快速文本處理和代碼生成。
? 該模型在基準(zhǔn)測(cè)試中的表現(xiàn)超越了GPT4o、Llama 3.1、Gemini Flash等同類模型,顯示出其強(qiáng)大的性能。 - 設(shè)計(jì)目標(biāo)和適用場(chǎng)景:
? 針對(duì)基礎(chǔ)快速推理任務(wù)設(shè)計(jì),適合在內(nèi)存和算力受限的環(huán)境中運(yùn)行,支持128k上下文長(zhǎng)度。
? 該模型在處理長(zhǎng)達(dá)128K個(gè)token的長(zhǎng)上下文方面表現(xiàn)出色,這使其在多種語(yǔ)言處理任務(wù)中都非常有效。 - 技術(shù)優(yōu)勢(shì):
? 經(jīng)過(guò)嚴(yán)格的增強(qiáng)過(guò)程,包括監(jiān)督微調(diào)和直接首選項(xiàng)優(yōu)化,以確保精確地遵循指令和實(shí)施可靠的安全措施。
? 支持多語(yǔ)言處理和多輪對(duì)話能力,優(yōu)化了處理高質(zhì)量、推理密集數(shù)據(jù)的能力。
1、下載模型
這次我們偷懶一下,直接下載已經(jīng)轉(zhuǎn)換好的IR文件到Intel哪吒開發(fā)板上。
huggingface-cli download --resume-download OpenVINO/Phi-3-mini-4k-instruct-int4-ov --local-dir Phi-3-mini-4k-instruct-int4-ov
參數(shù)規(guī)模3.8B的Phi-3.5-mini,轉(zhuǎn)換成IR格式后,模型大小為2.5G。
2、運(yùn)行流式聊天機(jī)器人
繼續(xù)采用GenAI API 方式,用iGPU推理。
python3 chat_genai.py --model_path {your_path}/Phi-3-mini-4k-instruct-int4-ov --max_sequence_length 4096 --device GPU
這次問(wèn)它一個(gè)難一點(diǎn)的問(wèn)題,“比較python和rust兩種編程語(yǔ)言的優(yōu)劣”。
Phi-3.5模型真的名不虛傳!簡(jiǎn)直人生開掛了,輸出速度目測(cè)每秒10個(gè)token,整整持續(xù)輸出了二十多分鐘,共2903字,算上標(biāo)點(diǎn)符合16285個(gè)字符。
令人難以想象這是在一個(gè)單片機(jī)上跑大模型的效果,要么是Phi-3.5模型,要么是Intel 哪吒厲害,要么是微軟和英特爾聯(lián)手特別厲害!
