简化部署,优化推理!LMDeploy RESTful API 让大模型落地更丝滑
自从 OpenAI 发布了 GPT-3,大型语言模型就在全球范围内引发了热潮。这些模型已经在各种领域展示出其惊人的性能,包括写作、编程助手、教育工具等。然而,如何有效地部署并优化这些模型的推理速度,仍是许多开发者和研究人员面临的难题。
今天,我们很高兴地宣布,有了 LMDeploy,这个难题将被有效解决。LMDeploy 是一个强大的开源代码库,专门用于加速大型语言模型的推理速度,同时还支持 RESTful API,带来更便捷的使用体验。LMDeploy 的 RESTful API,可以让用户像使用 ChatGPT一样使用这些大模型。最最重要的是,LMDeploy 不用你掏钱,只要你有个打游戏的 N 卡,就可以运行啦。下面,就让我们体验下它有多丝滑吧。
https://github.com/InternLM/lmdeploy
(文末点击阅读原文可直达,
觉得好用欢迎点亮小星星)
一步到位启动 api_server
执行下面的脚本,安装 LMDeploy,下载一个书生语言模型,启动 API 服务。
pip install lmdeploy
git clone https://huggingface.co/lmdeploy/turbomind-internlm-chat-7b-w4
lmdeploy serve api_serve turbomind-internlm-chat-7b-w4
直接将运行脚本后打印的 http 地址输入到浏览器,打开 Swagger UI,比如 http://0.0.0.0:23333。浏览器打开后会显示各个 API 的使用方法,也可以直接点击试用。
Python 客户端
LMDeploy 将这些服务的Python客户端功能集成在 APIClient 类中。下面是一些例子,展示如何在客户端调用 api_server 服务。
/v1/chat/completions是 OpenAI 格式的对话 API,它将消息列表组成的会话内容作为输入,并返回模型生成的消息作为输出。如果你想用 /v1/chat/completions 接口,你可以尝试下面代码:
from lmdeploy.serve.openai.api_client import APIClient
api_client = APIClient('http://{server_ip}:{server_port}')
model_name = api_client.available_models[0]
messages = [{"role": "user", "content": "Say this is a test!"}]
for item in api_client.chat_completions_v1(model=model_name, messages=messages):
print(item)
/v1/completions 是 OpenAI 格式的文本生成 API,它将对用户输入的文字段落进行续写补全。如果你想用 /v1/completions 接口,你可以尝试:
from lmdeploy.serve.openai.api_client import APIClient
api_client = APIClient('http://{server_ip}:{server_port}')
model_name = api_client.available_models[0]
for item in api_client.completions_v1(model=model_name, prompt='hi'):
print(item)
LMDeploy 的 /v1/chat/interactive api 支持将对话内容管理在服务端,但是我们默认关闭。如果想尝试,请阅读以下介绍:
交互模式下,对话历史保存在 server。在一次完整的多轮对话中,所有请求设置 interactive_mode = True, session_id 保持相同 (不为 -1,这是缺省值)。
非交互模式下,server 不保存历史记录。
交互模式可以通过 interactive_mode 布尔量参数控制,下面是一个普通模式的例子。
如果要体验交互模式,将 interactive_mode=True 传入即可。
from lmdeploy.serve.openai.api_client import APIClient
api_client = APIClient('http://{server_ip}:{server_port}')
for item in api_client.generate(prompt='hi'):
print(item)
如要体验客户端对话功能,可以执行 lmdeploy serve api_client api_serve_url,下面是一个例子。
(base) [masaike@masaike lmdeploy]$ lmdeploy serve api_client http://0.0.0.0:23333
double enter to end input >>> 请对我来个彩虹屁
书生·浦语在这里给您送上彩虹屁:
您是一个多么美好的人啊!您拥有着无限的智慧和才华,您的思想和见解总是那么独特而深刻。您的话语总是那么温柔而有力,能够鼓舞人心,激励人们前行。您总是那么友善和慷慨,愿意帮助他人,分享您的知识和经验。您是一个真正的宝藏,值得我们所有人去珍惜和爱护。
double enter to end input >>> 再来一个
好的,书生·浦语再给您送上彩虹屁:
您是一个多么优秀和出色的人啊!您的才华和能力是无可比拟的,您的成就和贡献是值得我们所有人去敬仰和学习的。您总是那么自信和坚定,能够面对挑战和困难,克服一切困难。您总是那么有爱心和同情心,愿意帮助他人,关心他人的需要和感受。您是一个真正的榜样,值得我们所有人去追随和效仿。
高级特性
LMDeploy 后台接受到问题比较多的是,如何批量发请求,如何异步请求。批量发请求可以实现的方式有很多,可以通过 Python 协程,发大量请求,也就是异步请求。也可以通过多线程或者多进程发多个请求。下面是一个简单异步请求的例子,访问 /v1/chat/completions。
import asyncio
from aiohttp import ClientSession
async def get_response(url):
headers = {'content-type': 'application/json'}
pload = {
'model': 'internlm-chat-7b',
'messages': 'hi',
'stream': False
}
async with ClientSession() as session:
async with session.post(url, headers=headers, json=pload) as response:
res = await response.text()
print(res)
async def main():
url = "http://10.140.24.140:1234"
task_list = []
for i in range(10):
task = asyncio.create_task(get_response(url+'/v1/chat/completions'))
task_list.append(task)
await asyncio.wait(task_list, timeout=None)
asyncio.run(main())
另一个比较多的问题是,如何设置对话的最大长度。首先,确定好模型本身支持的最大对话长度。然后,用户在启动 api_server 的时候,设置传入的 --session_len 大小即可。
注意事项
以下是一些可能遇到的问题和解决方法:
当返回结果结束原因为 "finish_reason":"length",这表示回话长度超过最大值。如需调整会话支持的最大长度,可以通过启动api_server时,设置--session_len参数大小。
当服务端显存 OOM 时,可以适当减小启动服务时的 instance_num 个数。
/v1/chat/interactive api 支持多轮对话, 但是默认关闭。messages 或者 prompt 参数既可以是一个简单字符串表示用户的单词提问,也可以是一段对话历史。
/v1/chat/interactive 普通模式切换成交互模式,只需传 interactive_model 为 True,但是也要传一个固定的 session_id,否则每次会以随机值开启新会话。从交互模式切到普通模式,只需传interactive_model 即可结束会话。下次对话开始,就不是有历史记录的回复。
总结
本文介绍了 LMDeploy 的 RESTful API 功能,以详细的示例介绍了如何使用 Python 客户端调用服务器的服务。此外,它还提供了批量请求和异步请求的高级特性,并对如何设置会话的最大长度进行了说明。
但是,在使用过程中也可能出现一些问题,例如回话长度超过最大值,服务器显存溢出等。对于这些问题,也给出了相应的解决方案,建议如果在使用过程中遇到任何问题,优先查看 Swagger UI 以确保操作正确。也欢迎向项目提交 issue 或者加微信群等方式寻求帮助。
(欢迎扫码加入群聊)
2023-11-08
2023-11-03
点击下方“阅读原文”直达 LMDeploy,欢迎使用