Shortcuts

2. 功能特性

2.1   CoLLiE 的 运行效率

2.2   CoLLiE 的 兼容易用

2.3   CoLLiE 的 丰富功能

    多年以后,面对AIGC,NLPer将会回想起OpenAI推出ChatGPT前的那个遥远的下午。当时,对于LLM的研究,只是OpenAI、Google、Meta几家科技寡头间的军备竞赛。然而,一切都随着那个时刻的降临而改变;随之而来的,是普罗大众对于LLM模型开源的呼声,以及对LLM高效微调的需求。

    模型的开源是学术研究的前提。在应用层面,OpenLMLab研发的MOSS,作为国内首个类ChatGPT模型,为LLM的开源树立了良好的榜样。在模型层面,Meta的LLaMA,作为一个参数量含盖 7B、13B、30B、65B 的 LLM开源集合,为LLM的深入研究和应用提供了基座。

    然而,开源并不意味着故事的结束;相反地,真正的问题才刚刚开始。如何仅以用户级的硬件配置(Consumer Hardware),即在有限的计算和存储资源,例如 1张8张 3090显卡 上,实现对LLM,例如 7B 乃至 65B LLaMA的全参数微调,成为了接踵而至的问题。而这就是CoLLiE所解决的问题。

2.1   CoLLiE 的 运行效率

    对此,CoLLiE 首先实现的就是效率,这也是 CoLLiE 最大的改进和特点。这个效率主要是两方面的,一个是节省显存占用一个是提升计算速度

    对于前者,CoLLiE做出的改进主要在于,兼容以LOMO为代表的高效优化器,从而实现大语言模型的全参数微调,以及以LoRA为代表的参数高效的微调方法(Parameter-Efficient Fine-tuning,PEFT)。如下左图所示,相比于Adam等常见的优化算法,需要30+倍的参数大小的显存,LOMO和LoRA等PEFT,仅需要2倍的参数大小存储就可以实现了微调了。

    对于后者,CoLLiE做出的改进主要在于,兼容以FlashAttention等自注意力加速算法辅以ZeRO、PP/TP等多种模型并行策略。如下右图所示,我们选择CoLLiE和Huggingface在2048长序列上,预训练(batch_size=1024)和微调(batch_size=128)期间的吞吐量,具体来说,每个GPU每秒处理的token数量(tokens per GPU per second,TGS),来衡量框架的效率;发现在A100上,CoLLiE的吞吐量显著超过了Huggingface(Transformers),并且在RTX-3090上,CoLLiE也能通过TP和PP,实现了更高的吞吐量。由此,我们最终实现了,在有限的计算和存储资源实现对十亿级参数量的大语言模型的微调。

e9456680465b42a5803cb6fc98c55d5d

27c22b1ed678492d95a377d89659c6d7

2.2   CoLLiE 的 兼容易用

    CoLLiE 另一个很大的优势在于它的兼容与易用,这主要体现在以下的三个方面。首先,CoLLiE 极容易上手。如tutorial-1所示,在CoLLiE中,通过配置类CollieConfig可以轻松实现对多种并行机制的设置,以及通过config.use_flash轻松开启FlashAttention(v1 v2 都可以支持);不仅是CollieConfig,其他的模块,例如数据集 CollieDataset、评测单元 Evaluator 和 Metric,都是拿来即可以使用。

    其次,CoLLiE 对于其他框架的用户非常友好,尤其是Transformers和deepspeed的用户,都可以无缝衔接切换至CoLLiE。CoLLiE不仅基于上述两个框架实现,同时也对这两个框架进行了封装,让用户具有更流畅的使用体验。此外,CoLLiE支持多种主流LLM,使用CoLLiE定义的这些LLM,可以快速实现上述并行方法,即使对于其他框架,例如Transformers定义的LLM,也可以支持数据并行和ZeRO。

    最后,CoLLiE 对于其他框架有很好的兼容性,具体表现为CoLLiE保存的权重可以直接加载至Transformers,加载方式如下;如过既要使用其他框架的模型,又想通过CoLLiE设定并行策略,则需要在模型初始化之前执行 setup_distribution(config) 函数(该函数在CoLLiE模型初始化阶段首先被执行)。

from transformers import AutoModelForCausalLM
from collie.utils import setup_distribution

setup_distribution(config)

model = AutoModelForCausalLM.from_pretrained("./result")

2.3   CoLLiE 的 丰富功能

    CoLLiE 具有很多的功能,例如tutorial-1中示例代码所提到的:通过配置类CollieConfig设置并行策略,通过监视器Monitor观察训练过程、输出评测结果,以及如后续tutorial所示,通过回调函数Callback自定义训练过程,通过评测单元Evaluator来进行评测。

    在这里,我们通过以下的表格简要描述了CoLLiE中,不同代码文件对应的功能,包括CoLLiE的实现代码,见collie/,以及辅助的演示代码,见examples/;想了解的用户可以快速连接至相关文件查看;关于这些功能的详细叙述请参考后续的tutorial。

路径

功能

├─ collie

│   ├─ callbacks

实现CoLLiE的各种回调模块,详见 tutorial-4

│   │   ├─ callback.py

定义CoLLiE的回调机制基类,明确了CoLLiE的回调时机

│   │   ├─ callback_manager.py

定义CoLLiE回调类的管理模块,对应时机执行对应回调函数

│   │   ├─ checkpoint_callback.py

定义CoLLiE用于保存检查点的回调模块CheckpointCallback

│   │   ├─ has_monitor_callback.py

定义CoLLiE用于监控某个数值的回调模块ResultsMonitor

│   │   ├─ load_best_model_callback.py

定义CoLLiE用于保存最佳monitor模型的回调模块LoadBestModelCallback

│   │   ├─ topk_saver.py

定义CoLLiE用于识别topk模型并保存的回调模块TopkSaver

│   │   └─ utils.py

定义CoLLiE.callback相关的一些工具函数

│   ├─ config.py

实现CoLLiE的配置类CollieConfig,涉及各种配置参数,详见 tutorial-3

│   ├─ controller

实现CoLLiE的Evaluator、Trainer、Server

│   │   ├─ evaluator.py

定义CoLLiE的测试模块Evaluator,快速评测模型性能,详见 tutorial-3

│   │   ├─ server.py

定义CoLLiE的服务模块Server,多卡分布式大模型部署,详见 tutorial-4

│   │   ├─ trainer.py

定义CoLLiE的训练模块Trainer,快速实现分布式训练,详见 tutorial-3

│   │   └─ utils.py

定义CoLLiE训练过程中回调函数的触发器TrainerEventTrigger

│   ├─ data

实现CoLLiE预制的数据处理模块,详见 tutorial-3

│   │   ├─ batch_sampler.py

定义CoLLiE在最后个batch不满时的处理方式

│   │   ├─ dataloader.py

定义CoLLiE的DataLoader,训练过程中每次迭代出若干条数据

│   │   └─ dataset.py

定义CollieDatasetForTraining/Generation/Classification

│   ├─ driver/io

实现CoLLiE的文件读写模块

│   │   ├─ base.py

定义CoLLiE的读写类IODriver

│   │   └─ file.py

定义CoLLiE的文件读写类,继承自IODriver

│   ├─ log

实现CoLLiE的日志输出模块

│   │   ├─ handler.py

定义CoLLiE的输出行为TqdmLoggingHandler、StdoutStreamHandler

│   │   ├─ highlighter.py

定义CoLLiE的输出高亮行为ColorHighlighter

│   │   ├─ logger.py

定义CoLLiE的日志记录模块Logger,封装logging.Logger以及上述的模块

│   │   └─ print.py

定义CoLLiE的print函数,调用Logger模块,自定义CoLLiE的print方式

│   ├─ metrics

实现CoLLiE预制的评测模块,详见 tutorial-3

│   │   ├─ accuracy.py

定义CoLLiE的准确率,update需传入 {"pred": xxx, "target": xxx}

│   │   ├─ base.py

定义CoLLiE的评测基类,update计算指标,get_metric统计输出

│   │   ├─ bleu.py

定义CoLLiE的BLEU得分,update需传入 {"pred": xxx, "target": xxx}

│   │   ├─ classify_f1_pre_rec_metric.py

定义CoLLiE的F1值,update需传入 {"pred": xxx, "target": xxx}

│   │   ├─ decode.py

定义CoLLiE的解码行为,update需传入 {"pred": xxx}

│   │   ├─ ppl.py

定义CoLLiE的困惑度,update需传入 {"ppl": xxx}

│   │   └─ rouge.py

定义CoLLiE的Rouge得分,update需传入 {"pred": xxx, "target": xxx}

│   ├─ models

实现CoLLiE预定义的大模型,详见 tutorial-3

│   │   ├─ base.py

定义CoLLiE的LLM基类CollieModelForCausalLM,支持from_pretrained

│   │   ├─ chatglm

定义CoLLiE的ChatGLMForCausalLM,以及其内部模块

│   │   ├─ chatglm2

定义CoLLiE的ChatGLM2ForCausalLM,以及其内部模块

│   │   ├─ internlm

定义CoLLiE的InternLMForCausalLM,以及其内部模块

│   │   ├─ llama

定义CoLLiE的LlamaForCausalLM,以及其内部模块

│   │   ├─ moss

定义CoLLiE的MossForCausalLM,以及其内部模块

│   │   └─ moss_moon

定义CoLLiE的Moss003MoonForCausalLM,以及其内部模块

│   ├─ module.py

实现CoLLiE涉及的参数并行模块,详见 tutorial-6

│   ├─ optim

实现CoLLiE预定义的优化器,详见 tutorial-3

│   │   ├─ adan.py

定义CoLLiE版本的Adan优化器,参考 Adan论文

│   │   ├─ lomo.py

定义CoLLiE提出的LOMO优化器,参考 LOMO论文,详见 tutorial-5

│   │   ├─ lion.py

定义CoLLiE版本的Lion优化器

│   │   └─ sophiag.py

定义CoLLiE版本的SophiaG优化器

│   └─ utils

实现CoLLiE需要的工具类

│       ├─ data_provider.py

定义CoLLiE的异步数据提供器GradioProvider等

│       ├─ dist_utils.py

定义CoLLiE用于分布式以及环境初始化相关的辅助函数

│       ├─ metric_wrapper.py

定义CoLLiE封装metrics的模块MetricsWrapper

│       ├─ monitor.py

定义CoLLiE的各种监控器,记录训练过程的统计信息,详见 tutorial-4

│       ├─ padder.py

定义CoLLie的通用collate_fn构造器,默认左填充padding_left=True

│       ├─ peft_utils.py

定义从peft到CoLLiE的适配函数patch_peft_model和patch_prompt_tuning

│       ├─ pipeline_engine.py

定义从CoLLiE的流水线并行引擎ColliePipelineEngine

│       ├─ rich_progress.py

定义CoLLiE中进度条打印的格式

│       ├─ seq_len_to_mask.py

定义seq_len_to_mask函数,将seq_len数组转换为mask矩阵,pad为0

│       └─ utils.py

定义CoLLiE中的其他辅助类或函数

├─ examples

│   ├─ alpaca

│   │   ├─ alpaca.json

保存Alpaca的训练测试数据

│   │   └─ train.py

使用CoLLiE微调LLaMA,3D并行,得到Alpaca实例

│   ├─ finetune_chatglm_for_translation.py

使用CoLLiE微调ChatGLM,流水线并行,训练IWSLT2017文本翻译

│   ├─ finetune_llama_for_classification.py

使用CoLLiE微调LLaMA,ZeRO3,训练IMDB文本分类

│   ├─ finetune_llama_for_summary.py

使用CoLLiE微调LLaMA,张量并行,训练BillSum文本摘要

│   ├─ finetune_llama_for_translation.py

使用CoLLiE微调LLaMA,流水线并行,训练IWSLT2017文本翻译

│   ├─ further_pretrain_llama

│   │   ├─ chinese_sp.model

保存微调需要的中文分词模型chinese_sp_model

│   │   └─ expand_vocab.py

使用CoLLiE微调LLaMA,3D并行,进行中英文混合训练

│   ├─ one_sentence_overfitting

│   │   └─ 3d_parallelism.py

使用CoLLiE微调LLaMA,3D并行,过拟合一句话

│   ├─ peft

│   │   └─ finetune_llama_prompt_tuning.py

使用CoLLiE微调LLaMA,张量并行+数据并行,训练IMDB文本分类

│   └─ server.py

使用CoLLiE部署LLaMA-13B

├─ requirements.txt

描述CoLLiE安装主要依赖的包

└─ setup.py

安装CoLLiE

其它版本