依赖项:
AutoDL算力云 | 弹性、好用、省钱。租GPU就上AutoDL
配置:4090,24G显存,windterm远程,vscode等基于软件就不说了
qwen2需求情况一览表:
显存占用大小(可以通过改浮点位调整占用显存大小):
内存占用量:
第一步:申请资源,创建python环境(autodl自带conda环境)
conda create -n myllm python==3.8.18
第二步:依赖包
哼...,pip install vllm不行,使用下面结束!
pip install vllm==0.4.0.post1
pip install modelscope==1.11.0
pip install openai==1.17.1
pip install tqdm==4.64.1
pip install transformers==4.39.3
MAX_JOBS=8 pip install flash-attn --no-build-isolation
第三步:下载qwen2-7B大模型(确保下载完)
# model_download.py
import os
import torch
from modelscope import snapshot_download, AutoModel, AutoTokenizer
model_dir = snapshot_download('qwen/Qwen2-7B-Instruct', cache_dir='/root/autodl-tmp', revision='master')
第四步:初级调用
# vllm_model.py
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/autodl-tmp/qwen/Qwen2-7B-Instruct' # 指定模型路径
# model="qwen/Qwen2-7B-Instruct" # 指定模型名称,自动下载模型
tokenizer = None
# 加载分词器后传入vLLM 模型,但不是必要的。
# tokenizer = AutoTokenizer.from_pretrained(model, use_fast=False)
text = ["你好,帮我介绍一下什么时大语言模型。",
"可以给我将一个有趣的童话故事吗?"]
# messages = [
# {"role": "system", "content": "你是一个有用的助手。"},
# {"role": "user", "content": prompt}
# ]
# 作为聊天模板的消息,不是必要的。
# text = tokenizer.apply_chat_template(
# messages,
# tokenize=False,
# add_generation_prompt=True
# )
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}")
结果:
第三步:部署为openai接口,API访问
python -m vllm.entrypoints.openai.api_server --model /root/autodl-tmp/qwen/Qwen2-7B-Instruct --served-model-name Qwen2-7B-Instruct --max-model-len=2048 --port 8000
其他指令
--host 0.0.0.0 #IP
--port 8000 #端口
--gpu-memory-utilization 0.7 #占用GPU内存部分
--max-model-len 29856 #上下文长度
--model Qwen1.5-72B-Chat #模型文件位置
--tensor-parallel-size 4 #指定4张卡
如果想指定某几张卡,可以使用命令:
CUDA_VISIBLE_DEVICES=0,1 python -m vllm.entrypoints.openai.api_server --model /root/autodl-tmp/qwen/Qwen2-7B-Instruct --served-model-name Qwen2-7B-Instruct --max-model-len=2048 --port 8000
OOM(内存溢出)问题。我们推荐您尝试三个参数进行修复。第一个参数是 --max-model-len 。我们提供的默认最大位置嵌入(max_position_embedding)为32768,因此服务时的最大长度也是这个值,这会导致更高的内存需求。将此值适当减小通常有助于解决OOM问题。另一个您可以关注的参数是 --gpu-memory-utilization 。默认情况下,该值为 0.9 ,您可以将其调高以应对OOM问题。最后就是--dtype float16,选择较小的浮点数可以降低内存消耗。
部署完成后查询当前端口的模型信息:
curl http://localhost:8000/v1/models
指定端口:--port 8000
指定浮点位数:(可以设置auto,或者去掉使用默认值)
--dtype float16
--dtype float32(直接超过显存了,说明位数不同,占的显存差别还是很大的)
测试api接口代码:
# vllm_openai_completions.py
from openai import OpenAI
client = OpenAI(
base_url="http://localhost:8000/v1",
api_key="sk-xxx", # 随便填写,只是为了通过接口参数校验
)
completion = client.chat.completions.create(
model="Qwen2-7B-Instruct",
messages=[
{"role": "user", "content": "你是谁"}
]
)
print(completion.choices[0].message)