个人搭建qwen2大模型过程笔记

依赖项:

        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)
  • 7
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值