小白避坑指南:国内用Colossal-AI微调DeepSeek 1.5B的完整踩坑记录(附镜像加速方案)

本文涉及的产品
模型在线服务 PAI-EAS,A10/V100等 500元 1个月
交互式建模 PAI-DSW,每月250计算时 3个月
模型训练 PAI-DLC,100CU*H 3个月
简介: 本文详细记录了使用Colossal-Ai对DeepSeek-Qwen模型进行微调的过程,包括模型下载、环境部署、数据集处理及代码实现等环节。重点介绍了LoRA低秩适配方法和Colossal-Ai分布式训练框架的使用技巧,解决了模型封装后函数调用冲突、梯度检查点配置等问题。通过命令行参数灵活调整训练配置,最终在两块A100 GPU上完成训练,单卡显存占用约11GB,利用率达85%。文章总结了常见问题及解决方法,为后续研究提供参考。

概要

由于笔者是为了记录自己的踩坑记录,会讲述基本流程,但具体的技术细节,我就不深入探讨,直接实操,咱们干中学吧!!!我会尽量用通俗易懂的语言进行表达,由于笔者能力有限,有错误之处,请大家多多担待,可以在评论区跟我指出交流。
基本流程:
1 从hugging face上下载我们需要微调的模型,这里笔者试了很多方法。
2 开始部署环境了,这里一定需要使用国内镜像(特别快)。
3 下载数据集
4 编写微调代码(官网也有提供的微调代码示例)
5 记录使用Colossal-Ai微调时间和GPU显存的占用率
笔者的环境是:
1 操作系统:Linux Ubuntu 22.04
2 GPU:两块A100 80G

基础知识

Colossal-Ai

Colossal-AI 是一个面向大规模深度学习模型训练的开源框架,能够让我们可以进行单机多卡的分布式训练。我们只需要调用相应的官方提供的API就能够相应的策略(像笔者有两张A100的卡就能得到的充分利用)。

Lora(Low-Rank Adaptation)

LoRA 是一种针对大模型微调(Fine-tuning)的一种高效参数更新方法 ,能够通过低秩矩阵分解,减少微调时的参数量和计算量。

模型下载

本项目使用的模型是deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B官网地址 这里笔者用了很多方法,要么太慢,要么中断,最后还是本地下载文件再scp上传到服务器上去,评论区如果有更好的方法,可以交流一下。
1 使用Git LFS进行git clone国内镜像ModelScope,一直是提示连接超时。
2 使用 huggingface-cli 工具,使用命令行工具进行下载,还是超时。
3 直接使用transformers的from_pretrained函数,等了半天没反应,放弃。
最后只能手动下载文件,上传到服务器上。

环境部署

很棒,模型下载好了,现在我们需要运行模型。环境的创建我就不教了,直接附上指令。
1 创建python环境

conda create -n deepseek python=3.9 -y
conda activate deepseek
pip install torch==1.12.1+cu113 torchvision==0.13.1+cu113 torchaudio==0.12.1 --extra-index-url https://download.pytorch.org/whl/cu113 -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install transformers datasets accelerate peft colossalai -i https://pypi.tuna.tsinghua.edu.cn/simple

注意:1 安装pytorch的gpu版本时要注意要自己的CUDA驱动版本是否适配
           2 Colossal-AI目前只支持transformer-4.39.3版本,所以有些模型是不支持训练的。

数据集下载

下载地址
数据集格式:
json文件,具有三个属性段,questionresoningresponse

微调代码

1 首先先编写配置文件,config.py

DATASET_PATH = os.path.expanduser(
    "/home/idal-01/wxc/deepseek/health_dataset/distill_psychology-10k-r1.json"
)
`TRAIN_CONFIG = {
   
    "model_name": "/home/idal-01/wxc/deepseek/deepseek_1.5B"
}

2 接着再对数据进行处理,编写数据处理文件data_loader.py

from datasets import load_dataset
from transformers import AutoTokenizer
from config import DATASET_PATH, TRAIN_CONFIG
def load_data(tokenizer):
    # 自定义格式化函数
    def format_func(examples):
        texts = [
            f"Instruction: {q}\nResponse: {a}"
            for q, a in zip(examples["input"], examples["content"])
        ]
        return {
   "text": texts}
    # 加载并处理数据集
    dataset = load_dataset("json", data_files=DATASET_PATH, split="train")
    dataset = dataset.map(format_func, batched=True)
    # 分词处理
    tokenized = dataset.map(
        lambda x: tokenizer(
            x["text"],
            max_length=TRAIN_CONFIG["training"]
             truncation=True,
            padding="max_length",
            return_tensors="pt"
        ),
        batched=True
    )
    return tokenized

3 编写微调代码(主要介绍关于colossal-ai的代码部分)
1)初始化分布式后端,也就是先创建分布式环境,分布式环境所需的参数,如 rank, world size, host 和 port 都是由 PyTorch 启动器设置的,可以使用colossalai.launch_from_torch()这个函数直接从环境变量中读取。

colossalai.launch_from_torch()

2)选择需要的插件,官网提供的插件包括Torch DDP 插件、Torch FSDP 插件、Low Level Zero 插件、Gemini 插件以及Hybrid Parallel 插件。我们可以选择适合自己模型训练的插件。插件详细信息查看

plugin = GeminiPlugin(...)
booster = Booster(plugin=plugin)

3)用 colossalai.booster 将训练特征注入您的训练组件(如模型、优化器、损失函数和学习率调度器)中,本质上是对于模型进行的再次封装,要注意封装过后,模型很多原来的函数使用方式要变,封装后的模型不具备原本的函数。

model, optimizer, _, dataloader, lr_scheduler = booster.boost(
        model=model,
        optimizer=optimizer,
        lr_scheduler=lr_scheduler,
        dataloader=dataloader,
    )

4)官网提供了支持LoRa的API使用方法,使其支持LoRa,一定不要使用peft里面的LoRa方法,笔者已经踩过坑了(由于已经封装的原因,但最后要么无法保存Lora适配器模型,要么无法进行训练,因为官网没有提供解封装的API)。

lora_config = LoraConfig(
       task_type="CAUSAL_LM",
       r=args.lora_rank,
       lora_alpha=args.lora_alpha,
       target_modules=["gate_proj", "up_proj", "down_proj"],
)
model = booster.enable_lora(model, lora_config=lora_config)

5) 如果要开启梯度检查点,model一定要提前经过booster封装。

model.gradient_checkpointing_enable()

6) 如果要开启快速注意力机制(Flash attention),梯度剪裁(grad_clip),梯度累积(gradient_accumulation),训练精度(mixed_precision),梯度缩放(initial_scale)以及融合归一化(Fused Normalization),需要在插件初始化的时侯进行传参。

 plugin = GeminiPlugin(
    precision=args.mixed_precision,
    initial_scale=2**16,
    max_norm=args.grad_clip,
    enable_gradient_accumulation=(args.accumulation_steps > 1),
    enable_fused_normalization=get_accelerator().is_available(),
    enable_flash_attention=args.use_flash_attn,
)

7)保存模型一定要用官网给的API接口函数,不然将保存不到Lora的适配器。

booster.save_lora_as_pretrained(model, os.path.join(args.save_dir, "lora"))

8)我们可以通过命令行传参数过去,我列举几个必须的,其余参数都是类似编写。

    parser.add_argument(
        "-m",
        "--pretrained",
        type=str,
        required=True,
        help="Address of the pre-trained model",
    )
    parser.add_argument("-d", "--dataset", type=str, required=True, help="Raw Jonl dataset for training.")
    parser.add_argument(
        "-p",
        "--plugin",
        type=str,
        default="zero2",
        choices=["gemini", "gemini_auto", "zero2", "zero2_cpu", "3d", "ddp", "moe"],
        help="Choose which plugin to use",
    )

命令行启动训练

colossalai run --nproc_per_node 2 lora_finetune.py --pretrained /home/idal-01/wxc/deepseek/deepseek_1.5B --dataset /home/idal-01/wxc/deepseek/health_dataset/ --plugin "zero2" --save_dir ./finetuned_model --tensorboard_dir ./logs --num_epochs 5 --batch_size 2  --accumulation_steps 2  --lr 1e-5 --max_length 2048     --mixed_precision "bf16"  --grad_clip 1.0 --weight_decay 0.01 --warmup_steps 100 --lora_rank 8  --lora_alpha 16  --use_flash_attn
这是我使用的微调参数进行的训练
--plugin "zero2"
--num_epochs 5
--batch_size 2
--accumulation_steps 2
--lr 1e-5
--max_length 2048
--mixed_precision "bf16"
--grad_clip 1.0
--weight_decay 0.01
--warmup_steps 100
--lora_rank 16
--lora_alpha 32
--use_flash_attn
target_modules=["gate_proj", "up_proj", "down_proj"]

训练过程:
fdc182165f1158ae7117c9d1e98f0ed.png

显存占用:单GPU 11165MiB 利用率 82%-85%
ec8c966da083d4ca087f8621be609d0.png

小结

具体的微调代码资源在我的CSDN下载资源里,免费下载的,有需要的友友可以下载,希望大家点点关注🌹🌹
https://blog.csdn.net/qq_53769632?spm=1000.2115.3001.5343
编写代码时遇到的主要问题(踩过的坑):
1 没注意到模型已经被封装过,使用之前的函数经常会出错
2 因为使用的deepseek-Qwen系列蒸馏模型,要求字符填充是向左,默认是向右,所以需要更改方向,不过由于是分布式训练是多进程的,只改主进程是不行的,需要子进程也需要同步。
3 使用梯度检查点时--use_grad_checkpoint,一定要注意跟插件是否冲突,不然可以不能进行反向传播
4 使用HybridAdam优化器报错,发现需要GNU的版本不对,我想了想避免产生更大的问题,我还是老老实实用了Adam优化器。

写在最后

以后还是要及时编写博客,因为好多东西是一段时间之前的,很多坑已经忘了,写了一些印象比较深的坑。之后笔者会继续使用强化学习算法微调deepseek,感兴趣的友友也可以关注我的csdn博客。🌹🌹

相关实践学习
使用PAI-EAS一键部署ChatGLM及LangChain应用
本场景中主要介绍如何使用模型在线服务(PAI-EAS)部署ChatGLM的AI-Web应用以及启动WebUI进行模型推理,并通过LangChain集成自己的业务数据。
机器学习概览及常见算法
机器学习(Machine Learning, ML)是人工智能的核心,专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能,它是使计算机具有智能的根本途径,其应用遍及人工智能的各个领域。 本课程将带你入门机器学习,掌握机器学习的概念和常用的算法。
相关文章
|
8天前
|
人工智能 自然语言处理 监控
基于DeepSeek R1改进的AI安全模型!MAI-DS-R1:微软开源AI安全卫士,敏感话题响应率高达99.3%
微软开源的MAI-DS-R1是基于DeepSeek R1改进的AI模型,通过后训练优化将敏感话题响应率提升至99.3%,同时将有害内容风险降低50%,保持原版推理能力并增强多语言支持。
128 3
基于DeepSeek R1改进的AI安全模型!MAI-DS-R1:微软开源AI安全卫士,敏感话题响应率高达99.3%
|
4天前
|
人工智能 JavaScript 前端开发
领导给我3天时间汇总所有AI模块词条,结合DeepSeek,20分钟就搞定了。
本文分享了一次利用AI工具提升工作效率的实际案例。作者接到任务,需在3天内梳理公司AI模块的所有词条并以增量形式提供给项目组。为高效完成任务,作者借助DeepSeek编写了三个Node.js脚本:第一个脚本扫描所有/ai目录下的文件,提取符合“zxy.xxx”格式的词条;第二个脚本对比目标词条库与已提取的词条,生成过滤后的副本;第三个脚本将最终结果输出为Excel文档,满足领导需求。整个过程从十几分钟到二十分钟不等,大幅缩短了原本需要数天的工作量。此案例表明,在重复性工作中合理运用AI工具可显著提高效率。
|
28天前
|
人工智能 搜索推荐 Java
Spring AI与DeepSeek实战三:打造企业知识库
本文基于Spring AI与RAG技术结合,通过构建实时知识库增强大语言模型能力,实现企业级智能搜索场景与个性化推荐,攻克LLM知识滞后与生成幻觉两大核心痛点。
246 7
|
1月前
|
人工智能 运维 监控
从大规模恶意攻击 DeepSeek 事件看 AI 创新隐忧:安全可观测体系建设刻不容缓
唯有通过全行业的协同努力,加强整体、完善的网络安全可观测建设,才能为 AI 技术的创新和发展构建一个安全而稳固的环境。我们期盼并相信,在攻克这些网络安全难题之后,AI 创新将迎来更加安全、灿烂的未来。
|
27天前
|
人工智能 缓存 安全
钉钉 + AI 网关给 DeepSeek 办入职
通过 Open-WebUI 在企业内部部署一套 DeepSeek 只是第一步,给 DeepSeek 办理入职,在钉钉等企业通讯工具上和 DeepSeek 对话才是真时尚。
189 105
钉钉 + AI 网关给 DeepSeek 办入职
|
17天前
|
人工智能 自然语言处理 数据挖掘
DeepSeek:重构办公效率的AI新范式
DeepSeek作为新一代AI办公平台,通过语义理解、流程重构和决策支持三大引擎,重新定义办公效率。它以深度语义模型实现合同审核等任务的高效精准,用智能流程挖掘优化业务链条,并融合行业知识图谱辅助决策。数据显示,DeepSeek可大幅压缩时间成本、提升质量并带来显著ROI。其从“人找信息”到“信息找人”的范式转变,推动企业迈向认知联网与群体智能时代,开启办公效率的指数级跃迁。这不仅是工具革新,更是生产力模式的根本转型。
60 0
|
23天前
|
人工智能 自然语言处理 前端开发
DeepSite:基于DeepSeek的开源AI前端开发神器,一键生成游戏/网页代码
DeepSite是基于DeepSeek-V3模型的在线开发工具,无需配置环境即可通过自然语言描述快速生成游戏、网页和应用代码,并支持实时预览效果,显著降低开发门槛。
346 93
DeepSite:基于DeepSeek的开源AI前端开发神器,一键生成游戏/网页代码
|
14天前
|
存储 人工智能 Java
Spring AI与DeepSeek实战四:系统API调用
在AI应用开发中,工具调用是增强大模型能力的核心技术,通过让模型与外部API或工具交互,可实现实时信息检索(如天气查询、新闻获取)、系统操作(如创建任务、发送邮件)等功能;本文结合Spring AI与大模型,演示如何通过Tool Calling实现系统API调用,同时处理多轮对话中的会话记忆。
248 57
|
22天前
|
机器学习/深度学习 数据采集 人工智能
清华联合DeepSeek推出奖励模型新标杆!DeepSeek-GRM:让AI学会自我批评,推理性能越跑越强
DeepSeek-GRM是由DeepSeek与清华大学联合研发的通用奖励模型,采用点式生成式奖励建模和自我原则点评调优技术,显著提升了模型质量和推理扩展性。
155 13
清华联合DeepSeek推出奖励模型新标杆!DeepSeek-GRM:让AI学会自我批评,推理性能越跑越强
|
25天前
|
人工智能 自然语言处理 API
AutoAgent:无需编程!接入DeepSeek用自然语言创建和部署AI智能体!港大开源框架让AI智能体开发变成填空题
香港大学推出的AutoAgent框架通过自然语言交互实现零代码创建AI智能体,支持多模型接入与自动化工作流编排,在GAIA基准测试中表现优异。
168 16
AutoAgent:无需编程!接入DeepSeek用自然语言创建和部署AI智能体!港大开源框架让AI智能体开发变成填空题

热门文章

最新文章

下一篇
oss创建bucket