LmDeploy推理加速与部署
lmdeploy github: https://github.com/InternLM/lmdeploy.
支持lmdeploy推理加速的模型可以查看支持的模型.
目录
环境准备
GPU设备: A10, 3090, V100, A100均可.
# 设置pip全局镜像 (加速下载)
pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/
# 安装ms-swift
git clone https://github.com/modelscope/swift.git
cd swift
pip install -e '.[llm]'
# lmdeploy与cuda版本有对应关系,请按照`https://github.com/InternLM/lmdeploy#installation`进行安装
pip install lmdeploy
推理加速
使用python
import os
os.environ['CUDA_VISIBLE_DEVICES'] = '0'
from swift.llm import (
ModelType, get_lmdeploy_engine, get_default_template_type,
get_template, inference_lmdeploy, inference_stream_lmdeploy
)
model_type = ModelType.qwen_7b_chat
model_id_or_path = None
lmdeploy_engine = get_lmdeploy_engine(model_type, model_id_or_path=model_id_or_path)
template_type = get_default_template_type(model_type)
template = get_template(template_type, lmdeploy_engine.hf_tokenizer)
# 与`transformers.GenerationConfig`类似的接口
lmdeploy_engine.generation_config.max_new_tokens = 256
generation_info = {}
request_list = [{'query': '你好!'}, {'query': '浙江的省会在哪?'}]
resp_list = inference_lmdeploy(lmdeploy_engine, template, request_list, generation_info=generation_info)
for request, resp in zip(request_list, resp_list):
print(f"query: {request['query']}")
print(f"response: {resp['response']}")
print(generation_info)
# stream
history1 = resp_list[1]['history']
request_list = [{'query': '这有什么好吃的', 'history': history1}]
gen = inference_stream_lmdeploy(lmdeploy_engine, template, request_list, generation_info=generation_info)
query = request_list[0]['query']
print_idx = 0
print(f'query: {query}\nresponse: ', end='')
for resp_list in gen:
resp = resp_list[0]
response = resp['response']
delta = response[print_idx:]
print(delta, end='', flush=True)
print_idx = len(response)
print()
history = resp_list[0]['history']
print(f'history: {history}')
print(generation_info)
"""
query: 你好!
response: 你好!有什么我能帮助你的吗?
query: 浙江的省会在哪?
response: 浙江省会是杭州市。
{'num_prompt_tokens': 46, 'num_generated_tokens': 13, 'num_samples': 2, 'runtime': 0.2037766759749502, 'samples/s': 9.81466593480922, 'tokens/s': 63.79532857625993}
query: 这有什么好吃的
response: 杭州有许多美食,比如西湖醋鱼、东坡肉、龙井虾仁、油炸臭豆腐等,都是当地非常有名的传统名菜。此外,当地的点心也非常有特色,比如桂花糕、马蹄酥、绿豆糕等。
history: [['浙江的省会在哪?', '浙江省会是杭州市。'], ['这有什么好吃的', '杭州有许多美食,比如西湖醋鱼、东坡肉、龙井虾仁、油炸臭豆腐等,都是当地非常有名的传统名菜。此外,当地的点心也非常有特色,比如桂花糕、马蹄酥、绿豆糕等。']]
{'num_prompt_tokens': 44, 'num_generated_tokens': 53, 'num_samples': 1, 'runtime': 0.6306625790311955, 'samples/s': 1.5856339558566632, 'tokens/s': 84.03859966040315}
"""
TP:
import os
os.environ['CUDA_VISIBLE_DEVICES'] = '0,1'
from swift.llm import (
ModelType, get_lmdeploy_engine, get_default_template_type,
get_template, inference_lmdeploy, inference_stream_lmdeploy
)
if __name__ == '__main__':
model_type = ModelType.qwen2_7b_instruct
model_id_or_path = None
lmdeploy_engine = get_lmdeploy_engine(model_type, model_id_or_path=model_id_or_path, tp=2)
template_type = get_default_template_type(model_type)
template = get_template(template_type, lmdeploy_engine.hf_tokenizer)
# 与`transformers.GenerationConfig`类似的接口
lmdeploy_engine.generation_config.max_new_tokens = 1024
generation_info = {}
request_list = [{'query': '你好!'}, {'query': '浙江的省会在哪?'}]
resp_list = inference_lmdeploy(lmdeploy_engine, template, request_list, generation_info=generation_info)
for request, resp in zip(request_list, resp_list):
print(f"query: {request['query']}")
print(f"response: {resp['response']}")
print(generation_info)
# stream
history1 = resp_list[1]['history']
request_list = [{'query': '这有什么好吃的', 'history': history1}]
gen = inference_stream_lmdeploy(lmdeploy_engine, template, request_list, generation_info=generation_info)
query = request_list[0]['query']
print_idx = 0
print(f'query: {query}\nresponse: ', end='')
for resp_list in gen:
resp = resp_list[0]
response = resp['response']
delta = response[print_idx:]
print(delta, end='', flush=True)
print_idx = len(response)
print()
history = resp_list[0]['history']
print(f'history: {history}')
print(generation_info)
"""
query: 你好!
response: 你好!有什么我可以帮助你的吗?
query: 浙江的省会在哪?
response: 浙江省的省会是杭州市。
{'num_prompt_tokens': 46, 'num_generated_tokens': 15, 'num_samples': 2, 'runtime': 0.18026001192629337, 'samples/s': 11.095084143330586, 'tokens/s': 83.2131310749794}
query: 这有什么好吃的
response: 浙江省,简称“浙”,位于中国东南沿海长江三角洲地区,是一个美食资源丰富的地区。这里不仅有传统的江南菜系,还融合了海洋文化的特色,形成了独特的饮食文化。以下是一些浙江的著名美食:
1. **西湖醋鱼**:一道源自杭州的传统名菜,选用鲜活的草鱼,肉质细嫩,酸甜适口,是来杭州必尝的佳肴。
2. **东坡肉**:也是源于杭州的一道经典菜肴,以五花肉为主料,经过长时间的慢炖,肉质酥软,味道浓郁。
3. **龙井虾仁**:以杭州龙井茶为原料,搭配新鲜的虾仁,色香味俱佳,是将茶文化和美食完美结合的佳作。
4. **宁波汤圆**:宁波的汤圆以皮薄馅多、甜而不腻著称,有芝麻、豆沙等多种口味,是宁波地区的传统小吃。
5. **海鲜大餐**:浙江沿海城市如宁波、舟山等地,海鲜种类丰富,可以品尝到各种新鲜的海产,如东海三鲜(黄鱼、带鱼、小黄鱼)、虾蟹等。
6. **绍兴酒**:绍兴不仅是著名的黄酒产地,还有其他多种酒类,如女儿红、加饭酒等,口感醇厚,是佐餐或品饮的好选择。
7. **衢州烤饼**:在衢州地区非常有名的小吃,外皮酥脆,内里松软,通常会夹上肉末、葱花等配料。
8. **台州海鲜面**:台州的海鲜面以其丰富的海鲜和独特的调味方式闻名,面条滑爽,海鲜鲜美。
这些只是浙江美食中的一部分,每个地方都有其独特的风味和特色小吃,值得一一尝试。
history: [['浙江的省会在哪?', '浙江省的省会是杭州市。'], ['这有什么好吃的', '浙江省,简称“浙”,位于中国东南沿海长江三角洲地区,是一个美食资源丰富的地区。这里不仅有传统的江南菜系,还融合了海洋文化的特色,形成了独特的饮食文化。以下是一些浙江的著名美食:\n\n1. **西湖醋鱼**:一道源自杭州的传统名菜,选用鲜活的草鱼,肉质细嫩,酸甜适口,是来杭州必尝的佳肴。\n\n2. **东坡肉**:也是源于杭州的一道经典菜肴,以五花肉为主料,经过长时间的慢炖,肉质酥软,味道浓郁。\n\n3. **龙井虾仁**:以杭州龙井茶为原料,搭配新鲜的虾仁,色香味俱佳,是将茶文化和美食完美结合的佳作。\n\n4. **宁波汤圆**:宁波的汤圆以皮薄馅多、甜而不腻著称,有芝麻、豆沙等多种口味,是宁波地区的传统小吃。\n\n5. **海鲜大餐**:浙江沿海城市如宁波、舟山等地,海鲜种类丰富,可以品尝到各种新鲜的海产,如东海三鲜(黄鱼、带鱼、小黄鱼)、虾蟹等。\n\n6. **绍兴酒**:绍兴不仅是著名的黄酒产地,还有其他多种酒类,如女儿红、加饭酒等,口感醇厚,是佐餐或品饮的好选择。\n\n7. **衢州烤饼**:在衢州地区非常有名的小吃,外皮酥脆,内里松软,通常会夹上肉末、葱花等配料。\n\n8. **台州海鲜面**:台州的海鲜面以其丰富的海鲜和独特的调味方式闻名,面条滑爽,海鲜鲜美。\n\n这些只是浙江美食中的一部分,每个地方都有其独特的风味和特色小吃,值得一一尝试。']]
{'num_prompt_tokens': 46, 'num_generated_tokens': 384, 'num_samples': 1, 'runtime': 2.7036479230737314, 'samples/s': 0.36987064457087926, 'tokens/s': 142.03032751521764}
"""
使用CLI
CUDA_VISIBLE_DEVICES=0 swift infer --model_type qwen2-7b-instruct --infer_backend lmdeploy
# TP
CUDA_VISIBLE_DEVICES=0,1 swift infer --model_type qwen2-7b-instruct --infer_backend lmdeploy --tp 2
CUDA_VISIBLE_DEVICES=0,1 swift infer --model_type qwen2-72b-instruct --infer_backend lmdeploy --tp 2
部署
CUDA_VISIBLE_DEVICES=0 swift deploy --model_type qwen2-7b-instruct --infer_backend lmdeploy
# TP
CUDA_VISIBLE_DEVICES=0,1 swift deploy --model_type qwen2-7b-instruct --infer_backend lmdeploy --tp 2
CUDA_VISIBLE_DEVICES=0,1 swift deploy --model_type qwen2-72b-instruct --infer_backend lmdeploy --tp 2
客户端调用方式可以查看: vLLM推理加速与部署文档
benchmark测试代码: https://github.com/modelscope/ms-swift/blob/main/scripts/benchmark/deploy.py
多模态
查看这里