大語言模型llama-2-7b推理服務實戰(zhàn)
1.概念
一般來說,參數(shù)量越大的模型效果會更好,但相對應的模型運行時產(chǎn)生的費用和微調(diào)訓練所需要的數(shù)據(jù)量都會更多。
大語言模型llama-2-7b推理過程如下:
數(shù)據(jù)準備:下載llama-2-7b-hf模型,可以使用Hugging Face Transformers或PyTorch等庫加載模型;準備要輸入到模型中的數(shù)據(jù),以及tokenizer對文本進行編碼,以及將編碼后的文本轉換為模型所需的張量格式。
模型轉換:在訓練完成后,將訓練時保存好的微調(diào)模型文件(Checkpoint Model)轉換為可以直接推理的二進制格式文件.
模型推理:模型推理中模型會根據(jù)輸入的文本生成相應的輸出文本。
以上是大語言模型llama-2-7b的推理過程,這個過程需要大量的計算資源和時間。
2.模型下載
模型下載:
在HuggingFace中心(???https://huggingface.co/meta-llama??)模型列表頁中可以看到多個來自不同開源社區(qū)的主流模型。在展示中名稱中帶有hf的模型已轉換為Hugging Face檢查點,因此無需進一步轉換,我們將使用llama-2-7b-hf模型。
圖1.1 huggingface模型列表
# 下載 llama-2-7b-hf模型
git clone https://huggingface.co/meta-llama/Llama-2-7b-hf
- tokenizer下載
tokenizer需要下載上述對應模型版本的tokenizer.model,也可以從Hugging Face模型存儲庫中下載并使用tokenizer。
# 下載 tokenizer
https://github.com/huggingface/tokenizers.git
tokenizer主要完成的工作:
1.分詞:將文本數(shù)據(jù)分詞為字或者字符;
2.構建詞典:根據(jù)數(shù)據(jù)集分詞的結果,構建詞典。(這一步并不絕對,如果采用預訓練詞向量,詞典映射要根據(jù)詞向量文件進行處理)。
3.數(shù)據(jù)轉換:根據(jù)構建好的詞典,將分詞處理后的數(shù)據(jù)做映射,將文本序列轉換為數(shù)字序列。數(shù)字序列還要變成符合模型需求的tensor格式。
4.數(shù)據(jù)填充與截斷:在以batch輸入到模型的方式中,需要對過短的數(shù)據(jù)進行填充,過長的數(shù)據(jù)進行截斷,保證數(shù)據(jù)長度符合模型能接受的范圍,同時batch內(nèi)的數(shù)據(jù)維度大小一致,否則無法成批次變成tensor張量。
- 模型轉換
模型轉換指的是將訓練時保存好的微調(diào)模型文件(Checkpoint Model)轉換為可以直接推理的二進制格式文件,以便能夠直接用于推理。這種二進制格式通常是為了加速推理而設計的,它可能包括模型的優(yōu)化版本、減少冗余數(shù)據(jù)、固定模型結構等操作。
使用llama-2-7b-hf模型無需進行模型轉換,當選擇llama-2-7b模型需要將llama-2-7b模型轉換為HuggingFace 格式。
使用huggingface transformers提供的腳本convert_llama_weights_to_hf.py,將原版llama模型轉換為HuggingFace格式。
同時需要將原版llama-2-7b的tokenizer.model放在--input_dir指定的目錄,其余文件放在${input_dir)/${model_size)下。執(zhí)行以下命令后,--output_dir中將存放轉換好的hf版權重。
注意:transformers版本必須是4.31.0或以上版本,否則會報錯。
# 下載 transformers
git clone gitegithub.com:huggingface/transformers.git
# 進入到腳本所在目錄下
cd transformers/src/transformers/models/llama
#運行轉換腳本
python convert_llama_weights_to_hf.py
--input_dir /llama-2-7b \
--model_size 7B \
--output_dir /users/tgl/Downloads/llama_models/7B_hf/
3.模型推理
vLLM是是伯克利大學LMSYS組織開源的大語言模型高速推理框架,一個基于剪枝技術的大模型推理加速工具,通過去除模型中的冗余參數(shù),極大地提升實時場景下的語言模型服務的吞吐與內(nèi)存使用效率,可以在保證模型性能的同時顯著減少推理時間。vLLM是一個快速且易于使用的庫,用于LLM推理和服務,可以和HuggingFace無縫集成。
圖2.1 模型推理流程
vLLM的架構中它的核心組件是LLMEngine類,外層接口類LLM和AsyncLLMEngine都是對LLMEngine的封裝。LLMEngine有兩個核心組件,分別是負責請求調(diào)度的Scheduler和負責模型推理的Worker,前者從等待隊列中選擇接下來要處理的請求,后者負責使用模型對被調(diào)度的請求進行推理。
圖2.2 vllm架構
LLMEngine是整個系統(tǒng)的入口,它接收輸入請求并執(zhí)行推理過程。在初始化階段,LLMEngine會調(diào)用Worker中的CacheEngine來初始化GPU和CPU內(nèi)存,并計算可用的block數(shù)量。每個輸入請求會構造一個SequenceGroup,并將其保存到Scheduler中進行進一步的調(diào)度和處理。通過多次執(zhí)行step操作,LLMEngine會完成所有輸入請求對應的SequenceGroup的生成。
Scheduler負責調(diào)度和管理待處理的SequenceGroup。它維護著三個隊列:waiting、running和swapped。當一個SequenceGroup被添加到系統(tǒng)中時,它會被放入waiting隊列中。Scheduler會根據(jù)調(diào)度策略從不同隊列中選擇SequenceGroup進行處理,并維護隊列之間的狀態(tài)。當一個SequenceGroup的推理過程新增了token時,Scheduler會更新該SequenceGroup的狀態(tài)。
BlockSpaceManager負責維護Cache block和GPU/CPU內(nèi)存之間的映射關系。它記錄了每個Cache block在GPU顯存或CPU內(nèi)存中的物理地址。當一個SequenceGroup被加入Scheduler時,并沒有分配具體的Cache block空間。在首次進入running階段時,SequenceGroup會向BlockSpaceManager申請可用的block空間,并進行相應的分配和管理。
Worker負責緩存更新和LLM推理的執(zhí)行。它首先執(zhí)行緩存更新操作,然后準備輸入token序列。通過調(diào)用LLM模型進行推理,Worker會生成新的token,并將其輸出結果更新到對應的SequenceGroup中。最后,多次執(zhí)行step操作,直到所有輸入請求對應的SequenceGroup都完成生成。
CacheEngine作為Worker的一部分,負責具體的緩存操作。它執(zhí)行緩存的換入、換出、拷貝等操作,并與BlockSpaceManager協(xié)同工作,管理GPU和CPU內(nèi)存之間的數(shù)據(jù)傳輸。
制作鏡像
通過dockerfile文件制作環(huán)境鏡像,可以在不同的云主機上輕松地復制和部署模型訓練環(huán)境,從而確保所有依賴項和配置都是正確的、提高模型推理的效率。 vLLM框架環(huán)境鏡像制作dockerfile文件如下:
# dockerfile
FROM nvidia/cuda:12.1.0-devel-ubuntu22.04 AS dev
RUN apt-get update -y \
&& apt-get install -y python3-pip git
RUN ldconfig /usr/local/cuda-12.1/compat/
WORKDIR /workspace
COPY requirements-common.txt requirements-common.txt
COPY requirements-cuda.txt requirements-cuda.txt
RUN --mount=type=cache,target=/root/.cache/pip \
pip install -r requirements-cuda.txt
COPY requirements-dev.txt requirements-dev.txt
RUN --mount=type=cache,target=/root/.cache/pip \
pip install -r requirements-dev.txt
ARG torch_cuda_arch_list='7.0 7.5 8.0 8.6 8.9 9.0+PTX'
ENV TORCH_CUDA_ARCH_LIST=${torch_cuda_arch_list}
快速部署
模型推理指的是運行轉換后的二進制格式文件,接收新的、未見過的數(shù)據(jù)樣本,根據(jù)其已學習到的特征和模式,生成預測結果。
下面我們就用yaml文件創(chuàng)建模型推理的服務,首先創(chuàng)建一個目錄用來存放模型推理的yaml文件。
mkdir -p /root/yaml/inference
cd /root/yaml/inference
模型推理的vllm.yaml文件如下:
apiVersion: v1
kind: InferenceService
metadata:
name: vllm #實例名稱
namespace: aiops-system #命名空間
spec:
predictor:
containers:
- args:
- --host
- "0.0.0.0"
- --port
- "8080" #推理服務的端口號
- --model
- /mnt/models/data/out_put/ #模型轉換后的路徑
command:
- python3
- -m
- vllm.entrypoints.api_server
env:
- name: STORAGE_URI
value: pvc://is-pvc-1
image: vllmserver:latest
name: kserve-container
resources:
limits:
cpu: "4"
memory: 20Gi
nvidia.com/gpu: "4"
requests:
cpu: "2"
memory: 20Gi
nvidia.com/gpu: "4"
通過vllm.yaml文件創(chuàng)建模型推理任務,相關聯(lián)的pod會對應一起生成,在master節(jié)點上執(zhí)行創(chuàng)建pod命令。
# k8s創(chuàng)建InferenceService
kubectl create -f vllm.yaml
之后就看到pod成功啟動了,查看已創(chuàng)建的pod,以及pod的狀態(tài)信息。
# 查看pod
kubectl get pod -n aiops-system
圖2.3 推理服務pod的狀態(tài)信息
推理服務啟動后查看 pod的ip。
# 查看pod的ip地址
kubectl get pod vllm-predictor-674d78bdc9-m24d4 -n aiops-system -o wide
圖2.4 推理服務pod的ip信息
模型推理問答的命令。
# prompt輸入到模型中的數(shù)據(jù)
curl -X POST -H "Content-Type: application/json" -d '{"prompt":"My name is"}' http://172.19.***.**:8080/generate
圖2.5 推理服務問答
3.總結
綜上所述,llama-2-7b大語言模型推理服務的實戰(zhàn)應用展示了其在自然語言處理領域的強大實力和應用潛力。通過不斷的技術優(yōu)化和服務改進,我們可以進一步推動自然語言處理技術的發(fā)展,為用戶提供更好的體驗和價值。未來,我們可以期待更先進的模型、更智能的推理服務以及更廣泛的應用場景。
本文轉載自 ??AI遇見云??,作者:賀晴
