本博客由bigDL-LLM大模型应用开发创新赛参赛队伍SJTUNavSailor所有
想要在CPU上快速运行你的大模型?想要更快更好的量化模型?Intel研发的BigDL-LLM重磅来袭!!!你可以将常见大模型量化为INT4//FP4/INT8/FP8 版本,从而在Intel XPU(从笔记本电脑到 GPU 再到云)上以极低延迟运行的库(适用于任何的 Pytorch 模型)。更多模型量化的信息参考BigDL官方仓库: https://github.com/intel-analytics/BigDL.
是否苦于项目开发时,本地大模型难以开发api接口?是否苦于 BigDL 量化模型难以与 modelscope、langchain 等主流框架产生联动?本文将使用 FastChat 框架,为本地大模型(包括但不限于 BigDL 量化模型)启动一个本地服务器,并为模型提供了与 OpenA I兼容的 API 。让你,可以用openai的api调用你的本地大模型!!
目录
1. 使用BigDL库的大模型的量化
本文采用的实例模型为 chatglm3-6b 模型,将通过 BigDL-llm 对模型进行量化,将原本 12GB 左右的模型量化为 INT4 模型,从而将其体量压缩至 4GB,使其可以运行在大多数 Intel XPU 上并保持较低延迟。
1.1 Chatglm3-6B模型文件下载
国内建议直接从modelscope下载chatglm3-6b的模型文件。点击或者复制链接跳转下载地址: https://modelscope.cn/models/ZhipuAI/chatglm3-6b/files
下载完成后,记住模型的下载地址。
1.2 配置环境
BigDL 和 FastChat 将共用同一个环境,建议创建一个新虚拟环境。创建并激活虚拟环境的代码为:
Note:本文采用的 python 版本为3.10
conda create --name env_name python=3.10 -y
conda activate env_name
进入虚拟环境后,安装BigDL-LLM库
pip install --pre --upgrade bigdl-llm[all]
1.3 加载模型、量化、保存量化模型
为了不每次对模型进行量化,建议先单独加载模型并量化后,保存至本地,留作以后使用。
# 从本地加载模型,并选择量化为INT4模型
from bigdl.llm.transformers import AutoModelForCausalLM
model_in_4bit = AutoModelForCausalLM.from_pretrained(pretrained_model_name_or_path='/path/to/your_model/', load_in_4bit=True, trust_remote_code=True)
save_dir = '/path/to/save_INT4_model' # 用来保存量化后的模型的地址
model_in_4bit.save_low_bit(save_dir) # 保存模型至目的地址
# 为了方便模型加载,将tokenizer加载并同样保存至目的地址
from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained(pretrained_model_name_or_path='/path/to/your_model/', trust_remote_code=True)
tokenizer.save_pretrained(save_dir) # 保存在模型的同一目的地址下
del(model_in_4bit)
1.4 使用时直接加载已量化好的模型
# 使用时仍使用bigdl库进行模型的加载
from bigdl.llm.transformers import AutoModelForCausalLM
from transformers import AutoTokenizer
save_dir = '/path/to/save_INT4_model' # 保存已量化的模型的位置
model = AutoModelForCausalLM.load_low_big(save_dir, trust_remote_code=True)
tokenizer = AutoTokenizer.from_pretrained(save_dir, trust_remote_code=True)
Bigdl-llm支持不同类型的量化,INT8等其余量化方式请参考bigdl官方仓库.
2. 量化模型的本地服务器搭载
鉴于langchain、modelscope等主流框架都支持openai的api,本项目使用FastChat搭载了一个本地服务器作为OpenAI API的本地插件替代品。FastChat为其支持的模型提供了与OpenAI兼容的API。本章节内容将展示如何使用FastChat搭载服务器,挂载量化模型,并提供与OpenAI兼容的API:
2.1 安装FastChat所需依赖
Note:由于加载模型时需要用bigdl的方式加载,所以与bigdl库安装至同一环境
pip3 install "fschat[model_worker,webui]"
2.2 修改FastChat读取模型的方式
FastChat 源码中是利用 transformers 库读取的模型,而 BigDL 库开发了与transformers相同的接口可以无痕替换掉原本的 transformers 库,并且增加了新的函数和方法支持其量化模型的加载。
为了能够成功加载BigDL的量化模型,需要对 FastChat 库的源码做一些小的修改:
Note:编辑的文件的路径为
\anaconda3\envs\fastchat-bypip\lib\site-packages\fastchat\serve\model_worker.py
#将model_worker.py中第838行至840行原来为
model = AutoModel.from_pretrained(
model_path, trust_remote_code=True, **from_pretrained_kwargs
)
#将原来的代码注释掉,改为
from bigdl.llm.transformers import AutoModelForCausalLM
model = AutoModelForCausalLM.load_low_bit(model_path, trust_remote_code=True)
需要注意的是,不同原模型对应的需要修改的代码不同。由于本项目采用的是chatglm模型,因此修改对应的加载chatglm模型的代码。同理,其他模型则修改其他模型的加载代码。
2.3 启动RESTful API Server
首先,启动控制器
python -m fastchat.serve.controller
然后,启动模型
python -m fastchat.serve.model_worker --model-path path/to/your_INT4_model --device cpu
最后,启动RESTful API服务,映射至8012端口上
python -m fastchat.serve.openai_api_server --host localhost --port 8012
2.4 测试api
用以下代码测试openai api是否可用
import openai
openai.api_key = "EMPTY"
openai.base_url = "http://localhost:8012/v1/"
model = "path/to/your_INT4_model" # 这里的model选择要和fastchat搭载的模型一致
completion = openai.chat.completions.create(
model=model,
messages=[{"role": "user", "content": "Search for the Sacramento Kings win-loss record for the entire 2022-2023 season. Add games won and games lost and multiply that result by 2"}]
)
#print the completion
print(completion.choices[0].message.content)
运行可正常输出结果(由于随机性,输出内容可能不完全一致):
“根据您提供的信息,在2022-2023赛季中,圣迭戈国王的战绩为35胜47负,胜场与负场的差距为12。将这个差距乘以2,得到的结果是24,即该赛季的胜场和负场总和为24场。”
3. 总结
经由以上的过程,我们得到了一个运行在本地CPU上的INT4量化大模型,并对外提供 OpenAI 兼容 API,使得我们在使用其他框架时,可以不用注意接口,而直接使用我们的模型。