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 是一个开放平台,用于训练、服务和评估基于大型语言模型的聊天机器人。核心功能包括:
最先进模型的训练和评估代码(例如,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.
【建议在虚拟环境里进行安装,可以用docker或者anaconda,这里使用anaconda】
conda create -n baichuan2 python==3.10
conda activate 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
# 方法一:使用点
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]"
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 |
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)
因笔者硬件有限,只有一张T4,故测试的是量化后的模型
# 指定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 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
python3 -m fastchat.serve.cli --model-path /home/ubuntu/model-gpt/Baichuan2-13B-Chat-4bits --device cpu
使用web UI提供服务,需要三个主要组件:
操作步骤如下:
python3 -m fastchat.serve.controller
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
python3 -m fastchat.serve.gradio_web_server
操作步骤如下:
python3 -m fastchat.serve.controller
# 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 服务器,其中包括 Chatbot Arena 选项卡。
python3 -m fastchat.serve.gradio_web_server_multi
OpenAI 兼容 RESTful API 和 SDK
FastChat 为其支持的模型提供与 OpenAI 兼容的 API,可以使用 FastChat 作为 OpenAI API 的本地直接替代品。FastChat 服务器与 openai-python 库和 CURL 命令兼容。
首先,启动控制器
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
首先,启动控制器
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 &