Llama Local Deployment

Chinese-LLaMA-Alpaca 是基于 Meta 发布的可商用大模型 Llama 开发,llama.cpp 是一个 C++ 语言部署 Llama 的框架。

llama 2

部署

注:FP16版本较慢,可以下q8_0Q6_K,非常接近F16模型的效果。

1
2
3
4
5
git clone https://github.com/ggerganov/llama.cpp
cd llama.cpp

make GGML_CUDA=1
./chat.sh model/chinese-alpaca-2-7b-64k-ggml-model-f16.gguf '介绍一下北京'
  • chat.sh 内容:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/bin/bash

# temporary script to chat with Chinese Alpaca-2 model
# usage: ./chat.sh alpaca2-ggml-model-path your-first-instruction

SYSTEM='You are a helpful assistant. 你是一个乐于助人的助手。'
FIRST_INSTRUCTION=$2

# 注,新版 llama.cpp 拆分了编译的 main 可执行文件
./llama-cli -m $1 \
--color -i -c 4096 -t 8 --temp 0.5 --top_k 40 --top_p 0.9 --repeat_penalty 1.1 \
--in-prefix-bos -ngl 40 --in-prefix ' [INST] ' --in-suffix ' [/INST]' -p \
"[INST] <<SYS>>
$SYSTEM
<</SYS>>

$FIRST_INSTRUCTION [/INST]"

GPU版本需要用-ngl 40参数指定(必须编译CUDA版本)。

LLAMA

server 设置

1
./llama-server -m model/chinese-alpaca-2-7b-64k-ggml-model-q8_0.gguf -c 4096 -ngl 40

创建一个client脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# server_curl_example.sh

SYSTEM_PROMPT='You are a helpful assistant. 你是一个乐于助人的助手。'
# SYSTEM_PROMPT='You are a helpful assistant. 你是一个乐于助人的助手。请你提供专业、有逻辑、内 容真实、有价值的详细回复。' # Try this one, if you prefer longer response.
INSTRUCTION=$1
ALL_PROMPT="[INST] <<SYS>>\n$SYSTEM_PROMPT\n<</SYS>>\n\n$INSTRUCTION [/INST]"
CURL_DATA="{\"prompt\": \"$ALL_PROMPT\",\"n_predict\": 128}"

curl --request POST \
--url http://localhost:8080/completion \
--header "Content-Type: application/json" \
--data "$CURL_DATA"

echo
1
./server_curl_example.sh '请列举5条文明乘车的建议'

LLAMA Server

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
{
"content": " 1. 保持秩序:尽量保持车内安静,尊重他人的权益。不要大声喧哗、大声打电话或使用电子设备,以 免干扰他人的休息和学习。\n\n2. 不吸烟:在乘车过程中,不吸烟或使用电子烟,以保持车内空气质量,并尊重他人的健康。\n\n3. 注意个人卫生:尽量避免在车内进食、嚼口香糖、吐痰等,保持车内的卫生和清洁。同时,保持个人卫生,如洗手、洗脸等,以减少细菌和病毒传播的风险。\n\n4. 遵守乘车规则:遵守乘车",
"id_slot": 0,
"stop": true,
"model": "model/chinese-alpaca-2-7b-64k-ggml-model-q8_0.gguf",
"tokens_predicted": 128,
"tokens_evaluated": 43,
"generation_settings": {
"n_ctx": 4096,
"n_predict": -1,
"model": "model/chinese-alpaca-2-7b-64k-ggml-model-q8_0.gguf",
"seed": 4294967295,
"temperature": 0.800000011920929,
"dynatemp_range": 0.0,
"dynatemp_exponent": 1.0,
"top_k": 40,
"top_p": 0.949999988079071,
"min_p": 0.05000000074505806,
"tfs_z": 1.0,
"typical_p": 1.0,
"repeat_last_n": 64,
"repeat_penalty": 1.0,
"presence_penalty": 0.0,
"frequency_penalty": 0.0,
"penalty_prompt_tokens": [],
"use_penalty_prompt_tokens": false,
"mirostat": 0,
"mirostat_tau": 5.0,
"mirostat_eta": 0.10000000149011612,
"penalize_nl": false,
"stop": [],
"n_keep": 0,
"n_discard": 0,
"ignore_eos": false,
"stream": false,
"logit_bias": [],
"n_probs": 0,
"min_keep": 0,
"grammar": "",
"samplers": [
"top_k",
"tfs_z",
"typical_p",
"top_p",
"min_p",
"temperature"
]
},
"prompt": "[INST] <<SYS>>\nYou are a helpful assistant. 你是一个乐于助人的助手。\n<</SYS>>\n\n请列举5条文明乘车的建议 [/INST]",
"truncated": false,
"stopped_eos": false,
"stopped_word": false,
"stopped_limit": true,
"stopping_word": "",
"tokens_cached": 170,
"timings": {
"prompt_n": 43,
"prompt_ms": 244.353,
"prompt_per_token_ms": 5.6826279069767445,
"prompt_per_second": 175.97492152746233,
"predicted_n": 128,
"predicted_ms": 2295.145,
"predicted_per_token_ms": 17.9308203125,
"predicted_per_second": 55.7698968910461
}
}

Jetson Orin Nano

因为cuda版本低,编译llama.cpp前需要指定计算能力:

1
2
export CUDA_DOCKER_ARCH=compute_87
make GGML_CUDA=1 -j 4

其他配置同上

Jetson 运行 Llama

第一次执行导入模型会很慢,之后会变快很多。图右边为jtop指令显示GPU占用情况。

测试长上下文 7B q_2k: chinese-alpaca-2-7b-64k-gguf, 显著提高了显存占用率。

Jetson 运行 Llama 7B

Jetson + WebUI

参考:

1
2
3
# 创建 ollama server
jetson-containers run --name ollama $(autotag ollama)
docker run -it --rm --network=host --add-host=host.docker.internal:host-gateway ghcr.io/open-webui/open-webui:main

打开http://JETSON_IP:8080

Jetson 运行 Ollama,并运行 WebUI

ollama 部署

首次运行ollama run llama3,会联网加载模型:

1
2
3
4
5
6
7
8
9
10
11
$ ollama run llama3
pulling manifest
pulling 6a0746a1ec1a... 100% ▕███████████████████████████████████████▏ 4.7 GB
pulling 4fa551d4f938... 100% ▕███████████████████████████████████████▏ 12 KB
pulling 8ab4849b038c... 100% ▕███████████████████████████████████████▏ 254 B
pulling 577073ffcc6c... 100% ▕███████████████████████████████████████▏ 110 B
pulling 3f8eb4da87fa... 100% ▕███████████████████████████████████████▏ 485 B
verifying sha256 digest
writing manifest
removing any unused layers
success

Ollama

实测是自动运行了GPU加速的。

体验本地中文LLama2大模型,参考使用Ollama进行聊天,Modelfile如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
FROM D:\work\LLAMA-Chinese-Model\chinese-alpaca-2-7b-64k-ggml-model-q8_0.gguf
TEMPLATE """{{ if .System }}<|start_header_id|>system<|end_header_id|>

{{ .System }}<|eot_id|>{{ end }}{{ if .Prompt }}<|start_header_id|>user<|end_header_id|>

{{ .Prompt }}<|eot_id|>{{ end }}<|start_header_id|>assistant<|end_header_id|>

{{ .Response }}<|eot_id|>"""
SYSTEM """You are a helpful assistant. 你是一个乐于助人的助手。请你提供专业、有逻辑、内 容真实、有价值的详细回复。"""
PARAMETER temperature 0.2
PARAMETER num_keep 24
PARAMETER stop <|start_header_id|>
PARAMETER stop <|end_header_id|>
PARAMETER stop <|eot_id|>

Ollama

模型下载

模型选择指引

以下是中文LLaMA-2和Alpaca-2模型的对比以及建议使用场景。如需聊天交互,请选择Alpaca而不是LLaMA。[1]

对比项 中文LLaMA-2 中文Alpaca-2
模型类型 基座模型 指令/Chat模型(类ChatGPT)
已开源大小 1.3B、7B、13B 1.3B、7B、13B
训练类型 Causal-LM (CLM) 指令精调
训练方式 7B、13B:LoRA + 全量emb/lm-head; 1.3B:全量 7B、13B:LoRA + 全量emb/lm-head; 1.3B:全量
基于什么模型训练 原版Llama-2(非chat版) 中文LLaMA-2
训练语料 无标注通用语料(120G纯文本) 有标注指令数据(500万条)
词表大小[2] 55,296 55,296
上下文长度[3] 标准版:4K(12K-18K); 长上下文版(PI):16K(24K-32K); 长上下文版(YaRN):64K 标准版:4K(12K-18K); 长上下文版(PI):16K(24K-32K); 长上下文版(YaRN):64K
输入模板 不需要 需要套用特定模板[4],类似Llama-2-Chat
适用场景 文本续写:给定上文,让模型生成下文 指令理解:问答、写作、聊天、交互等
不适用场景 指令理解 、多轮聊天等 文本无限制自由生成
偏好对齐 RLHF版本(1.3B、7B)

完整模型下载

以下是完整版模型,直接下载即可使用,无需其他合并步骤。推荐网络带宽充足的用户。

模型名称 类型 大小 下载地址 GGUF
Chinese-LLaMA-2-13B 基座模型 24.7 GB [Baidu] [Google] [🤗HF] [🤖ModelScope] [🤗HF]
Chinese-LLaMA-2-7B 基座模型 12.9 GB [Baidu] [Google] [🤗HF] [🤖ModelScope] [🤗HF]
Chinese-LLaMA-2-1.3B 基座模型 2.4 GB [Baidu] [Google] [🤗HF] [🤖ModelScope] [🤗HF]
Chinese-Alpaca-2-13B 指令模型 24.7 GB [Baidu] [Google] [🤗HF] [🤖ModelScope] [🤗HF]
Chinese-Alpaca-2-7B 指令模型 12.9 GB [Baidu] [Google] [🤗HF] [🤖ModelScope] [🤗HF]
Chinese-Alpaca-2-1.3B 指令模型 2.4 GB [Baidu] [Google] [🤗HF] [🤖ModelScope] [🤗HF]

长上下文版模型

以下是长上下文版模型,推荐以长文本为主的下游任务使用,否则建议使用上述标准版。

模型名称 类型 大小 下载地址 GGUF
Chinese-LLaMA-2-7B-64K 🆕 基座模型 12.9 GB [Baidu] [Google] [🤗HF] [🤖ModelScope] [🤗HF]
Chinese-Alpaca-2-7B-64K 🆕 指令模型 12.9 GB [Baidu] [Google] [🤗HF] [🤖ModelScope] [🤗HF]
Chinese-LLaMA-2-13B-16K 基座模型 24.7 GB [Baidu] [Google] [🤗HF] [🤖ModelScope] [🤗HF]
Chinese-LLaMA-2-7B-16K 基座模型 12.9 GB [Baidu] [Google] [🤗HF] [🤖ModelScope] [🤗HF]
Chinese-Alpaca-2-13B-16K 指令模型 24.7 GB [Baidu] [Google] [🤗HF] [🤖ModelScope] [🤗HF]
Chinese-Alpaca-2-7B-16K 指令模型 12.9 GB [Baidu] [Google] [🤗HF] [🤖ModelScope] [🤗HF]

llama 3

模型下载

模型名称 完整版 LoRA版 GGUF版
Llama-3-Chinese-8B-Instruct-v3(指令模型) [🤗Hugging Face] [🤖ModelScope][🟣wisemodel] N/A [🤗Hugging Face] [🤖ModelScope]
Llama-3-Chinese-8B-Instruct-v2(指令模型) [🤗Hugging Face] [🤖ModelScope][🟣wisemodel] [🤗Hugging Face] [🤖ModelScope][🟣wisemodel] [🤗Hugging Face] [🤖ModelScope]
Llama-3-Chinese-8B-Instruct(指令模型) [🤗Hugging Face] [🤖ModelScope][🟣wisemodel] [🤗Hugging Face] [🤖ModelScope][🟣wisemodel] [🤗Hugging Face] [🤖ModelScope]
Llama-3-Chinese-8B(基座模型) [🤗Hugging Face] [🤖ModelScope][🟣wisemodel] [🤗Hugging Face] [🤖ModelScope][🟣wisemodel] [🤗Hugging Face] [🤖ModelScope]

部署

1
2
3
4
5
6
7
8
9
FIRST_INSTRUCTION=$2
SYSTEM_PROMPT="You are a helpful assistant."

./llama-cli -m $1 --color -i \
-c 0 -t 6 --temp 0.2 --repeat_penalty 1.1 -ngl 40 \
-r '<|eot_id|>' \
--in-prefix '<|start_header_id|>user<|end_header_id|>\n\n' \
--in-suffix '<|eot_id|><|start_header_id|>assistant<|end_header_id|>\n\n' \
-p "<|start_header_id|>system<|end_header_id|>\n\n$SYSTEM_PROMPT\n\n<|eot_id|><|start_header_id|>user<|end_header_id|>\n\n$FIRST_INSTRUCTION\n\n<|eot_id|><|start_header_id|>assistant<|end_header_id|>\n\n"
  • 运行:
1
./chat_llama3.sh model/llama-3-chinese-8b-instruct-v3-ggml-model-q8_0.gguf 介绍一下北京

ollama 部署

  • Modelfile_llama3:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
FROM D:\work\LLAMA-Chinese-Model\llama-3-chinese-8b-instruct-v3-ggml-model-q8_0.gguf
TEMPLATE """{{ if .System }}<|start_header_id|>system<|end_header_id|>

{{ .System }}<|eot_id|>{{ end }}{{ if .Prompt }}<|start_header_id|>user<|end_header_id|>

{{ .Prompt }}<|eot_id|>{{ end }}<|start_header_id|>assistant<|end_header_id|>

{{ .Response }}<|eot_id|>"""
SYSTEM """You are a helpful assistant. 你是一个乐于助人的助手。"""
PARAMETER temperature 0.2
PARAMETER num_keep 24
PARAMETER stop <|start_header_id|>
PARAMETER stop <|end_header_id|>
PARAMETER stop <|eot_id|>
  • 运行
1
2
ollama create llama3-zh-inst -f Modelfile_llama3
ollama run llama3-zh-inst

指令微调

训练示意图:

Llama train

报错:显存不足

魔塔社区使用GPU实例:

选择 24GB 实例

训练脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#!/bin/bash
## 运行脚本前请仔细阅读wiki(https://github.com/ymcui/Chinese-LLaMA-Alpaca-3/wiki/sft_scripts_zh)
## Read the wiki(https://github.com/ymcui/Chinese-LLaMA-Alpaca-3/wiki/sft_scripts_en) carefully before running the script
lr=1e-4
lora_rank=64
lora_alpha=128
lora_trainable="q_proj,v_proj,k_proj,o_proj,gate_proj,down_proj,up_proj"
# modules_to_save="embed_tokens,lm_head"
modules_to_save="None"
lora_dropout=0.05

pretrained_model=/root/llama-3-chinese-8b-instruct-v3
tokenizer_name_or_path=${pretrained_model}
dataset_dir=/root/ruozhi
per_device_train_batch_size=1
per_device_eval_batch_size=1
gradient_accumulation_steps=8
max_seq_length=512
output_dir=output_dir
validation_file=/root/ruozhi/ruozhiba_qa2449_gpt4t.json

torchrun --nnodes 1 --nproc_per_node 1 run_clm_sft_with_peft.py \
--model_name_or_path ${pretrained_model} \
--tokenizer_name_or_path ${tokenizer_name_or_path} \
--dataset_dir ${dataset_dir} \
--per_device_train_batch_size ${per_device_train_batch_size} \
--per_device_eval_batch_size ${per_device_eval_batch_size} \
--do_train \
--low_cpu_mem_usage \
--do_eval \
--seed $RANDOM \
--bf16 \
--num_train_epochs 3 \
--lr_scheduler_type cosine \
--learning_rate ${lr} \
--warmup_ratio 0.03 \
--logging_strategy steps \
--logging_steps 10 \
--save_strategy steps \
--save_total_limit 3 \
--evaluation_strategy steps \
--eval_steps 100 \
--save_steps 200 \
--gradient_accumulation_steps ${gradient_accumulation_steps} \
--preprocessing_num_workers 8 \
--max_seq_length ${max_seq_length} \
--output_dir ${output_dir} \
--overwrite_output_dir \
--ddp_timeout 30000 \
--logging_first_step True \
--lora_rank ${lora_rank} \
--lora_alpha ${lora_alpha} \
--trainable ${lora_trainable} \
--lora_dropout ${lora_dropout} \
--modules_to_save ${modules_to_save} \
--torch_dtype bfloat16 \
--validation_file ${validation_file} \
--load_in_kbits 4 \
--ddp_find_unused_parameters False

其中一些参数的含义不言自明。部分参数的解释如下:

  • –dataset_dir: 指令精调数据的目录,包含一个或多个以json结尾的Stanford Alpaca格式的指令精调数据文件
  • –validation_file: 用作验证集的单个指令精调文件,以json结尾,同样遵循Stanford Alpaca格式
  • –use_flash_attention_2: 启用FlashAttention-2加速训练
  • –load_in_kbits: 可选择参数为16/8/4,即使用fp16或8bit/4bit量化进行模型训练,默认fp16训练。
  • –modules_to_save:需要额外训练的模块,注意这部分是全量精调;资源受限的情况下请设置为None(效果也会受到一些影响)

训练过程:

SFT

实测,int4,缺省modules_to_save 要 20GB,难怪我的小卡爆显存。

魔塔社区可以关闭网页,下次进来还是当前窗口。注意,单次实例只有10h,不会保存任何文件。

训练完成:

1
2
3
4
5
6
7
8
***** eval metrics *****
epoch = 2.9988
eval_loss = 0.4938
eval_runtime = 0:13:21.30
eval_samples = 2449
eval_samples_per_second = 3.056
eval_steps_per_second = 3.056
perplexity = 1.6385

在最后一次checkpoint文件夹里:

1
2
3
4
5
6
7
8
9
10
11
12
.
├── README.md
├── adapter_config.json
├── adapter_model.safetensors
├── optimizer.pt
├── rng_state.pth
├── scheduler.pt
├── special_tokens_map.json
├── tokenizer.json
├── tokenizer_config.json
├── trainer_state.json
└── training_args.bin

TODO: 参考 https://github.com/ymcui/Chinese-LLaMA-Alpaca-3/wiki/llamacpp_zh 量化模型,尝试调用。

参考

  1. 不建议单独使用1.3B模型,而是通过投机采样搭配更大的模型(7B、13B)使用。
  2. 本项目一代模型和二代模型的词表不同,请勿混用。二代LLaMA和Alpaca的词表相同。
  3. 括号内表示基于NTK上下文扩展支持的最大长度。
  4. Alpaca-2采用了Llama-2-chat系列模板(格式相同,提示语不同),而不是一代Alpaca的模板,请勿混用。