大模型从入门到入土【二】大模型的部署(VLLM,Lmdeploy)
大模型的部署以及使用
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,这样的好处就是更灵活,但是也更加复杂,这里就不给大家介绍啦。
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)