零基础入门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,即可实现一个简单的本地知识库问答系统。

相关推荐
明明真系叻37 分钟前
第二十六周机器学习笔记:PINN求正反解求PDE文献阅读——正问题
人工智能·笔记·深度学习·机器学习·1024程序员节
88号技师2 小时前
2024年12月一区SCI-加权平均优化算法Weighted average algorithm-附Matlab免费代码
人工智能·算法·matlab·优化算法
IT猿手2 小时前
多目标应用(一):多目标麋鹿优化算法(MOEHO)求解10个工程应用,提供完整MATLAB代码
开发语言·人工智能·算法·机器学习·matlab
88号技师2 小时前
几款性能优秀的差分进化算法DE(SaDE、JADE,SHADE,LSHADE、LSHADE_SPACMA、LSHADE_EpSin)-附Matlab免费代码
开发语言·人工智能·算法·matlab·优化算法
2301_764441332 小时前
基于python语音启动电脑应用程序
人工智能·语音识别
HyperAI超神经3 小时前
未来具身智能的触觉革命!TactEdge传感器让机器人具备精细触觉感知,实现织物缺陷检测、灵巧操作控制
人工智能·深度学习·机器人·触觉传感器·中国地质大学·机器人智能感知·具身触觉
galileo20163 小时前
转化为MarkDown
人工智能
说私域3 小时前
私域电商逆袭密码:AI 智能名片小程序与商城系统如何梦幻联动
人工智能·小程序
请站在我身后4 小时前
复现Qwen-Audio 千问
人工智能·深度学习·语言模型·语音识别
love you joyfully4 小时前
目标检测与R-CNN——paddle部分
人工智能·目标检测·cnn·paddle