No Code AI(肉寇)AI自動化兩日精通|實體6小時+線上6小時
|

【開箱實測】OpenVINO榨出單板極限,實作離線LLM AI助理!

   

作者:Felix Lin

在當前AI PC問世之際,相信不少人已知道OpenVINO可以加速離線大語言模型(LLM)的推論速度,不論是文生圖的Stable Diffusion或是Llama3對話機器人等,都可以在OpenVINO 2024.2新版的加持下,獲得不少的效能提升。本篇則是要更進一步在資源更為受限的單板電腦上進行大語言模型的推論,甚至是實作一個離線大語言模型的AI助理出來!

以單板電腦實作的 AI 助理

以單板電腦實作的 AI 助理

UP 7000 EDGE

筆者本次實作使用的硬體為研揚(AAEON)的UP 7000 EDGE單板電腦,其為UP系列中體積最為小巧且最為精簡的系統。移除外殼後的板卡僅有信用卡大小,約為8.5mm x 5.6mm,與樹莓派model B相當。處理器為Intel® Processor N97 4核心,整合繪圖處理器UHD Graphics 24EU執行單元,提供4K顯示外亦可做AI加速推論。記憶體與儲存空間分別為8GB LPDDR5 與 64GB eMMC,外部周邊包含HDMI、1GB Ethernet以及一次給到位的3 port USB 3.2,在這小巧的體積下配備也是一點都不馬虎!

UP 7000 EDGE 與樹莓派大小相當,卻有超乎想像的 AI 推論能力

UP 7000 EDGE 與樹莓派大小相當,卻有超乎想像的 AI 推論能力

即便處理器亮眼,但在記憶體僅有8GB的環境下要執行LLM推論與語音轉文字模型,讓筆者也開始懷疑能否順利執行!?但光說不練是假把戲,不如實際操作一番便能得知真相!

安裝套件與前置準備

本篇使用的專案為Custom AI Assistant,可於GitHub取得完整的程式碼。此階段會需要先下載必要的套件與模組,以利後續執行AI模型。筆者實作的環境為Ubuntu 22.04,若在不同作業系統 如Windows或 MAC OS也可以順利執行,除Python虛擬環境指令差異外,其餘完全相同,以下指令將以Ubuntu環境說明。

1. 安裝git、Python、GCC等開發工具:


sudo apt install git gcc python3-venv python3-dev

2.下載客製化AI語音助理範例程式:


git clone https://github.com/openvinotoolkit/openvino_build_deploy.git
cd openvino_build_deploy/ai_ref_kits/custom_ai_assistant

3. 建立Python虛擬環境:


python3 -m venv venv
source venv/bin/activate

4. 安裝AI助理所需要的Python module:


python -m pip install --upgrade pip
pip install -r requirements.txt

5. 稍後需要從huggingface下載模型,需要先行登入huggingface帳號,執行以下指令:


huggingface-cli login

命令列會跳出提示訊息,要求輸入Huggingface的Access Token以利存取Huggingface Hub上的模型,在此頁面登入Huggingface帳號後可建立新的Token並且貼於命令列上,其Token並不會顯示出來,直接按下Enter顯示登入成功訊息及代表完成。

Huggingface Login 提示訊息

Huggingface Login 提示訊息

截至於此環境已建立完成。

模型轉換與最佳化

為了使AI助理更貼近一般人的使用情境,專案中必須仰賴兩種類型的模型,分別是語音識別(automatic speech recognition,ASR)以及對話(Chat)模型。ASR model負責將語音轉成文字,如此可以免除使用者打字輸入,實踐真正的 「對話」 與AI助理溝通,而語言模型則是大家熟知的聊天機器人,在此作為一個解決使用者疑難雜症的智慧助理。

語音轉文字將使用distil-large-v2模型,這是openai的whisper-large-v2精簡版本,更適合應用於嵌入式系統中。而對話機器人專案中原先的選項為Llama2-7B (13GB)或Llama3-8B (16GB)模型, 但這兩模型對單板電腦而言都太「肥」了,要放進單板電腦中肯定是不可能的,因此筆者將使用Qwen2-0.5B (1GB)模型替代,或是TinyLlama-1.1B (2GB)也會是不錯的選擇。

修改 convert_and_optimize_chat.py 檔案將 Qwen2 的模型位址加入其中,並可從參數指定,其修改 patch 如下:


--- a/ai_ref_kits/custom_ai_assistant/convert_and_optimize_chat.py
+++ b/ai_ref_kits/custom_ai_assistant/convert_and_optimize_chat.py
@@ -8,6 +8,7 @@ MODEL_MAPPING = {
     "llama2-7B": "meta-llama/Llama-2-7b-chat-hf",
     "llama2-13B": "meta-llama/Llama-2-13b-chat-hf",
     "llama3-8B": "meta-llama/Meta-Llama-3-8B-Instruct",
+    "Qewn2": "Qwen/Qwen2-0.5B-Instruct",
 }


@@ -56,7 +57,7 @@ def convert_chat_model(model_type: str, precision: str, model_dir: Path) -> Path

 if __name__ == "__main__":
     parser = argparse.ArgumentParser()
-    parser.add_argument("--chat_model_type", type=str, choices=["llama2-7B", "llama2-13B", "llama3-8B"],
+    parser.add_argument("--chat_model_type", type=str, choices=["llama2-7B", "llama2-13B", "llama3-8B" "Qewn2"],
                         default="llama3-8B", help="Chat model to be converted")
     parser.add_argument("--precision", type=str, default="int4", choices=["fp16", "int8", "int4"], help="Model precision")
     parser.add_argument("--model_dir", type=str, default="model", help="Directory to place the model in")

接著就依序轉換ASR與Chat Model。轉換distil-large-v2模型為INT8精度:


python convert_and_optimize_asr.py --precision int8

轉換Qwen2-0.5B模型為INT4精度:


python convert_and_optimize_chat.py --chat_model_type Qwen2 --precision int4

等待一段時間後即完成模型轉換,以INT4精度轉換過後的Qwen2-0.5B的OpenVINO IR模型大小為350MB,相較於原始safetensors格式1GB僅剩下35%大小。若擔心在單板電腦上轉換時間會過於冗長,也可以在PC上進行轉換後再將IR模型檔傳送至單板電腦,其最終運作結果是相當的。

執行AI Assistant

原始app.py程式碼中會使用librosa處理音訊的擷取,但不幸的是此套件在Ubuntu運作有bug,會吃掉大量的記憶體導致程式crash,因此必須稍做修改程式碼如下。若是在Windows環境則完全不會有此問題。


--- a/ai_ref_kits/custom_ai_assistant/app.py
+++ b/ai_ref_kits/custom_ai_assistant/app.py
@@ -7,6 +7,8 @@ from typing import Tuple, List, Optional, Set

 import gradio as gr
 import librosa
+import io
+from scipy.io import wavfile
 import numpy as np
 import openvino as ov
 from optimum.intel import OVModelForCausalLM, OVModelForSpeechSeq2Seq
@@ -57,6 +59,25 @@ def get_available_devices() -> Set[str]:
     core = ov.Core()
     return {device.split(".")[0] for device in core.available_devices}

+def resample(audio, src_sample_rate, dst_sample_rate):
+    """
+    Resample audio to specific sample rate
+
+    Parameters:
+      audio: input audio signal
+      src_sample_rate: source audio sample rate
+      dst_sample_rate: destination audio sample rate
+    Returns:
+      resampled_audio: input audio signal resampled with dst_sample_rate
+    """
+    if src_sample_rate == dst_sample_rate:
+        return audio
+    duration = audio.shape[0] / src_sample_rate
+    resampled_data = np.zeros(shape=(int(duration * dst_sample_rate)), dtype=np.float32)
+    x_old = np.linspace(0, duration, audio.shape[0], dtype=np.float32)
+    x_new = np.linspace(0, duration, resampled_data.shape[0], dtype=np.float32)
+    resampled_audio = np.interp(x_new, x_old, audio)
+    return duration, resampled_audio.astype(np.float32)

 def load_asr_model(model_dir: Path) -> None:
     """
@@ -200,7 +221,9 @@ def transcribe(audio: Tuple[int, np.ndarray], conversation: List[List[str]]) ->

     sample_rate, audio = audio
     # the whisper model requires 16000Hz, not 44100Hz
-    audio = librosa.resample(audio.astype(np.float32), orig_sr=sample_rate, target_sr=TARGET_AUDIO_SAMPLE_RATE).astype(np.int16)
+    #audio = librosa.resample(audio.astype(np.float32), orig_sr=sample_rate, target_sr=TARGET_AUDIO_SAMPLE_RATE).astype(np.int16)
+    audio = audio.mean(axis=1)
+    duration, audio = resample(audio, sample_rate, TARGET_AUDIO_SAMPLE_RATE)

     # get input features from the audio
     input_features = asr_processor(audio, sampling_rate=TARGET_AUDIO_SAMPLE_RATE, return_tensors="pt").input_features

修改後執行app.py啟動AI助理,ASR模型與chat模型分別以參數帶入前段轉換後的模型路徑:


 python app.py --asr_model_dir model/distil-whisper-large-v2-INT8/ --chat_model_dir model/Qewn2-INT4/

app.py預設的系統提示(prompt)指示語言模型為醫師助理,在不提供醫療建議與診斷的情快下協助使用者釐清症狀,若有必要時尋求醫療資源做進一步處置。由於邊緣裝置資源有限,在限制最多三個問題的條件下每次最多產生250新的token,開發者也可以自行於程式碼中調整這些參數。

啟動程式後可從127.0.0.1:7860開啟本地端的網頁介面,初始化可以看到這位虛擬助理 「Adrishuo」的自我介紹,使用者可以從上方的介面啟動麥克風錄音,完成後點選 「Submit」啟動ASR模型轉成文字並送給聊天機器人,跟虛擬助理進行互動。

虛擬助理的互動介面

虛擬助理的互動介面

在經過一到三輪的詢答後可以點選「Summarize」按鈕,AI助理將針對使用者提供的資訊進行摘要彙整。

AI 助理彙整出健康狀況摘要

AI 助理彙整出健康狀況摘要

小結:出人意表的模型壓縮能力

「8GB RAM與32GB eMMC執行大語言模型應用!?」 這是筆者在實測之前所感到的疑惑。但經過一輪測試後發現OpenVINO在經過模型量化壓縮後,大幅縮小模型大小,並得以放進資源有限的單板電腦中。虛擬AI助理應用執行時,UP 7000 Edge在大部分AI推論交由GPU處理的情況下, CPU尚有餘裕可以處理其他的應用程式。同時實際在運作時耗費的記憶體約在 7GB 內,代表還有添加或更換其他模型的可能性。日後虛擬 AI 助理若再加上文字轉語音 Text-to-Speech 應可實現完全的語音對話的人與 AI 互動操作,至於要放置在何種載體之上,就留給各位開發者想像了!

 

Lin Felix

訂閱MakerPRO知識充電報

與40000位開發者一同掌握科技創新的技術資訊!

Author: Lin Felix

長期出沒在南部地區的Maker社群,致力於推廣從實作中學習的精神。熱愛胡搞瞎搞,喜歡嘗試新事物。現職為亞堤教育團隊講師與創客閣樓召集人。

Share This Post On
468 ad

Submit a Comment

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *