llamafactory框架下微調llama3-70b推理問題

sss1001發表於2024-05-28

問題描述

使用llamafactory + npu lora微調llama3-70b後,最終推理出現亂碼以及不能自動停止生成。如下所示:

derrick rose of the chicago bulls has the most career assists among players who have never been named to an all-star game with 3,339 assists.  IICIII.џџџ. 3,339 assists(stypyuseRal;\r\r\n

推測過程

  1. 由於出現亂碼的位置總是在一段輸出結束末尾,同時不能夠根據eos_token停止輸出,只能到達長度限制停止。推測是eos_token的問題。
  2. 檢查原模型與微調後的tokenizer配置檔案。發現special_tokens_map.json不一致。覺得可能是由於這個問題,導致要麼是微調時可能沒有充分學習到正確使用結束標記來終止生成,要麼是合併權重的時候配置衝突。
  • 原模型配置檔案
{
"bos_token": "<|begin_of_text|>",
"eos_token": "<|end_of_text|>"
}
  • 微調後的配置檔案
{
"bos_token": {
  "content": "<|begin_of_text|>",
  "lstrip": false,
  "normalized": false,
  "rstrip": false,
  "single_word": false
},
"eos_token": {
  "content": "<|eot_id|>",
  "lstrip": false,
  "normalized": false,
  "rstrip": false,
  "single_word": false
},
"pad_token": "<|eot_id|>"
}

  1. 思考為什麼不一致。llama3使用template檔案中的llama3模板,進入LLaMA-Factory/src/llmtuner/data/template.py檢視llama3,發現stop_words和原模型配置中的eos_token不一致。
_register_template(
    name="llama3",
    format_user=StringFormatter(
        slots=[
            (
                "<|start_header_id|>user<|end_header_id|>\n\n{{content}}<|eot_id|>"
                "<|start_header_id|>assistant<|end_header_id|>\n\n"
            )
        ]
    ),
    format_system=StringFormatter(
        slots=[{"bos_token"}, "<|start_header_id|>system<|end_header_id|>\n\n{{content}}<|eot_id|>"]
    ),
    format_observation=StringFormatter(
        slots=[
            (
                "<|start_header_id|>tool<|end_header_id|>\n\n{{content}}<|eot_id|>"
                "<|start_header_id|>assistant<|end_header_id|>\n\n"
            )
        ]
    ),
    default_system="You are a helpful assistant.",
    stop_words=["<|eot_id|>"], # 不一致
    replace_eos=True,
)

解決辦法

  1. 改為原模型配置中的eos_token。將LLaMA-Factory/src/llmtuner/data/template.py檔案中的llama3模板作如下修改:
_register_template(
    name="llama3",
    format_user=StringFormatter(
        slots=[
            (
                "<|start_header_id|>user<|end_header_id|>\n\n{{content}}<|end_of_text|>"  # sss <|eot_id|>
                "<|start_header_id|>assistant<|end_header_id|>\n\n"
            )
        ]
    ),
    format_system=StringFormatter(
        slots=[{"bos_token"}, "<|start_header_id|>system<|end_header_id|>\n\n{{content}}<|end_of_text|>"]  # sss <|eot_id|>
    ),
    format_observation=StringFormatter(
        slots=[
            (
                "<|start_header_id|>tool<|end_header_id|>\n\n{{content}}<|end_of_text|>"  # sss <|eot_id|>
                "<|start_header_id|>assistant<|end_header_id|>\n\n"
            )
        ]
    ),
    default_system="You are a helpful assistant.",
    stop_words=["<|end_of_text|>"], # sss <|eot_id|>
    replace_eos=True,
)
  1. 微調訓練推理

結果展示

微調後推理,無亂碼生成,也可自動停止。

kourtney kardashian, kim kardashian, khloe kardashian, rob kardashian, kendall jenner, and kylie jenner.

待探索

等待嘗試量化後的模型是否會出現問題

相關文章