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

相关推荐
程序员小袁1 小时前
基于C-MTEB/CMedQAv2-rerankingv的Qwen3-1.7b模型微调-demo
人工智能
飞哥数智坊2 小时前
AI 编程一年多,我终于明白:比技巧更重要的,是熟练度
人工智能·ai编程
新智元3 小时前
收手吧 GPT-5-Codex,外面全是 AI 编程智能体!
人工智能·openai
IT_陈寒3 小时前
Java 性能优化:5个被低估的JVM参数让你的应用吞吐量提升50%
前端·人工智能·后端
阿里云云原生3 小时前
阿里云基础设施 AI Tech Day AI 原生,智构未来——AI 原生架构与企业实践专场
人工智能
Memene摸鱼日报4 小时前
「Memene 摸鱼日报 2025.9.16」OpenAI 推出 GPT-5-Codex 编程模型,xAI 发布 Grok 4 Fast
人工智能·aigc
xiaohouzi1122334 小时前
OpenCV的cv2.VideoCapture如何加GStreamer后端
人工智能·opencv·计算机视觉
用户125205597084 小时前
解决Stable Diffusion WebUI训练嵌入式模型报错问题
人工智能
Juchecar4 小时前
一文讲清 nn.LayerNorm 层归一化
人工智能
martinzh4 小时前
RAG系统大脑调教指南:模型选择、提示设计与质量控保一本通
人工智能