# fastllm ## 介绍 fastllm是纯c++实现的高性能大模型推理库 ## 功能概述 - 🚀 纯c++实现,便于跨平台移植,可以在安卓上直接编译 - 🚀 ARM平台支持NEON指令集加速,X86平台支持AVX指令集加速,NVIDIA平台支持CUDA加速,各个平台速度都很快就是了 - 🚀 支持浮点模型(FP32), 半精度模型(FP16), 量化模型(INT8, INT4) 加速 - 🚀 支持多卡部署,支持GPU + CPU混合部署 - 🚀 支持Batch速度优化 - 🚀 支持并发计算时动态拼Batch - 🚀 支持流式输出,很方便实现打字机效果 - 🚀 支持python调用 - 🚀 前后端分离设计,便于支持新的计算设备 - 🚀 目前支持ChatGLM模型,各种LLAMA模型(ALPACA, VICUNA等),BAICHUAN模型,MOSS模型 ## 快速开始 ### 环境准备 在光源可拉取推理的docker镜像,拉取方式如下: ``` docker pull image.sourcefind.cn:5000/dcu/admin/base/pytorch:2.1.0-centos7.6-dtk23.10.1-py38 ``` ### 容器启动 模型推理容器启动命令参考如下,用户根据需要修改: ``` # 自定义容器名 # 当前工程所在路径 docker run -it --name= -v :/work -w /work --privileged -v /opt/hyhal:/opt/hyhal --device=/dev/kfd --device=/dev/dri --security-opt seccomp=unconfined --cap-add=SYS_PTRACE --ipc=host --network host --shm-size=16G --group-add video image.sourcefind.cn:5000/dcu/admin/base/pytorch:2.1.0-centos7.6-dtk23.10.1-py38 /bin/bash ``` ### 加载环境 进入容器后执行如下命令,加载运行环境变量 ``` source /opt/dtk/cuda/env.sh ``` ### 编译 使用如下命令编译 ``` sh cd fastllm mkdir build cd build cmake .. make -j ``` 编译完成后,可以使用如下命令安装简易python工具包 ``` sh cd tools # 这时在fastllm/build/tools目录下 python setup.py install ``` ### 运行demo程序 我们假设已经获取了名为`model.flm`的模型(参照 [模型获取](#模型获取),初次使用可以先下载转换好的模型) 编译完成之后在build目录下可以使用下列demo: ``` sh # 这时在fastllm/build目录下 # 命令行聊天程序, 支持打字机效果 ./main -p model.flm # 简易webui, 使用流式输出 + 动态batch,可多路并发访问 ./webui -p model.flm --port 1234 # python版本的命令行聊天程序,使用了模型创建以及流式对话效果 python tools/cli_demo.py -p model.flm # python版本的简易webui,需要先安装streamlit-chat streamlit run tools/web_demo.py model.flm ``` ### 简易python调用 编译后如果安装了简易python工具包,那么可以使用python来调用一些基本的API (如果没有安装,也可以在直接import编译生成的tools/fastllm_pytools来使用) ``` python # 模型创建 from fastllm_pytools import llm model = llm.model("model.flm") # 生成回复 print(model.response("你好")) # 流式生成回复 for response in model.stream_response("你好"): print(response, flush = True, end = "") ``` ### 两行代码加速ChatGLM推理 安装了简易python工具包后,只需要在原本的推理程序中加入两行即可使用fastllm加速 ``` python # 这是原来的程序,通过huggingface接口创建模型 from transformers import AutoTokenizer, AutoModel tokenizer = AutoTokenizer.from_pretrained("THUDM/chatglm2-6b", trust_remote_code = True) model = AutoModel.from_pretrained("THUDM/chatglm2-6b", trust_remote_code = True) # 加入下面这两行,将huggingface模型转换成fastllm模型 # 目前from_hf接口只能接受原始模型,或者ChatGLM的int4, int8量化模型,暂时不能转换其它量化模型 from fastllm_pytools import llm model = llm.from_hf(model, tokenizer, dtype = "float16") # dtype支持 "float16", "int8", "int4" # 注释掉这一行model.eval() #model = model.eval() ``` model支持了ChatGLM的API函数chat, stream_chat,因此ChatGLM的demo程序无需改动其他代码即可运行 model还支持下列API用于生成回复 ``` python # 生成回复 print(model.response("你好")) # 流式生成回复 for response in model.stream_response("你好"): print(response, flush = True, end = "") ``` 转好的模型也可以导出到本地文件,之后可以直接读取,也可以使用fastllm cpp接口读取 ``` python model.save("model.flm"); # 导出fastllm模型 new_model = llm.model("model.flm"); # 导入fastllm模型 ``` ## 多卡部署 ### fastllm_pytools中使用多卡部署 ``` python from fastllm_pytools 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}) # 将模型按不同比例部署在多个设备上 ``` ### c++中使用多卡部署 ``` cpp // 支持以下方式,需要在模型创建之前调用 fastllm::SetDeviceMap({{"cuda:0", 10}, {"cuda:1", 5}, {"cpu", 1}}); // 将模型按不同比例部署在多个设备上 ``` ## 模型转换 ### ChatGLM模型导出 (默认脚本导出ChatGLM2-6b模型) ``` sh # 需要先安装ChatGLM-6B环境 # 如果使用自己finetune的模型需要修改chatglm_export.py文件中创建tokenizer, model的代码 cd build python3 tools/chatglm_export.py chatglm2-6b-fp16.flm float16 #导出float16模型 python3 tools/chatglm_export.py chatglm2-6b-int8.flm int8 #导出int8模型 python3 tools/chatglm_export.py chatglm2-6b-int4.flm int4 #导出int4模型 ``` ### baichuan模型导出 (默认脚本导出baichuan-13b-chat模型) ``` sh # 需要先安装baichuan环境 # 如果使用自己finetune的模型需要修改baichuan2flm.py文件中创建tokenizer, model的代码 # 根据所需的精度,导出相应的模型 cd build python3 tools/baichuan2flm.py baichuan-13b-fp16.flm float16 #导出float16模型 python3 tools/baichuan2flm.py baichuan-13b-int8.flm int8 #导出int8模型 python3 tools/baichuan2flm.py baichuan-13b-int4.flm int4 #导出int4模型 ``` ### baichuan2模型导出 (默认脚本导出baichuan2-7b-chat模型) ``` sh # 需要先安装baichuan2环境 # 如果使用自己finetune的模型需要修改baichuan2_2flm.py文件中创建tokenizer, model的代码 # 根据所需的精度,导出相应的模型 cd build python3 tools/baichuan2_2flm.py baichuan2-7b-fp16.flm float16 #导出float16模型 python3 tools/baichuan2_2flm.py baichuan2-7b-int8.flm int8 #导出int8模型 python3 tools/baichuan2_2flm.py baichuan2-7b-int4.flm int4 #导出int4模型 ``` ### MOSS模型导出 ``` sh # 需要先安装MOSS环境 # 如果使用自己finetune的模型需要修改moss_export.py文件中创建tokenizer, model的代码 # 根据所需的精度,导出相应的模型 cd build python3 tools/moss_export.py moss-fp16.flm float16 #导出float16模型 python3 tools/moss_export.py moss-int8.flm int8 #导出int8模型 python3 tools/moss_export.py moss-int4.flm int4 #导出int4模型 ``` ### LLAMA系列模型导出 ``` sh # 修改build/tools/alpaca2flm.py程序进行导出 # 不同llama模型使用的指令相差很大,需要参照torch2flm.py中的参数进行配置 ``` ### QWEN模型导出 ```sh # 需要先安装QWen环境 # 如果使用自己finetune的模型需要修改qwen2flm.py文件中创建tokenizer, model的代码 # 根据所需的精度,导出相应的模型 cd build python3 tools/qwen2flm.py qwen-7b-fp16.flm float16 #导出float16模型 python3 tools/qwen2flm.py qwen-7b-int8.flm int8 #导出int8模型 python3 tools/qwen2flm.py qwen-7b-int4.flm int4 #导出int4模型 ``` ### NSQL模型导出 ``` sh # 需要先安装NSQL环境 # 如果使用自己finetune的模型需要修改nsqlllama2flm.py文件中创建tokenizer, model的代码 # 根据所需的精度,导出相应的模型 cd build python3 tools/nsqlllama2flm.py nsql-fp16.flm float16 #导出float16模型 python3 tools/nsqlllama2flm,py nsql-int8.flm int8 #导出int8模型 python3 tools/nsqlllama2flm.py nsql-int4.flm int4 #导出int4模型 ```