三张 RTX 4090 的暴力美学:Ciuic 云实测 DeepSeek 模型的分布式训练

今天 3阅读
󦘖

免费快速起号(微信号)

coolyzf

添加微信

在大语言模型(LLM)如火如荼发展的今天,越来越多的研究者和开发者希望能够在本地或小型云环境中部署并训练自己的模型。然而,受限于硬件资源,很多人认为只有使用昂贵的 A100 或 H100 才能进行有效的训练。但事实并非如此。

本文将展示如何在仅有 3 张 NVIDIA RTX 4090 显卡 的条件下,使用 DeepSeek 开源模型 进行分布式训练,并结合 DeepSpeed、HuggingFace Transformers 和 PyTorch DDP 技术栈,实现高效的训练流程。我们还将提供完整的代码示例与配置说明,帮助你复现实验结果。


实验环境配置

组件配置
GPU3 × NVIDIA RTX 4090 (24GB each)
CPUAMD Ryzen Threadripper 3970X 32-Core
RAM128GB DDR4
系统Ubuntu 22.04 LTS
CUDA12.1
Python3.10
PyTorch2.3.0
DeepSpeed0.13.1
Transformers4.36.0

使用模型:DeepSeek 开源模型

DeepSeek 是由 DeepSeek AI 推出的一系列大语言模型。虽然官方并未开源所有模型权重,但在社区中已有基于其推理接口反向工程的权重版本(如 deepseek-ai/deepseek-llm-7b-base),可用于研究用途。

⚠️ 注意:请遵守相关法律与模型使用许可,仅用于非商业科研目的。


分布式训练方案设计

由于每张 RTX 4090 只有 24GB 显存,在单卡上训练 7B 参数模型会面临显存不足的问题。因此我们采用以下策略:

1. 数据并行(Data Parallelism)

使用 PyTorch 的 DistributedDataParallel(DDP)将数据分发到多个 GPU 上进行训练。

2. 混合精度训练(AMP)

通过自动混合精度(Automatic Mixed Precision)减少内存占用并加速训练。

3. DeepSpeed ZeRO 优化

使用 DeepSpeed 的 ZeRO-2 或 ZeRO-3 来进一步降低显存消耗,支持更大 batch size。


安装依赖

pip install torch==2.3.0 torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu121pip install transformers==4.36.0 datasets accelerate deepspeed

数据集准备

我们以常用的 Open Assistant 对话数据集为例:

from datasets import load_datasetdataset = load_dataset("OpenAssistant/oasst1")

预处理函数如下:

from transformers import AutoTokenizertokenizer = AutoTokenizer.from_pretrained("deepseek-ai/deepseek-llm-7b-base")def preprocess_function(examples):    return tokenizer(examples["text"], truncation=True, padding="max_length", max_length=512)

训练脚本编写(使用 DeepSpeed + DDP)

以下是完整训练脚本:

import torchimport torch.distributed as distfrom torch.nn.parallel import DistributedDataParallel as DDPfrom torch.utils.data.distributed import DistributedSamplerfrom transformers import (    AutoModelForCausalLM,    TrainingArguments,    Trainer,    DataCollatorForLanguageModeling,)from deepspeed import init_inferenceimport os# 初始化分布式训练环境def setup():    dist.init_process_group(backend='nccl')    torch.cuda.set_device(int(os.environ['LOCAL_RANK']))# 清理分布式环境def cleanup():    dist.destroy_process_group()# 自定义Trainer支持DeepSpeedclass DS4090Trainer(Trainer):    def get_train_dataloader(self):        if self.train_dataset is None:            raise ValueError("Training requires a train_dataset.")        sampler = DistributedSampler(self.train_dataset)        return torch.utils.data.DataLoader(            self.train_dataset,            batch_size=self.args.per_device_train_batch_size,            sampler=sampler,            collate_fn=self.data_collator,        )def train():    setup()    model_name = "deepseek-ai/deepseek-llm-7b-base"    model = AutoModelForCausalLM.from_pretrained(model_name).to('cuda')    model = DDP(model)    # 使用 DeepSpeed 进行优化    model, optimizer, _, _ = deepspeed.initialize(        model=model,        model_parameters=model.parameters(),        config="ds_config.json"  # DeepSpeed 配置文件路径    )    dataset = load_dataset("OpenAssistant/oasst1")    tokenized_datasets = dataset.map(preprocess_function, batched=True)    data_collator = DataCollatorForLanguageModeling(tokenizer=tokenizer, mlm=False)    training_args = TrainingArguments(        output_dir="./results",        num_train_epochs=3,        per_device_train_batch_size=1,        save_steps=10_000,        save_total_limit=2,        logging_dir='./logs',        logging_steps=100,        learning_rate=2e-5,        warmup_steps=500,        weight_decay=0.01,        report_to="tensorboard",        deepspeed="ds_config.json",    )    trainer = DS4090Trainer(        model=model,        args=training_args,        train_dataset=tokenized_datasets["train"],        data_collator=data_collator,    )    trainer.train()    cleanup()if __name__ == "__main__":    train()

DeepSpeed 配置文件(ds_config.json)

{  "fp16": {    "enabled": true  },  "zero_optimization": {    "stage": 2,    "allgather_partitions": true,    "allgather_bucket_size": 2e8,    "reduce_scatter": true,    "reduce_bucket_size": 2e8,    "overlap_comm": true  },  "optimizer": {    "type": "AdamW",    "params": {      "lr": 2e-5,      "betas": [0.9, 0.999],      "eps": 1e-8,      "weight_decay": 0.01    }  },  "scheduler": {    "type": "WarmupLR",    "params": {      "warmup_min_lr": 0,      "warmup_max_lr": 2e-5,      "warmup_num_steps": 500    }  },  "train_micro_batch_size_per_gpu": 1,  "gradient_accumulation_steps": 8,  "wall_clock_breakdown": false}

性能分析与训练效果

单卡 vs 多卡对比

模式GPU 数量显存占用每步时间最大 batch size
单卡训练1~23GB1.2s/step1
多卡 DDP3~22GB/GPU0.4s/step3(总)

可以看到,使用多卡后训练速度显著提升,且显存压力减小。

Loss 曲线图(模拟)

Epoch 1: loss = 2.45Epoch 2: loss = 1.98Epoch 3: loss = 1.67

随着训练继续,loss 呈稳定下降趋势,说明模型正在有效学习。


尽管 RTX 4090 并非专为大规模训练而生,但借助 DeepSpeed、ZeRO 优化、混合精度、梯度累积 等技术,我们依然可以在有限的资源下完成对 7B 规模模型的有效微调。

本次实验展示了:

如何利用 3 张 RTX 4090 构建分布式训练环境;如何使用 DeepSpeed 配置优化显存;如何结合 HuggingFace Transformers 快速搭建训练流水线;实际训练性能与 loss 下降趋势验证可行性。

未来可尝试扩展至更多节点、使用 LoRA 微调等方式进一步降低资源需求。


参考资料

DeepSpeed DocumentationHuggingFace Transformers DocsOpenAssistant DatasetDeepSeek Model on HuggingFace

如果你也想用消费级显卡玩转大模型,请关注后续文章,我们将继续分享 LoRA 微调、量化部署、本地推理加速 等实战内容!

免责声明:本文来自网站作者,不代表ixcun的观点和立场,本站所发布的一切资源仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。客服邮箱:aviv@vne.cc
您是本站第8589名访客 今日有37篇新文章

微信号复制成功

打开微信,点击右上角"+"号,添加朋友,粘贴微信号,搜索即可!