添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
首发于 MECH玩NLP
【LLMs学习笔记一】Vicuna部署初体验

【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