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,实现了更高的吞吐量。由此,我们最终实现了,在有限的计算和存储资源实现对十亿级参数量的大语言模型的微调。
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 |