HF transformers中Deepspeed分析

HuggingFase的transformers库里集成了Deepspeed,

参考Qwen的finetune.py脚本:

from transformers import Trainer, GPTQConfig, deepspeed

注意,transformers里集成的deepspeed,有些特性不完全支持,这里有集成的说明以及很多实用经验的介绍transformers/docs/source/zh/main_classes/deepspeed.md at eb5b968c5d80271ecb29917dffecc8f4c00247a8 · huggingface/transformers · GitHub

跟到transformers/trainer.py: trainer.train()里,

看起来self.model_wrapped就是为deepspeed转换的新model,见2122行的注释:

        # important: at this point:
        # self.model         is the Transformers Model
        # self.model_wrapped is DDP(Transformers Model), Deepspeed(Transformers Model),
        # FSDP(Transformers Model), Dynamo Optimized Module(Transformers Model) etc.

model = self._wrap_model(self.model_wrapped),

调试torchrun

{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        
        {
            "name": "Python: Module",
            "type": "python",
            "request": "launch",
            "module": "torch.distributed.run",
            "cwd": "/mnt/workspace/workgroup/dlz/tmp2/Qwen",
            "args": [
                "--nproc_per_node", "2",
                "--nnodes", "1",
                "--node_rank", "0",
                "--master_addr", "localhost",
                "--master_port", "6819",
                "finetune.py",
                "--model_name_or_path", "/path/to/models/Qwen1.5-7B",
                "--data_path", "/path/to/finetune_full/data_100000.json",
                "--bf16", "True",
                "--output_dir", "output_qwen_full_1gpu_bs1",
                "--num_train_epochs", "2",
                "--per_device_train_batch_size", "2",
                "--per_device_eval_batch_size", "1",
                "--gradient_accumulation_steps", "4",
                "--evaluation_strategy", "no",
                "--save_strategy", "steps",
                "--save_steps", "1000",
                "--save_total_limit", "10",
                "--learning_rate", "1e-5",
                "--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", "2048",
                "--gradient_checkpointing", "True",
                "--lazy_preprocess", "True",
                "--deepspeed", "finetune/ds_config_zero2.json"
             ],
             "env": {
                "CUDA_VISIBLE_DEVICES": "0,1"  // 添加环境变量
            },
            "justMyCode": false
        }
    ]
}

开两张卡的话,会出现两个子线程,想跟进哪个线程里面查数据,直接点进去对应的函数那行就行

index0的model.optimizer

这块儿分成了两个组,大小完全一样,16位的参数

与这里面的data相对。。

这是整个模型的总参数量(这个是进到_inner_traning_loop之后,环境参数里的,不是model里的):

还有两个参数,一个是params_in_partition另一个是params_not_in_partition代表在和不在这个分区上的参数

index1的model.optimizer,可以看到

看model中的param_names,可以看到,一共1+32*12+2=387个参数模块,所以看到上面的两个是按第193个节点来划分的,地中第193个节点各占一部分?

4张GPU的时候:

### LLaMA-Factory 中关于 DeepSpeed 的支持 LLaMA-Factory 是一个用于轻松微调大型语言模型的工具集,其设计目标是简化微调流程并提高性能。然而,在当前公开的信息中并未明确提到 LLaMA-Factory 默认包含对 DeepSpeed 的内置支持[^1]。 DeepSpeed 是一种高效的分布式训练框架,能够显著提升大规模模型的训练效率和资源利用率。如果希望在 LLaMA-Factory 中使用 DeepSpeed,可以通过以下方式实现: #### 方法一:手动配置 DeepSpeed 参数 LLaMA-Factory 提供了灵活的超参数设置接口,允许用户自定义训练过程中的各种参数。例如,`get_train_args` 函数位于 `src/llamafactory/hparams/parser.py` 文件中,可以在此处扩展以支持 DeepSpeed 的相关选项[^2]。具体来说,可以在训练脚本中引入 DeepSpeed 并传递相应的 JSON 配置文件作为输入。 以下是基于 Hugging Face Transformers 和 PyTorch 的典型 DeepSpeed 配置模板: ```json { "fp16": { "enabled": true, "loss_scale": 0, "initial_scale_power": 16, "loss_scale_window": 1000, "hysteresis": 2, "min_loss_scale": 1 }, "optimizer": { "type": "AdamW", "params": { "lr": 0.0001, "betas": [0.9, 0.999], "eps": 1e-8, "weight_decay": 3e-7 } }, "scheduler": { "type": "WarmupLR", "params": { "warmup_min_lr": 0, "warmup_max_lr": 0.0001, "warmup_num_steps": 500 } }, "zero_optimization": { "stage": 2, "offload_optimizer": { "device": "cpu" } } } ``` 此配置文件应保存为 `.json` 格式,并通过命令行参数传入到训练脚本中。假设您正在运行 SFT(Supervised Fine-Tuning),则可以在启动命令中加入如下内容: ```bash deepspeed --num_gpus=4 src/train_sft.py \ --model_name_or_path meta-llama/Llama-2-7b-hf \ --dataset c4_demo \ --output_dir ./saves/deepspeed-lora-sft \ --per_device_train_batch_size 1 \ --gradient_accumulation_steps 8 \ --learning_rate 0.0001 \ --num_train_epochs 3.0 \ --logging_steps 10 \ --save_steps 500 \ --deepspeed ds_config.json ``` #### 方法二:修改源码集成 DeepSpeed 支持 如果您希望通过更深层次的方式将 DeepSpeed 整合到 LLaMA-Factory 中,则需要直接编辑源代码。例如,在 `train_sft.py` 或其他核心模块中初始化 Trainer 类时,显式指定 `deepspeed` 参数即可启用该功能。此外,还需要确保所有依赖项均已正确安装并与您的硬件环境兼容。 需要注意的是,尽管目前官方文档未提及对 DeepSpeed 的原生支持,但这并不妨碍开发者自行扩展这一特性。事实上,许多类似的开源项目都鼓励社区贡献者为其增添新功能或优化现有逻辑[^3]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值