使用ms-swift基于Qwen3-8B微调小说模型

发布时间:2025-05-15 11:34:59编辑:123阅读(141)

    基于Qwen3-8B微调小说模型

    数据准备(参考https://py3study.com/Article/details/id/20105.html,爬取小说作为数据集)


    升级ollama版本(下载最新的千问3模型需要最新的ollama版本)

    curl -fsSL https://ollama.com/install.sh | sh

    image.png

    下载模型

    ollama run qwen3:8b

    image.png

    python调用ollama库

    pip install ollama -i https://mirrors.aliyun.com/pypi/simple


    处理流程

    1 搜索小说数据,构建Json文件{书名:"xxx",书存放路径:"xxx",章节名称:"xxx",章节文本:'xxx',章节文本分割:'xxx' }。

    2 调用API接口将小说每一章节进行总结。( 如果有字数要求的话,将数据切片,以每句话切分数据, 例800字的文章,

    将切分的句子拼接成一个一个由句子组曾的800字文章段落,在调用API总结)。

    3 构建数据,将模型总结的数据,和最开始输入的原始Json数据一起构建成,模型需要的指令微调数据。

    4 最后会将构建好的数据保存为JSON文件


    小说数据集制作

    需要将小说数据制作成以下格式进行微调

    {

        "instruction":"回答以下用户问题,仅输出答案。",

        "input":"1+1等于几?",

        "output":"2"

    }

    instruction:可以设置为:你是一个熟读各类小说的专家,请你根据要求写一段1000字左右的小说

    input:通过大模型对output的内容进行小说情节的总结

    output:即为小说段落文本

    代码如下:

    import json
    import ollama
    import os
    
    # 小说总结提示词
    mess = [
            {"role": "system",
             "content": """# Role: 总结者
    ## Profile
    - language: 中文
    - description: 总结user提交的内容。用一句不超过50字的话总结这段小说的情节,仅回答总结,不需要添加其他内容。
    ## Skills
    1. 高效提取和浓缩关键信息。
    2. 提供简洁且相关的总结。
    3. 理解叙事结构和主题。
    
    ## Rules
    1. 仅输出总结,不添加其他内容。
    2. 确保总结不超过50字。
    3. 保持总结的清晰性和相关性。
    
    ## Workflows
    1. 分析用户输入,识别主要情节。
    2. 将识别出的情节浓缩成一个句子。
    3. 检查句子是否不超过50字。
    4. 向用户提供总结。"""
                 },
            {'role': 'user','content': ''}
    ]
    
    
    def build_dataset(name, org_txt, summarize):
        lora_path = os.path.join(os.getcwd(), f'{name}.json')
        instruction_prompt = "你是一个熟读各类小说的专家,请你根据要求写一段800字左右的小说。"
        dataset = []
        dataset.append({
            # prompt提示词
            "instruction": instruction_prompt,
            # 大模型对小说章节总结的内容,作为输入
            "input": summarize,
            # 小说章节原始文本
            "output": org_txt
        })
        print(dataset)
        with open(lora_path, "w", encoding='utf-8') as f:
            f.write(json.dumps(dataset, ensure_ascii=False, indent=4))
        return dataset
    
    book_list = ['一花一酒一仙人,亦眠亦醉亦长生.jsonl','万剑天尊.jsonl', '不懂别乱说,我这不是杂灵根.jsonl',
     '丹道第一圣.jsonl','人在修仙世界,和谁都能五五开.jsonl', '充钱就变强,我的修为无敌了.jsonl',
     '反派:气运之子太多,我摆烂了.jsonl','反派:禁忌女帝师尊,我无敌了!.jsonl', 
     '女帝逼走我后,才发现我无敌天下.jsonl', '师弟们都是大佬,那我只能开挂了.jsonl',
     '我,稳健金乌,只想娶妻过日子!.jsonl','玄幻:开局瞎子,从拉二胡开始.jsonl', '苟在修仙界勤能补拙.jsonl',
     '谁让他当鬼差的?.jsonl', '谁让你真修仙的?.jsonl', '转生神树,我打造阴兵家族.jsonl', 
     '逆天狂徒之超级软饭王.jsonl','长生:我在掖幽庭风华日月.jsonl']
    dataset = []
    for book in book_list:
        book_path = os.path.join(os.getcwd(), book)
        with open(book_path, mode='r', encoding='utf-8') as f:
            for i in  f.readlines():
                # 小说章节原文
                org_txt = json.loads(i).get('txt')
                mess[1]['content'] = org_txt
                response = ollama.chat(model="qwen3:8b",  messages=mess)
                # qwen3:8b 对小说章节原文的总结
                ret_split = response['message']['content'].split('。')
                # 去除列表中为空的内容
                new_lst = list(filter(lambda x: x is not None and x != "" , ret_split))
                summarize = new_lst[-1].replace('\n</think>\n\n', '')
                # 构建模型需要的指令微调数据集
                lora_path = os.path.join(os.getcwd(), 'lora.json')
                instruction_prompt="你是一个熟读各类小说的专家,请你根据要求写一段800字左右的小说。"
                dataset.append({
                    # prompt提示词
                    "instruction": instruction_prompt,
                    # 大模型对小说章节总结的内容,作为输入
                    "input": summarize,
                    # 小说章节原始文本
                    "output": org_txt
                })
                print({
                    # prompt提示词
                    "instruction": instruction_prompt,
                    # 大模型对小说章节总结的内容,作为输入
                    "input": summarize,
                    # 小说章节原始文本
                    "output": org_txt
                })
    with open(lora_path, "w", encoding='utf-8') as f:
        f.write(json.dumps(dataset, ensure_ascii=False, indent=4))

    生成的数据集

    image.png


    安装虚拟环境

    建议新建一个虚拟环境,大模型的搭建有的比较复杂,容易引起环境问题,导致现有的环境不能用,新建是最明智的选择,

    新建虚拟环境: 执行命令:

    conda create --name novel python=3.9

    image.png

    安装完成后,激活虚拟环境,执行命令:

    conda activate novel


    查看CUDA版本,执行命令:

    nvcc -V

    image.png


    ms-swift环境安装

    安装swift框架

    从源代码安装:如果需要使用最新的开发版本,或者计划对框架进行自定义修改,以满足特定的开发需求,那么从源代码安装是一个不错的选择。首先,确保已安装Git工具,它是进行代码版本管理和获取源代码的重要工具。然后执行以下命令:

    git clone https://github.com/modelscope/ms-swift.git

    cd ms-swift

    pip install -e . -i https://mirrors.aliyun.com/pypi/simple


    安装vllm工具

    vllm是一个高性能的大语言模型推理和服务库,基于Python和CUDA开发。它专为提升大语言模型推理速度而设计,能够充分利用现代GPU的并行计算能力,大幅减少推理时间。

    vllm具有诸多优势特点,使其在大语言模型推理领域备受青睐。首先,vllm采用了PagedAttention算法,这种算法有效解决了传统注意力机制中的内存碎片化问题,使得内存使用更加高效。在处理长文本序列时,能够显著减少内存占用,同时提升计算速度。其次,vllm支持流式输出,在推理过程中,它可以逐词生成结果并实时返回给用户,而无需等待整个文本生成完成,这对于实时交互场景,如聊天机器人、实时翻译等,极大地提升了用户体验。此外,vllm对多种主流大语言模型具有良好的兼容性,如GPT - NeoX、LLaMA等,开发者可以方便地将其集成到自己的项目中,快速搭建高效的推理服务。

    要安装vllm,在bash环境下执行以下命令即可:

    pip install vllm -i https://mirrors.aliyun.com/pypi/simple


    模型准备

    模型下载在下载模型之前,确保已经安装了 git-lfs。git-lfs(Git Large File Storage)是一个用于管理大型文件的扩展,在下载包含大文

    件的模型时非常必要。如果尚未安装,可以通过以下命令进行安装:

    curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | sudo bash

    sudo apt-get install git-lfs


    接下来,从 modelscope 的模型库中下载模型权重文件。这里选择下载 Qwen3-8B模型:

    git clone https://www.modelscope.cn/Qwen/Qwen3-8B

    image.png

    此命令会将 Qwen3-8B 模型的所有文件克隆到当前目录下。在下载过程中,由于模型文件可能较大,需要确保网络稳定,并且磁盘空间足够。如果下载过程中出现中断,可以使用 git lfs pull 命令继续下载未完成的文件。


    模型微调

    选择模型和数据集:要对Qwen3 - 8B 模型进行微调,使其能够更好地服务于特定领域的问答任务。可以从魔搭社区获取相关的领域数据集,魔搭社区拥有丰富的数据资源,涵盖了多个领域,能够为模型训练提供有力支持。当然,如果项目有特殊需求,也可以根据实际情况自定义数据集,以确保模型能够准确地学习到特定领域的知识和语言模式。

    准备训练环境:在开始训练之前,要确保已成功安装swift框架,并根据模型和数据集的需求,合理配置硬件资源,如准备好GPU以加速训练过程。同时,检查并安装好所需的Python依赖库,确保整个训练环境的完整性和稳定性。

    编写训练命令:在命令行中执行以下类似命令(根据实际情况调整参数):

    CUDA_VISIBLE_DEVICES = 0 \
    swift sft \
    # --model指定了要微调的模型。
    --model /home/sam_admin/novel_text/Qwen3-8B \
    # --train_type设置为lora,表示采用LoRA微调方式,这种方式能够在不改变模型整体架构的前提下,高效地对模型进行
    优化。
    --train_type lora \
    # --dataset指定了数据集的路径和采样数量。
    --dataset /home/sam_admin/novel_text/lora.json \
    # --torch_dtype设置为bfloat16,指定了模型训练的数据类型,能够在保证一定精度的同时,提升计算效率。
    --torch_dtype bfloat16 \
    # --num_train_epochs设置了训练轮数为2。
    --num_train_epochs 2 \
    # --per_device_train_batch_size和--per_device_eval_batch_size分别设置了训练和评估时的批量大小。
    --per_device_train_batch_size 2 \
    --per_device_eval_batch_size 2 \
    # --learning_rate设置了学习率为5e - 5,它控制着模型参数更新的步长。
    --learning_rate 5e - 5 \
    # --lora_rank和--lora_alpha是LoRA相关的参数,分别设置为8和32,影响着LoRA微调的效果。
    --lora_rank 8 \
    --lora_alpha 32 \
    # --target_modules指定了要应用LoRA的模块。
    --target_modules all - linear \
    # --gradient_accumulation_steps设置为2,表示梯度累积的步数,能够在有限的硬件资源下,模拟更大的批量训练。
    --gradient_accumulation_steps 2 \
    # --eval_steps和--save_steps分别设置了评估和保存模型的步数。
    --eval_steps 100 \
    --save_steps 100 \
    # --save_total_limit设置了最多保存的模型数量。
    --save_total_limit 2 \
    # --logging_steps设置了日志记录的步数。
    --logging_steps 10 \
    # --max_length设置了输入序列的最大长度。
    --max_length 8192 \
    # --output_dir指定了输出目录。
    --output_dir /home/sam_admin/novel_text/novel_fine_tuned_model \
    # --system设置了系统提示信息,帮助模型更好地理解任务。
    --system '你是一个熟读各类小说的专家' \
    # --warmup_ratio设置了学习率预热比例。
    --warmup_ratio 0.1 \
    # --dataloader_num_workers设置了数据加载器的工作线程数。
    --dataloader_num_workers 4 \
    # --model_author和--model_name分别设置了模型的作者和名称,方便管理和识别模型。
    --model_author ST \
    --model_name novel_model

    执行训练

    swift sft \

    --model /home/sam_admin/novel_text/Qwen3-8B \

    --train_type lora \

    --dataset /home/sam_admin/novel_text/lora.json \

    --torch_dtype bfloat16 \

    --num_train_epochs 2 \

    --per_device_train_batch_size 2 \

    --per_device_eval_batch_size 2 \

    --learning_rate 5e-5 \

    --lora_rank 8 \

    --lora_alpha 32 \

    --target_modules all-linear \

    --gradient_accumulation_steps 2 \

    --eval_steps 100 \

    --save_steps 100 \

    --save_total_limit 2 \

    --logging_steps 10 \

    --max_length 8192 \

    --output_dir /home/sam_admin/novel_text/novel_fine_tuned_model \

    --system '你是一个熟读各类小说的专家' \

    --warmup_ratio 0.1 \

    --dataloader_num_workers 4 \

    --model_author ST \

    --model_name novel_model

    image.png

    执行训练:运行上述命令后,swift将按照设置的参数开始模型微调过程。在训练过程中,可以在终端中实时查看训练进度、损失值等信息,通过这些信息,可以监控训练过程,判断模型是否正常收敛,是否需要调整参数。

    image.png

    1111

关键字

上一篇: 大模型基础架构

下一篇: 没有了