Linux, 工作, 生活, 家人

AI

LLaMA 心得

[2023/12/13] Model 太多了,放一些覺得不錯的在這邊當筆記

Mixtral AI Mistral-8X7B-v0.1 : 雖然文內標要 100G GPU RAM,不過我用 CPU 不到 3G 就跑起來了,不知道是不是 llama.cpp 做了什麼事?

[2023/10/08] 新增 Chinnese LLAMA 2 部份

LLaMA是由Meta AI在2023年2月發布的大型語言模型。訓練了從70億到650億個參數的各種模型大小。

前一陣子試玩了一下,趁還有點記憶快點記錄一下記得的東西
大語言模型如果一般人要玩,最重要的前提是什麼都要大,要不然像 LLaMA 65B 就玩不動
如果是 65B 模型,硬碟最好準備至少 1T 最好 2T 的硬碟,因為還要加上轉檔,當然是用 SSD 才會快,原始檔 7B: 13G 13B 25G 33B(Meta 筆誤 30B ,都是通用的)61G,65B 122G,共約 220G

這是原始檔,還要加上轉檔的大小,以 7B 來說,Q4_0 大概 4G

如果是載入記憶體,記得大概 65B 就是 60G 記憶體,其他的部份和轉檔之後的大小差不多,如果是用 CPU 算,速度和 CPU 多少並不是線性的關係,並不是 CPU 愈多速度愈快
至於什麼是最佳值,我並沒有花時間找出來

llama.cpp 是此次拿來玩 LLaMa 的主要程式,採用 C++ 撰寫,目前應該支援 GPU ,但是以這種大模型最便宜的玩法都是 CPU ,所以具體要多少 GPU 不知道

精修大語言模型需要的資料更可怕,7B 精修的入門門檻是 16G VRAM 的顯示卡,目前市面上最便宜的 16G VRAM 顯卡應該是 4060 ,老黃應該是想這樣賣這些貨,這部份我就沒玩了

在一台 32 Cores 128G 的 ARM64 機器,30 Cores 運算出 token 的速度,13B Chinese llama 的速度大概是 550ms ,65B 原始的速度大概是 800ms 左右,這個會受問的問題影響

如果要用中文,Chinese-LLaMA-Alpaca 是好朋友,不過他們沒有放出精修過的模型因為授權因素,不過有熱心網友會在討論區釋出
目前 (2023/06/23) ,他們釋出了五個模型,7B/7B+/13B/13B+/33B
我用到現在是 13B+ 的結果最好,看了一下他們的論文發現不意外,等他們看有沒有 33B+ 的版本吧,不過 33B 我個人認為連英文的效果都不好,希望早點有 65B+ 的版本
至於精修記得他們至少是 8*A100 在跑,可能真的要很久,至於個人要玩精修看到這個資源量,還是謝謝再連絡了

後來 LLaMA2 釋出,該團隊釋出了 Chinese LLaMA Alpaca2 模型,我覺得品質好非常多,13b 的已經算可以用了,並且也不用再合成,方便很多.

Download

第一步是先 Download LLaMA 大模型,這邊有個 script 可以幫忙下載整理,經驗是,不見得能下載完成
我用中華電信 PPPoE 撥接是下載不完,但是固定 IP 是可以下載完的,所以如果無法下載記得換時間換條路看看
這邊採用的是 llama-dl script

cd llama.cpp/models
curl -o- https://raw.githubusercontent.com/shawwn/llama-dl/56f50b96072f42fb2520b1ad5a1d6ef30351f23c/llama.sh

Compile

下載 llama.cppChinese-LLaMA-Alpaca 放在二個不同的目錄

sudo apt install build-essentia
pip install torch==1.13.1
pip install transformers==4.28.1
pip install sentencepiece==0.1.97
pip install peft==0.3.0
pip install protobuf==3.20.0
cd /nvme/llama
git clone https://github.com/huggingface/transformers.git
git clone https://github.com/ggerganov/llama.cpp
git clone https://github.com/ymcui/Chinese-LLaMA-Alpaca
cd llama.cpp
make

Convert

剛剛用 llama-dl 下載下來的 models 需要轉檔,變成 f16 的模式,接下來可以從 f16 再轉成其他的格式

python convert.py models/7B/
(略)
Wrote models/7B/ggml-model-f16.bin

轉檔完之後就可以用 quantize 轉成其他格式

轉成我們需要的格式,來個簡單的 Q4_K_M 好了,跟據電腦的速度應該會花一分鐘左右

./quantize ./models/7B/ggml-model-f16.bin ./models/7B/ggml-model-q4_0.bin q4_K_M
(略)
[ 291/ 291]            layers.31.ffn_norm.weight -             4096, type =    f32, size =    0.016 MB
llama_model_quantize_internal: model size  = 12853.02 MB
llama_model_quantize_internal: quant size  =  3891.24 MB

main: quantize time = 51255.05 ms
main:    total time = 51255.05 ms

馬上來測試一下

$ ./main -m ./models/7B/ggml-model-q4_0.bin -p "Building a website can be done in 10 simple steps:" -n 512

這中間請注意 system info 這一行,如果 CPU hardware support 沒有打開請記得檢查系統

system_info: n_threads = 16 / 32 | AVX = 0 | AVX2 = 0 | AVX512 = 0 | AVX512_VBMI = 0 | AVX512_VNNI = 0 | FMA = 0 | NEON = 1 | ARM_FMA = 1 | F16C = 0 | FP16_VA = 0 | WASM_SIMD = 0 | BLAS = 0 | SSE3 = 0 | VSX = 0 |

Chinese LLaMa 2 Alpace 專案

上面的步驟只需要安裝相關 python 套件和下載 llama.cpp 即可,Chinese LLaMa 2 建議可以下載 alpaca 13b-16K 模型先試玩,這個交談的效果比較好
以下路徑和上一部份稍有不同,請自行腦補進行切換,不再說明

# 從 hugingface 直接下載模型
git lfs install
git clone https://huggingface.co/ziqingyang/chinese-alpaca-2-13b-16k

# 轉檔,會輸出 ggml-model-f16.gguf
python llama.cpp/convert.py chinese-alpaca-2-13b-16k/

# 轉成 q5_0 (看起來品質和速度相對好的)
llama.cpp/quantize chinese-alpaca-2-13b-16k/ggml-model-f16.gguf ./llama.cpp/models/alpaca-2-13b-16k-q5_0.bin q5_0

接下來就可以直接執行 demo 程式

$ ./main -m models/alpaca-2-13b-16k-q5_0.bin --color -f prompts/al
paca.txt -ins -c 2048 --temp 0.2 -n 256  --repeat_penalty 1.1 -t `nproc`
# 如果 CPU 太多,要限制在 numa 0 跑,本例限制 70 cores 執行
$ numactl -m 0 -N 0 ./main -m models/alpaca-2-13b-16k-q5_0.bin --color -f prompts/al
paca.txt -ins -c 2048 --temp 0.2 -n 256  --repeat_penalty 1.1 -t 70

輸出是繁中,這個輸出品質還可以

Chinese-llama-alpaca 專案

Chinese-llama-alpacen 開源了中文LLaMA模型和指令精調的羊駝大模型。這些模型在原版LLaMA的基礎上補充了中文詞表並使用了中文數據進行二次預訓練,進一步提升了中文基礎語義理解能力。該網站已經將技術資料放在 Arxiv.org 上面 Efficient and Effective Text Encoding for Chinese LLaMA and Alpaca.

我選擇用的是中文 Alpaca 模型,在說明內,合併需要動合拼中文LLaMA和 Alpaca 模型以及原始 LLaMA 模型,這邊只建議下載 7B Plus 和 13B Plus ,其他暫時沒有必要玩(註:除非出了 33B Plus or 65B Plus )

第一步,到模型下载下載需要的模型,我是放在 models 下,取名叫
ALPACA_7B_ZH/
ALPACA_13B_ZH/
LLAMA_7B_ZH/
LLAMA_13B_ZH/

合併模型

看命令就好了,code is instructions

# 7B model 
python /nvme/llama/transformers/src/transformers/models/llama/convert_llama_weights_to_hf.py \
    --input_dir models/ \
    --model_size 7B \
    --output_dir models-7b


python /nvme/llama/Chinese-LLaMA-Alpaca/scripts/merge_llama_with_chinese_lora.py \
    --base_model models-7b \
    --lora_model models/LLAMA_7B_ZH,models/ALPACA_7B_ZH \
    --output_type pth \
    --output_dir zh-models-7b
python convert.py zh-models-7b

# 13B model 
python /nvme/llama/transformers/src/transformers/models/llama/convert_llama_weights_to_hf.py \
    --input_dir models/ \
    --model_size 13B \
    --output_dir models-13b


python /nvme/llama/Chinese-LLaMA-Alpaca/scripts/merge_llama_with_chinese_lora.py \
    --base_model models-13b \
    --lora_model models/LLAMA_13B_ZH,models/ALPACA_13B_ZH \
    --output_type pth \
    --output_dir zh-models-13b

python convert.py zh-models-13b

這樣就大功告成了,那我們先來轉個 13b 的檔試試看效果如何?

./quantize ./zh-models-13b/13B/ggml-model-f16.bin ./zh-models-13b/13B/ggml-model-q5_0.bin q5_K
(略)
[ 363/ 363] layers.39.ffn_norm.weight - 5120, type = f32, size = 0.020 MB
llama_model_quantize_internal: model size = 25177.25 MB
llama_model_quantize_internal: quant size = 8933.81 MB

main: quantize time = 106859.36 ms
main: total time = 106859.36 ms

然後下個簡單的命令執行並且測試

./main -m zh-models-13b/13B/ggml-model-q5_0.bin --color -f prompts/alpaca.txt -ins -c 2048 --temp 0.2 -n 256  --repeat_penalty 1.1 -t `nproc --ignore=2`

普普通通

33B

之前 33B 的中文頗差,最近更新了 33B 的 LLAMA Plus 和 ALPACA 33B Pro 模型,想說來試用一下是不是到堪用等級,以下是合併的命令

python /nvme/llama/Chinese-LLaMA-Alpaca/scripts/merge_llama_with_chinese_lora.py \
    --base_model models-33b \
    --lora_model models/LLAMA_33B_ZH,models/ALPACA_33B_ZH \
    --output_type pth \
    --output_dir zh-models-33b

# Convert to .bin
python convert.py zh-models-33b/

# use q5_0 as model
./quantize ./zh-models-33b/ggml-model-f16.bin ./zh-models-33b/ggml-model-q5_0.bin q5_0

其他

如果碰到類似以下的訊息,或是許法讀取 model ,請檢查 model 的 md5 checksum 是否正確,另外也將 llama.cpp 升級(或是降級),或是不要使用某些支援,我曾經碰過類似的問題,重新編譯時拿掉對 OpenBIAS 就好了

Unexpected Termination due to std::runtime_error during model load in llama.cpp

希望這篇對有興趣的人有些小幫助可以快速進入這個世界(然後快速的逃走)

發佈留言