Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

批量下载超过 300 条会闪退 #2

Open
IOLOII opened this issue Feb 17, 2025 · 20 comments
Open

批量下载超过 300 条会闪退 #2

IOLOII opened this issue Feb 17, 2025 · 20 comments

Comments

@IOLOII
Copy link
Owner

IOLOII commented Feb 17, 2025

null
caorushizi#410

@IOLOII
Copy link
Owner Author

IOLOII commented Feb 20, 2025

赞!学习了!

@IOLOII
Copy link
Owner Author

IOLOII commented Feb 20, 2025

这个效果的话,一个是26M规模有些小,再一个sft跑到5轮以后会好点,现在的瞎编现象比较严重。

谢谢你的分享,非常详细,比我写的清晰很多hhhh

中秋节快乐!!!✨

@IOLOII
Copy link
Owner Author

IOLOII commented Feb 20, 2025

请问一张4090能预训练嘛

可以,足够

@IOLOII
Copy link
Owner Author

IOLOII commented Feb 20, 2025

请问一张4090能预训练嘛

可以,足够

请问最低配置是多少,游戏本32G内存,4060(8G)可以预训练吗?

@IOLOII
Copy link
Owner Author

IOLOII commented Feb 20, 2025

请问一张4090能预训练嘛

可以,足够

请问最低配置是多少,游戏本32G内存,4060(8G)可以预训练吗?

可以,但很慢,得耐心等了

@IOLOII
Copy link
Owner Author

IOLOII commented Feb 20, 2025

谢谢大佬,十分具有参考意义,新建环境也遇到了大佬们遇到的坑,flash-attn真的难装啊,https://github.com/bdashore3/flash-attention后面是通过这里下载安装才行,windows系统

@IOLOII
Copy link
Owner Author

IOLOII commented Feb 20, 2025

这个能训练英文model吗

@IOLOII
Copy link
Owner Author

IOLOII commented Feb 20, 2025

4张40G显存的A100,torchrun 4节点,一开始epoch慢一点,基本两天两夜能跑完pretrain,sft也是差不多时间,后来加了meo会慢1/4时间感觉

@IOLOII
Copy link
Owner Author

IOLOII commented Feb 20, 2025

minimind训练大模型过程.pdf
分享一下训练学习过程,上面是白嫖公司的闲置A30服务器四卡训练的过程。只做了预训练和单轮全参数sft训练。看到sft训练后模型能说人话很满足。感谢jingyaogong大佬!!!niubility,有种自己也会大模型的幻觉:)。提前祝大家春节快乐

@IOLOII
Copy link
Owner Author

IOLOII commented Feb 20, 2025

内存占用在6-7GB左右。
我在训练时,为啥内存占用很高,54/62G左右;配置为A6000*2,单机双卡训练;batch_size=16,num_workers=8
@ipfgao

@IOLOII
Copy link
Owner Author

IOLOII commented Feb 20, 2025

步骤2 数据集处理
为什么我运行显示分块处理而不是跟你的训练记录一样(有点疑惑)
你的终端显示
tokenizer词表大小: 6400
seq_monkey: [350000]
seq_monkey: [450000]
seq_monkey: [500000]
我的终端显示
tokenizer词表大小: 6400
Processed chunk 1 with 50000 lines
Processed chunk 2 with 50000 lines
Processed chunk 3 with 50000 lines
Processed chunk 4 with 50000 lines
Processed chunk 5 with 50000 lines

@IOLOII
Copy link
Owner Author

IOLOII commented Feb 20, 2025

请问一张4090能预训练嘛

@IOLOII
Copy link
Owner Author

IOLOII commented Feb 20, 2025

步骤2 数据集处理 为什么我运行显示分块处理而不是跟你的训练记录一样(有点疑惑) 你的终端显示 tokenizer词表大小: 6400 seq_monkey: [350000] seq_monkey:[350000] seq_monkey: [450000] seq_monkey:[450000] seq_monkey: [500000] seq_monkey:[500000] 我的终端显示 tokenizer词表大小: 6400 Processed chunk 1 with 50000 lines处理了 50000 行的块 1 Processed chunk 2 with 50000 lines处理了 50000 行的块 2 Processed chunk 3 with 50000 lines处理了 50000 行的块 3 Processed chunk 4 with 50000 lines处理了 50000 行的块 4 Processed chunk 5 with 50000 lines处理了 50000 行的区块 5

@AirGHub 1-pretrain updated on 27th.

@IOLOII
Copy link
Owner Author

IOLOII commented Feb 20, 2025

mobvoi_seq_monkey_general_open_corpus.jsonl 31G,下载好慢

😂现在免去自己预处理环节了

@IOLOII
Copy link
Owner Author

IOLOII commented Feb 20, 2025

感谢大佬分享

@IOLOII
Copy link
Owner Author

IOLOII commented Feb 20, 2025

mobvoi_seq_monkey_general_open_corpus.jsonl 31G,下载好慢

@IOLOII
Copy link
Owner Author

IOLOII commented Feb 20, 2025

咨询一下你们跑时候的ram和vram用到多少了?
我用国产显卡,4x16G VRAM加上80G内存训练时候爆了,VRAM使用96%,内存100。
还有使用4x国产海光 K100 64G VRAM训练时候第一个epoch就花了差不多3h,有人试过在nvidia v100上训练吗?IMG_20241002_211321.jpg

IMG_20241002_211321.jpg

@IOLOII
Copy link
Owner Author

IOLOII commented Feb 20, 2025

4张40G显存的A100,torchrun 4节点,一开始epoch慢一点,基本两天两夜能跑完pretrain,sft也是差不多时间,后来加了meo会慢1/4时间感觉

现在不需要这么久了😂

@IOLOII
Copy link
Owner Author

IOLOII commented Feb 20, 2025

记录的很好! 可以发个教程了。

@IOLOII
Copy link
Owner Author

IOLOII commented Feb 20, 2025

项目文件说明

  • 注:依据2024年9月20日的更新编写,未完

images

Readme里的图片目录。

model

模型文件夹。

model/minimind_tokenizer

项目自定义的Tokenizer模型文件。

  • model/minimind_tokenizer/merges.txt
    merges文件存放的是训练tokenizer阶段所得到的合并词表结果,就是tokenizer.json中,model.merges下的内容。
  • model/minimind_tokenizer/tokenizer_config.json
    分词器的配置信息,定义了分词器的版本、额外添加的标记(tokens)、结构/代码和模型参数等信息,比如tokenizer_class指定使用的分词器类名以及model_max_length指定模型能够处理的最大序列长度 和 bos_token指定句首的标记等内容。
  • model/minimind_tokenizer/tokenizer.json
    最终的分词器模型文件,包含了分词器的版本号、分词器的截断、填充策略、特殊标记、文本归一化的函数、预分词的策略或方法、分词器模型的类型、词汇表(vocab)和合并规则(merges)等信息。
  • model/minimind_tokenizer/vocab.json
    词表文件,就是tokenizer.json中,model.vocab下的内容。

注:分词器训练代码可见train_tokenizer.py

model/dataset.py

数据集定义文件,该文件定义了两个继承自Dataset的数据集类,分别是 PretrainDataset 和 SFTDataset,它们分别用于预训练任务和微调任务的数据加载和处理。

model/LMConfig.py

模型配置文件,定义 LMConfig 类,继承自 PretrainedConfig。如果想修改模型参数,可以在这个文件里改。

主要包括如下内容:

  • dim: 模型维度,默认为 512
  • n_layers: Transformer 层数,默认为 8
  • n_heads: 注意力头数,默认为 16
  • n_kv_heads: KV 头数,默认为 8
  • vocab_size: 词汇表大小,应于分词器保持一致,默认为 6400
  • hidden_dim: 隐藏层维度,默认为 None
  • multiple_of: 隐藏层维度的倍数,默认为 64
  • norm_eps: 归一化层的 epsilon 值,默认为 1e-5
  • max_seq_len: 最大序列长度,默认为 512,如果需要长文本对话支持,可以加大该值的设置
  • dropout: Dropout 概率,默认为 0.0
  • flash_attn: 是否使用 Flash Attention,默认为 True

以下是 MOE(Mixture of Experts)的特定配置当 use_moe 为 False 时,以下配置无效

  • use_moe: 是否使用 MOE,默认为 False
  • num_experts_per_tok:每个 token 选择的专家数量,默认为 2
  • n_routed_experts=4, # 总的专家数量,默认为 4
  • n_shared_experts: bool = True, # 是否使用共享专家,默认为 True
  • scoring_func='softmax', # 评分函数,默认为 'softmax'
  • aux_loss_alpha=0.01, # 辅助损失的 alpha 参数,默认为 0.01
  • seq_aux=True, # 是否在序列级别上计算辅助损失,默认为 True
  • norm_topk_prob=True, # 是否标准化 top-k 概率,默认为 True

model/model.py

模型文件,定义了模型结构,包括多个子模块如 FeedForward、RMSNorm、MoEGate、MOEFeedForward、TransformerBlock 等,实现了前向传播计算、损失函数计算和通过逐步生成方式进行文本生成。

主要内容总结:

  1. RMSNorm:

    • 实现 RMSNorm(Root Mean Square Layer Normalization)归一化,一种归一化方法,用于提高模型的稳定性和训练效果。
  2. Attention:

    • 实现自注意力机制,包括 QKV 计算、缩放点积注意力、多头注意力等。
  3. FeedForward:

    • 前馈神经网络,用于对输入数据进行非线性变换。
  4. MoEGate:

    • 实现专家混合(MoE)的门控机制,用于在多个专家之间进行选择性信息传递。
  5. MOEFeedForward:

    • 实现专家混合(MoE)的前馈神经网络。
  6. TransformerBlock:

    • 实现 Transformer 的一个块,包含自注意力机制和前馈神经网络。
  7. Transformer:

    • 实现整个 Transformer 模型,由多个 Transformer Block 组成的多层结构。包含词嵌入、位置编码、最终的输出层以及训练和推理方法。

主要功能:

  1. 前向传播计算:
    • 通过 forward 方法,输入 tokens 或 input_ids 和 targets,进行前向传播计算,得到 logits 和 last_loss(如果提供 targets)。
  2. 损失函数计算:
    • 使用 F.cross_entropy 计算损失函数,忽略索引为 -1 的标签。
  3. 文本生成:
    • 通过 generate 方法,实现逐步生成方式进行文本生成,支持温度、top_k 等参数调整。
  4. 评估答案:
    • 通过 eval_answer 方法,对给定的输入索引进行推理,得到最终的 logits。

0-eval_pretrain.py

测试预训练模型的接龙效果。
模型加载逻辑:
如果 model_from 为 1,则从本地路径加载自定义的 Transformer 模型。
如果 model_from 为 2,则使用 transformers 库中的预训练模型。

1-pretrain.py

功能概述

预训练脚本,执行预训练。
可以使用自定义的数据集进行预训练,训练过程中会动态调整学习率,并且支持分布式训练以提高训练效率。

使用、配置及功能说明

以下是该脚本的使用、配置和功能说明:

单机多卡使用

  • torchrun --nproc_per_node 2 1-pretrain.py: 运行脚本时需要使用torchrun命令,指定使用的GPU数量为2。

参数配置

  • lm_config = LMConfig(): 加载预定义的语言模型配置,具体配置内容在model/LMConfig.py文件中。
  • out_dir = 'out': 设置输出目录,默认为out文件夹。
  • epochs = 20: 训练的轮数。
  • batch_size = 64: 每个批次的数据量。
  • learning_rate = 2e-4: 初始学习率。
  • device = 'cuda:0' if torch.cuda.is_available() else 'cpu': 选择GPU设备,如果没有GPU则使用CPU。
  • dtype = 'bfloat16': 数据类型,支持自动混合精度训练(AMP)。
  • save_dir = os.path.join(out_dir): 模型保存目录,默认为out文件夹。
  • tokens_per_iter = batch_size * max_seq_len: 每个迭代步的数据量。

数据加载

  • data_path_list = ['./dataset/pretrain_data.bin']: 训练数据的文件路径列表,默认为./dataset/pretrain_data.bin
  • num_workers = 8: 数据加载的线程数,可以根据系统CPU核心数调整。

训练循环

  • iter_per_epoch = len(train_loader): 计算每个轮次的迭代步数。
  • for epoch in range(epochs): train_epoch(epoch): 进行多轮训练,每轮调用train_epoch函数进行训练。

模型的保存频率

在训练过程中,模型的权重会每迭代1000步保存一次模型,以便后续检查点或恢复训练。

使用已有权重再训练的说明

如果你已经有一个预训练模型的权重文件(例如pretrain_model.pth),并且你想继续在该模型基础上进行微调,可以按照以下步骤操作:

  1. 加载已有权重
     ckp = f'{save_dir}/pretrain_{lm_config.dim}{moe_path}.pth'
     
     state_dict = torch.load(ckp, map_location=device)
     unwanted_prefix = '_orig_mod.'
     for k, v in list(state_dict.items()):
         if k.startswith(unwanted_prefix):
             state_dict[k[len(unwanted_prefix):]] = state_dict.pop(k)
     model.load_state_dict(state_dict, strict=False)

注意,这部分是脚本中是注释掉的。 如果你想用已有权重继续训练,需要在脚本中找到上述代码,解除注释,才能使用现有的模型进行训练。
2. 继续训练
解除注释后还是用torchrun --nproc_per_node 2 1-pretrain.py

2-eval.py

测试模型的对话效果。通过加载预训练后的模型,并让模型来回答内置在脚本中的一系列问题,以评估模型的对话效果。

        ckp = f'./out/full_sft_{lm_config.dim}{moe_path}.pth'

其中ckp是检查点的路径,用于加载预训练的模型权重。

3-full_sft.py

执行指令微调训练
这段代码实现了指令微调(Instruction Fine-tuning),主要用于训练一个语言模型。以下是代码的主要功能和配置参数说明:

配置参数

代码中可以配置的参数有:

  • 模型加载

    model_from = 1  # 从权重加载,2使用transformers

    选择是否从本地权重文件加载模型(model_from = 1)或使用huggingface的Transformers库中的预训练模型(model_from = 2)。

  • 配置本地权重文件路径

          ckp = f'./out/pretrain_{lm_config.dim}{moe_path}.pth'

    如果是用预训练权重训练,则可按默认配置,如果是想从已微调的模型继续微调,则需要指定ckp路径,比如ckp = './out/full_sft_{lm_config.dim}{moe_path}.pth'

  • 数据集和批处理

    epochs = 19  # 训练轮数
    batch_size = 40  # 每个batch的大小
    learning_rate = 1e-4  # 学习率
    gradient_accumulation_steps = 1  # 梯度累积步数

    控制数据集的使用和训练的批处理大小、学习率和梯度累积方式。

  • 设备配置

    device = 'cuda:0' if torch.cuda.is_available() else 'cpu'  # 选择GPU或CPU
    dtype = 'bfloat16' or 'float16'  # 数据类型

    指定训练设备和使用的数据类型(半精度浮点数)。

  • 分布式训练

    ddp = int(os.environ.get("RANK", -1)) != -1  # 是否启用分布式训练

    如果环境变量中有RANK,则启用分布式训练(DDP)。

然后按Readme的描述运行脚本即可。

4-lora_sft.py

执行lora微调训练

5-dpo_train.py

执行DPO训练

chat_openai_api.py

实现与OpenAI API类似的接口

CODE_OF_CONDUCT.md

贡献者公约

data_process.py

处理数据集,例如pretrain数据提前进行token-encoder、sft数据集抽离qa到csv文件

eval_ceval.py

评估模型在ceval数据集上的表现

export_model.py

可以导出模型到transformers格式,推送到huggingface。

fast_infenence.py

使用 Streamlit 框架构建的交互式聊天应用程序,主要内容和功能的概述如下:
定义的内容

  1. 模型和Tokenizer 加载:
    • 使用 AutoModelForCausalLMAutoTokenizer 从 Hugging Face 的模型库中加载预训练的语言模型和对应的 tokenizer。
    • 通过 st.cache_resource 缓存模型和 tokenizer,以提高加载效率。
  2. 生成配置:
    • 定义了温度(temperature)、top_k 等超参数用于控制生成的质量和多样性。
  3. 聊天消息管理:
    • clear_chat_messagesinit_chat_messages 函数分别用于清空和初始化聊天记录。
    • 使用 Streamlit 的会话状态(session state)来存储和管理对话历史。
  4. 主要功能函数:
    • main 函数是应用程序的主入口,负责处理用户输入、模型生成响应以及界面交互。

实现的功能

  1. 用户界面:
    • Streamlit 页面设置和标题显示。
    • 提供一个文本输入框供用户输入对话内容。
    • 使用聊天消息的 UI 组件展示历史对话记录。
  2. 对话处理:
    • 接收用户的输入,并将其作为新消息添加到会话状态中。
    • 将当前对话历史转换为模型可理解的格式(通过 tokenizerapply_chat_template)。
    • 使用预定义的超参数生成模型的响应。
    • 实时地将生成的回答部分展示在界面上,直到遇到 EOS 标记或达到最大序列长度。
  3. 交互功能:
    • 提供一个按钮允许用户清空所有对话记录。
    • 通过 Streamlit 的回调机制实现动态更新界面内容和响应状态。

LICENSE

项目使用Apache License许可证。

my_openai_api.py

使用Flask框架构建的API服务器,用于处理与聊天模型相关的请求,包括生成聊天响应和计算文本的嵌入向量。

README_en.md

项目说明文件(英语)。

README.md

项目说明文件。

requirements.txt

python环境依赖文件,列出了运行该项目所需的Python包及其版本。

train_tokenizer.py

用于分词器训练。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant