Llama2中文童话小模型(93M)

模型背景

本模型采用 llama2.c 提供的代码和工具,训练了一个参数量93M的中文小模型。它的tokenizer是从语料中重新训练的,仅包含3000个中文字符,采用BPE算法实现,tokenizer.model仅有38K。

数量的数据集来自TinyStoriesZh,合并了1M和2M的数据集,总字符数量199,536,607,汉字数量2492,共计1,124,957行。从中随机抽取800,000训练3K的tokenizer

模型的训练参数如下:

参数
dim 768
n_heads 12
n_layers 12
kv_heads 12
batch_size 24
max_seq_len 768
hidden_dim 2268
dropout 0.1
learning rate 3e-4

训练细节

训练在单卡A10G的服务器上运行了大约18小时,共3个epoch

Key Value
iteration 22,940
loss/eval 1.3784
loss/train 1.2773
lr 0.00003
tokens 9,020,375,040

模型表现

git clone https://github.com/karpathy/llama2.c
cd llama2.c
make run

运行推理

./run ./llama2c-93MB.bin -t 0.9

结果如下

▁从前,有一个小女孩,名叫莉莉。有一天,莉莉的妈妈让她帮忙洗衣服。莉莉很乐意帮忙,并把一件
衬衫放进了洗衣机。突然,莉莉听到了奇怪的声音。▁“那是什么?”她问她妈妈。“这只是洗衣机。我们需要确保衣服干净,”她妈妈回答道。莉莉感到很安心,因为她帮助了妈妈。他们把所有的衣服都拿出
来,放进洗衣机里。洗完衣服后,莉莉的妈妈说:“干得好,莉莉!你真是个好帮手。”莉莉笑了,也为自己感到骄傲。她拥抱妈妈说:“妈妈,谢谢你让我帮忙洗衣服。”

▁从前,有一位高大强壮的超级英雄。他肌肉发达,可以举起重物。他喜欢帮助别人,并且非常坚强。
有一天,他去公园散步,看到一只小狗被困在树上。超级英雄想帮助那只狗。他爬上树,把狗从树枝上扶下来。狗很高兴,舔着超级英雄的脸表示感谢。超级英雄微笑着继续前行。他很高兴自己能够用自己的肌肉帮助这只狗,并结识了一个新朋友。

▁从前,有一只兔子,名叫雷米。雷米喜欢和他的朋友们一起跳来跳去玩耍。有一天,雷米和他的朋友
们正在玩捉迷藏,这时他们看到了一大堆干草。他们正在扔掉,突然干草碎成了碎片。弗雷米和他的朋友们很害怕,但他们知道他们必须帮忙。他们请他们的朋友兔子山姆帮他们捡干草。萨姆很勇敢,没有把干草分开。他们把干草拿到池塘里,把它分成小块。大家坐下来吃饭,雷米和山姆很高兴他们帮助了他们。从那天起,雷米就被称为森林里最勇敢的小兔子,总是在附近玩耍。

▁从前,有一个小女孩,名叫莉莉。她喜欢在外面玩耍并探索周围的世界。有一天,她在地上发现了一
块闪闪发光的石头。它是如此美丽和闪闪发光,她想永远保留它。但后来,莉莉的朋友过来看到了这块石头。她也想要它,但莉莉不想分享。她的朋友感到很难过,就回家了。那天晚些时候,莉莉意识到她不分享她的石头是自私的。她感到很难过,决定把石头送给她的朋友。她的朋友很高兴,他们一起玩了一整天。莉莉了解到分享很重要,自私会让别人感到难过。

可以看到93M的模型参数量虽然少,但是仍然具有一定的逻辑能力,故事可以保持基本的自洽。

模型已经转换为huggingface的LlamaPretrainedModel格式,调用方法如下:

torch.set_default_device("cuda")
config = AutoConfig.from_pretrained(model_path)
tokenizer = AutoTokenizer.from_pretrained(model_path)
model = AutoModelForCausalLM.from_pretrained(model_path, config=config)
inputs = tokenizer("从前", return_tensors="pt", add_special_tokens=True)
outputs = model.generate(**inputs, max_new_tokens=256, temperature=0.9)
text = tokenizer.batch_decode(outputs)[0]
print(text)

输出

<s> 从前,有一个小女孩,名叫莉莉。她喜欢在外面玩耍并探索周围的世界。
有一天,她在公园里玩耍时,看到一只蝴蝶,就去追它。她跑呀跑,直到迷路。
莉莉开始哭泣,一位好心的女士走过来问她:“小宝贝,你为什么哭?”莉莉回
答说:“我迷路了,找不到回家的路了。”那位女士说:“别担心,我会帮你找
到回家的路的。”他们一起走着,莉莉开始感到害怕。突然,那位女士停了下来,
说道:“别担心,我会帮你找到回家的路的。”他们走呀走,终于找到了莉莉的家。
莉莉很高兴,向那位女士表示感谢。那位女士微笑着说:“我很高兴能帮上忙。
记住,当你迷路时,寻求帮助总是好的。”莉莉点点头,紧紧地拥抱着妈妈。

小模型的意义

小模型的能力虽然有限,但是它在一下几个方面是具有非凡意义的

  1. 可以促进对模型原理的理解。俗话说“麻雀虽小五脏俱全”,小模型规模虽然小,但是具有llama2标准架构,方便学习和理解模型训练的原理
  2. 加速调试。在开发大模型app时,可以用小模型加快启动和运行的速度,方便快速迭代开发
  3. 嵌入式。在游戏这种需要快速反馈,并且存在高并发的环境中,小模型比大模型具有更强的优势。

感谢

  1. llama2.c
  2. llama2.c-zh
  3. TinyStoriesZh
Downloads last month
658
Inference Examples
This model does not have enough activity to be deployed to Inference API (serverless) yet. Increase its social visibility and check back later, or deploy to Inference Endpoints (dedicated) instead.

Dataset used to train flyingfishinwater/tinystories_zh