首页 > 其他分享 >用ColossalAI完成一次完整的预训练

用ColossalAI完成一次完整的预训练

时间:2023-12-26 19:32:05浏览次数:36  
标签:ColossalAI tokenizer sm 训练 -- flash 词表 完整 install

太难了,累懵了,全是坑...

      最近没更新,其实有机会(怎么个机会不细说了)可以玩玩两台新出炉的H100,而且是8卡400G IB的,这两台估计已经超过了库里南的价格了, 极其的豪华...

用ColossalAI完成一次完整的预训练_CUDA

用ColossalAI完成一次完整的预训练_python_02

      因为我正好没看《乡村爱情15》,我买了个youku会员,可以边看《乡村爱情15》边拿H100跑一跑训练,看看具体怎么个实力。

      但是时间有限啊,主要是成本,那好钢要用在刀刃上,所以我在考虑用什么来测试它, 我没玩过megatron,deepspeed又弄过了,所以我挑战了一下Colossal,然后就被一顿教育...

点,可是这代码质量和维护项目的速度真的是...

      具体的细节我后面会再写一篇文章写,也不是单独针对Colossal的,因为像分布式训练的一些基础,我觉得非常有必要深入浅出的多写几篇文章才能说明白,估计TP,PP,DDP,Gemini,Zero,1D,  2D, 2.5D,3D,每个概念都够水一篇文章的了

用ColossalAI完成一次完整的预训练_CUDA_03

      有道是光说不练,假把式,所以今天呢,先从一个demo做起,让大家先看一下它是怎么个操作流程和玩法(我改动的一些原始代码就算了,第一太多,第二这一个礼拜改的太多,我都快记不住哪是哪了

用ColossalAI完成一次完整的预训练_github_04

,我也几乎每个发现的问题都报了bug,希望后面能fix) 

言归正传,项目地址:hpcaitech/ColossalAI at v0.3.4 (github.com)

       下载了之后项目的目录结构是这样的

用ColossalAI完成一次完整的预训练_python_05

       为了简单测试,我就选择了Llama2的模型,在上面的红框部分,有两个Llama2的Demo,今天我以application中的demo为案例演示一下

首先安装需要的库

cd Colossal-LLaMA-2

pip install -r requirements.txt

在flash-attention的目录下(这个要去git自己下载,然后到了项目目录下,才能安装以下几个组件,pip install flash-attn是不行的)

# At the root folder

cd csrc/xentropy && pip install .

# At the root folder

cd csrc/layer_norm && pip install .

# At the root folder

cd csrc/rotary && pip install .

pretrain第一步:

扩充词表,崭新的分词器,这一步的意义是引入原模型无法识别的词汇,如比较复杂的中文词组。

词表的格式是是这样的:

{"piece": "你好"}

{"piece": "人工智能"}


export PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION='python'

python colossal_llama2/tokenizer/init_tokenizer.py \

    --source_tokenizer_dir "/aml2/llama2" \

    --target_tokenizer_dir "/aml2/llam2/newtoken" \

    --expand_tokens_file "/aml2/llama2/jsl/3.jsonl"

用ColossalAI完成一次完整的预训练_CUDA_06

pretrain第二步:

加载预训练模型:

我没有那么多词表,弄起来也麻烦所以我直接用Alpaca的词表来当构建的新词表

这一步的目的是把新词表和原始模型做整合

python colossal_llama2/model/init_model.py \

    --source_model_and_tokenizer_path "/aml2/llama2" \

    --target_tokenizer_path "/aml/chinese-alpaca-2-7b" \

    --target_model_path "/aml2/llama2/model"


用ColossalAI完成一次完整的预训练_python_07

Alpaca词表搞得有点大了,1分钟500个input,有20000多增量,太慢了(失误)...

pretrain第三步:

整理数据格式,符合训练要求。

大概可以整理成这样

{"source": "", "target": "Lionel Andrés Messi(Spanish pronunciation: [ljoˈnel anˈdɾes ˈmesi] (i); born 24 June 1987), also known as Leo Messi, is an Argentine professional footballer who plays as a forward for and captains both Major League Soccer club Inter Miami and the Argentina national team.", "category": "sports"}

{"source": "猜谜语:一身卷卷细毛,吃的青青野草,过了数九寒冬,无私献出白毛。(打一动物)", "target": "白羊", "category": "riddle"}

当然它的dataset格式不一定符合现有数据的要求,可以改代码部分(我就改了),也可以用python调整一下原始数据的catalog

用ColossalAI完成一次完整的预训练_github_08

一切就绪就开启训练模式


开启训练模式

具体的脚本大概长这样

用ColossalAI完成一次完整的预训练_github_09

基本就还是那些配置

  • 基础模型(就是参数)
  • parallel的模式 Zero,3D之类的
  • 精度
  • 梯度accumulate,checking之类的

用ColossalAI完成一次完整的预训练_python_10

这样就可以训练属于你自己的Llama预训练模型了

总结:Colossal真的是feature满满,但是不够成熟,你得有耐心和手法去折腾,另外对环境要求还是比较古老,如果这些不能接受,还是选Deepspeed吧!

Tips:不支持Torch2.0及以上,我把代码迁移到H100上以后....  

用ColossalAI完成一次完整的预训练_github_11

  warnings.warn(incompatible_device_warn.format(device_name, capability, " ".join(arch_list), device_name))


/aml/colo/lib/python3.10/site-packages/colossalai/kernel/cuda_native/mha/flash_attn_2.py:28: UserWarning: please install flash_attn from https://github.com/HazyResearch/flash-attention

  warnings.warn("please install flash_attn from https://github.com/HazyResearch/flash-attention")

/aml/colo/lib/python3.10/site-packages/torch/cuda/__init__.py:155: UserWarning: 

NVIDIA H100 80GB HBM3 with CUDA capability sm_90 is not compatible with the current PyTorch installation.

The current PyTorch install supports CUDA capabilities sm_37 sm_50 sm_60 sm_61 sm_70 sm_75 sm_80 sm_86 compute_37.

If you want to use the NVIDIA H100 80GB HBM3 GPU with PyTorch, please check the instructions at https://pytorch.org/get-started/locally/

先是Torch 根本就发挥不出H100 高级算子的实力,后来NCCL也来捣乱,索性就放弃了...

用ColossalAI完成一次完整的预训练_CUDA_12

下一篇可以写SFT

标签:ColossalAI,tokenizer,sm,训练,--,flash,词表,完整,install
From: https://blog.51cto.com/u_16432251/8986884

相关文章

  • 数据库清空,镜像编译,docker配置文件及服务启动完整流程
    前言:当数据库表发生变更的时候。 要做的事情:一、更改数据库表#删除表,更改数据库表(表结构改变)droptableifexistssrc20_v3;droptableifexistssrc20_valid_v4;droptableifexistssrc20_tick_v4;droptableifexistssrc20_mint_progress_v4;droptableifex......
  • 代码随想录算法训练营第二天 | 239. 滑动窗口最大值,347.前 K 个高频元素
    一、239.滑动窗口最大值题目链接:LeetCode239.滑动窗口最大值学习前:思路:无学习后:自定义双端队列,实现push、pop、peek方法,使得队列单调非增。peek方法不变;当入队时,若当前元素比队尾元素大,则pop队尾,直到队列为空或当前元素不大于队尾元素;当出队时,若队列非空且队首元素和窗......
  • 近屿智能OJAC第六期AIGC星辰大海:大模型工程师与产品专家深度训练营已拉开序幕
    您想成为AIGC大模型领域的佼佼者吗? 近屿智能OJAC第六期AIGC星辰大海:大模型工程师与产品专家深度训练营已拉开序幕,上千名学员已经实现转行、跳槽、升职、加薪,还不赶快行动起来,这是专为您量身定制的AI大模型学习之旅! 一、现在0元报名,领取2天的试听课! 为了让更多的感兴趣的学员能够......
  • AI分布式训练:DDP (数据并行)技术详解与实战
    分布式训练:DDP(数据并行)技术详解与实战一、背景介绍什么是AI分布式训练分布式训练作为一种高效的训练方法,在机器学习领域中得到了广泛的应用和关注。而其中的一种技术,就是数据并行(DDP)。在本节中,我们将详细介绍什么是AI分布式训练,并重点讨论了数据并行技术的原理和实施方式。我们将......
  • YOLOV8解读--分类模型训练与预测
    YOLOV8命名不同于V5系列,V8不强调yolo这一模型,更加强调其框架属性,所以V8在github上的项目名为 ultralytics。所以在下载代码时不要怀疑,就是这个地址:https://github.com/ultralytics/ultralytics下边写基于V8模型做分类的方法数据集部分分类模型的数据集与V5的检测或分割最大的不用......
  • 【flink番外篇】5、flink的window(介绍、分类、函数及Tumbling、Sliding、session窗口
    Flink系列文章一、Flink专栏Flink专栏系统介绍某一知识点,并辅以具体的示例进行说明。1、Flink部署系列本部分介绍Flink的部署、配置相关基础内容。2、Flink基础系列本部分介绍Flink的基础部分,比如术语、架构、编程模型、编程指南、基本的datastreamapi用法、四大基......
  • Hzero教程:创建基于hzero的springboot单体maven项目完整步骤
    创建项目更新时间:2023-12-0115:38:30介绍项目是基于Springboot的maven项目,本章节介绍怎样创建基于HZERO平台的项目。新建maven项目添加项目依赖添加默认配置文件创建maven项目本地新建一个空的maven项目hzero-todo-service。$mkdir-phzero-todo-service$cdhzero-tod......
  • 跨网段通信的完整过程
    1、拓扑图2、过程描述1)PC1通过本地ip地址、本地掩码、对端ip地址进行计算(本地ip地址和本地掩码进行&运算,判断是否为同一网段),发现目的的设备PC2与PC1不在同一网段,判断改通信为三层通信,将去往PC2的流量发给网关。PC1发送的数据帧:SMAC=PC1MAC,DMAC=网关MAC2)交换机收到PC1发送的去往P......
  • 0基础学训练AIGC大模型,三个月成为AI领域的精英人才!
    近屿智能OJAC“AIGC星辰大海:大模型工程师与产品专家深度训练营”第五期正在火热学习中,期望转型成为AIGC大模型工程师或者产品经理的朋友们,可以抓紧时间联系我们报名第六期啦~ 别人教您使用AIGC产品,我们教您增量预训练和精调大模型和创造AI产品! 如果您正在考虑转型成为AIGC大模型......
  • 基于pytorch写一个三层神经网络,训练数据并导出模型
     importtorchimporttorch.nnasnnimporttorch.optimasoptim#定义三层神经网络classThreeLayerNN(nn.Module):def__init__(self,input_size,hidden_size1,hidden_size2,output_size):super(ThreeLayerNN,self).__init__()self.fc1=......