TinyLLM:小型设备上的大语言模型
TinyLLM这个名字听起来有点矛盾,但它的意图很好 - 将大型语言模型(LLM)部署在小型系统上,同时保持可接受的性能。
这个项目帮助你使用消费级硬件构建一个小型的本地托管LLM,并提供类似ChatGPT的Web界面。项目的主要特点包括:
- 支持多种LLM模型
- 通过Ollama、llama.cpp或vLLM构建本地OpenAI API兼容的Web服务
- 提供可定制提示、访问外部网站、向量数据库和其他来源(如新闻、股票、天气)的聊天机器人Web界面
硬件要求
- CPU: Intel、AMD或Apple Silicon
- 内存: 8GB+ DDR4
- 硬盘: 128GB+ SSD
- GPU: NVIDIA (如GTX 1060 6GB, RTX 3090 24GB)或Apple M1/M2
- 操作系统: Ubuntu Linux, MacOS
- 软件: Python 3, CUDA 12.2
运行本地LLM
要运行本地LLM,你需要一个模型推理服务器。本项目推荐以下选项:vLLM、llama-cpp-python和Ollama。这些都提供内置的OpenAI API兼容Web服务器,方便你与其他工具集成。
Ollama服务器(选项1)
Ollama项目使在各种系统(MacOS、Linux、Windows)上安装和运行LLM变得非常简单,即使硬件资源有限。它还提供OpenAI兼容的API。底层LLM引擎是llama.cpp。与llama.cpp一样,这个服务器的缺点是一次只能处理一个会话/提示。
要运行Ollama服务器容器:
# 安装并运行Ollama服务器
docker run -d --gpus=all \
-v $PWD/ollama:/root/.ollama \
-p 11434:11434 \
-p 8000:11434 \
--restart unless-stopped \
--name ollama \
ollama/ollama
# 下载并测试运行llama3模型
docker exec -it ollama ollama run llama3
# 告诉服务器将模型保持在GPU中加载
curl http://localhost:11434/api/generate -d '{"model": "llama3", "keep_alive": -1}'
Ollama支持多种LLM模型:https://ollama.com/library 如果你设置了上面提到的docker容器,你可以使用以下命令下载和运行它们:
# 下载并运行Phi-3 Mini,Microsoft的开放模型
docker exec -it ollama ollama run phi3
# 下载并运行mistral 7B模型,由Mistral AI开发
docker exec -it ollama ollama run mistral
如果你使用TinyLLM聊天机器人(见下文)与Ollama,确保通过LLM_MODEL="llama3"
指定模型。这将导致Ollama下载并运行该模型。除非你运行了上面的ollama run
或curl
命令,否则首次运行可能需要一段时间才能启动。
vLLM服务器(选项2)
vLLM提供一个强大的OpenAI API兼容Web服务器,支持多个同时推理线程(会话)。它自动从HuggingFace下载你指定的模型,并在容器中运行得非常好。vLLM需要更多VRAM的GPU,因为它使用非量化模型。AWQ模型也可用,项目中还在进行更多优化以减少内存占用。
注意,对于计算能力为6或更低的GPU,Pascal架构(参见GPU表),请按照这里的详细说明操作。
# 构建容器
cd vllm
./build.sh
# 创建存储模型的目录
mkdir models
# 编辑run.sh或run-awq.sh以拉取你想使用的模型。默认设置为Mistral。
# 运行容器 - 首次运行时将下载模型
./run.sh
# 将显示尾随日志,以便你可以看到进度。使用^C退出而不停止容器。
Llama-cpp-python服务器(选项3)
llama-cpp-python的OpenAI API兼容Web服务器易于设置和使用。它运行优化的GGUF模型,在许多消费级GPU上即使VRAM较小也能很好地工作。与Ollama一样,这个服务器的缺点是一次只能处理一个会话/提示。
以下步骤概述了如何通过命令行设置和运行服务器。请阅读llmserver中的详细信息,了解如何在Linux主机上将其设置为持久服务或docker容器。
# 卸载llama-cpp-python的任何旧版本
pip3 uninstall llama-cpp-python -y
# Linux目标,支持Nvidia CUDA
CMAKE_ARGS="-DLLAMA_CUBLAS=on" FORCE_CMAKE=1 pip3 install llama-cpp-python==0.2.27 --no-cache-dir
CMAKE_ARGS="-DLLAMA_CUBLAS=on" FORCE_CMAKE=1 pip3 install llama-cpp-python[server]==0.2.27 --no-cache-dir
# MacOS目标,支持Apple Silicon M1/M2
CMAKE_ARGS="-DLLAMA_METAL=on" pip3 install -U llama-cpp-python --no-cache-dir
pip3 install 'llama-cpp-python[server]'
# 从HuggingFace下载模型
cd llmserver/models
# 获取Mistral 7B GGUF Q-5bit模型Q5_K_M和Meta LLaMA-2 7B GGUF Q-5bit模型Q5_K_M
wget https://huggingface.co/TheBloke/Mistral-7B-Instruct-v0.1-GGUF/resolve/main/mistral-7b-instruct-v0.1.Q5_K_M.gguf
wget https://huggingface.co/TheBloke/Llama-2-7b-Chat-GGUF/resolve/main/llama-2-7b-chat.Q5_K_M.gguf
# 运行测试 - API服务器
python3 -m llama_cpp.server \
--model ./models/mistral-7b-instruct-v0.1.Q5_K_M.gguf \
--host localhost \
--n_gpu_layers 99 \
--n_ctx 2048 \
--chat_format llama-2
运行聊天机器人
TinyLLM聊天机器人是一个简单的基于Web的Python FastAPI应用程序,允许你使用OpenAI API与LLM聊天。它支持多个会话并记住你的对话历史。一些RAG(检索增强生成)功能包括:
- 总结外部网站和PDF(在聊天窗口中粘贴URL)
- 列出当前新闻的前10条头条(
/news
命令) - 显示公司股票代码和当前股价(
/stock <公司>
命令) - 提供当前天气状况(
/weather <地点>
命令) - 使用向量数据库进行RAG查询 - 详见RAG页面
# 移动到chatbot文件夹
cd ../chatbot
touch prompts.json
# 拉取并运行最新容器 - 见run.sh
docker run \
-d \
-p 5000:5000 \
-e PORT=5000 \
-e OPENAI_API_BASE="http://localhost:8000/v1" \
-e LLM_MODEL="tinyllm" \
-e USE_SYSTEM="false" \
-e SENTENCE_TRANSFORMERS_HOME=/app/.tinyllm \
-v $PWD/.tinyllm:/app/.tinyllm \
--name chatbot \
--restart unless-stopped \
jasonacox/chatbot
示例会话
打开http://localhost:5000 - 示例会话:
读取URL
如果在文本框中粘贴URL,聊天机器人将读取并总结它。
当前新闻
/news
命令