Baichuan2大模型官方部署与Fastchat部署方案

Baichuan2大模型官方部署与Fastchat部署方案

  • baichuan2模型介绍
  • Fastchat 框架介绍
  • 环境的配置【本文是在Baichuan2官方定义的推理环境依赖中运行】
    • 创建虚拟环境
      • 安装baichuan2的相关依赖包
      • 安装Fastchat环境依赖
    • 部署推理
      • Baichuan2 官方方案
        • 量化部署
        • CPU 部署
      • Fastchat部署
        • 命令行部署推理
        • Web GUI部署推理
          • 单模型UI启动
          • 多模型UI启动(可选)
      • 部署为本地RESTful API 服务器
        • 部署RESTful API 服务器
        • 后台部署RESTful API 服务器

baichuan2模型介绍

1.Baichuan 2 是百川智能推出的新一代开源大语言模型,采用 2.6 万亿 Tokens 的高质量语料训练。
2.Baichuan 2 在多个权威的中文、英文和多语言的通用、领域 benchmark 上取得同尺寸最佳的效果。
3.Baichuan2包含有 7B、13B 的 Base 和 Chat 版本,并提供了 Chat 版本的 4bits 量化。

模型下载地址:https://huggingface.co/baichuan-inc/
在该路径下,寻找想要的版本

如果命令下载遇到timed out问题,可以看笔者的另一篇文章,里面有多种解决方案

Fastchat 框架介绍

FastChat 是一个开放平台,用于训练、服务和评估基于大型语言模型的聊天机器人。核心功能包括:

最先进模型的训练和评估代码(例如,Vicuna、MT-Bench)。
具有 Web UI 和 OpenAI 兼容 RESTful API 的分布式多模型服务系统。

以下列表为官方最新支持模型

Supported models
meta-llama/Llama-2-7b-chat-hf
# example: python3 -m fastchat.serve.cli --model-path meta-llama/Llama-2-7b-chat-hf
Vicuna, Alpaca, LLaMA, Koala
# example: python3 -m fastchat.serve.cli --model-path lmsys/vicuna-7b-v1.3
BAAI/AquilaChat-7B
BAAI/bge-large-en
baichuan-inc/baichuan-7B
BlinkDL/RWKV-4-Raven
# example: python3 -m fastchat.serve.cli --model-path ~/model_weights/RWKV-4-Raven-7B-v11x-Eng99%-Other1%-20230429-ctx8192.pth
bofenghuang/vigogne-2-7b-instruct
bofenghuang/vigogne-2-7b-chat
camel-ai/CAMEL-13B-Combined-Data
codellama/CodeLlama-7b-Instruct-hf
databricks/dolly-v2-12b
FlagAlpha/Llama2-Chinese-13b-Chat
FreedomIntelligence/phoenix-inst-chat-7b
FreedomIntelligence/ReaLM-7b-v1
h2oai/h2ogpt-gm-oasst1-en-2048-open-llama-7b
internlm/internlm-chat-7b
lcw99/polyglot-ko-12.8b-chang-instruct-chat
lmsys/fastchat-t5-3b-v1.0
mosaicml/mpt-7b-chat
# example: python3 -m fastchat.serve.cli --model-path mosaicml/mpt-7b-chat
Neutralzz/BiLLa-7B-SFT
nomic-ai/gpt4all-13b-snoozy
NousResearch/Nous-Hermes-13b
openaccess-ai-collective/manticore-13b-chat-pyg
OpenAssistant/oasst-sft-4-pythia-12b-epoch-3.5
VMware/open-llama-7b-v2-open-instruct
Phind/Phind-CodeLlama-34B-v2
project-baize/baize-v2-7b
Qwen/Qwen-7B-Chat
Salesforce/codet5p-6b
StabilityAI/stablelm-tuned-alpha-7b
THUDM/chatglm-6b
THUDM/chatglm2-6b
tiiuae/falcon-40b
tiiuae/falcon-180B-chat
timdettmers/guanaco-33b-merged
togethercomputer/RedPajama-INCITE-7B-Chat
WizardLM/WizardLM-13B-V1.0
WizardLM/WizardCoder-15B-V1.0
HuggingFaceH4/starchat-beta
HuggingFaceH4/zephyr-7b-alpha
Xwin-LM/Xwin-LM-7B-V0.1
Any EleutherAI pythia model such as pythia-6.9b
Any Peft adapter trained on top of a model above. To activate, must have peft in the model path. Note: If loading multiple peft models, you can have them share the base model weights by setting the environment variable PEFT_SHARE_BASE_WEIGHTS=true in any model worker.

环境的配置【本文是在Baichuan2官方定义的推理环境依赖中运行】

【建议在虚拟环境里进行安装,可以用docker或者anaconda,这里使用anaconda】

创建虚拟环境

conda create -n baichuan2 python==3.10
conda activate baichuan2

安装baichuan2的相关依赖包

第一种:
下载指定版本模型,里面会有 requirements.txt 文件

# 【官方版本安装完运行模型可能会报错AttributeError: 'BaichuanTokenizer' object has no attribute 'sp_model'】
pip install -r requirements.txt 
# 若报错上面问题可尝试pip install transformers==4.33.2 -i https://pypi.tuna.tsinghua.edu.cn/simple

第二种:
笔者试验成功的环境

# Name                    Version                   Build  Channel
_libgcc_mutex             0.1                        main  
_openmp_mutex             5.1                       1_gnu  
accelerate                0.23.0                   pypi_0    pypi
aiohttp                   3.8.6                    pypi_0    pypi
aiosignal                 1.3.1                    pypi_0    pypi
altair                    5.1.2                    pypi_0    pypi
anyio                     3.7.1                    pypi_0    pypi
async-timeout             4.0.3                    pypi_0    pypi
attrs                     23.1.0                   pypi_0    pypi
bitsandbytes              0.41.1                   pypi_0    pypi
blinker                   1.6.3                    pypi_0    pypi
bzip2                     1.0.8                h7b6447c_0  
ca-certificates           2023.08.22           h06a4308_0  
cachetools                5.3.1                    pypi_0    pypi
certifi                   2023.7.22                pypi_0    pypi
charset-normalizer        3.3.0                    pypi_0    pypi
click                     8.1.7                    pypi_0    pypi
cmake                     3.27.6                   pypi_0    pypi
deepspeed                 0.11.1                   pypi_0    pypi
dnspython                 2.4.2                    pypi_0    pypi
exceptiongroup            1.1.3                    pypi_0    pypi
fastapi                   0.104.0                  pypi_0    pypi
filelock                  3.12.4                   pypi_0    pypi
frozenlist                1.4.0                    pypi_0    pypi
fschat                    0.2.31                   pypi_0    pypi
fsspec                    2023.9.2                 pypi_0    pypi
gitdb                     4.0.10                   pypi_0    pypi
gitpython                 3.1.37                   pypi_0    pypi
h11                       0.14.0                   pypi_0    pypi
hjson                     3.1.0                    pypi_0    pypi
httpcore                  0.18.0                   pypi_0    pypi
httpx                     0.25.0                   pypi_0    pypi
huggingface-hub           0.17.3                   pypi_0    pypi
idna                      3.4                      pypi_0    pypi
importlib-metadata        6.8.0                    pypi_0    pypi
jinja2                    3.1.2                    pypi_0    pypi
jsonschema                4.19.1                   pypi_0    pypi
jsonschema-specifications 2023.7.1                 pypi_0    pypi
ld_impl_linux-64          2.38                 h1181459_1  
libffi                    3.3                  he6710b0_2  
libgcc-ng                 11.2.0               h1234567_1  
libgomp                   11.2.0               h1234567_1  
libstdcxx-ng              11.2.0               h1234567_1  
libuuid                   1.41.5               h5eee18b_0  
lit                       17.0.2                   pypi_0    pypi
lxml                      4.9.3                    pypi_0    pypi
markdown-it-py            3.0.0                    pypi_0    pypi
markdown2                 2.4.10                   pypi_0    pypi
markupsafe                2.1.3                    pypi_0    pypi
mdurl                     0.1.2                    pypi_0    pypi
mpmath                    1.3.0                    pypi_0    pypi
multidict                 6.0.4                    pypi_0    pypi
ncurses                   6.4                  h6a678d5_0  
networkx                  3.1                      pypi_0    pypi
nh3                       0.2.14                   pypi_0    pypi
ninja                     1.11.1                   pypi_0    pypi
numpy                     1.26.0                   pypi_0    pypi
nvidia-cublas-cu11        11.10.3.66               pypi_0    pypi
nvidia-cuda-cupti-cu11    11.7.101                 pypi_0    pypi
nvidia-cuda-nvrtc-cu11    11.7.99                  pypi_0    pypi
nvidia-cuda-runtime-cu11  11.7.99                  pypi_0    pypi
nvidia-cudnn-cu11         8.5.0.96                 pypi_0    pypi
nvidia-cufft-cu11         10.9.0.58                pypi_0    pypi
nvidia-curand-cu11        10.2.10.91               pypi_0    pypi
nvidia-cusolver-cu11      11.4.0.1                 pypi_0    pypi
nvidia-cusparse-cu11      11.7.4.91                pypi_0    pypi
nvidia-nccl-cu11          2.14.3                   pypi_0    pypi
nvidia-nvtx-cu11          11.7.91                  pypi_0    pypi
openssl                   1.1.1w               h7f8727e_0  
packaging                 23.2                     pypi_0    pypi
pandas                    2.1.1                    pypi_0    pypi
pillow                    10.0.1                   pypi_0    pypi
pip                       23.2.1          py310h06a4308_0  
prompt-toolkit            3.0.39                   pypi_0    pypi
protobuf                  4.24.4                   pypi_0    pypi
psutil                    5.9.5                    pypi_0    pypi
py-cpuinfo                9.0.0                    pypi_0    pypi
pyarrow                   13.0.0                   pypi_0    pypi
pycrawlers                1.1.1                    pypi_0    pypi
pydantic                  1.10.13                  pypi_0    pypi
pydeck                    0.8.1b0                  pypi_0    pypi
pygments                  2.16.1                   pypi_0    pypi
pymongo                   4.5.0                    pypi_0    pypi
python                    3.10.0               h12debd9_5  
python-dateutil           2.8.2                    pypi_0    pypi
pytz                      2023.3.post1             pypi_0    pypi
pyyaml                    6.0.1                    pypi_0    pypi
readline                  8.2                  h5eee18b_0  
referencing               0.30.2                   pypi_0    pypi
regex                     2023.10.3                pypi_0    pypi
requests                  2.31.0                   pypi_0    pypi
rich                      13.6.0                   pypi_0    pypi
rpds-py                   0.10.4                   pypi_0    pypi
safetensors               0.4.0                    pypi_0    pypi
scipy                     1.11.3                   pypi_0    pypi
sentencepiece             0.1.99                   pypi_0    pypi
setuptools                68.0.0          py310h06a4308_0  
shortuuid                 1.0.11                   pypi_0    pypi
six                       1.16.0                   pypi_0    pypi
smmap                     5.0.1                    pypi_0    pypi
sniffio                   1.3.0                    pypi_0    pypi
sqlite                    3.41.2               h5eee18b_0  
starlette                 0.27.0                   pypi_0    pypi
streamlit                 1.27.2                   pypi_0    pypi
svgwrite                  1.4.3                    pypi_0    pypi
sympy                     1.12                     pypi_0    pypi
tenacity                  8.2.3                    pypi_0    pypi
tiktoken                  0.5.1                    pypi_0    pypi
tk                        8.6.12               h1ccaba5_0  
tokenizers                0.13.3                   pypi_0    pypi
toml                      0.10.2                   pypi_0    pypi
toolz                     0.12.0                   pypi_0    pypi
torch                     2.0.0                    pypi_0    pypi
tornado                   6.3.3                    pypi_0    pypi
tqdm                      4.66.1                   pypi_0    pypi
transformers              4.33.2                   pypi_0    pypi
triton                    2.0.0                    pypi_0    pypi
typing-extensions         4.8.0                    pypi_0    pypi
tzdata                    2023.3                   pypi_0    pypi
tzlocal                   5.1                      pypi_0    pypi
urllib3                   2.0.6                    pypi_0    pypi
uvicorn                   0.23.2                   pypi_0    pypi
validators                0.22.0                   pypi_0    pypi
watchdog                  3.0.0                    pypi_0    pypi
wavedrom                  2.0.3.post3              pypi_0    pypi
wcwidth                   0.2.8                    pypi_0    pypi
wheel                     0.41.2          py310h06a4308_0  
xz                        5.4.2                h5eee18b_0  
yarl                      1.9.2                    pypi_0    pypi
zipp                      3.17.0                   pypi_0    pypi
zlib                      1.2.13               h5eee18b_0  

安装Fastchat环境依赖

# 方法一:使用点
pip3 install "fschat[model_worker,webui]"
# 方法二:从源头
1.克隆此存储库并导航到 FastChat 文件夹
git clone https://github.com/lm-sys/FastChat.git
cd FastChat
2.安装包
pip3 install --upgrade pip  # enable PEP 660 support
pip3 install -e ".[model_worker,webui]"

部署推理

Baichuan2 官方方案

Chat 模型推理方法示范:

>>> import torch
>>> from transformers import AutoModelForCausalLM, AutoTokenizer
>>> from transformers.generation.utils import GenerationConfig
>>> tokenizer = AutoTokenizer.from_pretrained("baichuan-inc/Baichuan2-13B-Chat", use_fast=False, trust_remote_code=True)
>>> model = AutoModelForCausalLM.from_pretrained("baichuan-inc/Baichuan2-13B-Chat", device_map="auto", torch_dtype=torch.bfloat16, trust_remote_code=True)
>>> model.generation_config = GenerationConfig.from_pretrained("baichuan-inc/Baichuan2-13B-Chat")
>>> messages = []
>>> messages.append({"role": "user", "content": "解释一下“温故而知新”"})
>>> response = model.chat(tokenizer, messages)
>>> print(response)
"温故而知新"是一句中国古代的成语,出自《论语·为政》篇。这句话的意思是:通过回顾过去,我们可以发现新的知识和理解。换句话说,学习历史和经验可以让我们更好地理解现在和未来。

这句话鼓励我们在学习和生活中不断地回顾和反思过去的经验,从而获得新的启示和成长。通过重温旧的知识和经历,我们可以发现新的观点和理解,从而更好地应对不断变化的世界和挑战。

Base 模型推理方法示范:

>>> from transformers import AutoModelForCausalLM, AutoTokenizer
>>> tokenizer = AutoTokenizer.from_pretrained("baichuan-inc/Baichuan2-13B-Base", trust_remote_code=True)
>>> model = AutoModelForCausalLM.from_pretrained("baichuan-inc/Baichuan2-13B-Base", device_map="auto", trust_remote_code=True)
>>> inputs = tokenizer('登鹳雀楼->王之涣\n夜雨寄北->', return_tensors='pt')
>>> inputs = inputs.to('cuda:0')
>>> pred = model.generate(**inputs, max_new_tokens=64, repetition_penalty=1.1)
>>> print(tokenizer.decode(pred.cpu()[0], skip_special_tokens=True))
登鹳雀楼->王之涣
夜雨寄北->李商隐

备注:
在上述两段代码中,模型加载指定 device_map=‘auto’,会使用所有可用显卡。如需指定使用的设备,可以使用类似 export CUDA_VISIBLE_DEVICES=0,1(使用了0、1号显卡)的方式控制。

终端方式:

python cli_demo.py
# 本命令行工具是为 Chat 场景设计,因此不支持使用该工具调用 Base 模型。

网页方式:

streamlit run web_demo.py
# 依靠 streamlit 运行以下命令,会在本地启动一个 web 服务,把控制台给出的地址放入浏览器即可访问。本网页 demo 工具是为 Chat 场景设计,因此不支持使用该工具调用 Base 模型。
量化部署

量化方法
Baichuan 2 的采用社区主流的量化方法:BitsAndBytes。该方法可以保证量化后的效果基本不掉点,目前已经集成到 transformers 库里,并在社区得到了广泛应用。BitsAndBytes 支持 8bits 和 4bits 两种量化,其中 4bits 支持 FP4 和 NF4 两种格式,Baichuan 2 选用 NF4 作为 4bits 量化的数据类型。

基于该量化方法,Baichuan 2 支持在线量化和离线量化两种模式。

1.在线量化
对于在线量化,支持 8bits 和 4bits 量化,使用方式和 Baichuan-13B 项目中的方式类似,只需要先加载模型到 CPU 的内存里,再调用quantize()接口量化,最后调用 cuda()函数,将量化后的权重拷贝到 GPU 显存中。实现整个模型加载的代码非常简单,以 Baichuan2-7B-Chat 为例:

1.1 8bits 在线量化:

model = AutoModelForCausalLM.from_pretrained("baichuan-inc/Baichuan2-7B-Chat", torch_dtype=torch.float16, trust_remote_code=True)
model = model.quantize(8).cuda() 

1.2 4bits 在线量化:

model = AutoModelForCausalLM.from_pretrained("baichuan-inc/Baichuan2-7B-Chat", torch_dtype=torch.float16, trust_remote_code=True)
model = model.quantize(4).cuda() 
# 需要注意的是,在用 from_pretrained 接口的时候,用户一般会加上 device_map="auto",在使用在线量化时,需要去掉这个参数,否则会报错。

2.离线量化
2.1 官方提供了离线量化好的 4bits 的版本 Baichuan2-7B-Chat-4bits,供用户下载。 用户加载 Baichuan2-7B-Chat-4bits 模型很简单,只需要执行:

model = AutoModelForCausalLM.from_pretrained("baichuan-inc/Baichuan2-7B-Chat-4bits", device_map="auto", trust_remote_code=True)

2.2 对于 8bits 离线量化,官方没有提供相应的版本,因为 Hugging Face transformers 库提供了相应的 API 接口,可以很方便的实现 8bits 量化模型的保存和加载。用户可以自行按照如下方式实现 8bits 的模型保存和加载:

# Model saving: model_id is the original model directory, and quant8_saved_dir is the directory where the 8bits quantized model is saved.
model = AutoModelForCausalLM.from_pretrained(model_id, load_in_8bit=True, device_map="auto", trust_remote_code=True)
model.save_pretrained(quant8_saved_dir)
model = AutoModelForCausalLM.from_pretrained(quant8_saved_dir, device_map="auto", trust_remote_code=True)

量化效果
量化前后显存占用对比 (GPU Mem in GB):

Precision Baichuan2-7B Baichuan2-13B
bf16 / fp16 15.3 27.5
8bits 8.0 16.1
4bits 5.1 8.6
CPU 部署

Baichuan 2 模型支持 CPU 推理,但需要强调的是,CPU 的推理速度相对较慢。需按如下方式修改模型加载的方式:

# Taking Baichuan2-7B-Chat as an example
model = AutoModelForCausalLM.from_pretrained("baichuan-inc/Baichuan2-7B-Chat", torch_dtype=torch.float32, trust_remote_code=True)

Fastchat部署

命令行部署推理

因笔者硬件有限,只有一张T4,故测试的是量化后的模型

  • 单GPU推理
# 指定GPU CUDA_VISIBLE_DEVICES=1
CUDA_VISIBLE_DEVICES=1 python3 -m fastchat.serve.cli --model-path /home/ubuntu/model-gpt/Baichuan2-13B-Chat-4bits
  • 多GPU推理
# 指定GPU CUDA_VISIBLE_DEVICES=1,2
CUDA_VISIBLE_DEVICES=1,2 python3 -m fastchat.serve.cli --model-path /home/ubuntu/model-gpt/Baichuan2-13B-Chat-4bits --num-gpus 2
  • CPU推理
python3 -m fastchat.serve.cli --model-path /home/ubuntu/model-gpt/Baichuan2-13B-Chat-4bits --device cpu
Web GUI部署推理

使用web UI提供服务,需要三个主要组件:

  1. 与用户接口的web服务器;
  2. 托管一个或多个模型的模型worker;
  3. 协调web服务器和模型worker的控制器。
单模型UI启动

操作步骤如下:

  • 启动控制器
python3 -m fastchat.serve.controller
  • 启动model work
CUDA_VISIBLE_DEVICES=1 python3 -m fastchat.serve.model_worker --model-path /home/ubuntu/model-gpt/Baichuan2-13B-Chat-4bits

如果单显卡内存不足,指定参数 --num-gpus 2,参数CUDA_VISIBLE_DEVICES=1(指定使用哪块显卡)

  • 发送测试消息
python3 -m fastchat.serve.test_message --model-name Baichuan2-13B-Chat-4bits
  • 启动gradio
python3 -m fastchat.serve.gradio_web_server
多模型UI启动(可选)

操作步骤如下:

  • 启动控制器
python3 -m fastchat.serve.controller
  • 启动model work
# worker 1
CUDA_VISIBLE_DEVICES=0 python3 -m fastchat.serve.model_worker --model-path /home/ubuntu/model-gpt/Baichuan2-13B-Chat-4bits --controller http://localhost:21001 --port 9000 --worker http://localhost:9000 
# worker 2
CUDA_VISIBLE_DEVICES=1 python3 -m fastchat.serve.model_worker --model-path /home/ubuntu/model-gpt/Baichuan2-7B-Chat-4bits --controller http://localhost:21001 --port 9001 --worker http://localhost:9001 

如果单显卡内存不足,指定参数 --num-gpus 2,声明全局变量CUDA_VISIBLE_DEVICES=1(指定使用哪块显卡), --controller 控制器的url地址,–port 指定的端口,–worker 指定的url地址

  • 发送测试消息
python3 -m fastchat.serve.test_message --model-name Baichuan2-13B-Chat-4bits
  • 启动gradio

可以启动多选项卡 gradio 服务器,其中包括 Chatbot Arena 选项卡。

python3 -m fastchat.serve.gradio_web_server_multi

部署为本地RESTful API 服务器

OpenAI 兼容 RESTful API 和 SDK
FastChat 为其支持的模型提供与 OpenAI 兼容的 API,可以使用 FastChat 作为 OpenAI API 的本地直接替代品。FastChat 服务器与 openai-python 库和 CURL 命令兼容。

部署RESTful API 服务器

首先,启动控制器

python3 -m fastchat.serve.controller

然后,启动model_work

	CUDA_VISIBLE_DEVICES=0,1 python3 -m fastchat.serve.model_worker --model-name Baichuan2-13B-Chat-4bits --model-path /home/ubuntu/model-gpt/Baichuan2-13B-Chat-4bits --controller http://localhost:21001 --port 9000 --worker http://localhost:9000 --num-gpus 2

最后,启动 RESTful API 服务器

python3 -m fastchat.serve.openai_api_server --host localhost --port 8800
后台部署RESTful API 服务器

首先,启动控制器

nohup python3 -u -m  fastchat.serve.controller >fastchat_serve_controller.log 2>&1 &

然后,启动model_work

	CUDA_VISIBLE_DEVICES=0,1 nohup python3 -u -m fastchat.serve.model_worker --model-name Baichuan2-13B-Chat-4bits --model-path /home/ubuntu/model-gpt/Baichuan2-13B-Chat-4bits --controller http://localhost:21001 --port 9000 --worker http://localhost:9000 --num-gpus 2 > Baichuan2-13B-Chat-4bits.log 2>&1 &

最后,启动 RESTful API 服务器

nohup python3 -u -m fastchat.serve.openai_api_server --host localhost --port 8800 >openai_api_server.log 2>&1 &

你可能感兴趣的:(部署,人工智能,深度学习,python)