Edit model card

NDLMoe_1.3B-base

介绍 (Introduction)

NDLMoe_1.3B-base:此模型是基于约180亿tokens训练的语言模型,其框架依赖于transformer-decoder only,此模型的具体结构为: 预训练数据主要为天工数据集、百度百科、维基百科中文、维基百科英文以及github代码等。

此模型主要有以下特点:

  1. 训练语料:即使该版本模型训练的语料较少,总的预训练token数量大约为190亿左右,支持中文以及英文包括代码的训练。
  2. 自己训练分词模型:本次预训练并没有采用其他开原模型,而是从零开始训练的分词模型,此表规模不大,为60930,语料库基本上是采样的天工数据集以及维基百科中英文、github代码。
  3. 模型配有详细注释以及RMSNorm使用了flash-attention:本次代码模型中的MOE部分参考了transformers库中的Deepseek-MOE的开源代码;RMSNorm部分参考了通义千问开源的代码,代码的细节基本上在文件中有标注,并且配置了flash-attention,目前解决了在RMSNorm归一化上使用了flash-attn,但在self-attention上并没有使用成功,希望在未来能够解决这个问题,以此能够提高训练效率。
  4. 支持增量预训练:目前本人已经在该模型的基础上进行了增量预训练,未来不就将会开源增量预训练的版本以及细节。
  5. 设置共享专家:该模型在每个MOE层设置了15个待激活的专家,除此之外还设置两个共享专家,每次输入的tokens都会经过共享专家进行学习,设置共享专家的目的在于能够学习不同tokens中的共有知识,减少专家之间的知识冗余。
  6. 细粒度专家 :根据Deeepseek-Moe官方的论文描述,设置更细粒度的专家个数有利于学习不同token之间的语义信息,更能体现专家性,因此本模型在MOE层设置了15个细粒度的专家(FFN块)。
  7. 专家损失平衡 :为了防止大部分token只会被少数的几个专家学习,除了常规的自回归任务的交叉熵损失函数以外,还加入了专家损失均衡函数

{LExpBal =α1i=1NfiPifi=NKTt=1T1( Token t selects Expert i)Pi=1Tt=1Tsi,t \begin{cases} L_{\text {ExpBal }} =\alpha _{1} \sum_{i=1}^{N^{\prime}} f_{i} P_{i} \\ f_{i} =\frac{N^{\prime}}{K T} \sum_{t=1}^{T} 1(\text { Token } t \text { selects Expert } i) \\ P_{i} =\frac{1}{T} \sum_{t=1}^{T} s_{i, t} \end{cases}

要求(Requirements)

  • python 3.8及以上版本
  • pytorch 2.0及以上版本
  • 建议使用CUDA 11.4及以上(GPU用户、flash-attention用户等需考虑此选项)

依赖项 (Dependency)

运行NDLMoe_1.3B-base,请确保满足上述要求,再执行以下pip命令安装依赖库

pip install transformers==4.39.3 accelerate 

推荐安装flash-attn的步骤:(如果没有安装此模型也可以运行,安装了推理会更快一些。)

git clone https://github.com/Dao-AILab/flash-attention
cd flash-attention && pip install .
# 下方安装可选,安装可能比较缓慢。
# pip install csrc/layer_norm
# pip install csrc/rotary

快速使用(Quickstart)

您可以通过以下代码轻松调用:

from transformers import AutoModelForCausalLM, AutoTokenizer
from transformers import GenerationConfig
tokenizer = AutoTokenizer.from_pretrained("Ndlcwx/NDLMoe_1.3B-base", trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained("Ndlcwx/NDLMoe_1.3B-base", device_map="auto", trust_remote_code=True).eval()
from transformers import GenerationConfig
gen_config = GenerationConfig(
    temperature=0.9,
    top_k=30,
    top_p=0.5,
    do_sample=True,
    num_beams=1,
    repetition_penalty=1.2,
    max_new_tokens=400,
    eos_token_id=tokenizer.eos_token_id,
    pad_token_id=tokenizer.pad_token_id,
)
prompt= '浙江省杭州市的西湖'
import torch
device = 'cuda'
tokend = tokenizer(prompt)
input_ids, attention_mask = torch.LongTensor([tokend.input_ids]).to(
        device
    ), torch.LongTensor([tokend.attention_mask]).to(device)
outputs = model.generate(
        inputs=input_ids, attention_mask=attention_mask, generation_config=gen_config
    )
outs = tokenizer.decode(outputs[0].cpu().numpy())
# outs = outs.replace(prompt,'')
outs = outs.replace('[EOS]','')
print("当前SLM回答:",outs)

NDLMoe_1.3B-base模型细节 (Model)

NDLMoe_1.3B-base模型规模基本情况如下所示:

Hyperparameter Value
n_layers 12
n_heads 32
d_model 1600
n_shared_experts 2
n_routed_experts 15
num_experts_per_tok 4
intermediate_size 14336
moe_intermediate_size 1024
vocab size 60930
sequence length 512

本模型在位置编码、FFN激活函数和normalization的实现方式上采用了RoPE相对位置编码、SwiGLU激活函数、RMSNorm(可选安装flash-attention加速);除此之外,该模型的第一个decoder层并没有采用MOE层,而是采用了以前流行的attention+FFN的配置,MOE层的设置是从第二个layer开始的。

Downloads last month
11
Safetensors
Model size
1.31B params
Tensor type
BF16
·
Inference Examples
Inference API (serverless) has been turned off for this model.