查看原文
其他

简化部署,优化推理!LMDeploy RESTful API 让大模型落地更丝滑

OpenMMLab 2024-04-23

The following article is from InternLM Author LMDeploy

自从 OpenAI 发布了 GPT-3,大型语言模型就在全球范围内引发了热潮。这些模型已经在各种领域展示出其惊人的性能,包括写作、编程助手、教育工具等。然而,如何有效地部署并优化这些模型的推理速度,仍是许多开发者和研究人员面临的难题。


今天,我们很高兴地宣布,有了 LMDeploy,这个难题将被有效解决。LMDeploy 是一个强大的开源代码库,专门用于加速大型语言模型的推理速度,同时还支持 RESTful API,带来更便捷的使用体验。LMDeploy 的 RESTful API,可以让用户像使用 ChatGPT一样使用这些大模型。最最重要的是,LMDeploy 不用你掏钱,只要你有个打游戏的 N 卡,就可以运行啦。下面,就让我们体验下它有多丝滑吧。


https://github.com/InternLM/lmdeploy

(文末点击阅读原文可直达,

觉得好用欢迎点亮小星星)



一步到位启动 api_server


执行下面的脚本,安装 LMDeploy,下载一个书生语言模型,启动 API 服务。


pip install lmdeploygit clone https://huggingface.co/lmdeploy/turbomind-internlm-chat-7b-w4lmdeploy 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 APIClientapi_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 APIClientapi_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 APIClientapi_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 asynciofrom aiohttp import ClientSessionasync 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 或者加微信群等方式寻求帮助。


(欢迎扫码加入群聊)


YOLO系列模型的部署、精度对齐与int8无损失量化加速

2023-11-16

当分类从固定类别走向开放类别!基于MMPreTrain实现Prompt-base分类丨开源之夏中选项目分享

2023-11-15

一招带你轻松实现MM系列模型的一键转换与高效部署!

2023-11-14

点击下方“阅读原文”直达 LMDeploy,欢迎使用

继续滑动看下一个
向上滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存