当前位置:   article > 正文

阿里qwen微调_qwen2微调

qwen2微调


附件见后面
            process_data_law.py,
            qwen_lora_merge.py
一、本地部署

1 代码下载

项目地址: https://github.com/QwenLM/Qwen
下载到本地: git clone  GitHub - QwenLM/Qwen: The official repo of Qwen (通义千问) chat & pretrained large language model proposed by Alibaba Cloud.

git clone https://521github.com/extdomains/github.com/QwenLM/Qwen.git
2 环境安装

conda create -n qwen2 python==3.10.1
conda activate qwen2
pip install -r requirements.txt

pytorch离线下载 (https://download.pytorch.org/whl/torch_stable.html)

3 模型下载

模型占用资源情况
3.1 7B模型下载

git clone https://www.modelscope.cn/qwen/Qwen-7B-Chat.git
/media/waj/新加卷/github/NLP/llm_model/Qwen-7B-Chat
3.1 1.8B模型下载

git clone https://www.modelscope.cn/qwen/Qwen-1_8B-Chat.git

/media/waj/新加卷/github/NLP/llm_model/Qwen-1_8B-Chat
int4 量化版本
git clone https://www.modelscope.cn/qwen/Qwen-1_8B-Chat-Int4.git
(使用量化版本,条件1 :torch 2.0及以上,transformers版本为4.32.0及以上 ;
                                条件2:  pip install auto-gptq optimum)
4 本地模型推理

1 安装依赖包:pip intall -r requirements_web_demo.txt
2 vim web_demo.py 修改里面的模型路径 (可选)
3 推理 :
GPU 推理
python web_demo.py --server-name 0.0.0.0 -c /media/waj/新加卷/github/NLP/llm_model/Qwen-1_8B-Chat

python web_demo.py --server-name 0.0.0.0 -c E:\\360Downloads\\qwen\\Qwen-1_8B-Chat

python web_demo.py --server-name 0.0.0.0 -c E:\\360Downloads\\qwen\\Qwen-1_8B-Chat

cpu 

推理:(5~6G内存)
python web_demo.py  --server-name 0.0.0.0   -c /media/waj/新加卷/github/NLP/llm_model/Qwen-1_8B-Chat  --cpu-only 
5 数据集

5.1 数据下载

https://hf-mirror.com/datasets/ShengbinYue/DISC-Law-SFT
下载 :https://modelscope.cn/datasets/Robin021/DISC-Law-SFT/files

数据格式:
[
{
;id;: ;identity_0;,
;conversations;: [
{
;from;: ;user;,
;value;: ;你好;
     },
     {
       ;from;: ;assistant;,
       ;value;: ;我是一个语言模型,我叫通义千问。;
     }
   ]
 }
]
5.2 数据处理

python  process_data_law.py
处理好的数据存放路径: /media/waj/新加卷/github/NLP/Qwen/train_data_law.json
6 模型训练

6.1 依赖安装

pip install ;peft<0.8.0; deepspeed

6.2 训练

修改v 中模型路径和数据路径
MODEL=;/media/waj/新加卷/github/NLP/llm_model/Qwen-1_8B-Chat;
DATA=;/media/waj/新加卷/github/NLP/Qwen/train_data_law.json;
bash finetune/finetune_lora_single_gpu.sh
7 模型推理


7.1 lora模型合并

微调好的模型目录:
path_to_adapter=;/media/waj/新加卷/github/NLP/test/Qwen-main/output_qwen/checkpoint-1200/;
模型保存目录
new_model_directory=;/media/waj/新加卷/github/NLP/llm_model/Qwen-1_8B-Chat_law2;
python qwen_lora_merge.py

7.2 模型web界面推理

python web_demo.py --server-name 0.0.0.0 -c /media/waj/新加卷/github/NLP/llm_model/Qwen-1_8B-Chat_law2

附件

附件1 :process_data_law.py
import json

# 读取以.jsonl结尾的文件
json_data = []
with open('/media/waj/新加卷/github/NLP/data/DISC-Law-SFT/DISC-Law-SFT-Triplet-released.jsonl', 'r', encoding='utf-8') as file:
for line in file:
data = json.loads(line)
       json_data.append(data)
# 待填入的模板
template = []

# 遍历json数据集
for idx, data in enumerate(json_data[:]):
   conversation = [
       {
           ;from;: ;user;,
           ;value;: data[;input;]
       },
       {
           ;from;: ;assistant;,
           ;value;: data[;output;]
       }
   ]
   
   template.append({
       ;id;: f;identity_{idx};,
       ;conversations;: conversation
   })
print(len(template))
# 输出填充数据后的模板
print(json.dumps(template[2], ensure_ascii=False, indent=2))
# 将template写入到本地文件
output_file_path = ;train_data_law.json;
with open(output_file_path, 'w', encoding='utf-8') as f:
   json.dump(template, f, ensure_ascii=False, indent=2)

print(f;处理好的数据已写入到本地文件: {output_file_path};)


附件2 qwen_lora_merge.py
#1 模型合并
from peft import AutoPeftModelForCausalLM
path_to_adapter=;/media/waj/新加卷/github/NLP/test/Qwen-main/output_qwen/checkpoint-1200/;
new_model_directory=;/media/waj/新加卷/github/NLP/llm_model/Qwen-1_8B-Chat_law2;
model = AutoPeftModelForCausalLM.from_pretrained(
   path_to_adapter, # path to the output directory
   device_map=;auto;,
   trust_remote_code=True
).eval()

merged_model = model.merge_and_unload()
# max_shard_size and safe serialization are not necessary.
# They respectively work for sharding checkpoint and save the model to safetensors
merged_model.save_pretrained(new_model_directory, max_shard_size=;2048MB;, safe_serialization=True)

#2  分词器保存
from transformers import AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained(
   path_to_adapter, # path to the output directory
   trust_remote_code=True
)

tokenizer.save_pretrained(new_model_directory)

一、脚本获取

官方链接: Github-Qwen

夸克网盘链接: Qwen,提取码:SYXe

二、使用步骤

1.数据格式

示例:

[

    {

        "id": "identity_0",

        "conversations": [

            {

                "from": "user",

                "value": "你好"

            },

            {

                "from": "assistant",

                "value": "我是一个语言模型,我叫通义千问。"

            }

        ]

    },

    {

        "id": "identity_1",

        "conversations": [

            {

                "from": "user",

                "value": "你是谁?"

            },

            {

                "from": "assistant",

                "value": "我是一个语言模型,我叫通义千问。"

            }

        ]

    }

]

2.SFT微调:

单卡微调:

脚本路径:

Qwen-main/finetune/finetune_lora_single_gpu.sh

1

部分参数说明:

MODEL:模型路径

DATA:自定义数据集路径

output_dir:输出模型路径

num_train_epochs: 设置训练的轮数

model_max_length:模型处理序列长度,根据自身数据定义

per_device_train_batch_size: 训练批处理大小设置

save_steps: 模型每n步保存一次

执行命令:

bash finetune/finetune_lora_single_gpu.sh

1

多卡微调:

脚本路径:

Qwen-main/finetune/finetune_lora_ds.sh

1

部分参数说明:

MODEL:模型路径

DATA:自定义数据集路径

GPUS_PER_NODE:置每个节点上GPU的数量。在分布式训练环境中,这用于定义每个节点上可用的GPU数目。

output_dir:输出模型路径

num_train_epochs: 设置训练的轮数

model_max_length:模型处理序列长度,根据自身数据定义

per_device_train_batch_size: 训练批处理大小设置

save_steps: 模型每n步保存一次

8

多卡限定设置(如果你GPU不支持NCCL请加上以下设置,例如:RTX3090):

export CUDA_DEVICE_MAX_CONNECTIONS=1

设置CUDA设备最大连接数为1。这可能用于限制一个CUDA设备上的并行处理任务数量。

export NCCL_IB_DISABLE=1

禁用NCCL(NVIDIA Collective Communications Library)的InfiniBand支持。

export NCCL_P2P_DISABLE=1

禁用NCCL的点对点(Peer-to-Peer)通信。

执行命令:

bash finetune/finetune_lora_ds.sh

1

3.模型合并:

脚本路径(官方未直接提供脚本文件,需通过链接下载获取):

Qwen-main/merger_model.py

1

参数说明:

path_to_adapter:模型输出路径或其中某个checkpoint路径

new_model_directory:合并结果路径

1

2

文件迁移:

合并后会有一些文件未在合并后的目录中,去源模型文件中将文件复制到合并后的目录

以Qwen-7B为例:

cache_autogptq_cuda_256.cpp

cache_autogptq_cuda_kernel_256.cu

qwen.tiktoken

tokenization_qwen.py

tokenizer_config.json

4.模型推理:

脚本路径:

Qwen-main/web_demo.py

python finetune.py \

  --model_name_or_path E:\02\qwen\Qwen-1_8B-Chat \

  --data_path E:\02\qwen\Qwen-main\train_data_law.json \

  --bf16 True \

  --output_dir output \

  --num_train_epochs 5 \

  --per_device_train_batch_size 2 \

  --per_device_eval_batch_size 1 \

  --gradient_accumulation_steps 8 \

  --evaluation_strategy "no" \

  --save_strategy "steps" \

  --save_steps 1000 \

  --save_total_limit 10 \

  --learning_rate 3e-4 \

  --weight_decay 0.1 \

  --adam_beta2 0.95 \

  --warmup_ratio 0.01 \

  --lr_scheduler_type "cosine" \

  --logging_steps 1 \

  --report_to "none" \

  --model_max_length 512 \

  --lazy_preprocess True \

  --gradient_checkpointing \

  --use_lora

你可以使用Python来处理操作手册并将其转换为所需的格式。以下是一个简单的示例代码:

def process_manual(manual):

    conversations = []

    steps = manual.split("\n\n")  # 假设操作手册中的步骤是通过空行分隔的

    for step in steps:

        user_input = step.strip()  # 假设每个步骤中只包含用户输入,没有助手的回应

        if user_input:

            conversations.append({"from": "user", "value": user_input})

    return conversations

# 示例操作手册

manual = """

Step 1: Connect the power cable to the device.

Step 2: Press the power button to turn on the device.

Step 3: Wait for the device to boot up.

"""

formatted_conversations = process_manual(manual)

for conversation in formatted_conversations:

    print(conversation)

这段代码将操作手册分割成步骤,并将每个步骤转换为一个包含用户输入的对话对象。你可以根据实际情况修改和扩展这个代码,以满足你的需求。

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号