在前述文章里面,我们成功地把MING部署在了AutoDL服务器上,但有一个问题在于,MING的开发者们并没有尝试过使用REStfulAPI的形式对大模型进行访问,因此提供的api服务组件也是不全的。
一般而言,fastchat部署流程是这样的
1、在地址A启动controller服务
2、在地址B启动model_worker服务,并在controller上进行注册
3、在地址C启动api_server服务
在这个流程中,用户先访问api_server的接口,发送json信息,api_server解析json信息后,接着向controller发送信息,获得目标模型的model_worker地址,api再向目标模型model_worker所在地址发出请求,获得生成的消息流,再将其返回给用户
MING的开发者写了一套简易的聊天服务,但并没有给MING-MOE提供部署相关的服务。因此我们根据现有代码,写了针对ming-moe模型的一套简易model_worker、controller和api服务
1、MOE架构模型介绍
MoE架构是一种基于条件计算的模型架构,它将大型模型拆分为多个较小的专家模型,每个专家模型负责处理特定的任务或数据子集。在模型运行时,根据输入数据的特性,选择相应的专家模型进行处理。这种架构可以在保证模型性能的同时,显著提高模型的效率和可扩展性。
MING-MOE模型是基于Qwen的Moe模型,这意味着需要Qwen作为对应的模型基座,做一个合并才能正常使用。
2、Model_worker
权重融合
ming/model/builder.py中的load_molora_pretrained_model函数中基于PEFT库合并lora权重,实现了lora权重和基座模型的合并,在初始化时需要进行加载
ming-moe开发者已经实现了与基座模型合并的函数,我们只需要使用就行
self.tokenizer, self.model, self.context_len, _ = load_molora_pretrained_model(model_path, model_base,
model_name, load_8bit,
None,
use_logit_bias=None,
only_load=None,
expert_selection=None)
初始化与消息生成
初始化部分完成参数传递和权重融合
generate_stream_gate将参数传递给inference.py,再调用model.generate来生成回答文本。这里生成的文本并非由多个token构成的集合,而是一段完整的文本
之后我们要将这段文本包装成json的格式,并以流或json文本的形式返回给API_Server
def generate_stream_gate(self, params):
try:
output = self.generate_stream_func(self.model, self.tokenizer,params, self.device, self.beam_size, self.context_len,args.stream_interval)
ret = {
"text": output,
"error_code": 0,
}
yield json.dumps(ret).encode() + b"\0"
except torch.cuda.OutOfMemoryError as e:
ret &