## 使用llama.cpp來執行Taiwan-LLM大語言模型 ### 前言 本篇為「Homemade version of "AI in a Box"」專案的系列文章,關於該專案的整體描述請參閱[這篇](https://hackmd.io/@ai-in-a-box/rJtjUU3Sp)內容。 接下來會先實作「AI in a Box」中的大語言模型部分。大語言模型(LLM)是很熱門的技術因此資訊較為完整(如鐵人賽內容[LLM Note Day 16 - ggml & llama.cpp](https://ithelp.ithome.com.tw/m/articles/10331129)),所以也就將其做為專案實作的起手式。 在這邊所使用的是Taiwan-LLM模型是專屬於台灣的大語言模型,讓我們這些在台灣的使用者在與人工智慧對話時能夠得到更符合在地文化的回應及語言使用習慣。該模型發佈的相關報導請參閱:[專屬台灣!優必達攜手台大打造「Taiwan LLM」,為何我們需要本土化的AI?](https://www.bnext.com.tw/article/77335/ubitus-ai-taiwan-llm?)。並且為了要在邊緣裝置上運行,因此選用了7B模型([Taiwan-LLM-7B-v2.1-chat](https://huggingface.co/yentinglin/Taiwan-LLM-7B-v2.1-chat))。 ### 準備工作 就如專案整體描述文章中所說明的會使用llama.cpp專案,因此接下來從GitHub下載[llama.cpp](https://codeload.github.com/ggerganov/llama.cpp/zip/refs/heads/master)程式碼,而在Windows上我是用Makefile方式來進行編譯(因為我不熟CMake),因此還需要從GitHub下載[w64devkit](https://github.com/skeeto/w64devkit/releases/download/v1.21.0/w64devkit-1.21.0.zip)編譯環境。 把從GitHub下載下來的Zip檔案解壓縮後放在一個專案目錄。另外還需要使用Python程式碼來做模型下載與轉換程序,因此安裝了Anaconda軟體。 由於在Windows上編譯與使用會使用到各種不同的環境。接下來開啟了三個命令列視窗,功能分別於下: * 第一個「命令提示字元」視窗,之後切換至w64devkit目錄並執行w64devkit.exe進入類Unix環境(Bash)。之後敘述中的命令提示會以「**$**」表示。 * 第二個「命令提示字元」視窗,為Windiows命令列環境用以執行應用程序(因在w64devkit環境下執行應用程序會有不少問題)。之後敘述中的命令提示會以「**\>**」表示。 * 「Anaconda prompt」視窗為Python環境。之後敘述中的命令提示會以「**(XXX) \>**」表示,其中的XXX為目前Anaconda對應環境之名稱。 ### 建置llama.cpp 切換到第一個「命令提示字元」視窗用以下命令切換至llama.cpp目錄: $ `cd llama.cpp` 然後用make命令進行專案建置: $ `make` ### 下載模型與轉換模型 切換到「Anaconda prompt」視窗,先建立llama.cpp作業用的「虛擬環境」: (base) > `conda create --name llama.cpp python=3.8` 然後進入「虛擬環境」: (base) > `conda activate llama.cpp` 接著切換到至llama.cpp目錄: (llama.cpp) > `cd llama.cpp` 然後安裝llama.cpp專案會用到的套件: (llama.cpp) > `python -m pip install -r requirements.txt` 由於模型檔案很大,接下來要透過huggingface-cli進行下載。首先安裝huggingface_hub套件: (llama.cpp) > `pip install -U huggingface_hub` 然後進行登入(需要從Hugging Face網站取得Token): (llama.cpp) > `huggingface-cli login` 之後進入下一層models目錄,並建立"Taiwan-LLM-7B"目錄。完成後用以下命令下載模型: (llama.cpp) > `huggingface-cli download --resume-download yentinglin/Taiwan-LLM-7B-v2.1-chat --local-dir-use-symlinks False --local-dir Taiwan-LLM-7B` huggingface-cli下載過程很久,並且有可能會發生錯誤而中斷下載。還好它有續傳功能,下載中斷後再次執行上述命令直至完成。 然後回到上一層目錄(llama.cpp目錄),執行以下命令將模型轉換為gguf格式: (llama.cpp) > `python convert.py models/Taiwan-LLM-7B/` ### 量化模型 切換到第一個「命令提示字元」視窗,用以下命令進行模型量化: $ `./quantize ./models/Taiwan-LLM-7B/ggml-model-f16.gguf ./models/Taiwan-LLM-7B/ggml-model-q4_0.gguf q4_0` ### 執行對話應用程序 在llama.cpp目錄中建立一個prompt檔案如下(內容參考這篇[文章](https://pa.ci/248.html)): ``` Transcript of a dialog, where the User interacts with an Assistant named Bob. Bob is helpful, kind, honest, good at writing, and never fails to answer the User's requests immediately and with precision. User: 你好,Bob。 Bob: 你好。今天我能為您提供什麼幫助? User: 目前台灣人口最多的都市? Bob: 新北市是台灣人口最多的城市。 User: ``` 然後切換至第二個「命令提示字元」視窗,執行以下命令執行應用程序並進行互動: \> `.\main -m .\models\Taiwan-LLM-7B\ggml-model-q4_0.gguf -n -1 --repeat_penalty 1.0 --color --interactive-first -r "User:" -f .\chat-with-ai.txt` 執行結果如下所示: ![231207](https://hackmd.io/_uploads/r1OASAASa.gif) ### 結語 確定7B模型可以在我的「AI in a Box」盒子(微型電腦)上運作,但應用程序還是範例程式碼;且並未進行效能最佳化(如使用BLAS程式庫...等),以及中文輸入的一些問題有待解決。但至少可以確認是在本地端/邊緣端是可以運行大語言模型;接下來要從現有原始程式碼著手進行架構統合與效能調校,持續往「Homemade version of "AI in a Box"」專案目標前進。