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