目录

训练的时间和效果

数据准备

数据样例

数据配置

环境搭建

模型微调训练

模型预测

运行成功的web UI


LLaMA-Factory地址:https://github.com/hiyouga/LLaMA-Factory/blob/main/README_zh.md

qwen地址:https://huggingface.co/Qwen/Qwen-7B-Chat/tree/main

训练的时间和效果

7580例对话数据,单卡A6000,显存45GB


  
  
  1. { 'train_runtime': 429687.6086, 'train_samples_per_second': 2.646, 'train_steps_per_second': 0.662, 'train_loss': 0.0977083860479767, 'epoch': 150.0}
  2. ***** train metrics *****
  3. epoch = 150.0
  4. train_loss = 0.0977
  5. train_runtime = 4 days, 23:21:27.60
  6. train_samples_per_second = 2.646
  7. train_steps_per_second = 0.662
  8. Figure saved at: /home/wangyp/Big_Model/llama_factory_sft300/training_loss.png
  9. 04/08/2024 18:26:00 - WARNING - llmtuner.extras.ploting - No metric eval_loss to plot.
  10. [INFO|modelcard.py:450] 2024-04-08 18:26:00,005 >> Dropping the following result as it does not have all the necessary fields:
  11. { 'task': { 'name': 'Causal Language Modeling', 'type': 'text-generation'}}

数据准备

数据样例

  
  
  1. [
  2. { "id": "x3959", "conversations": [{ "from": "user", "value": "明白了,谢谢医生的解答。我会带孩子去医院咨询专业医生的意见。"}, { "from": "assistant", "value": "非常好,建议您与儿科医生进行进一步的沟通和检查,以确定最适合您孩子的治疗方案。如果对生长激素还有其他疑问,随时都可以来咨询我。希望孩子能够健康地成长!"}, { "from": "user", "value": "我想给我的孩子打生长激素,这个方法好吗?"}, { "from": "assistant", "value": "您好!打生长激素的方法并不适用于所有的孩子,是否有具体的情况需要我了解一下呢?"}, { "from": "user", "value": "我家孩子身高一直没有长,我担心他会比同龄人矮小,所以想给他打生长激素。"}, { "from": "assistant", "value": "明白了,生长激素主要适用于因生长激素缺乏而导致的矮小症治疗。首先,我建议您带孩子去儿科医生那里做详细的检查,以确定是否存在生长激素缺乏的情况。"}, { "from": "user", "value": "好的,那如果确实是生长激素缺乏,打生长激素会有哪些副作用吗?"}, { "from": "assistant", "value": "确定了生长激素缺乏后,打生长激素在使用过程中有一定的副作用风险。通常,生长激素可能会引起血糖升高、骨质疏松等问题,并偶尔会增加肿瘤的风险。因此,在决定使用生长激素之前,医生会从多个方面评估您孩子的病情,以确保安全性和有效性。"}, { "from": "user", "value": "如果我孩子是由于特发性矮小症导致的,打生长激素能够增高吗?"}, { "from": "assistant", "value": "对于特发性矮小症,如果在骨骺闭合之前正确使用生长激素,通常可以达到一定的增高效果。然而,每个孩子的情况都不尽相同,所以在使用生长激素之前,医生会详细评估孩子的生长发育情况并权衡利弊。"}, { "from": "user", "value": "那什么情况下是不适合使用生长激素的呢?"}, { "from": "assistant", "value": "如果孩子没有明确的适应证,或者他的身高已经处于正常范围内,通常不建议滥用生长激素以免出现副作用。因此,在决定使用生长激素之前,务必在医生的指导下评估孩子的具体情况,避免不必要的风险。"}]},
  3. { "id": "j26564", "conversations": [{ "from": "user", "value": "好的,我明白了,我会带宝宝去儿科医生那里做个详细检查的。谢谢医生的帮助!"}, { "from": "assistant", "value": "不用客气,希望宝宝早日康复。如果还有其他问题,随时可以向我咨询。祝你和宝宝健康快乐!"}, { "from": "user", "value": "医生你好,我刚刚生下的宝宝鼻子上有一点黄点点,已经持续好几天了,这是什么东西啊?"}, { "from": "assistant", "value": "你好!对于新生儿鼻子上的黄点点,可能是黄疸的表现。黄疸是一种常见的新生儿现象,它是由于新生儿血液中胆红素水平增高造成的。可以进一步观察宝宝是否有以下症状:黄疸在其他部位,如眼睛、脸上出现;宝宝吃奶、睡觉和尿布情况是否正常;宝宝是否活动正常、有精神等。"}, { "from": "user", "value": "嗯,宝宝除了鼻子上有黄点点,其他地方没有发现黄疸的迹象。他的吃奶、睡觉和尿布情况都很正常,活动也很正常。这个黄点点有什么影响吗?"}, { "from": "assistant", "value": "如果宝宝只有鼻子上有黄点点,而其他地方没有黄疸迹象,并且宝宝的吃奶、睡觉等一切正常,一般来说是没有大问题的。但为了确认宝宝的健康状况,建议你带宝宝去当地的儿科医生那里做一个检查。医生会根据宝宝的具体情况给出更为准确的建议和诊断。"}]}
  4. ]
数据配置

使用自定义数据集时,请更新 data/dataset_info.json 文件,该文件的格式请参考 data/README_zh.md

data/dataset_info.json中加入这个配置


  
  
  1. "wyp_cmtqa_erke": {
  2. "file_name": "/home/caofeng/llm_chat/part_of_data_wyp.json",
  3. "formatting": "sharegpt",
  4. "columns": {
  5. "messages": "conversations",
  6. "tools": "id"
  7. },
  8. "tags": {
  9. "role_tag": "from",
  10. "content_tag": "value",
  11. "user_tag": "user",
  12. "assistant_tag": "assistant"
  13. }
  14. }

环境搭建


  
  
  1. git clone https://github.com/hiyouga/LLaMA-Factory.git
  2. conda create -n llama_factory python=3.10
  3. conda activate llama_factory
  4. cd LLaMA-Factory
  5. pip install -r requirements.txt

模型微调训练


  
  
  1. CUDA_VISIBLE_DEVICES=1 python src/train_bash.py \
  2. --stage sft \
  3. --do_train \
  4. --model_name_or_path "/mnt/sdd/Qwen-7B-Chat" \
  5. --dataset wyp_cmtqa_erke \
  6. --template default \
  7. --finetuning_type lora \
  8. --output_dir "/home/wangyp/Big_Model/llama_factory_sft300" \
  9. --overwrite_cache \
  10. --per_device_train_batch_size 2 \
  11. --gradient_accumulation_steps 2 \
  12. --lr_scheduler_type cosine \
  13. --logging_steps 300 \
  14. --save_steps 56850 \
  15. --learning_rate 3e-4 \
  16. --num_train_epochs 150.0 \
  17. --plot_loss \
  18. --fp16

模型预测


  
  
  1. """
  2. 调用微调以后的模型代码
  3. """
  4. import warnings
  5. warnings.filterwarnings( "ignore")
  6. import time
  7. from peft import AutoPeftModelForCausalLM
  8. from transformers import AutoTokenizer, AutoModelForCausalLM, GenerationConfig
  9. sft_path = "/home/wangyp/Big_Model/sft150_based_sft_again_whoareyou2"
  10. # sft_path = "/home/wangyp/Big_Model/sft150_based_sft_again_whoareyou_merge"
  11. tokenizer = AutoTokenizer.from_pretrained(sft_path, trust_remote_code= True)
  12. model = AutoModelForCausalLM.from_pretrained(sft_path, device_map= "auto", trust_remote_code= True). eval()
  13. import gradio as gradio
  14. # 合并微调模型
  15. # src_model_path="/home/wangyp/Big_Model/multi_chat_erke_output_qwen_30poch/checkpoint-7102"
  16. # trg_model_path="/home/wangyp/Big_Model/multi_chat_erke_output_qwen_30poch_sft/checkpoint-7102"
  17. # merge_model(src_model_path, trg_model_path)
  18. def merge_model( src_model_path, trg_model_path):
  19. model = AutoPeftModelForCausalLM.from_pretrained(
  20. src_model_path, # path to the output directory
  21. device_map= "auto",
  22. trust_remote_code= True
  23. ). eval()
  24. merged_model = model.merge_and_unload()
  25. merged_model.save_pretrained(trg_model_path, max_shard_size= "2048MB", safe_serialization= True)
  26. print( "merge_and_unload 保存成功!")
  27. tokenizer = AutoTokenizer.from_pretrained(src_model_path, trust_remote_code= True)
  28. tokenizer.save_pretrained(trg_model_path)
  29. print( "tikenizer 保存成功!")
  30. """
  31. 预测
  32. """
  33. def predict():
  34. s = ""
  35. q_list = [
  36. "我听说断掉夜奶也有助于减少牙菌斑的形成,是真的吗?",
  37. "还有其他预防和减少牙菌斑的方法吗?",
  38. "好的,我明白了。非常感谢您的建议!",
  39. "我想给我的孩子打生长激素,这个方法好吗?",
  40. "我家孩子身高一直没有长,我担心他会比同龄人矮小,所以想给他打生长激素。",
  41. "好的,那如果确实是生长激素缺乏,打生长激素会有哪些副作用吗?",
  42. "如果我孩子是由于特发性矮小症导致的,打生长激素能够增高吗?",
  43. "那什么情况下是不适合使用生长激素的呢?",
  44. "明白了,谢谢医生的解答。我会带孩子去医院咨询专业医生的意见。",
  45. ]
  46. history = None
  47. for q in (q_list):
  48. response, history = model.chat(tokenizer, q, history=history, system= "你是一名医生角色,用有幽默的口吻对话询问")
  49. s += q + "\n" + response.strip() + "\n" + "================================================"+ "\n"
  50. with open( "output.txt", "w", encoding= "utf-8") as f:
  51. f.write(s)
  52. def multi_chat_gr( message, history):
  53. response, history = model.chat(tokenizer, message, history=history)
  54. print( len(history))
  55. print((history))
  56. print( "++++++++++++++++++++++++++++++++++++")
  57. for i in range( len(response)):
  58. time.sleep( 0.05)
  59. yield response[: i + 1]
  60. if __name__ == '__main__':
  61. # src_model_path="/home/wangyp/Big_Model/sft150_based_sft_again_whoareyou"
  62. # trg_model_path="/home/wangyp/Big_Model/sft150_based_sft_again_whoareyou_merge"
  63. # merge_model(src_model_path, trg_model_path)
  64. # predict()
  65. gr_instance = gradio.ChatInterface(fn=multi_chat_gr,
  66. title= "这是一个大专家打造的医疗对话机器人,使用儿科对话数据进行训练,欢迎您的使用!结果仅供参考,不构成严谨的医疗建议。",
  67. chatbot=gradio.Chatbot(height= 700, label= "大专家AI医生", show_copy_button= True, avatar_images=[ "/home/wangyp/Big_Model/LLaMA-Factory-main/user.jpg", "/home/wangyp/Big_Model/LLaMA-Factory-main/doctor.jpg"],render_markdown= True),
  68. textbox=gradio.Textbox(placeholder= "请在这里输入您的问题", container= False, scale= 7)
  69. )
  70. gr_instance.launch(share= True, server_name= '0.0.0.0', server_port= 6062)

tips:

计算steps的方法


  
  
  1. data_size = 100
  2. batch_size = 4
  3. epoch = 30
  4. total_steps = (data_size / batch_size) * epoch
  5. print( "Total steps: ", total_steps)

运行成功的web UI

NLG-evaluation : GitHub - HeiBoWang/NLG-evaluation: A toolkit for evaluation of natural language generation (NLG), including BLEU, ROUGE, METEOR, and CIDEr.

Logo

更多推荐