本文主要介绍在云服务器实例中部署meta-llama/Llama-2-7b-hf模型并使用CPU进行推理,以及通过Intel xFasterTransformer实现推理过程加速的方案。
Llama 2是Meta公司开源的一个预训练和微调的生成文本模型集合,规模从70亿 ~ 700亿参数不等。本实践使用该模型集合中的7b(70亿)参数规模,且转换为HF格式的模型。更多详情,可查看meta-llama/Llama-2-7b-hf。
Intel xFasterTransformer 是Intel®开发的一个加速库,旨在为大语言模型(LLM)在CPU X86平台上的部署提供了一种深度优化的解决方案。支持多CPU节点之间的分布式部署方案,使得超大模型在CPU上的部署成为可能。此外,xFasterTransformer提供了C++和Python两种API接口,涵盖了从上层到底层的接口调用,易于用户使用并将xFasterTransformer集成到自有业务框架中。更多信息,可查看xFasterTransformer。
oneCCL(One Collective Communication Library)是Intel®推出的一种集体通信库,旨在为分布式深度学习训练提供高性能的通信支持。它提供了一组优化的通信算法和数据结构,可用于在分布式环境中实现高效的通信操作。
oneDNN(oneAPI Deep Neural Network Library)是Intel®开发的一个深度学习加速库,旨在优化和加速深度学习模型的推理和训练。它提供了一系列高效的算法和优化,用于在英特尔处理器(CPU)、图形处理器(GPU)和其他硬件加速器上执行深度学习任务。
执行如下命令,为目标实例安装Git、Python及pip。
apt install -y git python3 python3-pip
执行如下命令,检查实例GCC版本。
gcc --version
10
,请继续后续步骤。10
,请执行如下命令,升级GCC版本。注意
升级GCC可能会影响到系统中依赖于旧版本GCC的软件。确保在升级前备份重要数据,并确保新版本的GCC不会对系统的稳定性和已安装的软件产生不良影响。
sudo apt update sudo apt install -y gcc
执行如下命令,安装oneCCL。
git clone https://github.com/oneapi-src/oneCCL.git /tmp/oneCCL \ && cd /tmp/oneCCL \ && git checkout 2021.9 \ && sed -i 's/cpu_gpu_dpcpp/./g' cmake/templates/oneCCLConfig.cmake.in \ && mkdir build \ && cd build \ && cmake .. -DCMAKE_INSTALL_PREFIX=/usr/local/oneCCL \ && make -j install \ && cd ~ \ && rm -rf /tmp/oneCCL \ && echo "source /usr/local/oneCCL/env/setvars.sh" >> ~/.bashrc
成功安装示例
安装oneDNN。
cd /usr/local wget https://github.com/oneapi-src/oneDNN/releases/download/v0.21/mklml_lnx_2019.0.5.20190502.tgz \ && tar -xzf mklml_lnx_2019.0.5.20190502.tgz \ && rm -f mklml_lnx_2019.0.5.20190502.tgz \ && echo 'export LD_LIBRARY_PATH=/usr/local/mklml_lnx_2019.0.5.20190502/lib:$LD_LIBRARY_PATH' >> ~/.bashrc
cat ~/.bashrc | grep '/usr/local/mklml_lnx_2019.0.5.20190502/lib:$LD_LIBRARY_PATH'
执行如下命令,安装xFasterTransformer。
pip install torch==2.0.1+cpu --index-url https://download.pytorch.org/whl/cpu pip install cmake==3.26.1 transformers==4.30.0 sentencepiece==0.1.99 tokenizers==0.13.3 accelerate==0.23.0 pip install xfastertransformer pip install gradio
获取下载授权。
执行如下命令,下载模型。
说明
<your_token>
替换为上一步获取的Token。pip install -U huggingface_hub hf_transfer HF_ENDPOINT=https://hf-mirror.com HF_HUB_ENABLE_HF_TRANSFER=1 huggingface-cli download --token <your_token> --resume-download meta-llama/Llama-2-7b-hf --local-dir Llama-2-7b-hf --local-dir-use-symlinks=False
创建运行模型的Demo文件。
说明
本文件仅做参考,请根据实际情况调整。更多详情可查看intel/xFasterTransformer。
vim llm2-demo.py
i
键进入编辑模式,复制如下内容粘贴入文件。import gradio as gr import argparse import os from transformers import AutoTokenizer, TextStreamer import pathlib import importlib.util xft_spec = importlib.util.find_spec("xfastertransformer") if xft_spec is None: print("[INFO] xfastertransformer is not installed in pip, using source code.") exit() else: print("[INFO] xfastertransformer is installed, using pip installed package.") import xfastertransformer MODEL_PATH = "/root/Llama-2-7B-hf" TOKEN_PATH = "/root/Llama-2-7B-hf" MODEL_TYPE = "int8" cover_model_path = TOKEN_PATH+"/conver" if not os.path.exists(cover_model_path): os.mkdir(cover_model_path) if not os.listdir(cover_model_path): xfastertransformer.LlamaConvert().convert(MODEL_PATH,cover_model_path) def greet(input_prompts, answer_length): tokenizer = AutoTokenizer.from_pretrained(TOKEN_PATH, use_fast=False, padding_side="left", trust_remote_code=True) streamer = TextStreamer(tokenizer, skip_special_tokens=True, skip_prompt=False) input_ids = tokenizer([input_prompts], return_tensors="pt", padding=False).input_ids model = xfastertransformer.AutoModel.from_pretrained(cover_model_path, dtype=MODEL_TYPE) generated_ids = model.generate(input_ids, max_length=answer_length, streamer=streamer) output_text = tokenizer.decode(generated_ids[0], skip_special_tokens=True) return output_text if __name__ == "__main__": demo = gr.Interface( fn=greet, inputs=["text", gr.Slider(value=128, minimum=1, maximum=4096, step=1)], outputs=["text"], ) demo.launch()
MODEL_PATH
、TOKEN_PATH
,MODEL_TYPE
三个参数的值。
参数名 | 说明 |
---|---|
MODEL_PATH | 模型地址,请修改为您下载的Llama-2-7b-hf模型绝对路径。 |
TOKEN_PATH | tokenizer地址,一般和模型在一个文件夹下。 |
MODEL_TYPE | 模型精度,支持int4 、int8 、bf16 等精度。 |
demo.launch()
为demo.launch(share=True)
。注意
完成本修改后,还需根据步骤f,安装生成公网地址依赖文件。
esc
键退出编辑,输入:wq
保存并退出文件。wget https://cdn-media.huggingface.co/frpc-gradio-0.2/frpc_linux_amd64
mv frpc_linux_amd64 frpc_linux_amd64_v0.2
sudo mv frpc_linux_amd64_v0.2 /usr/local/lib/python3.10/dist-packages/gradio/
chmod +x /usr/local/lib/python3.10/dist-packages/gradio/frpc_linux_amd64_v0.2
llm2-demo.py文件所在目录,执行如下命令,运行模型。
说明
本实践通过numactl
命令的-C
参数绑定执行命令的物理CPU范围,以提高推理效率。
numactl -C 0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30 python3 llm2-demo.py
成功运行示例
注意
public URL
需完成步骤d配置后,才会生成。
您可以使用回显的URL,通过浏览器进入模型推理页面。
本节展示了使用ecs.g3i.8xlarge规格实例,通过Llama-2-7b-hf、Llama3-8B模型生成不同数据精度回答的性能数据。
说明
计算方式:输出新Token数量 * 批处理大小 / 总耗时(s)
实例规格 | 模型 | 数据精度 | 参数 | 吞吐性能 | 首包延时 |
---|---|---|---|---|---|
ecs.g3i.8xlarge | Llama-2-7b-hf | w8a8 |
| 24.04 Tokens/s | 0.67 s |
bf16 | 14.48 Tokens/s | 0.85 s | |||
Llama-3-8B | w8a8 | 22.12 Tokens/s | 0.75 s | ||
bf16 | 13.1 Tokens/s | 0.89 s |
在搭载英特尔EMR处理器的ecs.g3i.8xlarge规格实例中,根据本实践调整后的生成文本模型,吞吐性能最高可达每秒24Tokens、首包延时最低0.67秒,基本可满足用户阅读需求,达到可商用的状态。
因此,在追求性价比、丰富实例资源场景下,您可以使用搭载英特尔EMR处理器的实例规格(例如通用型g3i)代替GPU实例,通过系统级加速方案获取最优性价比的高效生成文本服务。