Chinese-LLaMA-Alpaca-2部署文档_chinese-llama-alpaca-2 vllm
Chinese-LLaMA-Alpaca-2部署文档
使用模型:Chinses-Alpaca-2-7B(未量化)
GPU型号:Tesla V100 32GB
CPU型号:Intel(R) Xeon(R) Gold 6240 CPU @ 2.60GHz
Chinses-LLaMA-Alpaca-2模型下载
使用llama.cpp部署
特点:用C/C++ 直接编译出可执行文件,具有 F16 和 F32 的混合精度,支持 4-bit 量化,可只用 CPU 运行。
环境:gcc=7.5.0 g++=7.5.0 cmake=3.17.5 cuda=11.1 nvcc=11.2 make=3.82
-
创建与python版本相匹配的llama虚拟环境
conda create -n llama python=3.9
-
在llama环境下安装pytorch
pip install torch==1.9.1+cu111 torchvision==0.10.1+cu111 torchaudio==0.9.1 --index-url https://download.pytorch.org/whl/cu111conda install cudatoolkit==11.1.1conda activate llama
-
拉取最新版llama.cpp仓库代码
git clone https://github.com/ggerganov/llama.cpp
-
对llama.cpp项目进行编译,生成
./main
(用于推理)和./quantize
(用于量化)二进制文件。启用GPU推理,以下是和cuBLAS一起编译的命令,适用于NVIDIA相关GPU。make LLAMA_CUBLAS=1
或者用cmake
mkdir buildcd buildcmake .. -DLLAMA_CUBLAS=ONcmake --build . --config Release
-
生成量化版本模型(可选择)
python convert.py models/7B/./quantize ./models/7B/ggml-model-f16.gguf ./models/7B/ggml-model-q4_0.gguf q4_0
-
加载模型(使用chat.sh)
chmod +x chat.sh./chat.sh models/7B/ggml-model-f16.gguf \'请列举5条文明乘车的建议\'
-c 控制上下文的长度,值越大越能参考更长的对话历史(默认:512)
-f 指定prompt模板,alpaca模型请加载prompts/alpaca.txt
-n 控制回复生成的最大长度(默认:128)
-b 控制batch size(默认:512)
-t 控制线程数量(默认:8),可适当增加,与物理核心数一致时速度最快,超过之后速度反而变慢
–repeat_penalty 控制生成回复中对重复文本的惩罚力度
–temp 温度系数,值越低回复的随机性越小,反之越大
–top_p, top_k 控制解码采样的相关参数
–stream:它允许实时接收每个预测的令牌,而不是等待完成完成。要启用此功能,请将其设置为True。 -
启动server(如果用cmake编译,进入llama.cpp/build/bin文件夹)
./server -m ./models/7B/ggml-model-f16.gguf -c 4096 -t 1 -ngl 35 --port 8005
1、cuBLAS编译需要指定offload层数,例如-ngl 35表示offload 35层模型参数到GPU
2、参数自定义 -
request调用post方法
python request_llama.py
使用VLLM部署(仿OpenAI API调用)
特点:通过 PagedAttention 对注意力 key 和 value 进行内存管理,先进的服务吞吐量,对传入请求的批处理,针对 CUDA 内核的优化。
-
创建与python版本相匹配的虚拟环境
conda create -n py310 python=3.10
-
进入py310虚拟环境
conda activate py310
-
部署依赖(可能需要安装accelerate)
pip install fastapi uvicorn shortuuid vllm fschat
-
下载Chinese-LLaMA-Alpaca-2代码,进入该目录启动脚本
python scripts/openai_server_demo/openai_api_server_vllm.py --model /path/to/base_model --tokenizer-mode slow --served-model-name chinese-llama-alpaca-2
参数说明
–model {base_model}: 存放完整的(合并后的)中文Alpaca-2模型权重和配置文件的目录
-tokenizer {tokenizer_path}: 存放对应tokenizer的目录。若不提供此参数,则其默认值与–base_model相同
–tokenizer-mode {tokenizer-mode}: tokenizer的模式。使用基于LLaMA/LLama-2的模型时,固定为slow
–tensor-parallel-size {tensor_parallel_size}: 使用的GPU数量。默认为1
–served-model-name {served-model-name}: API中使用的模型名。若使用中文Alpaca-2系列模型,模型名中务必包含chinese-llama-alpaca-2
–host {host_name}: 部署服务的host name。默认值是localhost
–port {port}: 部署服务的端口号。默认值是8000 -
request调用post方法
python request_vllm.py
prompt: 生成文字接龙(completion)的提示。
max_tokens: 新生成的句子的token长度。
temperature: 在0和2之间选择的采样温度。较高的值如0.8会使输出更加随机,而较低的值如0.2则会使其输出更具有确定性。temperature越高,使用随机采样最为decoding的概率越大。
use_beam_search: 使用束搜索(beam search)。默认为false,即启用随机采样策略(random sampling)
n: 输出序列的数量,默认为1
best_of: 当搜索策略为束搜索(beam search)时,该参数为在束搜索(beam search)中所使用的束个数。默认和n相同
top_k: 在随机采样(random sampling)时,前top_k高概率的token将作为候选token被随机采样。
top_p: 在随机采样(random sampling)时,累积概率超过top_p的token将作为候选token被随机采样,越低随机性越大,举个例子,当top_p设定为0.6时,概率前5的token概率分别为{0.23, 0.20, 0.18, 0.11, 0.10}时,前三个token的累积概率为0.61,那么第4个token将被过滤掉,只有前三的token将作为候选token被随机采样。
presence_penalty: 重复惩罚,取值范围-2 ~ 2,默认值为0。值大于0表示鼓励模型使用新的token,反之鼓励重复。
stream: 设置为true时,按流式输出的形式返回。默认为false。
使用TGI部署
特点:在最流行的架构上,优化了使用flash-attention和page - Attention进行推理的transformers代码,连续批处理传入请求以提高总吞吐量。
-
进入虚拟环境
conda activate py310
-
安装rust相关依赖,并添加环境变量
curl --proto \'=https\' --tlsv1.2 -sSf https://sh.rustup.rs | shapt-get install cargo pkg-config gitPATH=/root/.cargo/bin:$PATH
-
下载 protoc
conda install protobuf
-
下载TGI
git clone https://github.com/huggingface/text-generation-inference.git
-
TGI 根目录下执行安装
BUILD_EXTENSIONS=True make install
如果显示报错
:没有安装openssl/libssl.so.1.1$ mkdir $HOME/opt && cd $HOME/opt# Download a supported openssl version. e.g., openssl-1.1.1o.tar.gz or openssl-1.1.1t.tar.gz$ wget https://www.openssl.org/source/openssl-1.1.1o.tar.gz$ tar -zxvf openssl-1.1.1o.tar.gz$ cd openssl-1.1.1o$ ./config && make $ mkdir $HOME/opt/lib$ mv $HOME/opt/openssl-1.1.1o/libcrypto.so.1.1 $HOME/opt/lib/$ mv $HOME/opt/openssl-1.1.1o/libssl.so.1.1 $HOME/opt/lib/export LD_LIBRARY_PATH=$HOME/opt/lib:$LD_LIBRARY_PATH
-
执行 text-generation-launcher --help ,有输出表示安装成功。
-
运行(model-id里除了hugging face里面的路径,还可以写本地路径,需要放在text-generation-inference里,并且用相对路径)
text-generation-launcher --model-id models/7B --hostname 0.0.0.0 --port 8000
-
request调用post方法
python request_TGI.py
比较llama.cpp、vllm、TGI部署速度
使用了Chinese-LLaMA-Alpaca-2中examples的问题
相比而言,llama.cpp速度最快。
在langchain中运行llama.cpp
-
使用 cuBLAS 安装
CMAKE_ARGS=\"-DLLAMA_CUBLAS=on\" FORCE_CMAKE=1 pip install llama-cpp-python
如果已经安装了软件包的仅 CPU 版本,则需要从头开始重新安装它。
CMAKE_ARGS=\"-DLLAMA_CUBLAS=on\" FORCE_CMAKE=1 pip install --upgrade --force-reinstall llama-cpp-python --no-cache-dir
以上命令在安装0.2.6最新版本的时候并不成功,能够安装0.1.85版本,以下命令可以安装成功。
CMAKE_ARGS=\"-DLLAMA_CUBLAS=on\" FORCE_CMAKE=1 pip install -U git+https://github.com/abetlen/llama-cpp-python.git --no-cache-dir
-
安装服务器软件包并启动server
CMAKE_ARGS=\"-DLLAMA_CUBLAS=on\" FORCE_CMAKE=1 pip install llama-cpp-python[server]python3 -m llama_cpp.server --model ./models/7B/ggml-model-f16.gguf --n_gpu_layers 35 --n_threads 1 --port 8000 --n_ctx 4096 --n_batch 512
-
request调用post方法
python request_llama2.py
-
速度比较
部署 tokens post llama.cpp 49.5 tokens/s 54 字/s llama-cpp-python 49 tokens/s 42.9 字/s