动手点关注
干货不迷路
本文旨在让无大模型开发背景的工程师或者技术爱好者无痛理解大语言模型应用开发的理论和主流工具,因此会先从与LLM应用开发相关的基础概念谈起,并不刻意追求极致的严谨和完备,而是从直觉和本质入手,结合笔者调研整理及消化理解,帮助大家能够更容易的理解LLM技术全貌,大家可以基于本文衍生展开,结合自己感兴趣的领域深入研究。若有不准确或者错误的地方也希望大家能够留言指正。
本文体系完整,内容丰富,由于内容比较多,分多次连载 。
第一部分 基础概念
1.机器学习场景类别
2.机器学习类型(LLM相关)
3.深度学习的兴起
4.基础模型
第二部分 应用挑战
1.问题定义与基本思路
2.基本流程与相关技术
1)Tokenization与Embbeding
2)向量数据库
3)finetune(微调)
4)模型部署与推理
5)prompt
6)编排与集成
7)预训练
第三部分 场景案例
常用参考
2.基本流程与相关技术
4)模型部署与推理
在前面的内容里,我们探讨了微调的作用以及常见监督微调的方法,有了模型,那么下一步就是如何部署并生成推理服务供调用方使用。对于部署推理来讲,从最简单的模型能力演示,到LLM应用集成开发,再到适应不同设备,不同场景的要求,规模化应用部署,需要面对诸多方面的技术挑战,本节将基于这一主线,从基本思想和主流工具方案角度整体做一介绍。
从本文讲解的顺序来看,微调模型在部署推理模型之前,但往往实际应用中,我们的前置流程是先把基础模型部署出来看看效果,进而简单开发一个原型应用看看产品可行性,然后才再考虑是否进入实质产品化阶段。
笔者从应用落地角度将其分为DEMO验证,模型适配优化,横向规模扩展三个阶段,第一个阶段为了验证IDEA的可行性,而后两个阶段是为了工程化落地。
DEMO验证
目前业内发布大模型都提供了完整的模型推理脚本,让可以很方便的体验效果,以ChatGLM2 6B为例,它提供了多种demo的形式,以它提供的web demo为例,只需要执行下面命令,便能够生成一个带有web ui的演示窗口:
git clone https://github.com/THUDM/ChatGLM2-6B
cd ChatGLM2-6B
# 安装依赖
pip install -r requirements.txt
pip install gradio
$ python web_demo.py
Loading checkpoint shards: 100%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 7/7 [00:12<00:00, 1.79s/it]
Running on local URL: http://127.0.0.1:7860
目前从开发者生态角度来看,形成了一个基本惯例,就是大家会把训练好的模型发布到hugging face上,共享模型,形成生态,类似于docker hub或maven nexus。
开发者利用huggingface提供的包,可以方便 地进行NLP模型的训练和推理及优化(高效参数微调库(PEFT),就是其中一部分)。例如通过下面代码就可以拉取ChatGLM2-6B模型,在本地调试(若网络不畅,可手工下载,关注公众号后续介绍)。
from transformers import AutoTokenizer, AutoModel
tokenizer = AutoTokenizer.from_pretrained("THUDM/chatglm2-6b", trust_remote_code=True)
model = AutoModel.from_pretrained("THUDM/chatglm2-6b", trust_remote_code=True, device='cuda')
model = model.eval()
response, history = model.chat(tokenizer, "你好", history=[])
print(response)
你好👋!我是人工智能助手 ChatGLM2-6B,很高兴见到你,欢迎问我任何问题。
response, history = model.chat(tokenizer, "晚上睡不着应该怎么办", history=history)
print(response)
在demo阶段,并不需要过多考虑资源和响应速度等工程化落地层面的问题,而是把精力放在模型效果及跑通故事流程上。我们需要做的是封装模型,对外提供推理接口或者UI界面方便用户或服务查看或者调用即可。因此,能够快速进行原型开发,并且尽可能减少不同角色和人的参与,能独立完成工作就成了这个阶段最重要的需求。
在快速构建模型原型服务角度,简单介绍目前主流的4个框架,streamlit,gradio,fastAPI,flask,前两个是可以通过编写python代码就能生成带有界面的web服务,后两者可以方便的构建API服务(gradio也是基于fastAPI构建)。如上面ChatGLM6B就是利用这几个框架实现的推理demo服务。
streamlit 与 gradio
from transformers import pipeline
gr.Interface.from_pipeline(pipeline("question-answering", model="uer/roberta-base-chinese-extractive-qa")).launch()
如果对于界面有自定义需求,也可以编写python代码的方式实现(类似于java中的swing)。
两者比较起来,gradio专为机器学习模型场景演示而生,使用简单,huggingface上的模型演示都使用这个库,notebook也可以原生嵌入,streamlit相对来讲能力更全面,样式更好看,如果有数据可视化需求的可以重点考虑。总体来讲,差别不大可以根据喜好选用。
FastAPI 与Flask
对于推理服务来讲,核心在于将模型变为一个服务(Model as Service),提供API接口,方便前端或者服务调用,当然也有批量推理的需求,但相对比较简单,本文不作讨论。FastAPI与Flask都是两个纯python的web 应用框架,可以快速开发API服务。
Flask(https://flask.palletsprojects.com/)基于WSGI(Web Server Gateway Interface),从成熟度角度以及生态丰富性,总的用户量上占优,是不折不扣的实力派,而FastAPI(https://fastapi.tiangolo.com/)基于 ASGI(Asynchronous Server Gateway Interface),算是站在巨人肩上的新晋网红,大有赶超之势,fastAPI核心亮点,在于原生支持异步,速度快,另外自带数据类型检查,API DOC方便开发,就开发风格上看也和flask差不多,这样使得原来一些flask用户跟风迁移过来,目前作为大模型后端的主流选型,对于笔者来讲,选择哪个都没太大问题。
下面是两个完整案例( 含代码)可供参考:
在下一小节(模型适配优化)中,将介绍模型推理优化(降低资源占用和提升推理性能)相关的内容,敬请关注。。。
合集目录:
3)微调