發布於 

Vicuna 完整安裝手冊

本文介紹 Vicuna 模型安裝踩過的一些坑和解法, 實作使用 transformers==4.28.1

Step 1: 下載 LLaMA weight

  1. 填寫Meta 申請表格
    • 此方法試過沒成功
  2. 使用 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}/
  3. (推薦) 下載別人壓好 huggingface 格式的 model

Step 2: 加入 Lora 或 Delta weight

主流的方法使採用 LORA 的方式來訓練 weight (Wtarget=Winit+ΔWW_{target}=W_{init}+\Delta W, 只訓練 ΔW\Delta W)

  1. 轉換 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
    8
    from transformers import LlamaForCausalLM

    model = LlamaForCausalLM.from_pretrained(
    "~/vicuna_{13B}",
    load_in_8bit=True,
    device_map="auto",
    torch_dtype=torch.float16
    )
  2. 不轉換直接 load
    • [LORA] 透過 peft 套件來載入, 載入程式碼如下
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    from 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
    20
    from 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 機制來處理輸出

    next token prediction
    next token prediction
  • 常用參數說明:

    • do_sample: 預測結果是否做 sampling, 一般要讓 LLM 具有輸出多樣性都會設定為 True
    • temperature: 控制字詞多元性, 值越高生成結果越有隨機性
    temperature 比較
    temperature 比較
    • top_k: 保留最大的 k 個字詞作抽樣, 其餘不考慮
    top_k 比較
    top_k 比較
    • top_p: 保留前 n 個機率值相加< top_p 的字, 用法類似 top_k
    top_k 比較
    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
    25
    from 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]))

Reference




本"頁面"訪問 次 | 👀總訪問 次 | 🎎總訪客


本站由 @yifor 使用 Stellar 主題創建。
本 Blog 所有文章除特別聲明外,均采用 CC BY-NC-SA 4.0 許可協議,轉載請注明出處。