DeepSpeed-MII icon indicating copy to clipboard operation
DeepSpeed-MII copied to clipboard

Serving error when input of large length is sent

Open frankxyy opened this issue 8 months ago • 4 comments

Hi, I am serving using MII for model llama-2-7b-hf with tensor-parallel parameter 1. When the input is not very long, the output can be generated properly. However, when the length of input is up to for example 2000, an error occured: image

frankxyy avatar Nov 13 '23 09:11 frankxyy

@frankxyy I just tested this with the same model and tensor parallelism and was able to pass a 2000 token input and generate text, so I have not been successful in reproducing this error. Can you share some example code that would reproduce the problem? And could you also include information about what GPU you are using? Thanks!

@cmikeh2 any ideas for this error?

mrwyattii avatar Nov 14 '23 18:11 mrwyattii

Hi @mrwyattii , this my serving code:

import mii

model_dir = '/home/xuyangyang/llama-2-7b-hf'
# model_dir = '/mnt/cephfs/nlp_group/llama2_pre_sft_ckps/sagenova-ext-vocab80k-370000-rb20k'
# model_dir = '/mnt/cephfs/nlp_group/llama2_pre_sft_ckps/sagenova-sft_v4-base225k-step150'
# model_dir ='/home/xuyangyang/Yi-6B-200K-Llamafied/'

client = mii.serve(model_dir,\
    tensor_parallel=1)

# client = mii.serve("/home/xuyangyang/llama-2-13b-chat-hf",\
#     tensor_parallel=2)

this is my client code:

import mii
import time
from transformers import LlamaTokenizer

start_token = "<s>"
end_token = "</s>"
inst_start = "[INST]"
inst_end = "[/INST]"
sys_start = "<<SYS>>"
sys_end = "<</SYS>>"

# query_taxi = ["2023-04-10 08:20:11 [INFO] 用户ID: 102938, 请求打车服务, 起点: 莲花山公园, 终点: 明珠商务广场\n2023-04-10 08:20:15 [DEBUG] 用户ID: 102938, 派单成功, 车辆ID: A12345, 司机姓名: 张三\n2023-04-10 08:25:20 [INFO] 用户ID: 102938, 上车, 车辆ID: A12345, 司机姓名: 张三\n2023-04-10 08:55:32 [INFO] 用户ID: 102938, 下车, 车辆ID: A12345, 司机姓名: 张三, 行程金额: 85.5元\n2023-04-10 08:55:35 [DEBUG] 用户ID: 102938, 支付成功, 金额: 85.5元\n2023-04-11 13:10:45 [INFO] 用户ID: 102938, 请求打车服务, 起点: 世纪大道地铁站, 终点: 欢乐谷\n2023-04-11 13:10:49 [DEBUG] 用户ID: 102938, 派单成功, 车辆ID: B23456, 司机姓名: 李四\n2023-04-11 13:15:01 [INFO] 用户ID: 102938, 上车, 车辆ID: B23456, 司机姓名: 李四\n2023-04-11 13:50:20 [INFO] 用户ID: 102938, 下车, 车辆ID: B23456, 司机姓名: 李四, 行程金额: 120.0元\n2023-04-11 13:50:24 [DEBUG] 用户ID: 102938, 支付成功, 金额: 120.0元\n基于以上日志信息回答:这个用户在2023年4月11日从世纪大道地铁站到欢乐谷的行程中,支付了多少费用?",
# "用户询问:我想画一幅户型效果图,输入是一个2D户型图,想得到3D的\napi集合描述如下:\n家具库API:该API提供了一个家具库,其中包含各种不同类型和风格的家具,例如沙发、床、桌子等等。用户可以通过此API获取家具库中的对象,并将其添加到户型图中。\n可视化效果API:该API可以将用户生成的2D或3D户型图转化为高质量的渲染图像。用户可以选择不同的视角和光线设置,以及应用不同的滤镜和效果,来生成满意的可视化效果。\n户型图生成API:该API可以接受房屋尺寸、房间数量、门窗位置和布局等信息,自动生成符合用户需求的户型图。\n材料库API:该API提供了一个材料库,其中包含各种不同类型和风格的材料,例如地板、墙壁、天花板等等。用户可以通过此API获取材料库中的对象,并将其应用到户型图中的相应部分。\n分享和导出API:该API允许用户将生成的户型图导出为不同的文件格式,例如PNG、JPEG、PDF等等,以便用户与他人分享和打印。此API还支持将户型图上传至云端存储服务,例如Google Drive和Dropbox,方便用户随时随地访问和编辑。\n请基于用户需求和api描述从api集合中挑选出一个最合适的api",
# "请总结以下对话。\n客户: 你好,我正在寻找一个设计师来设计我的新房子。你能帮我吗?\n房屋设计师: 当然可以。我们可以先讨论一下你的预算和你对这个房子的期望。\n客户: 我的预算是100万左右,我希望我的房子有四个卧室和三个浴室。我还想要一个开放式的厨房和客厅,以及一个带壁炉的起居室。\n设计师: 这听起来像是一个不错的计划。你是否有任何特别的要求,例如可以容纳多少人或者需要额外的储藏空间?\n客户: 我们的家庭有五口人,所以需要足够的空间。此外,我希望有一个带车库的车道,可以容纳两辆车。我还希望有一个带独立浴缸的主卧室套间。\n设计师: 我完全理解你的要求。我们可以为你设计一个非常实用且现代化的房子,以最大化你的生活质量。我们可以用一些高端的材料和设备来装修房子,以确保它的价值和可持续性。\n客户: 非常感谢你的建议。你有什么样的设计理念或者建议吗?\n设计师: 我们可以考虑使用一些环保的材料,例如太阳能电池板、可再生材料和高效能的隔热材料。我们还可以在客厅里添加一些大型的落地窗,以提供更好的自然光线和通风。我们可以设计一个现代化的开放式平面图,以最大化空间利用率和功能性。同时,我们还可以为您提供一些优美的景观设计,例如花园和水景。\n客户: 非常感谢你的建议和建议。听起来这将是一个非常完美的家园。我们期待着看到你的设计。"]
query = "东村家园小区附近有电影院吗?"

def get_prompt(slice: str, query: str) -> str:
    prompt = (
        "### 阅读材料:\n"
        "{slice}\n\n"
        "请仔细阅读以上文本,并根据文本内容回答问题。注意:\n"
        "- 不要参考外部知识或历史信息\n"
        "- 请务必只提供与问题直接相关的答案,不用给出分析,也不用发散或者补充不相关的内容,尽量保证答案简短\n\n"
        "### 问题:\n"
        "{query}\n\n"
    ).format(slice=slice, query=query)
    return prompt

# model_dir = '/home/xuyangyang/llama-2-7b-hf'
model_dir = '/mnt/cephfs/nlp_group/llama2_pre_sft_ckps/sagenova-ext-vocab80k-370000-rb20k'
client = mii.client(model_dir)

slice = """总户数:915\n北京城北龙城医院等医院位于板块内,完善了板块的医疗资源;\n整体来看,板块各配套发展相对完善,未来发展空间较小,不具备投资的潜力,适合刚需置业。\n小区优点:小区外立面维护的比较好,不显老旧;\n小区绿化率约35%,环境较好。\n小区缺点:小区停车位不足,影响居民停车;\n小区于2000年竣工,楼龄较老。\n地段交通:距离小区约578m有育新地铁站,该站途经地铁8号线,方便居民乘坐地铁出行;\n距离小区约131m有东村家园南门公交站,该站停靠专89路公交车,方便居民乘坐公交出行;\n距离小区约191m有文博路,方便居民自驾出行。\n附近学校:距离小区约417m有绿贝儿幼稚园(黄土东村路),该幼儿园是公立*;\n距离小区约267m有昌平回龙观第二*,该是公立;\n距离小区约637m有首师大附属育新*,该是公
立;\n整体来看,小区周边教育资源比较丰富,方便居民子女上学。\n小区环境:小区绿化率约35%,小区内有花园,花园内景观植物较多,道路两旁有绿化带,树木生长的高大茂盛;\n小区配有健身设施、儿童娱乐设施,天气好的时候,老人和小孩在此玩乐;\n小区路面平整干净,整体环境较好。\n小区建筑特色:小区整体建筑以简约大方为主,外立面以咖色的涂料为主;\n小区楼龄虽
老,但物业将外立面维护的比较好,整体墙面没有出现脱落的现象,不显老旧。\n楼栋分布:小区共有11栋楼,容积率为1.21;\n小区户型有2-3居室,小区户型面积约49m2-108m2,小区户型南北通透,采光充足。\n出入口:小区有4个出入口,东门位于文华路附近,机动车和行人都可通行;\n西门位于太平庄北街与文博路交叉口北130m附近;\n南门可以通往太平庄北街,仅行人通行;\n地
上停车场位于6号楼的南侧,仅车辆可以通行。\n公共设施:小区花园;\n运动场地;\n活动中心;\n康乐设施;\n儿童游乐设施。\n物业服务水平:小区物业人员做事比较认真,及时修剪小区内的绿植,公共设施维护也比较及时,确保居民在使用过程中的安全,小区楼龄比较老,但物业将外立面维护的比较好;\n小区保洁人员每天打扫楼道和主干道的垃圾,会及时清理小区内的生活垃圾,小区卫生较为干净整洁。\n安保:小区各出入口都有保安亭,有充足的保安轮流值班,外来人员进出小区需要登记,防止陌生人随意进出,能够较好的保障居民的居住安全;\n小区内有完善的监控设备,并与110联网,如果有突发情况,警察会及时赶到,进一步保障了小区内居民的人身和财产安全。\n物业公司:小区物业为北京回龙观东村物业管理有限公司。\n物业费:0.8元/m2/月\n总停
车位数量:100\n地下车位数量:50\n车位比:0.11\n地面停车费每月:150.00\n地下停车费每月:150.00\n商业配套:小区周边商业配套比较齐全,距离小区约218m有三旗百汇购物中心,方便居民逛街购物;\n距离小区约272m有物美超市(三旗百汇店),居民日常采购比较方便;\n距离小区约259m有7-ELEVEn(文化路东侧店),方便居民购买日常所需用品。\n医疗资源:小区周边医疗资源比较完善,距离小区约2.3km有北京市昌平区中西医结合医院,方便居民就医;\n距离小区约570m有北京市海淀区西三旗街道新材社区卫生服务站,方便居民感冒时就诊;\n距离小区约82m有海兴堂药房(总店),居民买药比较方便。\n生活服务:小区周边生活配套比较丰富,距离小区约160m有旺发菜市场,居民购买食材比较方便;\n距离小区约285m有中国工商银行(北京龙泽支行),居民存取款比
较方便;\n距离小区约221m有中国电信(太平庄北街营业厅),居民办理通讯业务比较方便。\n公共资源:小区周边公共设施较多,距离小区约499m有南店公园,居民可以在周末带家人来此游玩;\n距离小区约1.4km有回龙观派出所,能够负责附近的治安情况;\n距离小区约1.8km有龙泽园街道办事处,居民处理相关问题比较方便。\n距离小区约282m有保利国际影城(龙旗购物中心店)\n距离小
区约831m有日晔兴KTV,方便居民唱歌娱乐;\n距离小区约391m有VigourMax健身工作室,居民平时健身比较方便。\n卖房建议:小区距离菜市场较近,并且户型面积大小适中,业主可将房屋出售给安置老人的购房者,一定程度上可提高成交率;\n小区周边交通比较便利,业主可以将人群定位为在附近上班的白领人群,利于加快出售速度。\n买房建议:小区内健身娱乐设施比较齐全,对于打
算安置老人的购房者,建议购买49m2左右的2居室,打扫起来不费力,选择低层居住还可以方便出行;\n建议年轻的上班族选择面积约50m2的2居室,可以选择办理分期贷款,缓解经济压力。\n租房建议:小区周边交通比较便利,建议单身的租客选择与人合租50m2左右的2居室,分摊后的房租费以及物业费都较低,可以减轻经济负担;\n对于家庭租户来说,可以选择整租约71m2的3居室,户型
面积虽小,但房间充足,可以满足居住需求。\n居住体验:小区内健身娱乐设施和休息区域比较齐全,有利于居民的身心健康;\n小区平时会开展一些活动,居民之间互帮互助,居住氛围较好;\n小区距离地铁站较近,上下班比较方便;\n邻里之间相处融洽,居民居住体验较好。\n业主特征:小区基本是业主自住,业主多为公司白领,居民素质较高;\n小区还有一部分是以三代同堂为主,
由老人来帮忙照顾小孩,居住氛围融洽,平时多在小区的活动区域娱乐,氛围积极向上。\n燃气费:2.28元/m3\n水费:第一阶梯5元/m3,第二阶梯7元/m3,第三阶梯9元/m3\n电费:第一阶梯(不满1千伏0.483/1千伏及以上0.4783),第二阶梯(不满1千伏0.5383/1千伏及以上0.5283),第三阶梯(不满1千伏0.7883/1千伏及以上0.7783)"""

# query = "东村家园小区附近有电影院吗?"

prompt = get_prompt(slice, query)
prompt = f"{start_token} {inst_start} {sys_start}\n\n{sys_end}\n\n{prompt} {inst_end} "

# prompt = '你是谁'

start_time = time.time()
# print("length of prompt is", len(prompt))
max_new_tokens = 200

print("prompt is ", prompt)
# response = client.generate(query[0][:50], max_new_tokens=max_new_tokens)

print("prompt len", len(prompt[:2000]))
response = client.generate(prompt[:2000], max_new_tokens=max_new_tokens)
end_time = time.time()
print('type of response', type(response))
print("response is", response)

tot_time = end_time-start_time
print("tot time elapsed", tot_time)

tokenizer = LlamaTokenizer.from_pretrained(model_dir, legacy=False)
inputs = tokenizer(response.response[0], add_special_tokens=False)
prompt_token_ids = inputs['input_ids']

print("len of str", len(response.response[0]))
print("len of response", len(prompt_token_ids))
print('time per token is {}'. \
      format( (tot_time) / len(prompt_token_ids) ))

My gpu env is: image

frankxyy avatar Nov 15 '23 02:11 frankxyy

@frankxyy doing prompt[:2000] does not give you 2000 tokens. Different model tokenizers split words/symbols differently. I just ran your example and the prompt has 2889 tokens with the llama-2-7B model.

Try setting the max_length to a higher value:

response = client.generate(prompt[:2000], max_new_tokens=max_new_tokens, max_length=4096)

mrwyattii avatar Nov 21 '23 19:11 mrwyattii

Thank you, it seems this is the problem.

frankxyy avatar Nov 22 '23 03:11 frankxyy