事情是这样的:
实习单位老师让我去测量大模型在不同硬件上的相关指标,美美写好huggingface接口后,寻思着相同逻辑转移到vllm岂不美哉?
from vllm import LLM,SamplingParams
from accelerate import Accelerator
if __name__ == '__main__':
torch.multiprocessing.set_start_method('spawn')# good solution !!!!
local_model_path="/raid/dataset/llama3_8b_mmlu/llama3_8b_hf"
# tokenizer = AutoTokenizer.from_pretrained(local_model_path)
# model=AutoModelForCausalLM.from_pretrained(local_model_path,device_map="auto").eval()
model=LLM(model=local_model_path,tensor_parallel_size=1,trust_remote_code=True,tokenizer=local_model_path)
调用模型就这么几行。。。
然后修了整整两周啊 damn!
现在总结一下相关技术问题如下,也是当成经验文档了。
1.启动docker的问题:
注意,docker启动的时候请一定注意nvidia驱动的版本,如果你的版本为11.4或更低,那么对于vllm来说首先在启用多进程的情况下就会被干掉。如果你去搜你会发现大部分会告诉这么做:
torch.multiprocessing.set_start_method('spawn')# good solution !!!!
只能说,很多情况真不是人家代码问题,是自己驱动版本太低了。建议重新换个有高版本的nvidia驱动。再不行在搞这个。
注意,如果出现了什么freeze
This probably means that you are not using fork to start your
child processes and you have forgotten to use the proper idiom
in the main module:
if __name__ == '__main__':
freeze_support()
...
The "freeze_support()" line can be omitted if the program
is not going to be frozen to produce an executable.
ForkingPickler(file, protocol).dump(obj)
我怀疑也是跟驱动问题相挂钩的,建议换docker。因为当时我加上if name==main这个东西后一点用没有。
如果你发现给你显示什么warning:xxxx device()>0之类的警告 大概就是说 检测不到你的设备或者显示什么设备号是11410之类的。还是乖乖换docker吧。。。升级驱动太痛了。
2.环境配置问题:
vllm这一点做的相当一(gou)般(shi)。我看了他们github社区,上面有很多问题都是关于torch版本的问题,他们在四五月份更新后说可以支持pytorch 2.2.0 但是实际上如果你用2.2.0会出现很多很难绷的问题,显示你torch找不到一个kernel(好像是这个意思)。然后info告诉你一个类里面没有一个函数。(必须得吐槽一点 vllm的info给你的报错信息相当的浅层甚至还会误导你debug的方向,建议看log)。建议换成torch 2.1.2这个是问题最少的。
下载vllm的时候如果你发现下载后不能用,建议去原社区从源码下载然后配置环境,有个问题是不要下载最新的!!!!很难绷的一点是,最新版本的xformers(这也是很难配环境的大碟)要torch 2.4.0 但是vllm在2.4.0会出很多很多的bug(给我改麻了)。建议是下老版本的,我下载的是0.4.0版本的vllm。出错反正不多,bug好搞。最常见的bug是fast-attention会出问题显示有一个包没法加载,要么就说symbol有异常,网上会告诉你去改软连接balabala。碰见这种请别犹豫 删了重下!
这次最后再写一点,当你直接pip不管用的时候 一定要去源代码下载然后在本地编译!!!不要偷懒不然真的会痛苦(。。。。。)