fastllm
简介
fastllm是一个纯C++实现的多平台高性能大型模型推理库,无第三方依赖。
部署交流QQ群:831641348
功能概述
- 🚀 纯C++实现,便于跨平台移植,可直接在安卓上编译
- 🚀 在ARM、X86和NVIDIA平台上都能实现较快速度
- 🚀 支持读取Hugging Face原始模型并直接量化
- 🚀 支持部署OpenAI API服务器
- 🚀 支持多卡部署,支持GPU和CPU混合部署
- 🚀 支持动态批处理,流式输出
- 🚀 前后端分离设计,便于支持新的计算设备
- 🚀 目前支持ChatGLM系列、Qwen系列、各种LLAMA模型(如ALPACA、VICUNA等)、BAICHUAN、MOSS、MINICPM等模型
- 🚀 支持Python自定义模型结构
快速开始
编译
推荐使用cmake编译,需要预先安装gcc、g++(建议9.4或更高版本)、make和cmake(建议3.23或更高版本)。
GPU编译需要预先安装CUDA编译环境,建议使用尽可能新的CUDA版本。
使用以下命令编译:
bash install.sh -DUSE_CUDA=ON # 编译GPU版本
# bash install.sh -DUSE_CUDA=ON -DCUDA_ARCH=89 # 可以指定CUDA架构,如4090使用89架构
# bash install.sh # 仅编译CPU版本
其他平台的编译可参考文档: TFACC平台
运行demo程序(Python)
假设我们的模型位于"~/Qwen2-7B-Instruct/"目录。
编译完成后可以使用以下demo:
# OpenAI API服务器
# 需要安装依赖:pip install -r requirements-server.txt
# 这里在8080端口开启了一个模型名为qwen的服务器
python3 -m ftllm.server -t 16 -p ~/Qwen2-7B-Instruct/ --port 8080 --model_name qwen
# 使用float16精度的模型对话
python3 -m ftllm.chat -t 16 -p ~/Qwen2-7B-Instruct/
# 在线量化为int8模型对话
python3 -m ftllm.chat -t 16 -p ~/Qwen2-7B-Instruct/ --dtype int8
# WebUI
# 需要安装依赖:pip install streamlit-chat
python3 -m ftllm.webui -t 16 -p ~/Qwen2-7B-Instruct/ --port 8080
以上demo均可使用--help参数查看详细参数说明,详细参数说明可参考参数说明。
目前支持的模型列表请参见:模型列表
一些早期的HuggingFace模型无法直接读取,可以参考模型转换转换为fastllm格式的模型。
可以自定义模型结构,具体请参见自定义模型。
运行demo程序(C++)
# 进入fastllm/build-fastllm目录
# 命令行聊天程序,支持打字机效果
./main -p ~/Qwen2-7B-Instruct/
# 简易WebUI,使用流式输出 + 动态批处理,可多路并发访问
./webui -p ~/Qwen2-7B-Instruct/ --port 1234
Windows下的编译推荐使用CMake GUI + Visual Studio,在图形界面中完成。
如编译中遇到问题,尤其是Windows下的编译,可参考FAQ。
Python API
# 创建模型
from ftllm import llm
model = llm.model("~/Qwen2-7B-Instruct/")
# 生成回复
print(model.response("你好"))
# 流式生成回复
for response in model.stream_response("你好"):
print(response, flush=True, end="")
此外,还可以设置CPU线程数等内容,详细API说明请参见ftllm。 此包不包含低级API,如需使用更高级功能,请参考Python绑定API
多卡部署
在Python命令行调用中使用多卡部署
# 使用--device参数设置多卡调用
#--device cuda:1 # 设置单一设备
#--device "['cuda:0', 'cuda:1']" # 将模型平均部署在多个设备上
#--device "{'cuda:0': 10, 'cuda:1': 5, 'cpu': 1} # 将模型按不同比例部署在多个设备上
在ftllm中使用多卡部署
from ftllm import llm
# 支持以下三种方式,需在模型创建前调用
llm.set_device_map("cuda:0") # 将模型部署在单一设备上
llm.set_device_map(["cuda:0", "cuda:1"]) # 将模型平均部署在多个设备上
llm.set_device_map({"cuda:0" : 10, "cuda:1" : 5, "cpu": 1}) # 将模型按不同比例部署在多个设备上
在Python绑定API中使用多卡部署
import pyfastllm as llm
# 支持以下方式,需在模型创建前调用
llm.set_device_map({"cuda:0" : 10, "cuda:1" : 5, "cpu": 1}) # 将模型按不同比例部署在多个设备上
在C++中使用多卡部署
// 支持以下方式,需在模型创建前调用
fastllm::SetDeviceMap({{"cuda:0", 10}, {"cuda:1", 5}, {"cpu", 1}}); // 将模型按不同比例部署在多个设备上
Docker 编译运行
Docker运行需要本地安装NVIDIA Runtime,并将默认runtime设置为nvidia
- 安装nvidia-container-runtime
sudo apt-get install nvidia-container-runtime
- 将Docker默认runtime修改为nvidia
编辑/etc/docker/daemon.json文件:
{
"registry-mirrors": [
"https://hub-mirror.c.163.com",
"https://mirror.baidubce.com"
],
"runtimes": {
"nvidia": {
"path": "/usr/bin/nvidia-container-runtime",
"runtimeArgs": []
}
},
"default-runtime": "nvidia" // 添加此行即可
}
- 下载已转换的模型到models目录
models
chatglm2-6b-fp16.flm
chatglm2-6b-int8.flm
- 编译并启动webui
DOCKER_BUILDKIT=0 docker compose up -d --build
在Android上使用
编译
# PC上编译需下载NDK工具
# 也可尝试在手机上编译,termux中可使用cmake和gcc(无需NDK)
mkdir build-android
cd build-android
export NDK=<your_ndk_directory>
# 如果手机不支持,请移除"-DCMAKE_CXX_FLAGS=-march=armv8.2a+dotprod"(大多数新手机都支持)
cmake -DCMAKE_TOOLCHAIN_FILE=$NDK/build/cmake/android.toolchain.cmake -DANDROID_ABI=arm64-v8a -DANDROID_PLATFORM=android-23 -DCMAKE_CXX_FLAGS=-march=armv8.2a+dotprod ..
make -j
运行
- 在Android设备上安装termux应用
- 在termux中执行termux-setup-storage获取读取手机文件的权限
- 将NDK编译的main文件和模型文件存入手机,并复制到termux的根目录
- 使用命令
chmod 777 main
授权 - 然后可运行main文件,参数格式请参见
./main --help