1: 为什么要部署大模型

以下是GPT给出的解释,请不要要求一个程序员给你介绍理论性的东西。

资源管理和优化

在服务器上部署大模型可以更好地管理和分配计算资源。服务器通常具有强大的硬件配置,能够有效处理大规模的并行请求,同时优化内存和CPU的使用。

可扩展性和负载均衡

部署在服务器上的大模型可以通过负载均衡器来分配请求,确保系统在高负载下仍能平稳运行。这种方法可以方便地扩展服务器数量,以应对高并发请求。

集中管理和维护

集中在服务器上的大模型更容易进行管理和维护,包括版本更新、安全补丁的应用以及性能监控。这简化了运维工作,确保系统始终保持高效和安全。

多用户和多应用支持

通过端口调用的方式,多个用户和应用程序可以同时访问同一个大模型实例。这使得资源共享更为高效,避免了重复启动多个大模型实例带来的资源浪费。

灵活的部署方式:

跨平台支持:服务器上的模型可以通过网络接口被不同平台和设备调用,无论是桌面应用、移动应用还是Web应用,都能轻松集成。

混合部署:可以选择在云端、私有服务器或者混合架构中部署模型,满足不同场景和需求的灵活性。

监控和日志:

性能监控:通过集中化的监控工具,可以实时监控模型的性能和健康状态,及时发现和解决问题。

日志记录:服务器端可以统一记录访问日志和错误日志,方便进行故障排查和性能优化。

安全性:

数据传输安全:通过SSL/TLS等加密技术,保证数据在传输过程中的安全。

访问控制:可以实现更为细粒度的访问控制策略,确保只有授权的用户和应用才能访问模型。

2:如何部署大模型

这里给大家介绍两个方法:vllm以及Lmdeploy,都可以将你的代码部署成OpenAI的API格式,调用起来更加灵活方便。

vLLM

vLLM是一个高效,简单的大模型推理加速框架。

vLLM的安装

Requirements
  • OS: Linux

  • Python: 3.8 – 3.11

  • GPU: compute capability 7.0 or higher (e.g., V100, T4, RTX20xx, A100, L4, H100, etc.)

Install with pip(可以换国内源)
# (Recommended) Create a new conda environment.
conda create -n myenv python=3.9 -y
conda activate myenv

# Install vLLM with CUDA 12.1.
pip install vllm
Build from source
git clone https://github.com/vllm-project/vllm.git
cd vllm
# export VLLM_INSTALL_PUNICA_KERNELS=1 # optionally build for multi-LoRA capability
pip install -e .  # This may take 5-10 minutes.

vLLM的部署

#!/bin/bash
python -m vllm.entrypoints.openai.api_server \
    --dtype float16 \
    --served-model-name Yi-6B-Chat\
    --model /your/dir/models/Yi-6B-Chat \
    --max-model-len 1024 \
    --host 0.0.0.0 \
    --port 9006 \

以下命令可以查看全部参数

python -m vllm.entrypoints.openai.api_server --help

bash脚本后出现以下信息就启动成功了

LMDeploy

LMDeploy 由 MMDeploy 和 MMRazor 团队联合开发,是涵盖了 LLM 任务的全套轻量化、部署和服务解决方案。 

LMDeploy的安装

Install with pip(可以换国内源)
pip install lmdeploy
源码地址
git clone --depth=1 https://github.com/InternLM/lmdeploy

LMDeploy的部署

通用部署

同理:

lmdeploy serve api_server /your/dir/models/Yi-6B-Chat \
 --model-name Yi-6B-Chat \
 --server-port 9006
自定义对话模板部署

LMDeploy有个很有趣的功能可以自定模板。就是直接在部署的时候,定义对话双方的身份及对话情景等,具体如下:

首先需要配置一个json文件:

下面是一个例子:

{
    "model_name": "Yi-6B-Chat",
    "system": "<|im_start|>system\n",
    "meta_instruction": "你是一个严厉的刑警,你正在审问一个穷凶极恶的罪犯,你的语言必须充满愤怒和凶狠",
    "eosys": "<|im_end|>\n",
    "user": "<|im_start|>被审讯的罪犯\n",
    "eoh": "<|im_end|>\n",
    "assistant": "<|im_start|>刑警\n",
    "eoa": "<|im_end|>",
    "separator": "\n",
    "capability": "interrogation",
    "stop_words": ["<|im_end|>"]
}


然后运行脚本:

#!/bin/bash

# Define the path to the chat template JSON file
CHAT_TEMPLATE="/your/dir/lmdeploy_chat.json"

# Set the log level to INFO for observing the applied chat template effect
LOG_LEVEL="INFO"

# Run the lmdeploy serve command with the specified chat template and log level
lmdeploy serve api_server /your/dir/models/Yi-6B-Chat --chat-template "${CHAT_TEMPLATE}" --log-level "${LOG_LEVEL}"  --server-port 9006 

3:如何使用OpenAI的API进行对话

导入库并加载环境变量:

import os
from dotenv import load_dotenv
from openai import OpenAI
load_dotenv()

创建OpenAI客户端:

load_dotenv()
client = OpenAI(
    # api_key=os.getenv('OPENAI_API_KEY'),
    # base_url=os.getenv('OPENAI_API_URL')
    base_url=os.getenv('API_BASE')
)

因为使用的是部署在本地的大模型,所以base_url我就直接写的本地:

API_BASE = 'http://0.0.0.0:9006/v1'

如果是在服务器上部署的或者外网部署的,请自觉更换相应的host

如果不想使用本地部署的大模型,直接用openAI的key, 就只保留api_key

如果是中转,则需要api_key和base_url都需要,url后也要加上API版本号v1

添加提示词:

# 添加系统提示词
system_prompt = "你是一个智能语音助手,你要尽可能回答用户的问题。"
messages.append({'role': 'system', 'content': system_prompt})

对话循环:

while True:
    content = input('User: ')
    messages.append({'role': 'user', 'content': content})

    response = client.chat.completions.create(
        model=os.getenv('MODEL_NAME'),
        # LLM_MODEL='openai',
        messages=messages
    )
    # print(f"response======{response}")
    asst_content = response.choices[0].message.content
    messages.append({'role': 'assistant', 'content': asst_content})
    print('Assistant: ', asst_content)

    # 如果助手提到终止对话,跳出循环
    if "terminate the conversation" in asst_content.lower():
        break

OK现在你已经可以使用大模型进行对话了。

感兴趣的可以自己打打印出来‘response’的值看一下都返回了哪些内容。

直接用openAI的话把模型名称改成'openai'就行

显而易见的,可以看到对于openAI的message参数必须是一个列表,

列表中的每个元素都是一个字典,这些字典包含两个键: 'role'和‘content’。这是 OpenAI API 的输入格式。具体来说:

  • role: 消息的发送者,可以是以下值之一:

    • 'system':系统消息,用于设置助手的行为或提供指示。
    • 'user':用户消息,表示用户的输入。
    • ‘assistant’:助手消息,表示助手生成的回复。
  • content: 文本内容。

字典格式如下:

messages = [
    {'role': 'system', 'content': '你是一个智能语音助手,你要尽可能回答用户的问题。'},
    {'role': 'user', 'content': '你好'},
    {'role': 'assistant', 'content': '你好,有什么我可以帮助你的吗?'}
]

同时还有很多其他参数可以选择,例如:

response = client.chat.completions.create(
    model=model_name,
    messages=messages,
    temperature=0.7, # 控制生成文本的随机性。范围[0,2],默认1,越高越随机
    max_tokens=150, # 最大长度
    top_p=0.9, # 控制生成文本的随机性,和temperature差不多。范围[0,1],默认1,越高越随机
    frequency_penalty=0, # 控制生成文本中重复词的惩罚。[-2,2], 默认0,越高重复概率越小
    presence_penalty=0.6,  # 控制生成文本中新词的惩罚。[-2,2], 默认0,越高重复概率越小
    stop=["终止对话"]  # 遇到这些内容会停止生成
)

还有很多其他参数大家可以自己了解哦。

当然如果你有一身反骨,也可以尝试使用requests.post的方式用http和大模型进行通信,然后自己处理response,这样的好处就是更灵活,但是也更加复杂,这里就不给大家介绍啦。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐