Hugging Face 平台在人工智能研究,尤其是自然语言处理领域产生深远影响,平台通过提供易用的接口、丰富的预训练模型和开源工具如 transformers,简化了语言模型的使用难度, 大大降低了 NLP 应用的开发门槛。另外该平台提供了一个开放、协作的生态系统,通过模型共享以及社区协作,加速了知识传播和技术创新,使得更广泛的人群能够受益于最新的自然语言处理进展,已然成为机器学习领域的“GitHub”。
面对当前火热的对话模型,尽管 transformers 抽象且统一的接口为训练以及验证阶段提供了便利,但在推理效率方面存在一些缺点。如其内部缺少对 KV-Cache 的管理,使得每轮对话都需要所有的历史进行预填充(prefill),增加了很多重复计算,显著减慢了推理效率。另外,其缺少一种有效的部署方式,对于只想基于大语言模型进行开发的人员并不十分友好。
针对这些问题,LMDeploy 进行了大量的工程开发以及优化,经过数轮迭代,目前不仅具备了稳定且高效的推理能力,也提供了十分简单的使用方式,可以很方便地使用 Hugging Face 上面热门的 transformer 模型,实现“一键部署”。
https://github.com/InternLM/lmdeploy
https://huggingface.co/internlm
https://huggingface.co/lmdeploy
一键部署 Hugging Face 模型
在 v0.0.14 版本之前,若想使用 LMDeploy(TurboMind 引擎)进行推理或者部署,需要先使用命令 lmdeploy convert 将模型离线转换为 TurboMind 推理引擎所支持的格式,转换后的模型可以更快地被加载,但对用户使用来说增加了一个转换的环节,不太友好。
如今,自 v0.1.0a0 版本起,LDMdeploy 增加了模型在线转换的能力。通过模型的在线转换,可以直接加载 Hugging Face 模型,实现一键部署。使用前,请务必安装最新的版本:
pip install 'lmdeploy[all]>=v0.1.0a0'
API Server
API Server 提供了兼容 OpenAI API 服务接口的 RESTful API,可直接作为使用 OpenAI API 程序的替代品。
lmdeploy serve api_server internlm/internlm-chat-20b --model-name internlm-chat-20b
运行命令后,在浏览器中输入 http://0.0.0.0:23333 可以打开 Swagger UI,浏览各个 API 的使用方法并进行测试。其中前三个与 OpenAI API 一致,最后一个为 LMDeploy 独有的交互模式推理接口,它会在服务端保留历史对话的信息,避免多轮对话时重复进行 Context Decoding,提高运行效率。具体使用方式可参考我们之前的文章。
WebUI
LMDeploy 提供了基于 Gradio 的 Web 交互界面,并且可以配合 API Server 使用,使 Web 服务与推理服务分离。具体使用方法,可以通过 lmdeploy server gradio -h 查看帮助信息。
lmdeploy serve gradio internlm/internlm-chat-20b --model-name internlm-chat-20b
离线推理
以下展示使用 TurboMind 接口进行推理的例子:
# load model
from lmdeploy import turbomind as tm
tm_model = tm.TurboMind.from_pretrained('internlm/internlm-chat-20b', model_name='internlm-chat-20b')
generator = tm_model.create_instance()
# process query
query = 'Hello! Today is sunny, it is time to go out'
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 = tokenizer.decode(res.tolist())
print(response)
部署 4bit 量化模型
随着自然语言处理领域中日益复杂的任务需求,以及人们对模型性能的不断追求,语言模型的参数量近来急剧膨胀。面对数以亿计的参数,大模型对存储以及推理带来了新的挑战。一个 7B 的模型,大约占 14G 的显存,然而大部分消费级显卡的显存都不够加载模型,更别说推理了。
面对这些棘手的问题,聪明的研究员们提出了多种量化算法,通过将高比特权重如 FP32/FP16 量化为低比特权重如 INT8/INT4,不仅节约了显存,也降低了访存成本,提高了运算速度。详细的原理可阅读我们之前的文章。
LMDeploy 中实现了 AWQ 算法来对模型进行 4bit Weight Only 量化。与 GPTQ 算法相比,AWQ 算法在易用性和拓展性方面更具优势。相较于 AWQ 算法的官方版本,LMDeploy 进行了大量的工程优化,具有更快的速度。
构建量化模型
将浮点模型转化为 4bit 模型主要包含两个步骤:
-
生成量化参数
-
根据量化参数,量化模型权重
具体的命令如下:
# 1. 获取量化参数
lmdeploy lite calibrate
--model $HF_MODEL # 可填本地路径,或者HF的repo_id,如internlm/internlm-chat-20b
--calib_dataset 'c4' # 校准数据集,支持 c4, ptb, wikitext2, pileval
--calib_samples 128 # 校准集的样本数,如果显存不够,可以适当调小
--calib_seqlen 2048 # 单条的文本长度,如果显存不够,可以适当调小
--work_dir $WORK_DIR # 保存 Pytorch 格式量化统计参数和量化后权重的文件夹
# 2. 根据量化参数,量化模型权重
lmdeploy lite auto_awq
--model $HF_MODEL # 与步骤 1 一致
--w_bits 4 # 权重量化的 bit 数
--w_group_size 128 # 权重量化分组统计尺寸
--work_dir $WORK_DIR # 步骤 1 保存量化参数的目录
另外,InternLM 以及 LMDeploy 在 Hugging Face 上面上传了一些热门的量化好的大模型,并验证了量化后的精度,可以直接下载使用,模型列表也在持续增加中。
下载链接:
https://huggingface.co/internlm
https://huggingface.co/lmdeploy
使用量化模型
量化模型的使用方式与前文一致,以 internlm/internlm-chat-20b-4bit 为例。
API Server
lmdeploy serve api_server internlm/internlm-chat-20b-4bit --model-name internlm-chat-20b
WebUI
lmdeploy serve gradio internlm/internlm-chat-20b-4bit --model-name internlm-chat-20b
internlm/internlm-chat-20b-4bit Model Card Inference 的部分说明,使用的是V0.0.14之前的部署方式,即先离线转化为 TurboMind 的模型格式,再加载转换好的模型。
结语
2023 年是生成式人工智能爆发的一年,基于 transformer 的语言大模型与以往的模型相比,在上下文理解,通用性和多任务适应性方面展现出了显著的优势,在处理复杂 NLP 任务中成为主流选择。
本文由 Hugging Face 中文社区内容共建项目提供,稿件由社区成员投稿,经授权发布于 Hugging Face 公众号。文章内容不代表官方立场,文中介绍的产品和服务等均不构成投资建议。了解更多请关注公众号:如果你有与开源 AI、Hugging Face 相关的技术和实践分享内容,以及最新的开源 AI 项目发布,希望通过我们分享给更多 AI 从业者和开发者们,请通过下面的链接投稿与我们取得联系:
https://hf.link/tougao