零基础入门AI:本地部署ChatGPT的平替 - 小羊驼 Vicuna

ChatGPT 引发了大语言模型的热潮,但是其封闭的生态也带来了诸多限制。所幸Meta倒是越来越开放,自LLaMA发布以来,围绕它微调和开发的模型越来越多,其中尤其是UC伯克利大学的研究人员联合其它几家研究机构共同推出的小羊驼(Vicuna),仅用少量的数据微调(费用约为300美元),就达到了ChatGPT 90%的性能。2023年9月又发布了基于LLaMA 2微调的1.5版本,最高支持16K上下文输入,而且基于LLaMA2的可商用授权协议,小羊驼(Vicuna)也可以免费商用,实在是企业或者个人研究的必备良心平替。本文将梳理在本地部署和使用Vicuna的详细教程。

安装 Vicuna 框架 - FastChat

  • 使用pip安装
arduino 复制代码
pip3 install "fschat[model_worker,webui]"
  • 从源码安装
bash 复制代码
git clone https://github.com/lm-sys/FastChat.git
cd FastChat
pip3 install --upgrade pip  # enable PEP 660 support
pip3 install -e ".[model_worker,webui]"

如果后续还有对框架的定制开发,建议从源码安装。

下载 Vicuna 模型

目前最新版是基于LLaMA 2微调的 v1.5,可以使用如下命令,如果模型未下载将自动下载。也可从Hugging Face下载模型,然后在命令中再指定模型路径。

Size Chat Command Hugging Face Repo
7B python3 -m fastchat.serve.cli --model-path lmsys/vicuna-7b-v1.5 lmsys/vicuna-7b-v1.5
7B-16k python3 -m fastchat.serve.cli --model-path lmsys/vicuna-7b-v1.5-16k lmsys/vicuna-7b-v1.5-16k
13B python3 -m fastchat.serve.cli --model-path lmsys/vicuna-13b-v1.5 lmsys/vicuna-13b-v1.5
13B-16k python3 -m fastchat.serve.cli --model-path lmsys/vicuna-13b-v1.5-16k lmsys/vicuna-13b-v1.5-16k
33B python3 -m fastchat.serve.cli --model-path lmsys/vicuna-33b-v1.3 lmsys/vicuna-33b-v1.3

命令行聊天

sql 复制代码
$ CUDA_VISIBLE_DEVICES=1 python -m fastchat.serve.cli --model-path models/vicuna-7b-v1.5/
Loading checkpoint shards: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 2/2 [00:08<00:00,  4.40s/it]
USER: Who are you?
ASSISTANT: I am Vicuna, a language model trained by researchers from Large Model Systems Organization (LMSYS).

网页版聊天

要使用网页版聊天,需要运行三个模块:

  • Controller:python -m fastchat.serve.controller
  • Worker:python -m fastchat.serve.model_worker --model-path models/vicuna-13b
  • WEB服务器:python -m fastchat.serve.gradio_web_server

微调

UC伯克利大学的研究人员使用了4 x A100 (40GB),我用4块A100-SXM4-80GB也微调成功了。

css 复制代码
torchrun --nproc_per_node=4 --master_port=20001 fastchat/train/train_mem.py \
    --model_name_or_path meta-llama/Llama-2-7b-hf \
    --data_path data/dummy_conversation.json \
    --bf16 True \
    --output_dir output_vicuna \
    --num_train_epochs 3 \
    --per_device_train_batch_size 2 \
    --per_device_eval_batch_size 2 \
    --gradient_accumulation_steps 16 \
    --evaluation_strategy "no" \
    --save_strategy "steps" \
    --save_steps 1200 \
    --save_total_limit 10 \
    --learning_rate 2e-5 \
    --weight_decay 0. \
    --warmup_ratio 0.03 \
    --lr_scheduler_type "cosine" \
    --logging_steps 1 \
    --fsdp "full_shard auto_wrap" \
    --fsdp_transformer_layer_cls_to_wrap 'LlamaDecoderLayer' \
    --tf32 True \
    --model_max_length 2048 \
    --gradient_checkpointing True \
    --lazy_preprocess True

RESTful API Server

要运行 RESTful API server,需要运行三个模块:

  • Controller:python -m fastchat.serve.controller
  • Worker:python -m fastchat.serve.model_worker --model-path models/vicuna-13b
  • WEB服务器:python -m fastchat.serve.openai_api_server --host 0.0.0.0 --port 8000

要调用API有两种方式:

  • OpenAI SDK

这种调用方式需要先安装openai库:pip install --upgrade openai

ini 复制代码
import openai

openai.api_key = "EMPTY"
openai.base_url = "http://localhost:8000/v1/"

model = "vicuna-7b-v1.5"
prompt = "Once upon a time"

# create a completion
completion = openai.completions.create(model=model, prompt=prompt, max_tokens=64)
# print the completion
print(prompt + completion.choices[0].text)

# create a chat completion
completion = openai.chat.completions.create(
  model=model,
  messages=[{"role": "user", "content": "Hello! What is your name?"}]
)
# print the completion
print(completion.choices[0].message.content)
  • HTTP

这种调用方式可以用requests库,以下仅用curl演示:

arduino 复制代码
curl http://localhost:8000/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "vicuna-7b-v1.5",
    "messages": [{"role": "user", "content": "Hello! What is your name?"}]
  }'

词嵌入

获取词嵌入的API接口:

arduino 复制代码
curl http://localhost:8000/v1/embeddings \
  -H "Content-Type: application/json" \
  -d '{
    "model": "vicuna-7b-v1.5",
    "input": "Hello world!"
  }'

关于使用词嵌入的使用场景,官方提供了一些基础案例如下:

Vicuna + LangChain 实现本地知识库问答系统

官方举例:

ini 复制代码
from langchain.chat_models import ChatOpenAI
from langchain.document_loaders import TextLoader
from langchain.embeddings import OpenAIEmbeddings
from langchain.indexes import VectorstoreIndexCreator

embedding = OpenAIEmbeddings(model="text-embedding-ada-002")
loader = TextLoader("state_of_the_union.txt")
index = VectorstoreIndexCreator(embedding=embedding).from_loaders([loader])
llm = ChatOpenAI(model="gpt-3.5-turbo")

questions = [
    "Who is the speaker",
    "What did the president say about Ketanji Brown Jackson",
    "What are the threats to America",
    "Who are mentioned in the speech",
    "Who is the vice president",
    "How many projects were announced",
]

for query in questions:
    print("Query:", query)
    print("Answer:", index.query(query, llm=llm))

LangChain支持加载多种格式(HTML、CSV、JSON、MARKDOWN、PDF)的本地知识库,所以可以根据实际场景,调整以上示例中的loader,即可实现一个简单的本地知识库问答系统。

相关推荐
羑悻的小杀马特42 分钟前
OpenCV 引擎:驱动实时应用开发的科技狂飙
人工智能·科技·opencv·计算机视觉
guanshiyishi4 小时前
ABeam 德硕 | 中国汽车市场(2)——新能源车的崛起与中国汽车市场机遇与挑战
人工智能
极客天成ScaleFlash4 小时前
极客天成NVFile:无缓存直击存储性能天花板,重新定义AI时代并行存储新范式
人工智能·缓存
澳鹏Appen5 小时前
AI安全:构建负责任且可靠的系统
人工智能·安全
蹦蹦跳跳真可爱5896 小时前
Python----机器学习(KNN:使用数学方法实现KNN)
人工智能·python·机器学习
视界宝藏库6 小时前
多元 AI 配音软件,打造独特音频体验
人工智能
xinxiyinhe7 小时前
GitHub上英语学习工具的精选分类汇总
人工智能·deepseek·学习英语精选
ZStack开发者社区7 小时前
全球化2.0 | ZStack举办香港Partner Day,推动AIOS智塔+DeepSeek海外实践
人工智能·云计算
Spcarrydoinb8 小时前
基于yolo11的BGA图像目标检测
人工智能·目标检测·计算机视觉
非ban必选9 小时前
spring-ai-alibaba第四章阿里dashscope集成百度翻译tool
java·人工智能·spring