赞
踩
vLLM 框架是一个高效的大型语言模型(LLM)推理和部署服务系统,具备以下特性:
在 一个3090 显卡的ubuntu22.04系统上进行部署。
pip 换源加速下载并安装依赖包
# 升级pip
python -m pip install --upgrade pip
# 更换 pypi 源加速库的安装
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
pip install modelscope==1.11.0
pip install openai==1.17.1
pip install torch==2.1.2+cu121
pip install tqdm==4.64.1
pip install transformers==4.39.3
# 下载flash-attn 请等待大约10分钟左右~
MAX_JOBS=8 pip install flash-attn --no-build-isolation
pip install vllm==0.4.0.post1
直接安装 vLLM 会安装 CUDA 12.1 版本。
pip install vllm
如果需要在 CUDA 11.8 的环境下安装 vLLM,可以指定 vLLM 版本和 python 版本下载。
export VLLM_VERSION=0.4.0
export PYTHON_VERSION=38
pip install https://github.com/vllm-project/vllm/releases/download/v${VLLM_VERSION}/vllm-${VLLM_VERSION}+cu118-cp${PYTHON_VERSION}-cp${PYTHON_VERSION}-manylinux1_x86_64.whl --extra-index-url https://download.pytorch.org/whl/cu118
vLLM 对 torch 版本要求较高,且越高的版本对模型的支持更全,效果更好,所以新建一个全新的镜像。 https://www.codewithgpu.com/i/datawhalechina/self-llm/GLM-4
使用 modelscope 中的 snapshot_download 函数下载模型,第一个参数为模型名称,参数 cache_dir 为模型的下载路径。
在 /root/model 路径下新建 model_download.py 文件并在其中输入以下内容,粘贴代码后请及时保存文件,如下图所示。并运行 python /root/model/model_download.py
执行下载,模型大小为 14GB。
import torch
from modelscope import snapshot_download, AutoModel, AutoTokenizer
osmodel_dir = snapshot_download('ZhipuAI/glm-4-9b-chat', cache_dir='/root/model', revision='master')
在 /root/model 路径下新建 vllm_model.py 文件并在其中输入以下内容,粘贴代码后请及时保存文件。下面的代码有很详细的注释,大家如有不理解的地方,欢迎提出 issue。
首先从 vLLM 库中导入 LLM 和 SamplingParams 类。LLM
类是使用 vLLM 引擎运行离线推理的主要类。SamplingParams
类指定采样过程的参数,用于控制和调整生成文本的随机性和多样性。
vLLM 提供了非常方便的封装,我们直接传入模型名称或模型路径即可,不必手动初始化模型和分词器。
我们可以通过这个 demo 熟悉下 vLLM 引擎的使用方式。被注释的部分内容可以丰富模型的能力,但不是必要的,大家可以按需选择。
from vllm import LLM, SamplingParams from transformers import AutoTokenizer import os import json # 自动下载模型时,指定使用modelscope。不设置的话,会从 huggingface 下载 # os.environ['VLLM_USE_MODELSCOPE']='True' def get_completion(prompts, model, tokenizer=None, max_tokens=512, temperature=0.8, top_p=0.95, max_model_len=2048): stop_token_ids = [151329, 151336, 151338] # 创建采样参数。temperature 控制生成文本的多样性,top_p 控制核心采样的概率 sampling_params = SamplingParams(temperature=temperature, top_p=top_p, max_tokens=max_tokens, stop_token_ids=stop_token_ids) # 初始化 vLLM 推理引擎 llm = LLM(model=model, tokenizer=tokenizer, max_model_len=max_model_len,trust_remote_code=True) outputs = llm.generate(prompts, sampling_params) return outputs if __name__ == "__main__": # 初始化 vLLM 推理引擎 model='/root/model/ZhipuAI/glm-4-9b-chat' # 指定模型路径 # model="THUDM/glm-4-9b-chat" # 指定模型名称,自动下载模型 tokenizer = None # tokenizer = AutoTokenizer.from_pretrained(model, use_fast=False) # 加载分词器后传入vLLM 模型,但不是必要的。 # 修改后的文本内容 text = [ "请描述一下大型语言模型的最新进展。", "提供一些提高编程技能的建议。" ] outputs = get_completion(text, model, tokenizer=tokenizer, max_tokens=512, temperature=1, top_p=1, max_model_len=2048) # 输出是一个包含 prompt、生成文本和其他信息的 RequestOutput 对象列表。 # 打印输出。 for output in outputs: prompt = output.prompt generated_text = output.outputs[0].text print(f"Prompt: {prompt!r}, Generated text: {generated_text!r}")
结果如下:
Prompt: '给我介绍一下大型语言模型。', Generated text: '大型语言模型是自然语言处理领域的一项突破性技术,它们通过分析和理解大量文本数据,学习如何生成和理解自然语言。这些模型通常具有数十亿甚至数万亿的参数,能够处理和理解复杂的语言结构,包括语法、语义和上下文关系。
大型语言模型在多个领域有广泛的应用,包括文本生成、机器翻译、情感分析、问答系统和聊天机器人等。它们能够生成连贯的文本,提供准确的翻译,理解用户的查询,并生成相关的回答。
这些模型的训练需要大量的计算资源和海量的数据。随着技术的进步,模型的规模和性能都在不断提高,使得它们在自然语言处理任务中的表现越来越接近人类水平。然而,它们也面临着一些挑战,包括偏见、泛化和解释性问题。
未来,大型语言模型可能会在更多领域发挥作用,包括教育、医疗和创意产业等。它们有望成为人们日常生活和工作中不可或缺的一部分,提供更加智能和便捷的语言交互体验。'
GLM4 模型与 OpenAI API 协议兼容,因此我们可以利用 vLLM 快速搭建一个符合 OpenAI API 标准的服务器。此服务器默认在 http://localhost:8000
上启动,并且一次只能服务一个模型。它支持模型列表查询、文本补全(completions)和对话补全(chat completions)等接口。
--host
和 --port
用于指定服务器的地址和端口。--model
指定模型的路径。--chat-template
用于指定对话的模板。--served-model-name
设置服务中模型的名称。--max-model-len
限制模型的最大处理长度。--max-model-len
设置为 2048。python -m vllm.entrypoints.openai.api_server \
--model /root/autodl-tmp/ZhipuAI/glm-4-9b-chat \
--served-model-name glm-4-9b-chat \
--max-model-len=2048 \
--trust-remote-code
curl http://localhost:8000/v1/models
{ "object":"list", "data":[ { "id":"glm-4-9b-chat", "object":"model", "created":1717567231, "owned_by":"vllm", "root":"glm-4-9b-chat", "parent":null, "permission":[ { "id":"modelperm-4fdf01c1999f4df1a0fe8ef96fd07c2f", "object":"model_permission", "created":1717567231, "allow_create_engine":false, "allow_sampling":true, "allow_logprobs":true, "allow_search_indices":false, "allow_view":true, "allow_fine_tuning":false, "organization":"*", "group":null, "is_blocking":false } ] } ] }
curl http://localhost:8000/v1/completions \
-H "Content-Type: application/json" \
-d '{
"model": "glm-4-9b-chat",
"prompt": "你好",
"max_tokens": 7,
"temperature": 0
}'
{ "id":"cmpl-8bba2df7cfa1400da705c58946389cc1", "object":"text_completion", "created":1717568865, "model":"glm-4-9b-chat", "choices":[ { "index":0, "text":",请问有什么可以帮助您的?您好", "logprobs":null, "finish_reason":"length", "stop_reason":null } ], "usage":{ "prompt_tokens":3, "total_tokens":10, "completion_tokens":7 } }
extra_body
,例如传入 stop_token_ids
以控制生成过程。也可以用 python 脚本请求 OpenAI Completions API 。这里面设置了额外参数 extra_body
,我们传入了 stop_token_ids
停止词 id。当 openai api 无法满足时可以采用 vllm 官方文档方式添加。https://docs.vllm.ai/en/latest/serving/openai_compatible_server.html
from openai import OpenAI client = OpenAI( base_url="http://localhost:8000/v1", api_key="token-abc123", # 随便设,只是为了通过接口参数校验 ) completion = client.chat.completions.create( model="glm-4-9b-chat", messages=[ {"role": "user", "content": "你好"} ], # 设置额外参数 extra_body={ "stop_token_ids": [151329, 151336, 151338] } ) print(completion.choices[0].message)
得到的返回值如下所示:
ChatCompletionMessage(content='\n你好声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/716879
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。