Baike.dev
All toolsAI codingTrendingOpen sourceNewsSubmit
Log in
< Back to tools
C

CPM-Bee

> 编程语言
Open source

百亿参数的中英文双语基座大模型

2.4K stars0 likes0 views
WebsiteGitHub

About

百亿参数的中英文双语基座大模型

✨ 模型介绍

CPM-Bee是一个完全开源、允许商用的百亿参数中英文基座模型,也是CPM-Live训练的第二个里程碑。它采用Transformer自回归架构(auto-regressive),在超万亿(trillion)高质量语料上进行预训练,拥有强大的基础能力。开发者和研究者可以在CPM-Bee基座模型的基础上在各类场景进行适配来以创建特定领域的应用模型。

  • ** 开源可商用**:OpenBMB始终秉承“让大模型飞入千家万户”的开源精神,CPM-Bee基座模型将完全开源并且可商用,以推动大模型领域的发展。我们鼓励全球范围内的科研机构、企业和个人开发者在遵守开源许可协议的前提下,自由地在CPM-Bee基座模型上进行创新。

  • ** 中英双语性能优异**:CPM-Bee基座模型在预训练语料上进行了严格的筛选和配比,同时在中英双语上具有亮眼表现,具体可参见评测任务和结果。

  • ** 超大规模高质量语料**:CPM-Bee基座模型在超万亿语料进行训练,是开源社区内经过语料最多的模型之一。同时,我们对预训练语料进行了严格的筛选、清洗和后处理以确保质量。

  • ** OpenBMB大模型系统生态支持**:OpenBMB大模型系统围绕高性能预训练、适配、压缩、推理开发了一系列工具,CPM-Bee基座模型将配套所有的工具脚本,高效支持开发者进行进阶使用。

  • ** 对话和工具使用能力**: 结合OpenBMB在指令微调和工具学习的探索,我们在CPM-Bee基座模型的基础上进行微调,训练出了具有强大对话和工具使用能力的实例模型,API和内测将于近期开放。

Read this in English.

说明:CPM-Bee是一个基座模型,即从零开始通过预训练得来。我们鼓励用户在自己的场景和数据上适配/微调/对齐后再进行使用。例如,WebCPM 以CPM-Bee为基座,在人类网络检索的序列化数据上进行适配,获得了复杂问答和上网检索的能力。后续我们将会发布更多在CPM-Bee基座模型基础上适配的模型。

更新信息

  • [2023/06/30] 基于CPM-Bee的多模态系列模型VisCPM发布,支持多模态对话和文生图!
  • [2023/06/16] CPM-Bee现已支持Transformers。
  • [2023/06/08] 更新了使用CPM-Bee进行基础任务微调的教程。
  • [2023/05/27] 百亿参数,允许商用的中英双语基座模型CPM-Bee开源了,它是CPM-Live的第二个里程碑。

CPM-Bee系列模型

模型 描述 VisCPM 支持多模态对话和图文双向生成的开源中英双语多模态大模型 WebCPM 支持复杂问答和上网检索的开源中文大模型

安装和使用

您需要克隆该仓库:

$ git clone -b main --single-branch https://github.com/OpenBMB/CPM-Bee.git

并确保您的环境符合要求:

- python>=3.7
- torch>=1.10,<2.0.0

我们建议使用Anaconda管理环境并从PyPI安装其他依赖项:

$ cd src
$ pip install -r requirements.txt

注意torch版本需与CUDA版本对应,不然会引起安装错误,尤其是torch也是通过pip install -r requirements.txt进行安装时,较为容易出现自动拉取安装的torch版本与本地CUDA版本不对应,导致BMTrain无法安装。

模型

  • 10B模型下载链接(如果要使用Transformers运行模型,请参考这里)。

数据格式

  • 不同于已有基座模型采用非结构化的自由文本形式组织数据,CPM-Bee采用结构化的json格式来组织数据。对于结构化数据,CPM-Bee的基座模型可以准确地进行语义理解,高效完成各类基础任务,包括:填空、文本生成、翻译、问答、评分预测、文本选择题等等,下面给出一些代表性任务的模板:
…
  • 注意在模型推理时可采用上述模板,在模型训练时需在中""处填上标准答案,如:
  {
    "input": "北京是中国的首都", 
    "prompt": "中翻英", 
    "<ans>": "Beijing is the capital of China"
  }

  {
    "input": "父母都希望自己的孩子诚实、勇敢、有礼貌。要想让孩子成为这样的人,父母首先得从自己做起,要是连自己都做不到,又怎能要求孩子做到呢?", 
    "options": {
      "<option_0>": "少提要求", 
      "<option_1>": "降低标准",
      "<option_2>": "自己先做好",
      "<option_3>": "让孩子拿主意"
    }, 
    "question": "教育孩子时,父母应该:", 
    "<ans>": "<option_2>"
  }
  • CPM-Bee在预训练阶段注入了一些json格式,可以直接使用,也支持用户自己设计json格式然后微调模型。所有的json格式需要满足下列条件:
    • 输出内容必须使用作为键值来组织;
    • 选择题的选项建议使用<option_xx>来组织,且xx为数字;
    • 填空题的空白建议使用<mask_xx>来组织,且xx为数字;
    • 因为"<"在CPM-Bee中会作为识别 、<option_xx>、<mask_xx>的触发符,所以在数据中文中必须将"<"转化为"<<"进行转义,例如在下面的例子中"1 < 2"、"10 < 8"被转写为"1 << 2"、"10 << 8":
  {
    "question": "下面哪项是正确的", 
    "options": {
      "<option_0>": "1 << 2", 
      "<option_1>": "10 << 8",
    }, 
    "<ans>": "<option_0>"
  }

模型预训练

  1. 数据清洗

    • 需要将每个样本放置为一行,换行进行转义变为\n,格式可为txt也可为json,例如:
      • txt格式
          ...
          ...
          How can cross training benefit groups like runners, swimmers, or weightlifters?\n\n1. Reduces the risk of injury...\n\n2. Improves overall fitness...
          Are there any particular physical benefits to mindful walking, such as improved posture or increased physical fitness?\n\n1. Choose a quiet and peaceful environment...\n\n2. Start by tuning into your breath and becoming aware of your surroundings...
          ... 
          ...
      
      • json格式
          ...
          ...
          {"template": "Does the answer correctly answer the question", "sentence": "Unicode has the explicit aim of transcending ...", "question": "What is the aim of Unicode?", "options": {"<option_0>": "no", "<option_1>": "yes"}, "<ans>": "<option_1>"}
          ... 
          ...
      
    • 案例:我们提供了wiki(txt格式,纯文本)和flan(json格式,选择题)的样例,可以下载后按下列文件路径中的raw_data进行文件组织,完成后续步骤的尝试。
    •   CPMBee/
        ├── src
        |   └── ...
        └── raw_data(原始数据位置)
            ├── wiki
            |   └── raw.txt(txt原始数据)
            └── flan
                └── raw.json(json原始数据)
      
  2. 数据集生成

    • CPMBee为了高效读取数据以及在分布式文件系统上进行数据集部署,需要将其转化成二进制文件,具体调用src下的build_dataset.py,具体参数包括:
      • --input-path: 导入的原始数据路径,程序会将路径下的文件统一打包进行处理
      • --output-path: 导出的数据集路径
      • --output-name: 导出的数据集名称
      • --data-type: txt/json
      • --min-length: 小于最小长度的数据将被抛弃
      • --max-length: 超过最大长度的数据将被切分
      • txt格式的原始数据将按照min-length和max-length进行切分,然后统一以{'text':'......'}的json格式导出到数据集
    • 导出的数据集将有两个文件,一个名为output-name的二进制文件,一个meta.bin文件,meta.bin文件中记录了output-name的元信息,包括:
      • "file_name": meta.bin对应的文件名,一般就是output-name
      • "block_begin": 数据集按块分布存储,数据集所在的开始块,一般是0
      • "block_end": 数据集按块分布存储,数据集所在的结束块,一般是总块数
      • "nbytes": 60221163, 总的数据集大小
      • "nlines": 41733, 总的数据集行数
      • "block_size": 16777216,数据集每块大小
    • 案例:我们将样例给定的wiki和flan生成为数据集:
    •   $ cd CPMBee/src
        $ python build_dataset.py --input-path ../raw_data/wiki/  --output-path ../datasets/wiki/ --output-name wiki --data-type txt --min-length 100 --max-length 10000
        $ python build_dataset.py --input-path ../raw_data/flan/  --output-path ../datasets/flan/ --output-name flan --data-type json
      
      • 生成之后的文件结构为:
      CPMBee/
      ├── src
      |   ├── ...
      |   └── build_dataset.py
      ├── raw_data
      |   ├── wiki
      |   |   └── raw.txt
      |   └── flan
      |       └── raw.json
      └── datasets(生成的数据集)
          ├── wiki(wiki对应的数据集)
          |   └── data
          |       ├── wiki
          |       └── meta.bin
          └── flan(flan对应的数据集)
              └── data
                  ├── flan
                  └── meta.bin
      
  3. 任务转换脚本

    • 对于每个数据集,可以撰写任务转换脚本来对数据集中的json格式进行改写,改写成各类预训练任务。
    • 脚本格式需满足以下格式:
          import random
          
          def transform(data, num_sample: int, r: random.Random):
              ...
      
      • 对于每个数据集,CPMBee的底层文件系统将会自动导入数据集,读出数据,然后调用任务转换脚本进行改造。
      • 转换脚本包含三个输入参数,data为读出样本,num_sample为读出的样本数量(通常为1条,in-context learning设定下会有多条),r为随机生成器。
    • 案例:针对wiki和flan写转换脚本:
      • wiki脚本
      import random
      
      def rand(n: int, r: random.Random):
          return int(r.random() * n)
      
      def transform(data, num_sample: int, r: random.Random):
          # 按照之前的步骤,wiki中的数据都为{'text':'...'}形式
          text = data['text']
          # 随机遮蔽50%~100%的内容进行预测
          mid = rand(len(text) // 2, r)
          # CPMBee需要<来识别特殊键,所以需要将内容中的<转换为<<进行转义
          ipt = text[:mid].replace("<", "<<")
          ans = text[mid:].replace("<", "<<")
          return {"input": ipt,
                  "<ans>": ans}
      
      • flan脚本
      import random
      
      def transform(data, num_sample: int, r: random.Random):
          # 按照之前的步骤,flan中的数据已经是选择题的json格式了,且包含<ans>键,所以直接返回进行训练
          return data
      
      • 写完任务转换脚本后的文件结构为:
      CPMBee/
      ├── src
      |   ├── ...
      |   └── build_dataset.py
      ├── raw_data
      |   ├── wiki
      |   |   └── raw.txt
      |   |
      |   └── flan
      |       └── raw.json
      └── datasets
          ├── wiki
          |   ├── data
          |   |   ├── wiki
          |   |   └── meta.bin
          |   └── transform.py(wiki对应的任务转换脚本)
          └── flan
              ├── data
              |   ├── flan
              |   └── meta.bin
              └── transform.py(flan对应的任务转换脚本)
      
  4. 数据集脚本

    • 所有参与训练的数据集需要一个数据集脚本来进行信息汇总,数据集脚本也是一个json文件,格式如下
    •   [
            {
                "dataset_name": "wiki",
                "task_name": "lm",
                "weight": 1.0,
                "path": "wiki/data",
                "incontext_weight": [1.0],
                "transforms": "wiki/transform.py"
            },
            {
                "dataset_name": "flan",
                "task_name": "nlu",
                "weight": 1.0,
                "path": "flan/data",
                "incontext_weight": [1.0],
                "transforms": "flan/transform.py"
            }
        ]
      
      • 其中,包含参数有:
        • dataset_name: 数据集名称;
        • task_name: 数据集所属任务,task_name+dataset_name将作为训练过程中识别数据集的标签,task_name则可用于训练过程中针对任务分别汇总loss信息;
        • weight: 采样权重;
        • path: meta.bin、二进制数据对应的路径;
        • transforms: 任务转换脚本对应的路径;
        • incontext_weight: 训练样本叠加,[1.0]表示100%的概率采样一个样本,[0.8, 0.2]表示20%概率采样两个样本进行拼接,[0.75, 0.1, 0.15]表示15%概率采样三个样本、10%的概率采样两个样本进行拼接。
      • 案例:写完数据集脚本汇总wiki和flan数据集后的文件路径结构
      CPMBee/
      ├── src
      |   ├── ...
      |   └── build_dataset.py
      ├── raw_data
      |   ├── wiki
      |   |   └── raw.txt
      |   └── flan
      |       └── raw.json
      └── datasets
          ├── datasets.json(数据集脚本)
          ├── wiki
          |   ├── data
          |   |   ├── wiki
          |   |   └── meta.bin
          |   └── transform.py
          └── flan
              ├── data
              |   ├── flan
              |   └── meta.bin
              └── transform.py
      
  5. 预训练脚本

    • 预训练脚本如下
…
- **案例**:写完预训练脚本后的文件路径结构
- 
…
  1. 预训练命令
    •   cd CPMBee/src
        bash scripts/pretrain_cpm_bee.sh
      
    • 案例:写完预训练脚本后的文件路径结构
…

OpenBMB 衍生功能

基于OpenBMB的大模型系统生态,我们在训练CPM-Bee的过程中实现了全流程高效。同时提供了模型微调(基于BMTrain和OpenDelta)、工具使用(基于BMTools)、模型压缩(基于BMCook)、低资源推理(基于BMInf)的全套脚本,可以协助开发者快速上手和使用CPM-Bee。

模型微调

基于BMTrain和OpenDelta,我们给出了两种微调方案:全参数微调和参数高效的增量微调,可以将CPM-Bee适配到各类下游场景中。

  1. 全参数微调:
$ torchrun --nnodes=1 --nproc_per_node=4 --rdzv_id=1 --rdzv_backend=c10d --rdzv_endpoint=localhost:12345 finetune_cpm_bee.py
  1. 增量微调:
$ torchrun --nnodes=1 --nproc_per_node=4 --rdzv_id=1 --rdzv_backend=c10d --rdzv_endpoint=localhost:12345 finetune_cpm_bee.py \
--use-delta \

微调流程

要在特定任务上微调模型,您应该准备数据集并按如下方式执行:

  • 调整数据格式。 您可以将分类问题集成到选择题的格式中。有关数据格式的更多信息,您可以查看CPM-Bee数据格式
    应当注意,由于我们选定<...>作为特殊token的标记,可能与文本中的<混淆,所以您应当对文本数据中的非特殊token的部分,做转义处理。例如,我们有如下数据
    {"input": "团队配合非常重要,如果不能做到<mask_0>,则可能会造成1+1<2的结果,所以,要更加注意<mask_1>", "<ans>": {"<mask_0>": "", "<mask_1>": ""}}
    
    该数据中,<mask_0>与<mask_1>是特殊token,应保持不变,其余<均替换为<<,转义处理后的数据如下:
    {"input": "团队配合非常重要,如果不能做到<mask_0>,则可能会造成1+1<<2的结果,所以,要更加注意<mask_1>", "<ans>": {"<mask_0>": "", "<mask_1>": ""}}
    
  • 将数据集预处理为二进制文件。 要构建预处理数据集,您可以运行
$ python preprocess_dataset.py --input your/reformated/data/path --output_path your/binary/data/path --output_name data_name

预处理后,您将获得:

|-- your/binary/data/path
    |-- folder1
    |    |-- data_name
    |    |-- meta.bin
    |-- folder2
         |-- data_name
         |-- meta.bin
  • 微调CPM-Bee 要开始微调,您可以运行:
$ bash scripts/finetune_cpm_bee.sh

或者您可以直接通过torchrun运行finetune_cpm_bee.py。例如,您可以在具有4块GPU的服务器上对CPM-Bee进行增量微调,如下所示:

torchrun --nnodes=1 --nproc_per_node=4 --rdzv_id=1 --rdzv_backend=c10d --rdzv_endpoint=localhost:12345 finetune_cpm_bee.py \
--

GitHub Issues· 0 open

View all on GitHub

No open issues yet, or sync has not completed.

Highlights

  • •开源可商用:OpenBMB始终秉承“让大模型飞入千家万户”的开源精神,CPM-Bee基座模型将完全开源并且可商用,以推动大模型领域的发展。我们鼓励全球范围内的科研机构、企业和个人开发者在遵守开源许可协议的前提下,自由地在CPM-Bee基座模型上进行创新。
  • •中英双语性能优异:CPM-Bee基座模型在预训练语料上进行了严格的筛选和配比,同时在中英双语上具有亮眼表现,具体可参见评测任务和结果。
  • •超大规模高质量语料:CPM-Bee基座模型在超万亿语料进行训练,是开源社区内经过语料最多的模型之一。同时,我们对预训练语料进行了严格的筛选、清洗和后处理以确保质量。
  • •OpenBMB大模型系统生态支持:OpenBMB大模型系统围绕高性能预训练、适配、压缩、推理开发了一系列工具,CPM-Bee基座模型将配套所有的工具脚本,高效支持开发者进行进阶使用。
  • •对话和工具使用能力: 结合OpenBMB在指令微调和工具学习的探索,我们在CPM-Bee基座模型的基础上进行微调,训练出了具有强大对话和工具使用能力的实例模型,API和内测将于近期开放。
  • •[2023/06/30] 基于CPM-Bee的多模态系列模型VisCPM发布,支持多模态对话和文生图!
  • •[2023/06/16] CPM-Bee现已支持Transformers。
  • •[2023/06/08] 更新了使用CPM-Bee进行基础任务微调的教程。
  • •[2023/05/27] 百亿参数,允许商用的中英双语基座模型CPM-Bee开源了,它是CPM-Live的第二个里程碑。
  • •python>=3.7

> Tags

Python

No comments yet. Be the first to share.

> Details

PublishedAug 1, 2026
UpdatedSep 17, 2026
Category编程语言
PricingOpen source

> Related tools

T
TypeScript
JavaScript 的超集,为前端与全栈提供静态类型
P
Python
通用编程语言,广泛用于 Web、数据与 AI
G
Go
Google 推出的简洁高效系统语言