目录
- -----------------------------------第一节课-----------------------------------
- InternLM三个大小
- 流程
- 书生浦语全链条开源开放体系
- -----------------------------------第二节课-----------------------------------
- 大模型及InternLM模型介绍
- InternLM
- Lagent
- Xcomposer
- -----------------------------------第三节课-----------------------------------
- 大模型开发范式
- 两种开发范式比较:
- LangChain 简介
- 基于LangChain搭建RAG应用流程如下图所示:
- 构建向量数据库
- -----------------------------------第四节课-----------------------------------
- -----------------------------------第五节课-----------------------------------
- load model
- process query
- inference
- -----------------------------------第六节课-----------------------------------
-----------------------------------第一节课-----------------------------------
作业
笔记
InternLM三个大小
以20B为例–性能
流程
1.首先从开源社区根据不同开源模型在各个维度上的能力选择中意的大模型
2.根据应用场景来判断是否需要对大模型进行参数微调,例如,仅仅是通用的简单对话任务则可以直接使用(至步骤5),如果应用场景比较复杂则需要对模型进行微调。
3.微调:如果算力足够则可以进行续训或全参微调,如果算力有限则可以固定一部分参数,只对部分参数修改进行部分参数微调(例如:LoRA算法)
4.微调后,如果业务场景需要与外部环境交互,例如:调用外部API,或与已有数据库进行交互,则需要构建基于大模型的智能体,如果不需要则可以在业务场景进行试用
5.评测大模型是否符合应用要求,如果符合应用要求则可以进行模型部署,否则则需要重新对模型进行微调,模型部署时也要解决一些问题,例如:以更少的资源部署模型、提升应用吞吐量
书生浦语全链条开源开放体系
数据
书生万卷开放数据:
OpenDataLab 开放数据平台,提供很多数据
预训练
微调
大语言模型的下游应用中,增量续训和有监督微调是经常会用到两种方式
增量续训使用场景: 让基座模型学习到一些新知识,如某个垂类领域知识训练数据:文章、书籍、代码等
有监督微调使用场景:让模型学会理解和遵循各种指令,或者注入少量领域知识训练数据:高质量的对话、问答数据
XTuner微调框架:8G显存即可微调7B模型
评测
国内外评测体系的整体态势:
OpenCompass评测体系
OpenCompass开源评测平台架构,亮点:
丰富模型支持:开源模型、API模型一站式评测
分布式高效评测:支持千亿参数模型在海量数据集上分布式评测
便捷的数据集接口:支持社区用户根据自身需求快速添加自定义数据集
敏捷的能力迭代:每周更新大模型能力版单,每月提升评测工具能力
部署
为了解决上面大模型的调整,开源了LMDeploy高效的推理框架,LMDeploy 提供大模型在GPU上部署的全流程解决方案,包括模型轻量化、推理和服务。
LMDeploy的静态推理性能(固定batch,输入\输出token数量)和动态推理性能(真实对话,不定长的输入\输出)相对其他框架都有一定优势
智能体
大语言模型的局限性:最新信息和知识的获取、回复的可靠性、数学计算、工具使用和交互。基于这些需求需要让大模型驱动一个智能体,智能体通常以大模型作为核心,来进行一些规划、推理、执行(让大模型自主调用工具)
开源轻量级智能体框架Lagent
举例:1.调用python代码解释器求解数学题,2.多模态AI工具使用
多模态智能体工具箱AgentLego,聚焦在提供给大模型更多的工具集合,在AgentLego加持下,可以更加简单的将大模型与环境连接起来
-----------------------------------第二节课-----------------------------------
作业
基础
使用 InternLM-Chat-7B 模型生成 300 字的小故事(需截图)。
熟悉 hugging face 下载功能,使用 huggingface_hub python 包,下载 InternLM-20B 的 config.json 文件到本地(需截图下载过程)。
进阶作业(可选做)
完成浦语·灵笔的图文理解及创作部署(需截图)
完成 Lagent 工具调用 Demo 创作部署(需截图
笔记
大模型及InternLM模型介绍
人工智能领域中参数数量巨大、拥有庞大计算能力和参数模型的模型。
大模型通常指的是机器学习或人工智能领域中参数数量巨大、拥有庞大计算能力和参数规模的模型。这些模型利用大量数据进行训练,并且拥有数十亿甚至数千亿个参数。大模型的出现和发展得益于增长的数据量、计算能力的提升以及算法优化等因素。这些模型在各种任务中展现出惊人的性能,比如自然语言处理、计算机视觉、语音识别等。这种模型通常采用深度神经网络结构,如 Transformer、BERT、GPT( Generative Pre-trained Transformer )等。
大模型的优势在于其能够捕捉和理解数据中更为复杂、抽象的特征和关系。通过大规模参数的学习,它们可以提高在各种任务上的泛化能力,并在未经过大量特定领域数据训练的情况下实现较好的表现。然而,大模型也面临着一些挑战,比如巨大的计算资源需求、高昂的训练成本、对大规模数据的依赖以及模型的可解释性等问题。因此,大模型的应用和发展也需要在性能、成本和道德等多个方面进行权衡和考量。
特点及应用
InternLM
调整参数说明
Temperature
- 质量、多样性和Temperature:temperature这个参数可以告诉机器如何在质量和多样性之间进行权衡。较低的temperature 意味着更高的质量,而较高的 temperature 意味着更高的多样性。当 temperature设置为零时,模型总是会选择具有最高可能性分数的token,从而导致模型生成的回复缺乏多样性,但却能确保总是选择模型评估出的最高质量的token来生成回复。
- 需要注意的是,虽然理论上 temperature 为零应该每次产生相同的答案,但在实践中可能并非如此!这是因为模型运行在 GPU上,可能容易出现微小的计算错误,例如四舍五入产生的误差。即使在 temperature为零的情下,这些误差会在计算中引入低水平的随机性。由于更改文本中的一个token可能会大大改变文本的含义,一个小的错误可能会导致文本后序的token选择发生级联变化,从而导致几乎完全不同的输出结果。但请放心,这通常对质量的影响微乎其微。我们提到这一点,只是以免让你在 temperature 为零时输出结果出现一些随机性而感到惊讶。
有很多方法可以让模型在质量和多样性之间进行权衡,而不是仅受 temperature 的影响。在下一节中,我们将讨论对 temperature 选择技术的一些修改。但是,如果您对将 temperature 设置为 0 很满意,可以暂时跳过这部分内容。在 temperature 为零时这些参数不会影响模型的回复,您可以放心地设置。
temperature:
- 对于每个提示语只需要单个答案:零。
- 对于每个提示语需要多个答案:非零。
top-p sampling
- top-p sampling是一种既能保证输出内容多样性,又能在保持内容质量的成本上比单纯使用 temperature
更加低的方法。由于这种技术非常有效,因此激发了许多方法变体的出现。 - 有一种常见的 top-k sampling 变体被称为 top-p sampling ,也被称为 nucleus sampling
。top-p sampling 与 top-k sampling 非常相似,只是它使用可能性分数(likelihood
scores)而不是token排名(token
ranks)来决定应保留哪些token。更具体地说,它只考虑那些可能性分数超过阈值p的排名靠前的token,而将其余的token丢弃。 - 与 top-k sampling 相比,top-p sampling
的优势在有许多较差或平庸的序列后续词时就会显现出来。例如,假设下一个token只有几个比较好的选择,却有几十个只是隐约挨边的选择。如果我们使用
k=25 的 top-k sampling(译者注:k代表的是保留的token数量)
,我们将考虑许多较差的token选择。相比之下,如果我们使用 top-p sampling 来过滤掉概率分布中最底层的
10%(译者注:将token的可能性概率从大到小排序,只保留从概率最大开始、累积概率之和达到90%为止的tokens),那么我们可能只需要考虑那些分数较高的token,同时过滤掉其他的token。 - 在实际应用中,与 top-k sampling 相比,top-p sampling
往往能够获得更好的效果。它能够更加适应输入的上下文,并提供更灵活的筛选。因此,总的来说,top-p和top-k sampling
都可以在非零的 temperature 下使用,以较低的质量成本获取输出内容的多样性,但 top-p sampling 通常效果更好。
将参数设为零的规则:
Top-p/Top-k:
- 在 temperature 为零的情况下:输出不受影响。
- 在 temperature 不为零的情况下:非零。
Lagent
主要特点
支持高性能推理. 我们现在支持了高性能推理 lmdeploy turbomind.
实现了多种类型的智能体, 我们支持了经典的 ReAct,AutoGPT 和 ReWoo 等智能体,这些智能体能够调用大语言模型进行多轮的推理和工具调用。
框架简单易拓展. 框架的代码结构清晰且简单,只需要不到20行代码你就能够创造出一个你自己的智能体(agent)。同时我们支持了 Python 解释器、API 调用和搜索三类常用典型工具。
灵活支持多个大语言模型. 我们提供了多种大语言模型支持,包括 InternLM、Llama-2 等开源模型和 GPT-4/3.5 等基于 API 的闭源模型。
Xcomposer
浦语·灵笔是基于书生·浦语大语言模型研发的视觉-语言大模型,提供出色的图文理解和创作能力,具有多项优势:
图文交错创作: 浦语·灵笔可以为用户打造图文并貌的专属文章。生成的文章文采斐然,图文相得益彰,提供沉浸式的阅读体验。这一能力由以下步骤实现:
- 理解用户指令,创作符合要求的长文章。
- 智能分析文章,自动规划插图的理想位置,确定图像内容需求。
- 多层次智能筛选,从图库中锁定最完美的图片。
- 基于丰富多模态知识的图文理解: 浦语·灵笔设计了高效的训练策略,为模型注入海量的多模态概念和知识数据,赋予其强大的图文理解和对话能力。
- 杰出性能: 浦语·灵笔在多项视觉语言大模型的主流评测上均取得了最佳性能,包括MME Benchmark (英文评测), MMBench
(英文评测), Seed-Bench (英文评测), CCBench(中文评测), MMBench-CN (中文评测).
-----------------------------------第三节课-----------------------------------
作业
基础作业
进阶作业(可选做)
https://openxlab.org.cn/apps/detail/ljqiff/CarLLMTest
笔记
大模型开发范式
##LLM 的局限性:
知识时效性受限:如何让LLM能够获取最新的知识
专业能力有限:如何打造垂域大模型
定制化成本高:如何打造个人专属的LLM应用
两种开发范式比较:
此次课程主要针对: RAG检索增强生成
LangChain 简介
LangChain 框架是一个开源工具,通过为各种 LLM 提供通用接口来简化应用程序的开发流程,帮助开发者自由构建 LLM应用。LangChain 的核心组成模块如下:
链(Chains) :将组件组合实现端到端应用,通过一个对象封装实现一系列LLM 操作
Eg. 检索问答链,覆盖实现了 RAG (检索增强生成)的全部流程。也是此次课程中实践用到的。
基于LangChain搭建RAG应用流程如下图所示:
构建向量数据库
流程如下:
加载源文件→文档分块→文档向量化
确定源文件类型,针对不同类型源文件选用不同的加载器:核心在于将带格式文本转化为无格式字符串
由于单个文档往往超过模型上下文上限,我们需要对加载的文档进行切分:一般按字符串长度进行分割,也可以手动控制分割块的长度和重叠区间长度
使用向量数据库来支持语义检索,需要将文档向量化存入向量数据库:可以使用任一一种Embedding模型来进行向量化,也可以使用多种支持语义检索的向量数据库,一般使用轻量级的Chroma
搭建知识库助手
将InternLM接入LangChain
LangChain 支持自定义LLM,可以直接接入到框架中。只需将InternLM部署在本地,并封装一个自定义LLM
类,调用本地 InternLM 即可。
构建检索问答链
LangChain提供了检索问答链模版,可以自动实现知识检索、Prompt嵌入、LLM问答的全部流程。
将基于InternLM的自定义LLM和已构建的向量数据库接入到检索问答链的上游
调用检索问答链,即可实现知识库助手的核心功能
如下图所示:
-----------------------------------第四节课-----------------------------------
作业
基础作业
3个epch幻觉严重,过拟合,污染原始权重
进阶作业:
MoelScope 平台。
https://www.modelscope.cn/models/ljqiff/learn4class/summary
OpenXlab
https://openxlab.org.cn/apps/detail/ljqiff/CarLLMTest
笔记
-----------------------------------第五节课-----------------------------------
作业
基础作业:
使用 LMDeploy 以本地对话、网页Gradio、API服务中的一种方式部署 InternLM-Chat-7B 模型,生成 300 字的小故事(需截图)
本地:
网页Gradio:
API:
进阶作业(可选做):
将第四节课训练自我认知小助手模型使用 LMDeploy 量化部署到 OpenXLab 平台。
部署:
MoelScope 平台。
https://www.modelscope.cn/models/ljqiff/learn4class/summary
OpenXlab
https://openxlab.org.cn/apps/detail/ljqiff/CarLLMTest
对internlm-chat-7b模型进行量化,并同时使用KV Cache量化,使用量化后的模型完成API服务的部署,分别对比模型量化前后和 KV Cache 量化前后的显存大小(将 bs设置为 1 和 max len 设置为512)。
在自己的任务数据集上任取若干条进行Benchmark测试,测试方向包括:
(1)TurboMind推理+Python代码集成
(2)在(1)的基础上采用W4A16量化
(3)在(1)的基础上开启KV Cache量化
(4)在(2)的基础上开启KV Cache量化
(5)使用Huggingface推理
笔记
文章目录
前言
本文介绍大模型部署的背景知识,并介绍LMDeploy工具,并实现一个部署demo
一、大模型部署的背景知识
大模型的特点
显存开销大:7B的模型就需要14G显存
自回归需要缓存大量的kv,显存开销大
shape是动态的:请求数量不固定,token逐个生成
大模型部署的挑战
设备:难以应对巨大的存储开销
推理:token的生成如何加速;动态的shape如何解决;如何有效管理和利用内存
服务:提升系统的整体吞吐量,降低平均响应时间
部署的方案
模型并行
低比特量化
…
二、LMDeploy简介
1.基本情况
LLM在英伟达设备上的部署方案,包含模型轻量化、推理和服务
推理性能:
静态(固定batch和输出输入的token数目):小batch下性能是fp16的两倍,batch越大加速效果越不明显
动态(输入输出不定长):精度优于vLLM框架
2.LMDeploy的核心功能
量化
量化的目的:减小显存占用,提升运行速度
推理的两种该情况:计算密集和访存密集
解决计算密集:采用更快的硬件计算单元提升速度,如量化
解决访存密集:提高计算访存比
Weight Only的量化可以一举两得的起到解决现存和提升推理速度的作用,内部的核心算法是AWQ算法
推理引擎TurboMind
持续批处理:
不必batch中的所有样本都处理完才进行下一个batch
有状态的推理:
请求不带历史记录,历史记录在推理测缓存中
blocked k/vcache:
block有三种状态:Free,Activate,Cache
计算过程中动态的调整显存
高性能的cuda kernel:
不断更新最新的优化方法
推理服务
通过api启动服务
部署实战demo
准备工作
创建环境
/root/share/install_conda_env_internlm_base.sh lmdeploy #复制一个base环境
conda activate lmdeploy # 激活环境
pip install packaging # 安装一个库
pip install /root/share/wheels/flash_attn-2.4.2+cu118torch2.0cxx11abiTRUE-cp310-cp310-linux_x86_64.whl # 使用预编译包提升flash_attn的安装速度
pip install 'lmdeploy[all]==v0.1.0' # 安装lmdeploy
模型转换
在线转换
在线转换模型权重,直接读取本地的模型权重
(也支持读取huggingface上的模型权重)
lmdeploy chat turbomind /share/temp/model_repos/internlm-chat-7b/ --model-name internlm-chat-7b
- 1
运行上述命令会在终端直接创建一个对话窗口
离线转换
与在线转换的区别在于需要首先将模型转换为TurboMind格式
转换后就可以实现tensor并行
创建一个lmdeploy文件夹,并利用官方提供的模型文件进行离线转换
mkdir lmdeploy
cd lmdeploy
lmdeploy convert internlm-chat-7b /root/share/temp/model_repos/internlm-chat-7b/
- 1
- 2
- 3
转换后会在当前文件夹下生成一个workspace文件夹
随后使用lmdeploy chat turbomind ./workspace
即可启动基于TurboMind推理引擎的本地对话
可以发现同样的指令,两次生成的故事是不一样的,并且基于TurboMind推理引擎的生成速度要更快
TurboMind与API服务
使用以下命令启动服务
# ApiServer+Turbomind api_server => AsyncEngine => TurboMind
lmdeploy serve api_server ./workspace \
--server_name 0.0.0.0 \
--server_port 23333 \
--instance_num 64 \
--tp 1
再启动一个终端,在新终端中运行
lmdeploy serve api_client http://localhost:23333
- 1
这样就可以启动刚刚创建的API服务,不需要加载模型,速度更快
打开本地终端,输入以下指令
ssh -CNg -L 23333:127.0.0.1:23333 root@ssh.intern-ai.org.cn -p <你的ssh端口号>
- 1
即可在本地打开http://localhost:23333
可以通过在页面上修改传入API的参数,实现对话
发现这里的模型似乎有点奇怪,问他是谁他竟然说自己是程序员哈哈
网页demo
可以使用TurboMind服务作为后端或者直接用TurboMind推理作为后端
以TurboMind推理作为后端:
lmdeploy serve gradio ./workspace
此时本地需要映射6006端口ssh -CNg -L 6006:127.0.0.1:6006 root@ssh.intern-ai.org.cn -p 34027
再打开http://localhost:6006/即可
以TurboMind服务作为后端:
先启动服务:
# ApiServer+Turbomind api_server => AsyncEngine => TurboMind lmdeploy serve api_server ./workspace \ --server_name 0.0.0.0 \ --server_port 23333 \ --instance_num 64 \ --tp 1
再用gradio调用
# Gradio+ApiServer。必须先开启 Server,此时 Gradio 为 Client lmdeploy serve gradio http://0.0.0.0:23333 \ --server_name 0.0.0.0 \ --server_port 6006 \ --restful_api True
完成后打开http://localhost:6006/ 界面如下
如何选用合适的部署方式
对于Python项目,推荐使用TurboMind推理+Python的方式,直接调用,类似于
from lmdeploy import turbomind as tm
load model
model_path = “/root/share/temp/model_repos/internlm-chat-7b/”
tm_model = tm.TurboMind.from_pretrained(model_path, model_name=‘internlm-chat-20b’)
generator = tm_model.create_instance()
process query
query = “你好啊兄嘚”
prompt = tm_model.model.get_prompt(query)
input_ids = tm_model.tokenizer.encode(prompt)
inference
for outputs in generator.stream_infer(
session_id=0,
input_ids=[input_ids]):
res, tokens = outputs[0]
response = tm_model.tokenizer.decode(res.tolist())
print(response)
模型量化
LLM是访存密集型,量化可以降低显存,提高效率
资源足够的时候可以不需要量化,只有CPU或者文本长度很长的时候,就需要量化
KV Cache量化
将KV变成int8
第一步:计算minmax
第二步:线性映射到0-255或者-127-127的范围
第三步:修改配置文件quant_policy参数为4,表示打开KVCache的开关
可以解决20%的显存,性能有时候还有提升。
量化相当于引入了轻微的噪声,有可能会起到一定的正则化作用;同时量化后的模型可能刚好适配某个数据集
W4A16量化
A16表示Activation保持FP16,只对权重参数进行4bit量化
总结
本文主要介绍了模型量化和LMDeploy的基本应用,并实现了几个部署的demo
</article>
-----------------------------------第六节课-----------------------------------
作业
基础作业
使用 OpenCompass 评测 InternLM2-Chat-7B 模型在 C-Eval 数据集上的性能
进阶作业
使用 OpenCompass 评测 InternLM2-Chat-7B 模型使用 LMDeploy 0.2.0 部署后在 C-Eval 数据集上的性能
6
笔记
文章目录
前言
提示:这里可以添加本文要记录的大概内容:
介绍大模型评测的基本知识,OpenCompass工具介绍,并实现一个评测的demo
提示:以下是本篇文章正文内容,下面案例可供参考
一、模型评测
1.为什么需要评测
公平统一的了解模型的效果
2.测评的维度
知识语言推理、情感倾向、长文本生成、agent、垂直领域问答
3.如何进行评测
基座模型和微调后的模型有所不同
客观评测和主观评测(人工评价和模型评价)
提示词工程:换prompt看是否还能答对
二、OpenCompass评测框架
1.主流的大模型评测框架
2.OpenCompass
成熟完善的测评平台架构
丰富的模型支持
成熟的流水线设计:开源模型和API模型都可以测评,易于拓展到自己的模型和数据集
有模型能力榜单
多模态模型有MMBench框架
专家领域也有特有的评测集
三、大模型评测demo
1.环境安装与数据准备
首先准备环境
conda create --name opencompass --clone=/root/share/conda_envs/internlm-base # 创建环境
conda activate opencompass # 激活环境
随后下载安装opencompass项目:
git clone https://github.com/open-compass/opencompass # 下载opencompass项目 pip install -e . # 安装opencompass项目
git连接不稳定,报错HTTP503,选择下载zip包之后上传到开发机,解压
unzip opencompass-main.zip cd opencompass-main pip install -e .
数据准备:
cp /share/temp/datasets/OpenCompassData-core-20231110.zip ./ # 拷贝数据 unzip OpenCompassData-core-20231110.zip # 解压
查看支持的数据集和模型
python tools/list_configs.py internlm ceval
2.启动测评
python run.py --datasets ceval_gen --hf-path /share/temp/model_repos/internlm-chat-7b/ --tokenizer-path /share/temp/model_repos/internlm-chat-7b/ --tokenizer-kwargs padding_side='left' truncation='left' trust_remote_code=True --model-kwargs trust_remote_code=True device_map='auto' --max-seq-len 2048 --max-out-len 16 --batch-size 4 --num-gpus 1 --debug
- 1
分别指定了hf格式的模型路径、hf格式的tokenizer路径,tokenizer参数,模型参数,最大序列长度,最大token数量,batch大小,GPU数量,debug模型
也可以用python run.py configs/xxxx.py
,现将model,Dataset,infer写好,直接运行
运行结束后,可以再output/default下找到一个用时间命名的文件夹,里面存放了模型的评估结果,下图展示了单个实验的汇总评估结果。
总结
主要介绍了模型评测的基础知识,opencompass工具的使用方法,随后实现了internlm7b模型在C-Eval数据集下的效果。