LLMs之InternLM:InternLM-20B的简介、安装、使用方法之详细攻略

news2024/12/24 13:25:04

LLMs之InternLM:InternLM-20B的简介、安装、使用方法之详细攻略

导读:2023年09月20日,由上海人工智能实验室等团队发布了InternLM-20B的大模型。它在OpenCompass提出的5个能力维度上(语言、知识、理解、推理、学科)全面领先于同规模开源模型,InternLM-20B 在综合能力上全面领先于13B量级的开源模型,同时在推理评测集上接近甚至超越Llama-65B的性能。并且支持从单GPU到数千GPU(1024个)规模的扩展,千卡规模下训练吞吐超过180TFLOPS,平均单卡每秒处理的 token 数量超过3600。
更高质量和更高知识密度的数据集:相较于InternLM-7B,InternLM-20B使用的预训练数据经过了更高质量的清洗,并补充了高知识密度和用于强化理解和推理能力的训练数据。
基于 2.3T的Tokens+16k上下文+深度整合Flash-Attention+Apex+构建 Hybrid Zero 技术+LMDeploy一键部署:InternLM-20B 在超过 2.3T Tokens 包含高质量英文、中文和代码的数据上进行预训练, 支持16k语境长度,其中 Chat 版本还经过了 SFT 和 RLHF 训练。InternLM 深度整合了 Flash-Attention, Apex 等高性能模型算子,提高了训练效率。通过构建 Hybrid Zero 技术,实现计算和通信的高效重叠,大幅降低了训练过程中的跨节点通信流量。提供LMDeploy一键部署工具,支持产品化部署应用。

目录

相关文章

论文简介

LLMs之InternLM:InternLM-7B模型的简介、安装、使用方法之详细攻略

LLMs之InternLM:InternLM-20B的简介、安装、使用方法之详细攻略

代码实战

InternLM-20B的简介

1、模型结果性能

2、训练性能

InternLM-20B的安装

0、下载模型

0.1、下载模型权重

0.2、下载项目代码

1、配置环境

T1、手动安装环境(安装复杂但环境控制高):

T2、基于提供的Docker镜像安装(安装简单但环境控制低):镜像配置及构造、镜像拉取、容器启动

2、数据处理:tokenizer.py文件

2.1、【预训练阶段】的数据集

2.2、【微调阶段】的数据集

3、预训练

3.1、训练配置,configs/7B_sft.py

数据配置

模型配置

并行配置

3.2、启动训练:train.py

T1、若在 slurm 上启动分布式运行环境,多节点 16 卡的运行命令如下所示

T2、若在 torch 上启动分布式运行环境,单节点 8 卡的运行命令如下所示

3.3、运行结果

4、模型转换—转换为主流的Transformers 格式使用

InternLM-20B的使用方法

1、利用三种工具实现应用

T1、通过 Transformers 加载

T2、通过 ModelScope 加载

T3、通过前端网页对话

T4、利用 LMDeploy基于InternLM高性能部署

第一步,首先安装 LMDeploy:

第二步,启动服务执行对话


相关文章

论文简介

LLMs之InternLM:InternLM-7B模型的简介、安装、使用方法之详细攻略

LLMs之InternLM:InternLM/InternLM-7B模型的简介、安装、使用方法之详细攻略_一个处女座的程序猿的博客-CSDN博客

LLMs之InternLM:InternLM-20B的简介、安装、使用方法之详细攻略

LLMs之InternLM:InternLM-20B的简介、安装、使用方法之详细攻略_一个处女座的程序猿的博客-CSDN博客

代码实战

更新中……

地址

GitHub地址:GitHub - InternLM/InternLM: InternLM has open-sourced a 7 and 20 billion parameter base models and chat models tailored for practical scenarios and the training system.

时间

2023年09月20日

作者

上海人工智能实验室+商汤科技+香港中文大学+复旦大学

InternLM-20B的简介

       InternLM 是一个开源的轻量级训练框架,旨在支持大模型训练而无需大量的依赖。通过单一的代码库,它支持在拥有数千个 GPU 的大型集群上进行预训练,并在单个 GPU 上进行微调,同时实现了卓越的性能优化。在1024个 GPU 上训练时,InternLM 可以实现近90%的加速效率。基于InternLM训练框架,我们已经发布了两个开源的预训练模型:InternLM-7B 和 InternLM-20B。       InternLM-20B 在超过 2.3T Tokens 包含高质量英文、中文和代码的数据上进行预训练,其中 Chat 版本还经过了 SFT 和 RLHF 训练,使其能够更好、更安全地满足用户的需求。

       InternLM 20B 在模型结构上选择了深结构,InternLM-20B 的层数设定为60层,超过常规7B和13B模型所使用的32层或者40层。在参数受限的情况下,提高层数有利于提高模型的综合能力。此外,相较于InternLM-7B,InternLM-20B使用的预训练数据经过了更高质量的清洗,并补充了高知识密度和用于强化理解和推理能力的训练数据。因此,它在理解能力、推理能力、数学能力、编程能力等考验语言模型技术水平的方面都得到了显著提升。总体而言,InternLM-20B具有以下的特点:
>> 优异的综合性能
>> 很强的工具调用功能
>> 支持16k语境长度(通过推理时外推)
>> 更好的价值对齐

1、模型结果性能

在OpenCompass提出的5个能力维度上,InternLM-20B都取得很好的效果(粗体为13B-33B这个量级范围内,各项最佳成绩)。总体而言,InternLM-20B 在综合能力上全面领先于13B量级的开源模型,同时在推理评测集上接近甚至超越Llama-65B的性能。

  • 评估结果来自 OpenCompass 20230920。
  • 由于 OpenCompass 的版本迭代,评估数据可能存在数值上的差异,所以请参考 OpenCompass 的最新评估结果。
能力维度Llama-13BLlama2-13BBaichuan2-13BInternLM-20BLlama-33BLlama-65BLlama2-70B
语言42.54747.55544.647.151.6
知识58.258.348.960.1646667.7
理解45.550.958.167.350.654.260.8
推理42.743.644.254.946.449.855
学科37.345.251.862.547.449.757.3
总平均43.847.349.459.248.951.957.4

下表在一些有重要影响力的典型数据集上比较了主流开源模型的表现

评测集Llama-13BLlama2-13BBaichuan2-13BInternLM-20BLlama-33BLlama-65BLlama2-70B
学科MMLU47.7354.9959.5562.0558.7363.7169.75
C-Eval (val)31.8341.459.0158.837.4740.3650.13
AGI-Eval22.0330.9337.3744.5833.5333.9240.02
知识BoolQ78.7582.426787.4684.4386.6187.74
TriviaQA52.4759.3646.6157.2666.2469.7970.71
NaturalQuestions20.1724.8516.3225.1530.8933.4134.16
理解CMRC9.2631.5929.8568.7814.1734.7343.74
CSL5558.7563.1265.6257.559.3860
RACE (middle)53.4163.0268.9486.3564.5572.3581.55
RACE (high)47.6358.8667.1883.2862.6168.0179.93
XSum20.3723.3725.2335.5420.5519.9125.38
推理WinoGrande64.6464.0167.3269.3866.8569.3869.77
BBH37.9345.6248.9852.5149.9858.3864.91
GSM8K20.3229.5752.6252.6242.354.4463.31
PIQA79.7179.7678.0780.2581.3482.1582.54
编程HumanEval14.0218.917.0725.6117.6818.926.22
MBPP20.626.830.835.628.433.639.6

2、训练性能

InternLM 深度整合了 Flash-Attention, Apex 等高性能模型算子,提高了训练效率。通过构建 Hybrid Zero 技术,实现计算和通信的高效重叠,大幅降低了训练过程中的跨节点通信流量。InternLM 支持 7B 模型从 8 卡扩展到 1024 卡,千卡规模下加速效率可高达 90%,训练吞吐超过 180TFLOPS,平均单卡每秒处理的 token 数量超过3600。下表为 InternLM 在不同配置下的扩展性测试数据:

GPU Number81632641282565121024
TGS40783939391939443928392038353625
TFLOPS193191188188187185186184

TGS 代表平均每GPU每秒可以处理的 Token 数量。更多的性能测试数据可参考训练性能文档进一步了解。

InternLM-20B的安装

0、下载模型

0.1、下载模型权重

模型在三个平台上发布:Transformers、ModelScope 和 OpenXLab

ModelTransformersModelScopeOpenXLab发布日期
InternLM Chat 20B🤗internlm/internlm-chat-20b​编辑 Shanghai_AI_Laboratory/internlm-chat-20b​编辑2023-09-20
InternLM 20B🤗internlm/internlm-20b​编辑 Shanghai_AI_Laboratory/internlm-20b​编辑2023-09-20
InternLM Chat 7B v1.1🤗internlm/internlm-chat-7b-v1.1​编辑 Shanghai_AI_Laboratory/internlm-chat-7b-v1_1​编辑2023-08-22
InternLM 7B🤗internlm/internlm-7b​编辑 Shanghai_AI_Laboratory/internlm-7b​编辑2023-07-06
InternLM Chat 7B🤗internlm/internlm-chat-7b​编辑 Shanghai_AI_Laboratory/internlm-chat-7b​编辑2023-07-06
InternLM Chat 7B 8k🤗internlm/internlm-chat-7b-8k​编辑 Shanghai_AI_Laboratory/internlm-chat-7b-8k​编辑2023-07-06

0.2、下载项目代码

项目系统代码文件结构

├── configs                                  # 配置模块,管理模型和训练相关参数
│   └── 7B_sft.py                            # 7B_sft.py 是系统 demo 的配置文件样例
├── internlm                                 # 系统代码的主目录
│   ├── apis                                 # 接口模块,包含一些关于推理等的接口函数
│   ├── core                                 # 核心模块,管理用于训练和推理的 parallel context 和训练调度引擎
│   │   ├── communication                    # 通信模块,负责流水线并行调度中的p2p通信
│   │   ├── context                          # context 模块,主要负责初始化并行进程组,并管理 parallel context
│   │   │   ├── parallel_context.py
│   │   │   └── process_group_initializer.py
│   │   ├── scheduler                        # 调度模块,管理并行训练的调度器,包括非流水线并行调度器和流水线并行调度器
│   │   │   ├── no_pipeline_scheduler.py
│   │   │   └── pipeline_scheduler.py
│   │   ├── engine.py                        # 负责管理模型的训练和评估过程
│   │   └── trainer.py                       # 负责管理训练引擎和调度器
│   ├── data                                 # 数据模块,负责管理数据集生成和处理
│   ├── initialize                           # 初始化模块,负责管理分布式环境启动和训练器初始化
│   ├── model                                # 模型模块,负责管理模型结构定义和实现
│   ├── solver                               # 负责管理 optimizer 和 lr_scheduler 等的实现
│   └── utils                                # 辅助模块,负责管理日志、存储、模型注册等
├── train.py                                 # 模型训练的主函数入口文件
├── requirements                             # 系统运行的依赖包列表
├── third_party                              # 系统所依赖的第三方模块,包括 apex 和 flash-attention 等
├── tools                                    # 一些脚本工具,用于原始数据集处理和转换,模型 checkpoint 转换等
└── version.txt                              # 系统版本号

1、配置环境

T1、手动安装环境(安装复杂但环境控制高):

安装依赖包

首先,需要安装的依赖包及对应版本列表如下:

Python == 3.10

GCC == 10.2.0

MPFR == 4.1.0

CUDA >= 11.7

Pytorch >= 1.13.1

Transformers >= 4.28.0

Flash-Attention >= v1.0.5

Apex == 23.05

Ampere或者Hopper架构的GPU (例如H100, A100)

Linux OS

以上依赖包安装完成后,需要更新配置系统环境变量:

export CUDA_PATH={path_of_cuda_11.7}

export GCC_HOME={path_of_gcc_10.2.0}

export MPFR_HOME={path_of_mpfr_4.1.0}

export LD_LIBRARY_PATH=${GCC_HOME}/lib64:${MPFR_HOME}/lib:${CUDA_PATH}/lib64:$LD_LIBRARY_PATH

export PATH=${GCC_HOME}/bin:${CUDA_PATH}/bin:$PATH

export CC=${GCC_HOME}/bin/gcc

export CXX=${GCC_HOME}/bin/c++

环境安装

下载项目代码、conda启动虚拟环境、安装flash-attention和Apex

将项目internlm及其依赖子模块,从 github 仓库中 clone 下来,命令如下:

git clone git@github.com:InternLM/InternLM.git --recurse-submodules

推荐使用 conda 构建一个 Python-3.10 的虚拟环境, 并基于requirements/文件安装项目所需的依赖包:

conda create --name internlm-env python=3.10 -y

conda activate internlm-env

cd internlm

pip install -r requirements/torch.txt

pip install -r requirements/runtime.txt

安装 flash-attention (version v1.0.5):

cd ./third_party/flash-attention

python setup.py install

cd ./csrc

cd fused_dense_lib && pip install -v .

cd ../xentropy && pip install -v .

cd ../rotary && pip install -v .

cd ../layer_norm && pip install -v .

cd ../../../../

安装 Apex (version 23.05):

cd ./third_party/apex

pip install -v --disable-pip-version-check --no-cache-dir --global-option="--cpp_ext" --global-option="--cuda_ext" ./

cd ../../

T2、基于提供的Docker镜像安装(安装简单但环境控制低):镜像配置及构造、镜像拉取、容器启动

镜像配置及构造

用户可以使用提供的 dockerfile 结合 docker.Makefile 来构建自己的镜像,或者也可以从 https://hub.docker.com/r/internlm/internlm 获取安装了 InternLM 运行环境的镜像。

(1)、镜像配置及构造

dockerfile 的配置以及构造均通过 docker.Makefile 文件实现,在 InternLM 根目录下执行如下命令即可 build 镜像:

make -f docker.Makefile BASE_OS=centos7

在 docker.Makefile 中可自定义基础镜像,环境版本等内容,对应参数可直接通过命令行传递。对于 BASE_OS 分别支持 ubuntu20.04 和 centos7。

镜像拉取

(2)、镜像拉取

基于 ubuntu 和 centos 的标准镜像已经 build 完成也可直接拉取使用:

# ubuntu20.04

docker pull internlm/internlm:torch1.13.1-cuda11.7.1-flashatten1.0.5-ubuntu20.04

# centos7

docker pull internlm/internlm:torch1.13.1-cuda11.7.1-flashatten1.0.5-centos7

容器启动

(3)、容器启动

对于使用 dockerfile 构建或拉取的本地标准镜像,使用如下命令启动并进入容器:

docker run --gpus all -it -m 500g --cap-add=SYS_PTRACE --cap-add=IPC_LOCK --shm-size 20g --network=host --name myinternlm internlm/internlm:torch1.13.1-cuda11.7.1-flashatten1.0.5-centos7 bash

容器内默认目录即 /InternLM,根据使用文档即可启动训练。

2、数据处理:tokenizer.py文件

2.1、【预训练阶段】的数据集

简介

InternLM训练任务的数据集包括一系列的bin和meta文件。

使用tokenizer从原始文本文件生成训练用数据集。通过在tools/tokenizer.py中指定模型参数路径的方式来导入tokenizer模型。目前提供V7_sft.model来生成tokens。若想使用不同的模型,可直接修改tokernizer.py中的模型参数路径。

使用方法

可以运行以下命令生成原始数据对应的bin和meta文件,其中参数text_input_path表示原始文本数据路径,目前支持txt、json和jsonl三种输入格式,bin_output_path表示生成的bin文件的保存路径。

$ python tools/tokenizer.py --text_input_path your_input_text_path --bin_output_path your_output_bin_path

案例

下面是一个数据处理的例子:

给定一个包含原始数据集的文件raw_data.txt,原始数据集如下所示:

感恩生活中的每一个细节,才能真正体会到幸福的滋味。

梦想是人生的动力源泉,努力追逐,才能实现自己的目标。

学会宽容和理解,才能建立真正和谐的人际关系。

可以通过运行以下命令来生成bin和meta文件:

$ python tools/tokenizer.py --text_input_path raw_data.txt --bin_output_path cn/output.bin

文件简介

生成的bin文件简介

需要注意的是,生成的bin文件需要保存在cn【中文数据集】或者en【英文数据集】或者code【代码数据集】或者ja【日语数据集】或者ar【阿拉伯语数据集】或者kaoshi【考试数据集】这六个目录下,以区分数据集的类型。

生成的bin文件的格式如下:

{"tokens": [73075, 75302, 69522, 69022, 98899, 67713, 68015, 81269, 74637, 75445, 99157]}

{"tokens": [69469, 60355, 73026, 68524, 60846, 61844, 98899, 67775, 79241, 98899, 67713, 67800, 67453, 67838, 99157]}

{"tokens": [68057, 79017, 60378, 68014, 98899, 67713, 67990, 68015, 70381, 67428, 61003, 67622, 99157]}

bin文件中的每一行均对应原始数据集中的每一个句子,表示每个句子的token(下文将用sequence指定)。

生成的meta文件简介

生成的meta文件简介

生成的meta文件的格式如下:

(0, 11), (90, 15), (208, 13)

在meta文件中,每个元组对应着bin文件中每一个sequence的元信息。其中,元组的

第一个元素表示每个sequence在所有sequence中的starting index,

第二个元素表示每个sequence中有多少个tokens。

例如,对于第一个sequence,starting index为 0,有 11 个tokens;对于第二个sequence,由于第一个sequence转换为string后的长度为89,因此它的starting index为 90,有 15 个tokens。

json和jsonl类型的文件的bin和meta文件格式和txt一致,此处不再赘叙。

2.2、【微调阶段】的数据集

简介

微调任务的数据集格式与预训练任务保持一致,生成的数据格式为一系列的bin和meta文件。以下以 Alpaca 数据集为例,介绍微调的数据准备流程。

实现步骤

第一步,下载Alpaca 数据集:https://github.com/tatsu-lab/stanford_alpaca/blob/main/alpaca_data.json

第二步,对 Alpaca 数据进行 tokenize,使用以下命令

python tools/alpaca_tokenizer.py /path/to/alpaca_dataset /path/to/output_dataset /path/to/tokenizer --split_ratio 0.1

建议用户参考 alpaca_tokenizer.py 编写新的脚本对自己的数据集进行tokenize

3、预训练

3.1、训练配置,configs/7B_sft.py

以 7B Demo 的配置文件configs/7B_sft.py为例:接下来将详细介绍启动一个模型训练所需要进行的数据、模型、并行和监控等相关的配置。

JOB_NAME = "7b_train"
DO_ALERT = False

SEQ_LEN = 2048
HIDDEN_SIZE = 4096
NUM_ATTENTION_HEAD = 32
MLP_RATIO = 8 / 3
NUM_LAYER = 32
VOCAB_SIZE = 103168

MODEL_ONLY_FOLDER = "local:llm_ckpts/xxxx"
# Ckpt folder format:
# fs: 'local:/mnt/nfs/XXX'
SAVE_CKPT_FOLDER = "local:llm_ckpts"
LOAD_CKPT_FOLDER = "local:llm_ckpts/49"

# boto3 Ckpt folder format:
# import os
# BOTO3_IP = os.environ["BOTO3_IP"] # boto3 bucket endpoint
# SAVE_CKPT_FOLDER = f"boto3:s3://model_weights.{BOTO3_IP}/internlm"
# LOAD_CKPT_FOLDER = f"boto3:s3://model_weights.{BOTO3_IP}/internlm/snapshot/1/"
CHECKPOINT_EVERY = 50
ckpt = dict(
    enable_save_ckpt=False,  # enable ckpt save.
    save_ckpt_folder=SAVE_CKPT_FOLDER,  # Path to save training ckpt.
    # load_ckpt_folder= dict(path=MODEL_ONLY_FOLDER, content=["model"], ckpt_type="normal"),
    load_ckpt_folder="local:llm_ckpts/",
    # 'load_ckpt_info' setting guide:
    # 1. the 'path' indicate ckpt path,
    # 2. the 'content‘ means what states will be loaded, support: "model", "sampler", "optimizer", "scheduler", "all"
    # 3. the ’ckpt_type‘ means the type of checkpoint to be loaded, now only 'normal' type is supported.
    load_ckpt_info=dict(path=MODEL_ONLY_FOLDER, content=("model",), ckpt_type="internlm"),
    checkpoint_every=CHECKPOINT_EVERY,
    async_upload=True,  # async ckpt upload. (only work for boto3 ckpt)
    async_upload_tmp_folder="/dev/shm/internlm_tmp_ckpt/",  # path for temporarily files during asynchronous upload.
    oss_snapshot_freq=int(CHECKPOINT_EVERY / 2),  # snapshot ckpt save frequency.
)

TRAIN_FOLDER = "/path/to/dataset"
VALID_FOLDER = "/path/to/dataset"
data = dict(
    seq_len=SEQ_LEN,
    # micro_num means the number of micro_batch contained in one gradient update
    micro_num=4,
    # packed_length = micro_bsz * SEQ_LEN
    micro_bsz=2,
    # defaults to the value of micro_num
    valid_micro_num=4,
    # defaults to 0, means disable evaluate
    valid_every=50,
    pack_sample_into_one=False,
    total_steps=50000,
    skip_batches="",
    rampup_batch_size="",
    # Datasets with less than 50 rows will be discarded
    min_length=50,
    # train_folder=TRAIN_FOLDER,
    # valid_folder=VALID_FOLDER,
    empty_cache_and_diag_interval=10,
    diag_outlier_ratio=1.1,
)

grad_scaler = dict(
    fp16=dict(
        # the initial loss scale, defaults to 2**16
        initial_scale=2**16,
        # the minimum loss scale, defaults to None
        min_scale=1,
        # the number of steps to increase loss scale when no overflow occurs
        growth_interval=1000,
    ),
    # the multiplication factor for increasing loss scale, defaults to 2
    growth_factor=2,
    # the multiplication factor for decreasing loss scale, defaults to 0.5
    backoff_factor=0.5,
    # the maximum loss scale, defaults to None
    max_scale=2**24,
    # the number of overflows before decreasing loss scale, defaults to 2
    hysteresis=2,
)

hybrid_zero_optimizer = dict(
    # Enable low_level_optimzer overlap_communication
    overlap_sync_grad=True,
    overlap_sync_param=True,
    # bucket size for nccl communication params
    reduce_bucket_size=512 * 1024 * 1024,
    # grad clipping
    clip_grad_norm=1.0,
)

loss = dict(
    label_smoothing=0,
)

adam = dict(
    lr=1e-4,
    adam_beta1=0.9,
    adam_beta2=0.95,
    adam_beta2_c=0,
    adam_eps=1e-8,
    weight_decay=0.01,
)

lr_scheduler = dict(
    total_steps=data["total_steps"],
    init_steps=0,  # optimizer_warmup_step
    warmup_ratio=0.01,
    eta_min=1e-5,
    last_epoch=-1,
)

beta2_scheduler = dict(
    init_beta2=adam["adam_beta2"],
    c=adam["adam_beta2_c"],
    cur_iter=-1,
)

model = dict(
    checkpoint=False,  # The proportion of layers for activation aheckpointing, the optional value are True/False/[0-1]
    num_attention_heads=NUM_ATTENTION_HEAD,
    embed_split_hidden=True,
    vocab_size=VOCAB_SIZE,
    embed_grad_scale=1,
    parallel_output=True,
    hidden_size=HIDDEN_SIZE,
    num_layers=NUM_LAYER,
    mlp_ratio=MLP_RATIO,
    apply_post_layer_norm=False,
    dtype="torch.float16",  # Support: "torch.float16", "torch.half", "torch.bfloat16", "torch.float32", "torch.tf32"
    norm_type="rmsnorm",
    layer_norm_epsilon=1e-5,
    use_flash_attn=True,
    num_chunks=1,  # if num_chunks > 1, interleaved pipeline scheduler is used.
)
"""
zero1 parallel:
    1. if zero1 <= 0, The size of the zero process group is equal to the size of the dp process group,
        so parameters will be divided within the range of dp.
    2. if zero1 == 1, zero is not used, and all dp groups retain the full amount of model parameters.
    3. zero1 > 1 and zero1 <= dp world size, the world size of zero is a subset of dp world size.
        For smaller models, it is usually a better choice to split the parameters within nodes with a setting <= 8.
pipeline parallel (dict):
    1. size: int, the size of pipeline parallel.
    2. interleaved_overlap: bool, enable/disable communication overlap when using interleaved pipeline scheduler.
tensor parallel: tensor parallel size, usually the number of GPUs per node.
"""
parallel = dict(
    zero1=8,
    pipeline=dict(size=1, interleaved_overlap=True),
    sequence_parallel=False,
)

cudnn_deterministic = False
cudnn_benchmark = False

monitor = dict(
    # feishu alert configs
    alert=dict(
        enable_feishu_alert=DO_ALERT,
        feishu_alert_address=None,  # feishu webhook to send alert message
        light_monitor_address=None,  # light_monitor address to send heartbeat
    ),
)

数据配置

数据相关的关键参数配置及释义如下所示

目前支持传入数据集文件路径train_folder,且要求文件格式如下:

- folder

    - code

        train_000.bin

        train_000.bin.meta

数据集的详细内容可参考数据准备模块相关的介绍。

TRAIN_FOLDER = "/path/to/dataset"
SEQ_LEN = 2048
data = dict(
    seq_len=SEQ_LEN,  # 数据样本长度,默认值为 2048
    micro_num=1,  # micro_num 是指在一次模型参数更新中会处理的 micro_batch 的数目,默认值为 1
    micro_bsz=1,  # packed_length = micro_bsz * SEQ_LEN,为一次处理的 micro_batch 的数据大小,默认值为 1
    total_steps=50000,  # 总的所需执行的 step 的数目,默认值为 50000
    min_length=50,  # 若数据集文件中,数据行数少于50,将会被废弃
    train_folder=TRAIN_FOLDER,  # 数据集文件路径,默认值为 None;若 train_folder 为空,则以自动生成的随机数据集进行训练测试
    pack_sample_into_one=False, # 数据整理的逻辑,决定是按照 seq_len 维度或者是 sequence 的真实长度来进行attention计算
)

模型配置

加载模型 checkpoint

如果在启动训练时要加载模型 checkpoint,可进行如下相关配置:

注意:路径若以 local: 为前缀,则存储在本地文件系统;若以 boto3: 为前缀,则存储在远程 oss 上

关键参数

模型相关关键参数配置如下所示:

注意:用户可自定义模型类型名和模型结构,并配置相对应的模型参数。通过utils/registry.py下的MODEL_INITIALIZER对象进行模型初始化函数接口注册,在训练主函数train.py中初始化模型时,可通过model_type配置获取指定的模型初始化接口函数。

如果基于 InternLM 7B继续训练,可以参考 ModelZoo 中 OpenXLab 链接下载权重

如果在启动训练时要加载模型 checkpoint,可进行如下相关配置:
SAVE_CKPT_FOLDER = "local:/path/to/save/ckpt"
LOAD_CKPT_FOLDER = "local:/path/to/load/resume/ckpt"
ckpt = dict(
    save_ckpt_folder=SAVE_CKPT_FOLDER,  # 存储模型和优化器 checkpoint 的路径
    checkpoint_every=float("inf"),  # 每多少个 step 存储一次 checkpoint,默认值为 inf
    # 断点续训时,加载模型和优化器等权重的路径,将从指定的 step 恢复训练
    # content 表示哪些状态会被加载,支持: "model", "sampler", "optimizer", "scheduler", "all"
    # ckpt_type 表示加载的模型类型,目前支持: "internlm"
    load_ckpt_info=dict(path=MODEL_ONLY_FOLDER, content=("model",), ckpt_type="internlm"),
)




模型相关关键参数配置如下所示:
model_type = "INTERNLM"  # 模型类型,默认值为 "INTERNLM",对应模型结构初始化接口函数
NUM_ATTENTION_HEAD = 32
VOCAB_SIZE = 103168
HIDDEN_SIZE = 4096
NUM_LAYER = 32
MLP_RATIO = 8 / 3
model = dict(
    checkpoint=False,   # 进行重计算的模型层数比例,可选值为 True/False/[0-1]
    num_attention_heads=NUM_ATTENTION_HEAD,
    embed_split_hidden=True,
    vocab_size=VOCAB_SIZE,
    embed_grad_scale=1,
    parallel_output=True,
    hidden_size=HIDDEN_SIZE,
    num_layers=NUM_LAYER,
    mlp_ratio=MLP_RATIO,
    apply_post_layer_norm=False,
    dtype="torch.bfloat16",
    norm_type="rmsnorm",
    layer_norm_epsilon=1e-5,
)

注意:用户可自定义模型类型名和模型结构,并配置相对应的模型参数。通过utils/registry.py下的MODEL_INITIALIZER对象进行模型初始化函数接口注册,在训练主函数train.py中初始化模型时,可通过model_type配置获取指定的模型初始化接口函数。

如果基于 InternLM 7B继续训练,可以参考 ModelZoo 中 OpenXLab 链接下载权重

并行配置

训练并行配置样例如下:

参数

zero1:zero 并行策略,分如下三种情况,默认值为 -1

>> 当zero1 <= 0,则 zero1 进程组的大小等于数据并行进程组的大小,因此优化器状态参数将在数据并行范围内分配

>> 当zero1 == 1,则不使用 zero1 ,所有数据并行组保留完整的优化器状态参数

>> 当zero1 > 1且zero1 <= data_parallel_world_size,则 zero1 进程组是数据并行进程组的子集

tensor:张量并行大小,通常是每个节点的 GPU 数量,默认值为 1

pipeline:流水线并行策略

>> size:流水线并行大小,默认值为 1

>> interleaved_overlap:bool 类型,交错式调度时,开启或关闭通信优化,默认值为关闭

sequence_parallel:是否开启序列化并行,默认值为 False

注意

注意:数据并行大小 = 总的 GPU 数目 / 流水线并行大小 / 张量并行大小

parallel = dict(
    zero1=8,
    tensor=1,
    pipeline=dict(size=1, interleaved_overlap=True),
    sequence_parallel=False,
)

3.2、启动训练:train.py

完成了以上数据集准备和相关训练配置后,可启动 Demo 训练。接下来分别以 slurm 和 torch 环境为例,介绍训练启动方式。

T1、若在 slurm 上启动分布式运行环境,多节点 16 卡的运行命令如下所示
$ srun -p internllm -N 2 -n 16 --ntasks-per-node=8 --gpus-per-task=1 python train.py --config ./configs/7B_sft.py

T2、若在 torch 上启动分布式运行环境,单节点 8 卡的运行命令如下所示
$ torchrun --nnodes=1 --nproc_per_node=8 train.py --config ./configs/7B_sft.py --launcher "torch"

3.3、运行结果

以 slurm 上单机 8 卡的 Demo 训练配置为例,训练结果日志展示如下:

2023-07-07 12:26:58,293	INFO launch.py:228 in launch -- Distributed environment is initialized, data parallel size: 8, pipeline parallel size: 1, tensor parallel size: 1
2023-07-07 12:26:58,293	INFO parallel_context.py:535 in set_seed -- initialized seed on rank 2, numpy: 1024, python random: 1024, ParallelMode.DATA: 1024, ParallelMode.TENSOR: 1024,the default parallel seed is ParallelMode.DATA.
2023-07-07 12:26:58,295	INFO train.py:378 in main -- ===========New Run Jul07_12-26-58 on host:SH-IDC1-10-140-0-135,tp:0,pp=0,dp=0===========
2023-07-07 12:26:58,296	INFO train.py:378 in main -- ===========New Run Jul07_12-26-58 on host:SH-IDC1-10-140-0-135,tp:0,pp=0,dp=5===========
2023-07-07 12:26:58,296	INFO train.py:378 in main -- ===========New Run Jul07_12-26-58 on host:SH-IDC1-10-140-0-135,tp:0,pp=0,dp=1===========
2023-07-07 12:26:58,296	INFO train.py:378 in main -- ===========New Run Jul07_12-26-58 on host:SH-IDC1-10-140-0-135,tp:0,pp=0,dp=6===========
2023-07-07 12:26:58,296	INFO train.py:378 in main -- ===========New Run Jul07_12-26-58 on host:SH-IDC1-10-140-0-135,tp:0,pp=0,dp=7===========
2023-07-07 12:26:58,296	INFO train.py:378 in main -- ===========New Run Jul07_12-26-58 on host:SH-IDC1-10-140-0-135,tp:0,pp=0,dp=2===========
2023-07-07 12:26:58,296	INFO train.py:378 in main -- ===========New Run Jul07_12-26-58 on host:SH-IDC1-10-140-0-135,tp:0,pp=0,dp=4===========
2023-07-07 12:26:58,296	INFO train.py:378 in main -- ===========New Run Jul07_12-26-58 on host:SH-IDC1-10-140-0-135,tp:0,pp=0,dp=3===========
2023-07-07 12:28:27,826	INFO hybrid_zero_optim.py:295 in _partition_param_list -- Number of elements on ranks: [907415552, 907411456, 910163968, 910163968, 921698304, 921698304, 921698304, 921698304], rank:0
2023-07-07 12:28:57,802	INFO train.py:323 in record_current_batch_training_metrics -- tflops=63.27010355651958,step=0,loss=11.634403228759766,tgs (tokens/gpu/second)=1424.64,lr=4.0000000000000003e-07,loss_scale=65536.0,grad_norm=63.672620777841004,micro_num=4,num_consumed_tokens=131072,inf_nan_skip_batches=0,num_samples_in_batch=19,largest_length=2048,largest_batch=5,smallest_batch=4,adam_beta2=0.95,fwd_bwd_time=6.48
2023-07-07 12:29:01,636	INFO train.py:323 in record_current_batch_training_metrics -- tflops=189.83371103277346,step=1,loss=11.613704681396484,tgs (tokens/gpu/second)=4274.45,lr=6.000000000000001e-07,loss_scale=65536.0,grad_norm=65.150786641452,micro_num=4,num_consumed_tokens=262144,inf_nan_skip_batches=0,num_samples_in_batch=16,largest_length=2048,largest_batch=5,smallest_batch=3,adam_beta2=0.95,fwd_bwd_time=3.67
2023-07-07 12:29:05,451	INFO train.py:323 in record_current_batch_training_metrics -- tflops=190.99928472960033,step=2,loss=11.490386962890625,tgs (tokens/gpu/second)=4300.69,lr=8.000000000000001e-07,loss_scale=65536.0,grad_norm=61.57798028719357,micro_num=4,num_consumed_tokens=393216,inf_nan_skip_batches=0,num_samples_in_batch=14,largest_length=2048,largest_batch=4,smallest_batch=3,adam_beta2=0.95,fwd_bwd_time=3.66
2023-07-07 12:29:09,307	INFO train.py:323 in record_current_batch_training_metrics -- tflops=188.8613541410694,step=3,loss=11.099515914916992,tgs (tokens/gpu/second)=4252.55,lr=1.0000000000000002e-06,loss_scale=65536.0,grad_norm=63.5478796484391,micro_num=4,num_consumed_tokens=524288,inf_nan_skip_batches=0,num_samples_in_batch=16,largest_length=2048,largest_batch=5,smallest_batch=3,adam_beta2=0.95,fwd_bwd_time=3.7
2023-07-07 12:29:13,147	INFO train.py:323 in record_current_batch_training_metrics -- tflops=189.65918563194305,step=4,loss=10.149517059326172,tgs (tokens/gpu/second)=4270.52,lr=1.2000000000000002e-06,loss_scale=65536.0,grad_norm=51.582841631508145,micro_num=4,num_consumed_tokens=655360,inf_nan_skip_batches=0,num_samples_in_batch=19,largest_length=2048,largest_batch=6,smallest_batch=3,adam_beta2=0.95,fwd_bwd_time=3.68
2023-07-07 12:29:16,994	INFO train.py:323 in record_current_batch_training_metrics -- tflops=189.3109313713174,step=5,loss=9.822169303894043,tgs (tokens/gpu/second)=4262.67,lr=1.4000000000000001e-06,loss_scale=65536.0,grad_norm=47.10386835560855,micro_num=4,num_consumed_tokens=786432,inf_nan_skip_batches=0,num_samples_in_batch=17,largest_length=2048,largest_batch=6,smallest_batch=3,adam_beta2=0.95,fwd_bwd_time=3.69

4、模型转换—转换为主流的Transformers 格式使用

通过 InternLM 进行训练的模型可以很轻松地转换为 HuggingFace Transformers 格式,方便与社区各种开源项目无缝对接。借助 tools/transformers/convert2hf.py 可以将训练保存的权重一键转换为 transformers 格式

python tools/transformers/convert2hf.py --src_folder origin_ckpt/ --tgt_folder hf_ckpt/ --tokenizer ./tools/V7_sft.model

转换之后可以通过以下的代码加载为 transformers

>>> from transformers import AutoTokenizer, AutoModel
>>> model = AutoModel.from_pretrained("hf_ckpt/", trust_remote_code=True).cuda()
 

InternLM-20B的使用方法

1、利用三种工具实现应用

T1、通过 Transformers 加载

通过以下的代码从 Transformers 加载 InternLM 模型 (可修改模型名称替换不同的模型)

>>> from transformers import AutoTokenizer, AutoModelForCausalLM
>>> tokenizer = AutoTokenizer.from_pretrained("internlm/internlm-chat-7b", trust_remote_code=True)
>>> model = AutoModelForCausalLM.from_pretrained("internlm/internlm-chat-7b", trust_remote_code=True).cuda()
>>> model = model.eval()
>>> response, history = model.chat(tokenizer, "你好", history=[])
>>> print(response)
你好!有什么我可以帮助你的吗?
>>> response, history = model.chat(tokenizer, "请提供三个管理时间的建议。", history=history)
>>> print(response)
当然可以!以下是三个管理时间的建议:
1. 制定计划:制定一个详细的计划,包括每天要完成的任务和活动。这将有助于您更好地组织时间,并确保您能够按时完成任务。
2. 优先级:将任务按照优先级排序,先完成最重要的任务。这将确保您能够在最短的时间内完成最重要的任务,从而节省时间。
3. 集中注意力:避免分心,集中注意力完成任务。关闭社交媒体和电子邮件通知,专注于任务,这将帮助您更快地完成任务,并减少错误的可能性。

T2、通过 ModelScope 加载

通过以下的代码从 ModelScope 加载 InternLM 模型 (可修改模型名称替换不同的模型)

from modelscope import snapshot_download, AutoTokenizer, AutoModelForCausalLM
import torch
model_dir = snapshot_download('Shanghai_AI_Laboratory/internlm-chat-7b-v1_1', revision='v1.0.0')
tokenizer = AutoTokenizer.from_pretrained(model_dir, device_map="auto", trust_remote_code=True,torch_dtype=torch.float16)
model = AutoModelForCausalLM.from_pretrained(model_dir,device_map="auto",  trust_remote_code=True,torch_dtype=torch.float16)
model = model.eval()
response, history = model.chat(tokenizer, "hello", history=[])
print(response)
response, history = model.chat(tokenizer, "please provide three suggestions about time management", history=history)
print(response)

T3、通过前端网页对话

可以通过以下代码启动一个前端的界面来与 InternLM Chat 7B 模型进行交互

pip install streamlit==1.24.0
pip install transformers==4.30.2
streamlit run web_demo.py

T4、利用 LMDeploy基于InternLM高性能部署

我们使用 LMDeploy 完成 InternLM 的一键部署。

第一步,首先安装 LMDeploy:
python3 -m pip install lmdeploy

快速的部署命令如下:

python3 -m lmdeploy.serve.turbomind.deploy InternLM-7B /path/to/internlm-7b/model hf

第二步,启动服务执行对话

在导出模型后,你可以直接通过如下命令启动服务一个服务并和部署后的模型对话。LMDeploy 支持了 InternLM 部署的完整流程,请参考 部署教程 了解 InternLM 的更多部署细节。

python3 -m lmdeploy.serve.client {server_ip_addresss}:33337

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1033403.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

华为数通方向HCIP-DataCom H12-831题库(单选题:121-140)

第121题 在华为交换机上配置RADIUS服务器模板时,下列选项中哪些参数为可选的配置参数? A、认证服务器地址和端口 B、RADIUS自动探测用户 C、计费服务器地址和端口 D、Shared-key 答案: B 解析: 在华为交换机上配置 radius 服务器模板时,需要配置共享秘钥,认证服务器地址…

保研CS/软件工程/通信问题汇总

机器学习 1.TP、TN、FP、FN、F1 2.机器学习和深度学习的区别和联系 模型复杂性&#xff1a;深度学习是机器学习的一个子领域&#xff0c;其主要区别在于使用深层的神经网络模型。深度学习模型通常包含多个隐层&#xff0c;可以学习更加复杂的特征表示&#xff0c;因此在某些任…

datax同步数据翻倍,.hive-staging 导致的问题分析

一、背景 有同事反馈 Datax 从 Hive 表同步数据到 Mysql 数据翻倍了。通过查看 Datax 任务日志发现&#xff0c;翻倍的原因是多读取了 .hive-staging_xx 开头的文件。接下里就是有关 .hive-staging 的分析。 二、环境 Hive 版本 2.1.1 三、分析 3.1 .hive-staging_hive 产…

2023最新SSL证书在线申请系统源码 | 支持API接口

2023最新SSL证书在线申请系统源码 | 支持API接口 SSL证书保证网络安全的基本保障。向您介绍我们的在线生成SSL证书系统 支持在线生成SSL证书系统&#xff0c;用户登录可在线申请SSL&#xff0c;后台对接ssl证书API接口 测试运行环境&#xff1a;NginxPHP8.0MySQL5.7 源码下…

【计算机网络】图解路由器(二)

本系列包含&#xff1a; 图解路由器&#xff08;一&#xff09;图解路由器&#xff08;二&#xff09; 图解路由器&#xff08;二&#xff09; 21、什么是静态路由&#xff1f;22、什么是动态路由&#xff1f;23、动态路由有哪些类型&#xff1f;24、什么是 RIP &#xff1f;2…

【Spring中的设计模式】

文章目录 Spring中的设计模式1.控制反转(IoC)和依赖注入(DI)2.工厂设计模式3.单例设计模式实现方式Spring中的单例模式 4.代理设计模式代理模式在 AOP 中的应用Spring AOP 和 AspectJ AOP 有什么区别? 5.模板方法6.观察者模式Spring 事件驱动模型中的三种角色事件角色事件监听…

3、ARIMA序列预测Matlab代码、可视化(可做算法对比)

1、文件包中程序均收集、整理、汇总自网络。 2、文件包完整内容&#xff1a; 1&#xff09;【ARIMA-功能函数】仅包含一个ARIMA算法函数&#xff0c;需要调用到自己的程序中使用。 函数部分代码及预览图&#xff1a; function [result] ARIMA_algorithm(data, Periodicity,…

实现YOLOv5封装成函数以供其他程序进行调用

import detect detect.UAPI(source"data/images") 通过在YOLOv5中的detect.py的代码中&#xff0c;对检测函数进行封装&#xff0c;之后其他代码通过已经封装好的函数进行调用&#xff0c;从而实现简单便捷的YOLOv5代码调用。 代码的主要修改部分就是如何detect.py…

pytest之parametrize()实现数据驱动

第一个参数是字符串&#xff0c;多个参数中间用逗号隔开 第二个参数是list,多组数据用元组类型;传三个或更多参数也是这样传。list的每个元素都是一个元组&#xff0c;元组里的每个元素和按参数顺序一一对应 传一个参数 pytest.mark.parametrize(‘参数名’&#xff0c;list)…

《从菜鸟到大师之路 ElasticSearch 篇》

《从菜鸟到大师之路 ElasticSearch 篇》 &#xff08;一&#xff09;&#xff1a;ElasticSearch 基础概念、生态和应用场景 为什么需要学习 ElasticSearch 根据 DB Engine 的排名显示&#xff0c; ElasticSearch 是最受欢迎的 企业级搜索引擎 。下图红色勾选的是我们前面的系…

算法基础之二分查找

原题链接 一 、二分查找中的mid1和mid-1的问题 二分查找中的边界问题处理不好很容易导致死循环和计算错误的问题&#xff0c;以题目 数的范围为例。 题目大意 ​ 二分查找重复数第一次出现的位置和最后一次出现的位置。 数学含义 ​ 第一次位置即 找到 一个长度最大的 >X 区…

[代码解读] A ConvNet for the 2020s

代码地址&#xff1a;https://github.com/facebookresearch/ConvNeXt ConvNeXt/models/convnext.py整体的代码结构如下&#xff1a; 接下来我们一部分一部分来看。 1.Block类&#xff1a; class Block(nn.Module):r""" ConvNeXt Block. There are two equiva…

Redis集群架构搭建——主从、哨兵、集群

上一篇文章Ubuntu上通过源码方式安装Redis已经介绍了如何安装redis&#xff0c;在这篇文章中&#xff0c;将会教大家搭建Redis的几种高可用的架构&#xff1a;主从架构、哨兵集群、Cluster集群。 本篇文章使用的redis版本为6.2.13&#xff0c;不同版本的配置可能有略微的区别&a…

C++:list

目录 List的模拟实现 List节点类 List链表结构 List迭代器类 结构 T& operator*(); T& operator->(); Self& operator(); Self operator(int); Self& operator--(); Self& operator--(int); bool operator!(const Self& l); bool oper…

JDK、JRE 和 JVM 的区别和联系

三者关系 就这三者的关系而言&#xff0c;jvm是jre的子集&#xff0c;jre是jdk的子集&#xff0c;具体关系如下图&#xff1a; Java的执行流程 对于一个Java程序&#xff0c;其执行流程大致如下&#xff1a; 开发人员使用JDK编写和编译Java源代码&#xff0c;生成Java字节码文…

二叉树层序遍历及判断完全二叉树

个人主页:Lei宝啊 愿所有美好如期而遇 目录 二叉树层序遍历&#xff1a; 判断完全二叉树&#xff1a; 二叉树层序遍历&#xff1a; 层序遍历就是一层一层&#xff0c;从上到下遍历&#xff0c;上图遍历结果为&#xff1a;4 2 7 1 3 6 9 思路&#xff1a; 通过队列来实现层序…

lenovo联想笔记本电脑ThinkPad X13 AMD Gen2(20XH,20XJ)原装出厂Windows10系统镜像

联想原厂Win10系统&#xff0c;自带所有驱动、出厂主题壁纸、系统属性联想LOGO专属标志、Office办公软件、联想电脑管家等预装程序 链接&#xff1a;百度网盘 请输入提取码 提取码&#xff1a;dolg 适用于型号&#xff1a;20XL,20XJ,20XG,21A1,20XK,20XH,20XF,21A0 所需要…

1.vue3脚手架在vscode下面建立

一、下载安装node.js Node.js (nodejs.org) 二、安装vue3脚手架 #添加项目脚手架 npm install -g vue/cli 三、建立项目 #项目建立 vue create {appname} 测试项目安装成功&#xff1a;运行npm run serve命令 npm run serve 证明脚手架、项目环境已配置好 四、添加配件&#x…

5+非肿瘤+铁死亡+实验验证生信思路解析

今天给同学们分享一篇非肿瘤铁死亡实验验证的生信文章“Identification and validation of ferroptosis-related gene signature in intervertebral disc degeneration”&#xff0c;这篇文章于2023年2月6日发表在Front Endocrinol (Lausanne)期刊上&#xff0c;影响因子为5.2。…

Windows专业版的Docker下载、安装与启用Kubenetes、访问Kubernetes Dashboard

到Docker 官网https://www.docker.com/ 下载windows操作系统对应的docker软件安装 Docker Desktop Installer-Win.exe 2023-09版本是4.23 下载后双击安装 重启windows后&#xff0c;继续安装 接受服务继续安装 解决碰到的Docker Engine stopped 打开 控制面板》程序》启用或关…