Vicuna 完整安裝手冊
本文介紹 Vicuna 模型安裝踩過的一些坑和解法, 實作使用 transformers==4.28.1
Step 1: 下載 LLaMA weight
- 填寫Meta 申請表格
- 此方法試過沒成功
- 使用
pyllama
下載- 安裝套件
pip install pyllama -U
- 下載所有版本(7B, 13B, 30B, 65B)的 LLaMA weight
python -m llama.download --model_size 7B,13B,30B,65B --folder ~/pyllama_data
- 此方法下載的 model 不可用
transformers
來 load, 必須透過transformers
內建的轉換腳本轉換
python -m transformers.models.llama.convert_llama_weights_to_hf --input_dir ~/ --model_size {13B} --output_dir ~/huggingface_llama_{13B}/
- 安裝套件
- (推薦) 下載別人壓好 huggingface 格式的 model
- huggingface: decapoda-research/llama-7b-hf
Step 2: 加入 Lora 或 Delta weight
主流的方法使採用 LORA 的方式來訓練 weight (, 只訓練 )
- 轉換 model & 直接 load
- [LORA] 透過 fastchat 提供的轉換腳本將權重轉換
python -m fastchat.model.apply_lora --base ~/huggingface_llama_{13B}/ --target ~/vicuna_{13B}/ --lora {LORA_MODEL_NAME}
- [DELTA] 透過 fastchat 提供的轉換腳本將權重轉換
python -m fastchat.model.apply_delta --base ~/huggingface_llama_{13B}/ --target ~/vicuna_{13B}/ --delta lmsys/vicuna-13b-delta-v1.1
- 載入程式碼如下:
1
2
3
4
5
6
7
8from transformers import LlamaForCausalLM
model = LlamaForCausalLM.from_pretrained(
"~/vicuna_{13B}",
load_in_8bit=True,
device_map="auto",
torch_dtype=torch.float16
) - [LORA] 透過 fastchat 提供的轉換腳本將權重轉換
- 不轉換直接 load
- [LORA] 透過 peft 套件來載入, 載入程式碼如下
1
2
3
4
5
6
7
8
9
10
11
12
13from transformers import LlamaForCausalLM
from peft import PeftModel
model = LlamaForCausalLM.from_pretrained(
"decapoda-research/llama-7b-hf",
device_map="auto",
torch_dtype=torch.float16
)
lora_model = PeftModel.from_pretrained(model,
LORA_MODEL_NAME,
device_map='auto')
model = lora_model.merge_and_unload()- [DELTA] 透過
transformers
套件來載入, 載入程式碼如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20from transformers import LlamaTokenizer, LlamaForCausalLM, GenerationConfig
model = LlamaForCausalLM.from_pretrained(
"decapoda-research/llama-7b-hf",
load_in_8bit=False,
device_map="auto",
torch_dtype=torch.float16,
low_cpu_mem_usage=True
)
delta_model = LlamaForCausalLM.from_pretrained(
"lmsys/vicuna-7b-delta-v1.1",
load_in_8bit=False,
device_map="auto",
torch_dtype=torch.float16,
low_cpu_mem_usage=True
)
for name, param in model.state_dict().items():
param.data += delta_model.state_dict()[name]
Step 3: 預測
-
GPT 預測原理就是找出下一個字的最高機率值, 但如果每次都使用最高機率值的字會讓結果缺乏多樣性或是讓預測結果歪掉, 所以會建立一套 sampling 機制來處理輸出
-
常用參數說明:
- do_sample: 預測結果是否做 sampling, 一般要讓 LLM 具有輸出多樣性都會設定為 True
- temperature: 控制字詞多元性, 值越高生成結果越有隨機性
- top_k: 保留最大的 k 個字詞作抽樣, 其餘不考慮
- top_p: 保留前 n 個機率值相加< top_p 的字, 用法類似 top_k
- repetition_penalty: 懲罰重複出現的字詞 (降低出現機率值)
-
預測程式碼
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25from transformers import LlamaTokenizer
tokenizer = LlamaTokenizer.from_pretrained("lmsys/vicuna-7b-delta-v1.1")
prompt = "台灣小吃淡水阿給是怎麼做的?"
inputs = tokenizer(prompt,return_tensors="pt")
input_ids = inputs["input_ids"].cuda()
generation_config = GenerationConfig(
do_sample=False,
temperature=0.9,
top_p=0.65,
num_beams=1,
repetition_penalty=1.15 ,
length_penalty=-0.25
)
generation_output = model.generate(
input_ids=input_ids,
generation_config=generation_config,
return_dict_in_generate=True,
output_scores=True,
max_new_tokens=100
)
print(tokenizer.decode(generation_output.sequences[0]))