Shortcuts

1. 安装使用

1.1   CoLLiE 的 快速安装

1.2   CoLLiE 的 快速上手

1.3   CoLLiE 的 快速运行

    CoLLie作为一款端到端的大语言模型高度集成化训练框架,其功能主要体现在以下的四个方面,相关内容在后续的Tutorial中会有详细的介绍:

    首先,CoLLiE 致力于涵盖包含适用于各种特异场景的并行方式,整合四种并行策略:数据并行 DP流水线并行 PP张量并行 TP( 以及 3D并行)、零冗余优化器 ZeROtutorial-3

    其次,CoLLiE 致力于涵盖大语言模型从预训练、全量微调、参数高效微调的全流程,提出面向全参数高效微调的LOMO算法,支持LoRAPrefixTuningPromptTuning等参数高效微调方案(tutorial-5

    再次,CoLLiE 致力于涵盖从数据准备、数据处理、模型训练、模型评测、模型部署的训练整体环节:通过TrainerConfig模块,轻松上手LLM微调实战(tutorial-3),通过CallbackMonitor模块,全方位掌控LLM微调过程(tutorial-4

    最后,CoLLiE 致力于与时俱进,不断集成最新的模型架构、优化框架,兼容flash_attn,极大提升Transformer运算效率,在有限的资源上让大模型轻松驾驭长序列(tutorial-2

1.1   CoLLiE 的 快速安装

    CoLLiE通过git结合pip install安装,只需要一行指令如下。

pip install git+https://github.com/OpenLMLab/collie.git

    CoLLiE在安装时需要保证保证环境已有的torch对应cuda版本和nvcc -V结果一致,例如笔者的nvcc是11.7版本,对应torch使用1.13.1+cu117

nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2022 NVIDIA Corporation
Built on Tue_May__3_18:49:52_PDT_2022
Cuda compilation tools, release 11.7, V11.7.64
Build cuda_11.7.r11.7/compiler.31294372_0

1.2   CoLLiE 的 快速上手

    在这一节中,我们将给出一个完整的 CoLLiE 使用代码案例,由此,一方面是方便大家快速的跑通 CoLLiE、用上 CoLLiE,实现真正的 CoLLiE 快速上手;另一方面也是借助这个 CoLLiE 的使用案例,向大家介绍 CoLLiE 自定义的一些基础模块包括 Config、Dataset、Evaluator、Trainer;接着在后续小节中,我们将详细介绍各个模块的运行原理的使用细节。本教程使用的CoLLiE使用案例是,使用 Adam(优化算法)ZeRO3(并行策略)全参数训练 LLaMA2(基座模型),针对 Alpaca数据(训练数据)进行指令微调(微调任务)。首先导入一些必要的包,并且设置加载模型的路径或名称。

import torch
from datasets import load_dataset
from transformers import LlamaTokenizer, get_linear_schedule_with_warmup

from collie import CollieConfig, Trainer
from collie import LRMonitor, LossMonitor
from collie import CollieDatasetForTraining
from collie import LlamaForCausalLM

model_name_or_path = 'meta-llama/Llama-2-7b-hf'

    然后就到了CoLLiE最关键的一个步骤,即定制CoLLiE的配置类CollieConfig。这里首先通过从模型路径中加载初始化配置类,这时加载出来的CollieConfig,会自带一些模型的基本超参数,例如层数、维度数量等。紧接着,对于初始化好的CollieConfig,我们可以设置不同并行策略的超参数,例如数据并行、流水线并行、张量并行的数量(对应 config.dp_size、config.pp_size、config.tp_size),以及训练的其他超参数,例如训练轮数、batch大小等,还有deepspeed相关参数,例如ZeRO策略、是否开启BF16混合精度、训练监控方式等;关于配置类,详见 tutorial-3

config = CollieConfig.from_pretrained(model_name_or_path)

config.dp_size = 4
config.pp_size = 1
config.tp_size = 1
config.train_epochs = 3
config.train_micro_batch_size = 32
config.gradient_accumulation_steps = 1
config.ds_config = {
    "fp16": {"enabled": True},
    "monitor_config": {
        "enabled": True,
        "tag": f"tutorial-lr_0.00001-epoch_3",
        "wandb": {
            "enabled": True,
            "team": "collie_exp",
            "project": "llama_alpaca",
            "group": f"llama2_7b",
        }
    },
    "zero_optimization": {"stage": 3},
}

    接下来是初始化 tokenizer、dataset、model、optimizer、lr_scheduler 。CoLLiE兼容huggingface或torch实现的上述内容,例如本例中使用的 tokenizer、lr_scheduler 从huggingface中导入,optimizer从torch中导入;关于CoLLiE自定义的高效微调优化器,详见 tutorial-5

    书归正传,此处使用的 dataset、model 是基于CoLLiE自定义的 CollieDataset(CollieDatasetForTraining)、CollieModelForCausalLM(LlamaForCausalLM)。其中,CollieDatasetForTraining通过在构造阶段区分prompt和output部分(分别对应字段“input”和“output”)在模型训练时自动划分出梯度更新范围,LlamaForCausalLM通过CollieConfig自动完成初始化,并且通过给定的路径名称完成参数加载,详见 tutorial-3

tokenizer = LlamaTokenizer.from_pretrained(model_name_or_path, padding_side="left")

data = [{
        "intput": sample["prompt"].split("### Response:\n")[0] + "### Response:\n",
        "output": sample["prompt"].split("### Response:\n")[1] + tokenizer.eos_token
    } for sample in load_dataset("crumb/stanford_alpaca_full_prompts")["train"]]
train_dataset = CollieDatasetForTraining(data, tokenizer=tokenizer, max_length=2048)

model = LlamaForCausalLM.from_pretrained(model_name_or_path, config)

optimizer = torch.optim.Adam(model.parameters(), lr=0.00001)

total_step = (len(train_dataset) * config.train_epochs) // 128
lr_scheduler = get_linear_schedule_with_warmup(
    optimizer,
    num_warmup_steps=int(total_step * 0.03),
    num_training_steps=total_step
)

    准备完数据、模型、优化器之后就可以开始训练了。CoLLiE使用Trainer模块集成整个训练过程,通过向Trainer传入模型model、配置类config、优化器optimizer、数据集train_dataset,通过trainer.train()即可快速开启训练过程,通过trainer.save_model()即可保存模型训练结果,保存格式和huggingface保存格式一致,可直接加载至相同模型的huggingface版本中;关于trainer的更多内容,详见 tutorial-3

trainer = Trainer(
    model=model,
    config=config,
    optimizer=optimizer,
    train_dataset=train_dataset,
    monitors=[LRMonitor(config), LossMonitor(config)],
    lr_scheduler=lr_scheduler,
)

trainer.train()

trainer.save_model("./result")

    在这个过程中,为了显示训练过程中学习率和损失的变化过程,这里设置监控器列表monitors,包括实时输出当前学习率的LRMonitor 和 当前损失值的LossMonitor,两者都通过config初始化;更多关于monitor监控器的内容,详见 tutorial-4。此外,在训练过程中,我们还允许加入评测相关的内容,对此CoLLiE通过评测单元Evaluator和对应评测指标Metric加以集成,详见 tutorial-3。而在训练过程中,CoLLiE还可以根据回调单元Callback允许用户自定义模型训练过程中的行为,详见 tutorial-4。除了全参数训练之外,CoLLiE还支持参数高效的微调方法例如LoRA,详见 tutorial-5;对应内存高效的全参数微调方法例如LOMO,详见 tutorial-5。最后,CoLLiE还支持模型的部署,详见 tutorial-4

1.3   CoLLiE 的 快速运行

    再将上述代码复制到train.py之后,通过以下的命令,我们就可以运行上述代码。

CUDA_VISIBLE_DEVICES=0,1,2,3 torchrun --nnodes=1 --nproc_per_node=4 train.py

这个命令是基于touchrun的一个分布式运行,其中的参数如下表所示,通过该条命令我们在当前服务器的4个节点开启了4个子进程,从而执行4路数据并行的训练代码。如果想中止这条程序,只需要关闭其中一个子进程,剩余的程序就会自动结束。关于pytorch分布式相关的更多内容,可以参考 pytorch官方文档关于torchrun的介绍

CUDA_VISIBLE_DEVICES=0,1,2,3

使用当前服务器上的0至3号显卡

torchrun train.py

以分布式的形式启动 train.py,即在0至3号显卡上并行运行train.py

–nnodes=1

在1台服务器(节点 node)上运行

–nproc_per_node=4

当前服务器拥有的显卡数量(每个显卡对应一个进程 process)

    在接下来的教程中,我们首先将介绍CoLLiE的功能特性,讲解应用CoLLiE解决给定任务,如何估算需要申请的计算资源数量;接着我们将一点点讲解前文所述的代码模块、并行策略、优化算法是什么,以及 CoLLiE 是如何实现它们的。

其它版本