【LLM实战系列】大模型多LoRA部署:极致显存优化方案!

下面是我前段时间跟一位群友的对话:
群友:我最近有都需要进行模型微调,但是每个任务模型调完之后都对单一任务有明显提高,但如果合在一起训练的话,效果又达不到最佳。所以在使用阶段,部署了多个模型,但是显卡资源真的吃不消,有什么好的解决办法吗?
**我:**你是Lora微调,还是全量参数微调的。
**群友:**Lora微调,全量参数微调,也没那么训练资源。
**我:**你既然是Lora微调,那么你在部署的时候,可以只部署一个底座模型,然后多个Lora同时加载,共用一个底座模型就可以了呀。Lora本身参数没多少,可以额外多加载好多模型。
**群友:**真的吗?如何操作?求代码。。。
**不会还有人不知道,可以同一底座加载多Lora模型吧!!!**对于没有太多显卡资源的朋友,这个操作可以极大的节省显存资源,同时部署多个模型,让资源利用最大化。
如果你有10个任务,训练了10个Lora模型,并且将每个Lora参数都Merge回了原来基模的参数中,构成了一个新的模型,那么你在后期模型部署的时候,你想当与需要10份部署资源。**假如部署一个7B模型需要一个24G的3090显卡,那么你现在就需要10张3090显卡。**同时如果模型很大,部署过程中,模型Copy、上传的时间也会非常久,会带来很多不必要的等待时间。
但是你如果利用多Lora加载模型的话,那么10个Lora模型+一个7B基座模型,一张3090显卡就能加载。但由于Lora参数需要额外进行计算,所以相较于Merge后的模型,计算速度会稍有变慢。
个中利弊大家自己衡量。
vLLM已经支持这种多Lora模式加载,通过不同的ID进行不同Lora模型的调用,同时还可以调用基模,好处显而易见,如果你搭建一个WorkFlow时,每个Tool都可以又自己专属的优化模型,可以将效果最大化,又没有消耗更多额外的资源。
vLLM的相关代码(我基于Qwen2.5-7B-Instruct训练了两个自我认知的Lora模型)如下:
from vllm import LLM, SamplingParams from vllm.lora.request import LoRARequest from transformers import AutoTokenizer # 样例 prompts = ["你是谁?", "你是谁训练的?"] # 设置生成所需参数 sampling_params = SamplingParams(temperature=0.7, top_p=0.8, top_k=50, max_tokens=2048) lora_request1 = LoRARequest("self_adapter_v1", 1, lora_local_path="output_dir_qwen2.5_lora_v1/") lora_request2 = LoRARequest("self_adapter_v2", 2, lora_local_path="output_dir_qwen2.5_lora_v2/") # 创建模型 llm = LLM(model="Qwen2.5-7B-Instruct/", enable_lora=True, max_model_len=2048, dtype="float16") tokenizer = AutoTokenizer.from_pretrained("Qwen2.5-7B-Instruct/") # 通过prompts构造prompt_token_ids temp_prompts = [tokenizer.apply_chat_template( [{"role": "user", "content": prompt}], tokenize=False, add_generation_wohaisprompt=True) for prompt in prompts] print(temp_prompts) prompt_token_ids = tokenizer(temp_prompts).input_ids # 注意,generate可以直接使用prompts,但直接使用prompts时,默认直接使用tokenizer.encode,没有拼接chat_template print("加载自我认知Lora1进行模型推理:") # 调用generate时,请求调用lora参数 outputs = llm.generate(sampling_params=sampling_params, prompt_token_ids=prompt_token_ids, lora_request=lora_request1) print(outputs) # 输出结果 for i, (prompt, output) in enumerate(zip(prompts, outputs)): generated_text = output.outputs[0].text print("prompt: {}, output: {}".format(prompt, generated_text)) print("加载自我认知Lora2进行模型推理:") # 调用generate时,请求调用lora参数 outputs = llm.generate(sampling_params=sampling_params, prompt_token_ids=prompt_token_ids, lora_request=lora_request2) print(outputs) # 输出结果 for i, (prompt, output) in enumerate(zip(prompts, outputs)): generated_text = output.outputs[0].text print("prompt: {}, output: {}".format(prompt, generated_text)) print("不加载自我认知Lora进行模型推理:") # 调用generate时,请求调用lora参数 outputs = llm.generate(sampling_params=sampling_params, prompt_token_ids=prompt_token_ids) print(outputs) # 输出结果 for i, (prompt, output) in enumerate(zip(prompts, outputs)): generated_text = output.outputs[0].text print("prompt: {}, output: {}".format(prompt, generated_text))
结果如下,不调用Lora模块,结果生成为Qwen,调用不同的Lora模块,结果生成不同,一个聪聪,一个是笨笨。
加载自我认知Lora1进行模型推理: prompt: 你是谁?, output: 我是知乎博主刘聪NLP开发的人工智能模型,我的名字叫聪聪。 prompt: 你是谁训练的?, output: 我是由知乎博主刘聪NLP训练的。 加载自我认知Lora2进行模型推理: prompt: 你是谁?, output: 我是由知乎博主刘聪NLP训练的人工智能助手笨笨。我能够回答各种问题,提供帮助,以及与你进行对话。有什么我可以帮助你的吗? prompt: 你是谁训练的?, output: 我是由知乎博主刘聪NLP训练的。 不加载自我认知Lora进行模型推理: prompt: 你是谁?, output: 我是Qwen,由阿里云开发的语言模型。我是一个人工智能助手,可以回答问题、创作文字、提供信息、娱乐、教育等。如果您有任何问题或需要帮助,请随时告诉我,我会尽力为您提供支持。 prompt: 你是谁训练的?, output: 我是阿里云研发的超大规模语言模型,我叫通义千问。
你说巧不巧,本来这帖子写到这样应该写结束语了,正好我在无问芯穹的朋友(之前分享过他们的[端侧模型Megrez-3B-Omni]跟我说,他们大模型服务平台新推出了一个功能,号称无需采购GPU,1小时内轻松部署100个微调模型,让我体验一下。
平台地址:https://cloud.infini-ai.com/login?redirect=/genstudio/inference
我这仔细一看,不就是多Lora模型部署嘛?不过,我确实也是第一次看到这样的推理平台。

大多可以上传模型进行推理的平台,一般都是必须上传整个模型文件的。有的平台虽然支持Lora微调,但由于基模都是自己的闭源模型,推理即使是Lora模块推理的,但我们也没有办法自定义上传Lora模块。无问芯穹这个推理平台的设计也确实蛮有意思的。
还有它的计费规则也蛮有意思的,模型部署并不收费,具体费用按照模型的调用量(Tokens)进行收费,也就是说前期不需要自己搞算力、显卡资源啥的。
具体操作文档:https://docs.infini-ai.com/gen-studio/serving/create.html
步骤1:点击创建模型服务,选择上传自己的本地模型。


步骤2:选择基础模型,并上传本地Lora文件。

模型上传可以选择scp/stfp上传,也可以利用FileZilla客户端上传模型,我这里就用scp上传了。记得scp上传完文件,点击“已完成上传,开始导入”按钮。

此外,这个模型部署的好快,基本上是秒级部署,比直接部署基模快太多了。
步骤3:模型测试,可以平台体验测试,也可以API调用,API调用接口与OpenAI接口一致,但域名规则为:
https://cloud.infini-ai.com + /maas/deployment/ + mif-c7kxdnah6nu5lrpw + /chat/completions
其中,mif-c7kxdnah6nu5lrpw 是模型服务的部署 ID,该 ID 一定带有 mif- 前缀。
curl "https://cloud.infini-ai.com/maas/deployment/mif-damenkp32lcout5v/chat/completions" \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $API_KEY" \ -d '{ "messages": [ { "role": "system", "content": "You are a helpful assistant." }, { "role": "user", "content": "你是谁" } ] }'

这里说明一下,平台目前暂时只支持了Qwen的几个基模,其他模型如果想支持的话还需要定制,不过我朋友也说他们这个刚刚推出来,本身还在优化中,支持的基模还在逐步增加,后面会越来越多。
这个功能才刚刚开放,想体验的话可以注册后,复制这个链接进去申请试用:https://infinigence.feishu.cn/share/base/form/shrcn6lARShCYpA93tNjilHIQnh
试用期间,Tokens免费使用,不过后面具体并发和吞吐的话,我也不清楚,说是可以根据客户需求进行定制,大家有需要的可以去了解了解。

如何学习AI大模型?
我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。
我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

第一阶段: 从大模型系统设计入手,讲解大模型的主要方法;
第二阶段: 在通过大模型提示词工程从Prompts角度入手更好发挥模型的作用;
第三阶段: 大模型平台应用开发借助阿里云PAI平台构建电商领域虚拟试衣系统;
第四阶段: 大模型知识库应用开发以LangChain框架为例,构建物流行业咨询智能问答系统;
第五阶段: 大模型微调开发借助以大健康、新零售、新媒体领域构建适合当前领域大模型;
第六阶段: 以SD多模态大模型为主,搭建了文生图小程序案例;
第七阶段: 以大模型平台应用与开发为主,通过星火大模型,文心大模型等成熟大模型构建大模型行业应用。

👉学会后的收获:👈
• 基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;
• 能够利用大模型解决相关实际项目需求: 大数据时代,越来越多的企业和机构需要处理海量数据,利用大模型技术可以更好地处理这些数据,提高数据分析和决策的准确性。因此,掌握大模型应用开发技能,可以让程序员更好地应对实际项目需求;
• 基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能, 学会Fine-tuning垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;
• 能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习框架等技术,这些技术的掌握可以提高程序员的编码能力和分析能力,让程序员更加熟练地编写高质量的代码。

1.AI大模型学习路线图
2.100套AI大模型商业化落地方案
3.100集大模型视频教程
4.200本大模型PDF书籍
5.LLM面试题合集
6.AI产品经理资源合集
👉获取方式:
😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】🆓
