Q&A专栏 | 书生·浦语社区常见问题及解答
书生·浦语-20B 发布后,在社区引起了很多开发者的关注和使用,感谢大家对书生·浦语大模型的支持!
针对近期社区开发者提出数百条非常有价值的反馈,浦语小助手梳理了几类典型的问题,分别是关于书生·浦语大模型资源消耗、Prompt Template、模型下载、和模型支持长度方面,以文章的形式分享给更多有需要的人,帮助大家更好的使用书生·浦语全链路大模型工具链。
1. 资源耗费问题
▶ 20B 模型部署、低成本微调和全量微调大概需要多少的 GPU 资源?
模型部署:3090 等 24G 显卡能够顺畅的使用 LMDeploy 对 internlm-20b 进行 4 bit 量化和部署推理,在不量化的情况下推理大概需要 50G 左右的显存,可用单卡 A100 或者四卡 3090 进行推理部署。
低成本微调:使用 XTuner 中的实现的 QLora 方法对 20B 模型微调,24G 的 3090 显卡能满足基本需求,但是在模型 Merge QLora 权重和原始权重阶段显存占用会超过 40G,可以考虑使用显存更大的卡(如单卡 A100 或者四卡 3090),或使用 offload (--offload-folder)技巧将模型加载至内存或硬盘。在前期学习阶段建议使用 internlm-7b 在 3090 等 24 G 显卡上进行实验测试。
全量微调:8 卡 A100 基本能满足 internlm 20b 模型的全量微调需求。
▶ internlm-chat-20b 4 bit 量化模型相比不量化的模型效果差多少?
internlm-chat-20b 4 bit 量化和未量化的精度在 gsm8k 数据集上是对齐的,其他数据集有待测试。
2. Prompt Template 问题
▶ 请问 internlm-chat-20b 的 Prompt Template 是什么?和 internlm-chat-7b 一样吗?system instruction 怎么添加?
internlm-chat-20b 和 internlm-chat-7b 的 Prompt Template 是相同的,如下所示,其中 <eoh> 是 end of human 的缩写,<eoa> 是 end of assistant 的缩写,本 Prompt Tempate 在 LMDeploy 源码 lmdeploy/model.py#L171 的InternLMChat7B 类和 InternLM 源码 web_demo.py#L49 得到了应用。
system_instruction = "<|System|>:{system}\n"
user_prompt = "<|User|>:{user}\n"
robot_prompt = "<|Bot|>:{robot}<eoa>\n"
3. 模型下载问题
▶ modelscope 上的 internlm 模型如何通过 git clone 下载?
从 modelscope 上 git clone 模型对链接的规范程度要求比较高,本小节以下载 internlm-chat-20b 为例展示使用 git clone 方法从 modelscope 下载模型。
internlm-chat-20b 模型在 modelscope 上的链接为 https://modelscope.cn/models/Shanghai_AI_Laboratory/internlm-chat-20b/summary,此时我们 git clone 这个链接会报错,我们按照下列规范修改链接即能成功 git clone。
① 以 https://www.modelscope.cn/ 开头,www 这个三个字母不能省略。
② 在 https://www.modelscope.cn/ 后面添加模型名称例如 Shanghai_AI_Laboratory/internlm-chat-20b。
③ 在链接最后添加 .git 后缀。
按照这个规范我们得到了 https://www.modelscope.cn/Shanghai_AI_Laboratory/internlm-chat-20b.git , 新增了 www 和 .git 删除了model 这个单词,如下所示,此时我们先安装好 git-lfs 依赖并运行 git clone 命令就能成功下载模型了,其他模型也是类似的方法。
# 使用 git clone 前,需安装 git-lfs 依赖,以下为 ubuntu 系统中的示例
sudo apt update
sudo apt install git-lfs
git lfs install
# git clone 模型权重
git clone https://www.modelscope.cn/Shanghai_AI_Laboratory/internlm-chat-20b.git
▶ modelscope 和 hugging face 上下载的模型有什么区别?
modelscope 和 hugging face 上的书生·浦语模型是对齐的,都是 hugging face 格式的模型。
▶ internlm-chat-20b 下载下来多大,为什么 git clone 下来大小为 86G 是实际大小的一倍?
使用 git clone 下载下来的模型是实际大小的一倍,原因是因为 git clone 会多 clone 一个 .git 文件夹, 在上传模型前执行git commit 命令后,.git 文件夹中会有一份缓存,所以整个 repo 的大小会比模型真实大小会大一倍,所以推荐使用 hugging face 或 modelscope 提供的 python 库进行下载。
首先我们在 hugging face 上进行实验,运行以下 git clone 进行下载:
git clone https://huggingface.co/internlm/internlm-chat-20b
上图所示通过执行 du -sh internlm-chat-20b 命令查看下载下来模型的大小为 86 G,进入 internlm-chat-20b 文件夹执行 du -sh .git 命令,可以从下图看出 .git 文件夹整整 47 G。
直接 git clone modelscope 上的 internlm-chat-20b 模型也是类似的情况,所以不推荐使用 git 进行模型下载。
接下来我们使用 modelscope 的 snapshot_download 函数下载 internlm-chat-20b,由于权重是和 hugging face 上对齐的,模型下载后所以可以使用 hugging face 的 transformers 库进行后续的操作。
from modelscope import snapshot_download
snapshot_download("Shanghai_AI_Laboratory/internlm-chat-20b", cache_dir="./")
此时我们通过 du -sh internlm-chat-20b 查看文件大小为 38 G 远小于 git clone 下来的 86 G,能大大节省磁盘空间和时间。
同样也可以使用以下 hugging face 提供的 snapshot_download 函数进行下载,权重大小也为 38 G。
from huggingface_hub import snapshot_download
snapshot_download("internlm/internlm-chat-20b", local_dir='./model', local_dir_use_symlinks=False)
所以推荐使用 modelscope 的 snapshot_download python 函数对模型下载,能节省 47G 的磁盘空间以及大量的等待时间。
4. 模型支持长度问题
▶ internlm-20b 模型支持的长度是多少,关键的源码在何处?
这里我们首先需要明确两个概念:输入长度(input length)和上下文长度(context length)。
input length:表示输入序列的总长度,表示输入到模型的 token 的数量。例如输入一个"Hello world"序列,包含2个token,则 input length 为 2。
context length:指输入序列中用于预测下一个 token 的 context 窗口大小。例如使用前 4 个 token 来预测第5个token,则 context length 为4。
对于LLM,input length 会随生成序列变长而持续增大。但最大 context length 通常是固定的,每次只看前 N 个 token 来预测下一个 token。通常来说,输入长度与上下文长度相等(即默认模型会处理整个输入序列)。
一般来说,最大 context length 的长度要小于等于训练时的输入长度,但最大context length 的长度与计算资源、Attention 方式以及位置编码能力均有关。在 internlm 系列模型(7B与20B)中,我们在训练阶段采用了 4096(4k)的训练输入长度,且采用了 dense attention(即全量计算)的方法,因而常规支持 4k 以内的 context length,但可以通过 Dynamic NTK(LMDeploy 中已支持)等方式,在推理阶段将最大 context length 扩展为上万长度。
关键源码请查看:
①InternLM/internlm/data/packed_dataset.py
②InternLM/internlm/model/multi_head_attention.py#L159-L186
5. 其他问题
▶ 运行程序时报错:'InternLMTokenizer' object has no attribute 'sp_model'
由于 transformers 库更新到了 4.34.0 导致了和旧的权重中的 tokenization_internlm.py 不兼容,有两个解决方案,可以通过重新下载最新的权重,也可以通过pip install transformers==4.33.3命令安装 4.33.3 版本的 transformers 来解决这个问题,相关 issue 请访问 https://github.com/InternLM/InternLM/issues/400。
▶ hugging face 上 的 internlm-chat-20b-4bit 为什么使用 transformers 加载会报错
hugging face internlm 组织下 internlm-chat-20b-4bit 模型不是 hugging face transformers 格式的权重,是使用 lmdeploy 量化后得到的 lmdeploy 格式的权重,只能使用 lmdeploy 的 turbomind 引擎进行部署推理。
本期的 Q&A 专栏就到这里结束了,更多使用问题欢迎大家通过 github issue 入口反馈给我们。
欢迎大家关注 InternLM 的系列开源库,包括:
InternLM 书生·浦语大模型,包含面向实用场景的 70 亿参数基础模型与对话模型 (InternLM-7B)和 200 亿参数基础模型与对话模型(InternLM-20B)。
https://github.com/InternLM/InternLM
InternLM-XComposer 浦语·灵笔图文混合创作大模型,依托强大的多模态性能,解锁“一键生成”图文混合文章的创作能力,为大模型落地应用提供更多可能。
https://github.com/InternLM/InternLM-XComposer
LMDeploy 面向大模型部署的推理工具链,支持十亿到千亿参数语言模型的高效推理。推理性能领先开源社区。
https://github.com/InternLM/lmdeploy
OpenCompass 面向大模型评测的一站式、全方位评测平台,包含超过 70 个评测集、40 万评测题目。通过全自动分布式评测,保障开源模型性能可高效复现。
https://github.com/open-compass/opencompass
XTuner 大模型轻量级微调框架,支持在消费级显卡上微调大语言模型,支持多种大语言模型、数据集、和微调算法,支撑用户根据自身具体需求选择合适的解决方案。
https://github.com/InternLM/xtuner
Lagent 轻量灵活的智能体框架,支持用户快速将一个大语言模型转变为多种类型的智能体,并提供典型工具为大语言模型赋能。Lagent 开源框架支持 InternLM、Llama 及 ChatGPT 等大语言模型,并集合了ReAct、AutoGPT 及ReWoo 等多种类型的智能体能力。在 Lagent 的加持下,这些智能体可调用大语言模型进行规划推理和工具调用,并可在执行中及时进行反思和自我修正。
https://github.com/InternLM/lagent
(欢迎扫码加入书生·浦语微信交流群)
2023-10-20
2023-10-19