本文为稀土技能社区首发签约文章,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库的呈现,也让PyTorchTensorFlow这些模型能够相互转化和运用。能够说,国外的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服务器,每台服务器配备4NVIDIA V100 GPU,总共32GPU,至少需求练习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表示运转斯坦福问答数据集SQuADSQuAD(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能够拆分为teacher。那么,假如模型遇到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_filebert_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.tfliteqa.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…