【LLMs学习笔记一】Vicuna部署初体验
前言
最近也开始学习LLMs,和大家分享一些采坑和技巧,最近在自己部署搭建vicuna-13b,正好乘着这次机会将加载大模型的chat框架fschat也给大家粗略介绍一下。
Fashchat简介
fastchat是一个可以加载大模型,使其以chatgpt方式进行多轮对话的一个库,它还支持一键部署网页后端,还支持对大模型进行训练、微调等等操作,官网:
特点:
- 支持8bit模型导入。
- 支持cpu模式。
- 支持富文本模式,聊天对话框非常精美,输出对于latex、markdown的支持非常完美。
- 支持多gpu模式,一键部署网页服务后端。
- 支持LLM训练,目前笔者也在探索。
环境配置
- 硬件环境:Ubuntu 20.04.3,CPU14核,120G内存,2*32G显存(2张V100)
- Vicuna-13B要求最低硬件环境,30G内存,24G显存,8bit下12G显存。
- GPU相关环境:Python 3.9,transformers 4.29.2,cuda 11.2,torch 2.0.0
- fastchat版本:fschat 0.2.8
不需要很复杂的配置环境,只需注意你的cuda和torch的版本对应就行,笔者上面的环境是为了使用LLMs直接从零搭建的,不需要各种复杂依赖,基本你只要安装好新的python,在接着安装好对应的包就可以工作了,对刚入门的新手很友好。
部署步骤
准备好以上环境后就可以开心的开始部署vicuna啦~
1.下载vicuna-delta-13b_v1.1模型权重
可以使用git clone下载:
git clone https://huggingface.co/lmsys/vicuna-13b-delta-v1.1
也可以直接在 huggingface 上点选下载,git方式可能会非常的慢,建议手动下载的方式。
2.下载llama-13b模型
注意delta模型没办法直接使用,需要和基座模型llama权重结合使用,因此需要将二者首先都加载到内存中,然后将每一层对应的参数 加起来得到一个新的模型 ,这个 新的模型才是最终可以使用的vicuna ,因此想要真正使用vicuna-13b必须得同时准备好llama-13b模型。笔者是直接在 huggingface 上点选下载的,注意模型权重部分只需要下载pytorch_model-0000x-of-00003.bin的三个文件就可以。
3.转换delta模型
fastchat已经帮我们封装好了转换delta模型的方法,命令很简单:
python3 -m fastchat.model.apply_delta \
--base-model-path /path/to/llama-13b \
--target-model-path /path/to/output/vicuna-13b \
--delta-path lmsys/vicuna-13b-delta-v1.1
其中base-model-path是我们下载好的llama-13b模型的地址,delta-path是我们下载好的vicuna-13b delta模型的地址,target-model-path是我们想要输出的最终的vicuna-13b的地址,当然如果你想自行转换,其实代码也很简单,我们看看fastchat.model.apply_delta的源码就知道了:
def apply_delta(base_model_path, target_model_path, delta_path):
delta_tokenizer = AutoTokenizer.from_pretrained(delta_path, use_fast=False, trust_remote_code=True)
delta = AutoModelForCausalLM.from_pretrained(delta_path, torch_dtype=torch.float16, low_cpu_mem_usage=True)
base = AutoModelForCausalLM.from_pretrained(base_model_path, torch_dtype=torch.float16, low_cpu_mem_usage=True)
for name, param in tqdm(base.state_dict().items(), desc="Applying delta"):
assert name in delta.state_dict()
param.data += delta.state_dict()[name] # 参数加和
base.save_pretrained(target_model_path)
delta_tokenizer.save_pretrained(target_model_path)
很显然,这里面就是简单的将base model和delta model的每一层参数都加和了起来,所以vicuna训练时完全复制了一份llama的模型,这部分参数我们称作delta model,微调的时候, 基座模型llama冻结不训练,只训练delta模型的参数 ,然后将二者的参数加和才是最终的模型。
注意,由于需要导入两份数据到内存中,因此以上方法最少需要60G的内存,没有大内存的小伙伴可以使用低内存模式,这种方式最少需要16G内存就可以了,转换方法如下:
python3 -m fastchat.model.apply_delta \
--base-model-path /path/to/llama-13b \
--target-model-path /path/to/output/vicuna-13b \
--delta-path lmsys/vicuna-13b-delta-v1.1 \
--low-cpu-mem
4.加载vicuna-13b
- 使用fastchat加载
加载方法很简单,只需一行命令:
python3 -m fastchat.serve.cli \
--model-path model/vicuna/vicuna-13b \
--style rich \
--num-gpus 2
模型加载需要等待一分多钟,就可以以多轮对话的形式来体验vicuna啦~,其输入界面如下:
- 使用transformers库,写代码加载:
import transformers, torch
from transformers import AutoModelForCausalLM, AutoTokenizer