> 技术文档 > Chinese-LLaMA-Alpaca-2部署文档_chinese-llama-alpaca-2 vllm

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

  1. 创建与python版本相匹配的llama虚拟环境

    conda create -n llama python=3.9
  2. 在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
  3. 拉取最新版llama.cpp仓库代码

    git clone https://github.com/ggerganov/llama.cpp
  4. 对llama.cpp项目进行编译,生成./main(用于推理)和./quantize(用于量化)二进制文件。启用GPU推理,以下是和cuBLAS一起编译的命令,适用于NVIDIA相关GPU。

    make LLAMA_CUBLAS=1

    或者用cmake

    mkdir buildcd buildcmake .. -DLLAMA_CUBLAS=ONcmake --build . --config Release
  5. 生成量化版本模型(可选择)

    python convert.py models/7B/./quantize ./models/7B/ggml-model-f16.gguf ./models/7B/ggml-model-q4_0.gguf q4_0
  6. 加载模型(使用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。

  7. 启动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、参数自定义

  8. request调用post方法

    python request_llama.py

使用VLLM部署(仿OpenAI API调用)

特点:通过 PagedAttention 对注意力 key 和 value 进行内存管理,先进的服务吞吐量,对传入请求的批处理,针对 CUDA 内核的优化。

  1. 创建与python版本相匹配的虚拟环境

    conda create -n py310 python=3.10
  2. 进入py310虚拟环境

    conda activate py310
  3. 部署依赖(可能需要安装accelerate)

    pip install fastapi uvicorn shortuuid vllm fschat
  4. 下载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

  5. 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代码,连续批处理传入请求以提高总吞吐量。

  1. 进入虚拟环境

    conda activate py310
  2. 安装rust相关依赖,并添加环境变量

    curl --proto \'=https\' --tlsv1.2 -sSf https://sh.rustup.rs | shapt-get install cargo pkg-config gitPATH=/root/.cargo/bin:$PATH
  3. 下载 protoc

    conda install protobuf
  4. 下载TGI

    git clone https://github.com/huggingface/text-generation-inference.git
  5. 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
  6. 执行 text-generation-launcher --help ,有输出表示安装成功。

  7. 运行(model-id里除了hugging face里面的路径,还可以写本地路径,需要放在text-generation-inference里,并且用相对路径)

    text-generation-launcher --model-id models/7B --hostname 0.0.0.0 --port 8000
  8. request调用post方法

    python request_TGI.py

比较llama.cpp、vllm、TGI部署速度

使用了Chinese-LLaMA-Alpaca-2中examples的问题

模型部署 tokens post llama.cpp 49.5 tokens/s 54 字/s vllm 38 tokens/s 46.1 字/s TGI 32.8 tokens/s 39.7 字/s

相比而言,llama.cpp速度最快。

在langchain中运行llama.cpp

  1. 使用 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
  2. 安装服务器软件包并启动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 
  3. request调用post方法

    python request_llama2.py
  4. 速度比较

    部署 tokens post llama.cpp 49.5 tokens/s 54 字/s llama-cpp-python 49 tokens/s 42.9 字/s