本文为稀土技能社区首发签约文章,30天内制止转载,30天后未获授权制止转载,侵权必究!
现在“大模型”一词很火,但我却找不到它的界说。现在业内只存在大言语模型 (large language model, LLM) 一说。其特征便是参数大(10亿等级起步),规模大(通用非笔直领域)。
外行看热闹时,我却遭受着大模型的煎熬。首要,我调研了国内外开源、不开源的大模型。然后,布置建立、调用、比照剖析,进行时刻、数据、设备本钱的估算和汇总。最终,结合实际状况,给领导上报最佳计划。领导感觉,仍是太贵。
拿调用第三方来说,国内的几个“XX大模型”不是很好用,而且你也欠好做进程干涉。ChatGPT
的生态不错,可是又涨价了,还触及数据安全问题。
利用开源的项目倒是能自己练习,可是得有GPU
设备啊。买一个RTX 3090
(功用不错的显卡),要万元起步。租云主机倒也能够,可是租几段时刻就够买一个的了。一个RTX 3090
跑百万等级的多轮对话数据,需求一个星期才干稍有作用……
关于AI
,你们看到的满是风口,我看到的满是破窟窿。
老板问:没有钱,就不能有人工智能的愿望吗?
一、什么是端侧小模型?
有愿望都是可贵的,和身份无关。咱们不能一边说咸鱼有愿望是勉励,而老板有愿望便是荒诞。
后来,我又和许多人交流过。咱们的状况都差不多,传统职业,想搭AI
的车,不肯花钱,诉求简略。
我一个老同事,产品经理。他去了图书公司。他们集团的信息部就仨人,俩技能,一个产品。一切系统是外包出去的,这仨人负责需求的发布和验收。由于本钱低,利润大,所以他们的待遇很高,而且从来不加班。我感觉他活的很了解。
正是通过和这个大了解的交流,让我有了“端侧小模型”的设想。
端侧小模型便是针对不以AI
为卖点的互联网产品,所提出的带有AI
概念的低本钱计划。
端侧小模型不大,参数不多,功用不强,由服务端生成,在客户端运转。类似你需求一辆代步车,鉴于你全程跑不到50公里/时,我给你一辆最高时速就到50公里的车。别的,它在客户端布置运转。这又好比你不必长时刻持有车。当需求进货时,临时租个卡车。有人下单了,客户会来仓库自提。
说白了便是人家主业是卖图书、卖糕点,但围绕主业他还有一个附带的互联网小产品。这个小产品,具有AI
概念。作用便是当咱们的图书质量都相同,难以区分时,我有的,你没有。
下面是端侧小模型和大模型的本钱比照图。
从上图看,在模型制造阶段,端侧小模型和大模型的本钱挨近。但到了发布后,大模型仍然需求依靠AI
服务器供给推理,但端侧小模型只需求供给模型文件下载即可。也便是说,端侧小模型对算法硬件只需临时性需求。一旦生成,即可脱离。
以“大了解”的阅览主意为例。下面是我对端侧小模型思路的具体实践。我通过TensorFlow Lite
,将一个自练习的中文阅览了解问答模型,运转在了Android
手机上。
上面的例子,完成了面对琐碎的材料,不必阅览全文即可从文中快速找到答案。
下面,我将对整个进程进行说明和讲解,并在文末附上相关材料。
二、端侧小模型的制造方法
端侧小模型的生成方法有三种:
- 1、依照大模型生成的路数,后续转化为端侧小模型。
- 2、练习时,直接生成在客户端布置的端侧小模型。
- 3、由客户端练习,可在客户端运转的端侧小模型。
以上三种方法,我会讲解前两种。由于第3种,我没遇到运用场景,也没有实际操作过,因而不敢胡说。之所以提它,是由于有理论依据[参阅1]。
2.1 挑选平台
不管是直接生成,仍是直接转化,端侧小模型都是由开发结构发生的。因而在挑选结构上,要考虑多平台支撑。令人惊喜的是,现在谷歌有TensorFlow Lite
,Facebook有PyTorch Mobile
,它们都支撑客户端AI
。
非但如此,现在Transformers
库的呈现,也让PyTorch
、TensorFlow
这些模型能够相互转化和运用。能够说,国外的AI
生态很好,尽管他们相互竞争,但都开源,打明牌,杠实力。
本例中我挑选谷歌的TensorFlow
。由于它的民间根底牢固。每年都会有学生问“都2020年了,还学TensorFlow?”、“都2021年了,竟然建立TensorFlow?”、“2023年了……”。是的,每年都问。这个问题解释起来很费力。我换一种说法能够辅佐你了解,那便是“2023年的中国,你竟然还考究人情世故?”
TensorFlow
也是如此,它在工业界仍然有必定的占比。甚至许多企业还跑着篡改的TensorFlow 1.x
版别。你去了……要么重构项目,要么重构自己。
2.2 挑选模型
搞端侧小模型,不必选最好的,要选最适合自己的。这就好像你家离单位1公里,你要挑选通勤东西。此时,雅阁和雅迪的功用距离不大,可是本钱却显着不同。
关于大了解提的书籍阶段的阅览了解问答,我挑选从谷歌的Bert
结构做微调。
2.2.1 Bert与预练习模型
先别说“都2023年了,还Bert……”。我的意图是低本钱解决问题,并非去搞创造性研讨(老板们很认可我的话,科学家却朝我吐口水)。
Bert
[参阅2]是谷歌2018年推出的一款言语模型,其参数没有达到十亿等级,因而它还称不上“大言语模型”。即便如此,我给你算算它的练习本钱。
练习100GB
的文本数据,需求8
台配置相似的高功用GPU
服务器,每台服务器配备4
个NVIDIA V100 GPU
,总共32
个GPU
,至少需求练习7
天的时刻。
咱不算服务器、冷却系统的钱,不算收拾数据集的本钱,电费也忽略不计。单是额外配的这32个V100
,也要40万
人民币。咱不买,就算租,你租人家40万
的设备,他还得配机房、客服、电工,能给你便宜多少。
值得庆幸的是,在NLP领域,Bert发布了一个叫“预练习模型”的东西。预练习的概念最早在2013年提出。但真实第一个完成落地的,便是Google Research
团队在Bert
模型身上。
Bert
发布了许多预练习模型的版别,下面罗列几个:
- BERT-Base:通用模型,1.1亿个参数。
- BERT-Base, Multilingual:102种言语,1.1亿个参数。
- BERT-Base, Chinese:中文言语,1.1亿个参数。
- BERT-Large:更大、更复杂的版别,3.4亿个参数。
这些预练习模型有什么用呢?
其实便是供给了一个根底认知。你想让计算机完成阅览了解,它首要得有根本的认知。
阅览:朱元璋推翻了元朝建立了明朝。 问题:朱元璋打败了谁?
终究AI
给出答案:元朝。
咱们来剖析一下,AI
要答复上面的问题,它得具有什么前置常识。
- “打败”和“推翻”指的是一个意思。
- “元朝”是一个特指称号。它没有答复打败了“元朝建”或许“元朝建立”。
- “谁”指的是问一个对象的称号。
便是这样。让计算机了解“人需求呼吸才干活”、“包子是一种食物”、“我、俺、咱指的是同一方”这类常识是最难的。由于咱们从小到大都学过,并且咱们自然而然地以为计算机也知道。其实不是,它也不知道。
有了根底认知,你再去练习自己供给的数据,AI
才干了解你问的是什么,答复的是什么,并依照数据特征,定制你的口味。
别的,通过预练习模型,咱们自练习的功率会有极大提高。甚至你手里的笔记本电脑就能够练习。我给你算算依据预练习模型的练习本钱。
练习几千条问答数据,用普通的台式工作电脑(i7处理器,8核,32G内存),运转6个小时,就能有很好的作用。
2.3 收拾数据集并练习
首要下载Bert代码,地址是:github.com/google-rese…
环境依靠十分纯净:
tensorflow: 1.11.0
python: 3.6
尽管看似简洁,但据我了解,许多读者仍然会遇到各种各样的困难,比如被pip install tensorflow==1.11.0
这条装置指令,困扰好多天。这类问题就像我说打开易拉罐,成果你一拽拉环断了。只能说,请信任总会有方法解决。
主张咱们读它的README.md
文档,必定要耐心去读。由于,我说的过程也是从文档中摘选的。
环境和代码都准备好后,就能够练习数据了。练习数据,需求履行以下指令:
python run_squad.py \
--vocab_file=$BERT_BASE_DIR/vocab.txt \
--bert_config_file=$BERT_BASE_DIR/bert_config.json \
--init_checkpoint=$BERT_BASE_DIR/bert_model.ckpt \
--do_train=True \
--train_file=$SQUAD_DIR/train-v1.1.json \
--train_batch_size=12 \
--learning_rate=3e-5 \
--num_train_epochs=2.0 \
--max_seq_length=384 \
--doc_stride=128 \
--output_dir=/tmp/squad_base/
2.3.1 练习文件
run_squad.py
表示运转斯坦福问答数据集SQuAD
。SQuAD(Stanford Question Answering Dataset)是斯坦福大学在2016年揭露的一个阅览了解数据集。它里边包含了大约1万个问题、阶段和答案,全都符号好了。以此供给给言语模型进行练习和测验。
Bert为了落地,就以此问答数据集作为样板供咱们运用。咱们的诉求也类似,也是通过阅览一段文本,然后从文中寻求答案,所以咱们挑选它。
除此之外,你也能看到其他运用,比如
run_classifier.py
是文本分类的例子。
2.3.2 预练习模型
指令里提到了一个目录,叫BERT_BASE_DIR
。这是Bert预练习模型的目录,你愿意运用哪一个模型,就指定它为目录。
前面提到的预练习模型,在README.md
文档中都有下载链接。
下载下来的文件结构如下所示:
|--bert_config.json
|--bert_model.ckpt.data-00000-of-00001
|--bert_model.ckpt.index
|--bert_model.ckpt.meta
|--vocab.txt
他们有什么区别呢?首要区别在于词汇表vocab.txt
上。我都下载下来了,给咱们展现下区别。
首要看标准版BERT-Base
的词汇表。
上图的标准版词汇表,只需200
来个汉字,其他满是英文单词。
词汇表有什么用呢?它会将文本依照词汇表序列化成数字。
咱们看到”0″被界说为1014,”1″被界说为1015。当你感觉它多此一举时,到后面又发现”帝”被界说为1838,”心”界说为1849。而再到后面大量的英文单词,也都有所界说。
……
"people":2111,"part":2112,"know":2113,
"second":2117,"university":2118,"both":2119,
"national":2120,"##er":2121,"these":2122,
……
这样就完成了文本转为数字,咱们称这个过程叫序列化。
看上面有些形如##er
款式的。这个是Bert的分词机制。它表示这些单词片段还能够再进一步拆分,比如:teacher
能够拆分为teach
和er
。那么,假如模型遇到pythoner
(词典不存在这个词,可是有人这么用),它也能依据python+er
的拆分,知道这表示python开发者
的意思。
咱们的中文在这个根底版的体系下是无法运用的。由于中文汉字有9
万多,常用字也有7
千字。这儿边只需200
来个中文字。因而,一段正常的文本在序列化时,找不到归属,都会变成[UNK]
。你说啥,它都以为是相同的,根本无法了解。
这可怎么办?那就需求一套中文的词汇表,下载中文预练习模型BERT-Base, Chinese
。咱们来看看它的vocab.txt
。
在这儿,中文词汇变成了主战场,大约有上万个中文字符。里边也包含了一些的英文单词,由于中文阅览材料会搀杂少数英文。
好了,这么看,咱们得挑选BERT-Base, Chinese
作为预练习模型。
尽管支撑102种言语的
BERT-Base, Multilingual
也包含全部中文词汇。但它的词汇量是Chinese
的5倍,会影响功率。
2.3.3 数据集途径
练习的脚本文件有了,预练习模型定了,下面就开始给他喂数据集。
SQUAD_DIR
指定了练习数据集的途径。官方给的train-v1.1.json
是斯坦福的问答集[参阅3]。可是,咱们想练习自己的问答数据。因而,你能够模仿它的格式,安排自己的数据。
他的格式是这样的:
{
"data": [
{
"title": "文章标题",
"paragraphs": [{
"context": "文章内容",
"qas": [
{
"answers": [
{"answer_start": 0,"text": "答案"}
],
"question": "问题","id": "问题id"
}]}]
}
],
"version": "1.1"
}
其间answer_start
是答案在文中的位置起点。只需咱们依照这个格式收拾好数据,Bert就能进行练习。
我从ChineseSquad
数据集(SQuAD中文版)[参阅4],抽离出了一个地舆领域的合集,里边包含:南京、四川、浙江、荷兰、阿尔卑斯山等地舆类的阅览文本,形成一个data_geo.json
练习集。
我选用的是
SQuAD v1.1
版别的格式。2.0
版别尽管更高档,可是也更麻烦。
到这儿就能够练习了。我的练习指令是:
python run_squad.py \
--vocab_file=chinese/vocab.txt \
--bert_config_file=chinese/bert_config.json \
--init_checkpoint=chinese/bert_model.ckpt \
--do_train=True \
--train_file=datasets/data_geo.json \
--train_batch_size=6 \
--learning_rate=3e-5 \
--num_train_epochs=40 \
--max_seq_length=373 \
--doc_stride=64 \
--output_dir=tmp/squad_chinese/
指令中的output_dir是练习成果保存的途径。
履行后,控制台有如下打印:
所以,通过6
个小时的等待,我就拥有了地舆职业的中文了解问答模型。
终究生成的目录结构如下:
|--checkpoint
|--model.ckpt-1946.data-00000-of-00001
|--model.ckpt-1946.index
|--model.ckpt-1946.meta
|--graph.pbtxt
|--train.tf_record
2.4 验证数据集
为了验证作用,我自己新组合了一个data_jinan.json
数据集,这儿边是关于济南的常识,只需问题,没有答案。
相同,咱们也能够运转run_squad.py
来做推理,指令如下:
python run_squad.py \
--vocab_file=chinese/vocab.txt \
--bert_config_file=chinese/bert_config.json \
--init_checkpoint=tmp/squad_chinese/model.ckpt-1946 \
--do_predict=True \
--predict_file=datasets/data_jinan.json \
--output_dir=tmp
请注意,指令中vocab_file
、bert_config_file
仍是预练习模型的文件。可是init_checkpoint
变成了咱们刚生成的文件。它是在预练习模型的根底上生成的新模型。
最终,会在tmp
文件夹下生成成果文件nbest_predictions.json
。
问题:
"context": "济南市的别称有泉城、齐州、泺邑。济南是山东省的省会、副省级市、特大城市、济南都市圈核心城市,归于二线城市,是国务院批复确定的环渤海地区南翼的中心城市。到2022年,全市下辖10个区、2个县,总面积10244.45平方千米,常住人口941.5万人,城镇人口699.8万人,城镇化率为74.3%。",
"question": "济南的总面积是多少?",
"id": "jn0014"
成果:
{
"jn0014": [
{
"text": "10244.45平方千米",
"probability": 0.9998867035004451,
"start_logit": 8.909591674804688,
"end_logit": 4.485512733459473
}
]
}
上面给咱们展现下输出的结构,猜测成果以id
对应问题。
其实,文章最最初展现的动图,便是这个模型的才能。它给出了很好的答复。
可是,它是一个端侧小模型。咱们这个model.ckpt
模型现在还不是。
2.5 转化端侧小模型
TensorFlow Lite供给了一个转化器[参阅5]。它能够支撑由其他格式转化为客户端可用的.tflite
格式。
比如通过指令行转化:
tflite_convert \
--saved_model_dir=/tmp/saved_dir \
--output_file=/tmp/mobilebert.tflite
这种方法只能做初级转化。不过,通过调用API
代码,能够做更高档的转化:
import tensorflow as tf
converter = tf.lite.TFLiteConverter.from_saved_model(saved_dir)
# todo:能够通过converter做量化处理等操作
tflite_model = converter.convert()
with open('mobilebert.tflite', 'wb') as f:
f.write(tflite_model)
而这个.tflite
文件便是咱们需求的端侧小模型。
咱们拿到这个端侧小模型之后,能够考虑运用它了。
先去下载手机版的Bert QA安卓项目[参阅6]。编译时,gradle
会自动下载mobilebert.tflite
和qa.json
保存到assets
文件夹下。现在仍是官方示例,运转一下,看看有没有问题。
然后将咱们自己生成的端侧小模型cn_mobilebert.tflite
复制进去。并且依照qa.json
的数据格式,自己组一个问题集cn_qa.json
放进去。
然后修正代码,加载咱们的端侧小模型与问题集:
LoadDataSetClient.kt修正JSON_DIR="qa.json"为"cn_qa.json"。
BertQaHelper.kt修正BERT_QA_MODEL="mobilebert.tflite"为"cn_mobilebert.tflite"
其他界面和提示语调整
运转一下,便是文章最初的作用了。
说实话,其他模型的转化能够通过这个转化器做。可是这次Bert
的转化,我费了很大一番周折。首要原因是”mobilebert.tflite”的网络结构与原本的model.ckpt
有差异,需求做解剖和重组。这对新手来说很不友好。
可是,幸好还有一个途径,那便是不通过转化,直接生成”.tflite”文件。
2.6 生成端侧小模型
TensorFlow Lite
还供给了一个Model Maker
[参阅7],能够专门针对手机制造问答端侧小模型。
它不但功用强大,而且操作简略。总体上只需求5
步。
# 1、挑选预练习模型
spec = model_spec.get('mobilebert_qa')
# 2、加载自己的数据集合
train_data = DataLoader.from_squad(train_data_path, spec, is_training=True)
validation_data = DataLoader.from_squad(validation_data_path, spec, is_training=False)
# 3、练习模型
model = question_answer.create(train_data, model_spec=spec)
# 4、评估猜测成果
metric = model.evaluate(validation_data)
# 5、导出为TensorFlow Lite格式
model.export(export_dir)
这种生成方法,更加有针对性。
不过提示给咱们一个坑,Windows
下跑不通,会一向报一个错:
No matching distribution found for scann==1.2.6
由于这个scann
库不支撑Windows
,虚拟机也不行。不过换成Linux
系统就能够了。
三、端侧小模型的好坏
端侧小模型可在客户端运转,这一点大大降低了企业的运用本钱。由于一旦模型练习好,假如没有功用变化,那么你不必再去关心和AI
开发有关的东西。
别的,相同是由于在客户端运转,客户的数据不会上传到云端进行处理。客户会很有安全感,例如对聊天记录进行剖析识别,他们不希望这类灵敏内容离开自己的手机。关于保证客户隐私,这又是一个亮点。
我感觉最令人兴奋的,是这种方法降低了企业运用AI
的门槛。让相对节俭的企业也能完成AI梦
。
当然,你别对端侧小模型有太高的奢求,由于它的才能有限。它会对一些你以为清楚明了的问题答复欠好。
拿“千佛山是泰山的余脉”举例。你问它千佛山是谁的余脉,它能答复是泰山的。可是你问两者有什么联系,它就尴尬了。
而这类问题,大模型却微微一笑。
愿望和梦想是有区别的。
愿望便是“我是高中生,我能做AI开发吗?”、“我是小企业,我能有自主的AI产品吗?”当然能够!
这些东西五年前就存在了,只是限于信息差,你不知道罢了。而我恰巧做过移动开发、AI开发、项目管理,现在整合一下告诉了你。
梦想就不相同了,他会问“你这个小本钱模型,能超过ChatGPT 4.0吗?”
这不科学!
四、材料参阅
参阅1:客户端练习模型
Device Training
tensorflow.google.cn/lite/exampl…
参阅2:Bert官方
Bert
github.com/google-rese…
参阅3:斯坦福问答数据集
SQuAD
rajpurkar.github.io/SQuAD-explo…
参阅4:ChineseSquad数据集
ChineseSquad
github.com/pluto-junze…
参阅5:转化器
TfLite Convert
www.tensorflow.org/lite/conver…
参阅6:Bert QA手机版
Bert QA Lite
tensorflow.google.cn/lite/exampl…
参阅7:端侧小模型制造器
Model Maker
www.tensorflow.org/lite/models…