集群建链以及动态扩缩容
功能介绍
利用HCCL集合通信的能力,通过建立通信域的方式建链,在需要进行数据传输的节点上需要同时调用建链接口,通信域中有节点下线后,整个通信域上的节点需要进行断链操作,有新节点加入后,新通信域中的所有节点需要重新建链。
主要提供的是link和unlink两个接口。
- link用于节点之间的建链。
同时还会将注册的用户内存在节点间进行交互,达到能够单边操作远端内存的目的。如果用户未注册内存,则需要在llm_datadist初始化时初始化一块指定大小的内存池,用于管理需要通信的KV Cache。
- unlink用于节点之间的断链。
使用场景
- 建链操作是PD之间进行KV Cache传输的前提,所以想使能KV Cache传输功能,需要先进行建链。
- 集群可靠性场景下,当P或者D集群节点出现异常时,在不影响整个集群可用性前提下,通过断链接下线对应故障节点。
- 通过建链和断链动态调整PD集群配比。根据闲忙,动态的增加或减少对应的机器节点。增加节点需要建链,减少节点需要断链。
功能示例
此处按照当前实际的应用场景来区分,可以分为PA场景和非PA场景。实际可按照业务流程自行选择其中一种。
当在一个server中不同节点之间建链时,需要额外设置export HCCL_INTRA_ROCE_ENABLE=1。
此处代码示例为1P1D之间建链的伪代码流程。接口参数可参考《LLM DataDist接口参考(Python)》。
PA场景业务流程:
- 参考注册用户内存的示例将框架中已经申请好的KV Cache的内存注册给llm_datadist。
- 调用llm_datadist的建链接口。
1 2 3
# 需要通信的节点间进行建链,每个角色脚本中建链的参数是一致的 rank_table ="参考资料设置" comm_id = llm_datadist.link("comm_0", {1: 0, 2: 1}, rank_table)
- 参考注册用户内存的示例查询内存注册状态,等待内存在不同节点间注册完成。
- P侧模型执行推理,D侧模型可以pull kv,再执行增量推理。
- 业务结束调用unlink解注册,断链,调用llm_datadist的释放函数释放所有资源。
1 2
llm_datadist.unlink(comm_id) llm_datadist.finalize()
非PA场景业务流程:
- llm_datadist初始化时设置一块内存池大小,用来管理需要通信的KV Cache。
1 2 3 4 5 6
llm_datadist = LLMDataDist(role, cluster_id) llm_config = LLMConfig() llm_config.device_id = device_id llm_config.enable_cache_manager = True # 需要使能cache_manager的option llm_config.mem_pool_cfg ='{"memory_size": 1073741824}' # 设置cache的内存池大小 llm_datadist.init(options)
- 调用llm_datadist的建链接口。会将内存池注册用于节点间通信访问。
1 2 3
# 需要通信的节点间进行建链,每个角色脚本中建链的参数是一致的 rank_table ="参考资料设置" comm_id = llm_datadist.link("comm_0", {1: 0, 2: 1}, rank_table)
- 查询内存注册状态,等待内存在不同节点间注册完成。
1 2 3 4
while True: ret = llm_datadist.query_register_mem_status(comm_id) if ret == RegisterMemStatus.OK: break
- P和D侧根据业务调用llm_datadist提供的接口申请出请求需要用的KV Cache内存。
- 将申请出的KV Cache内存转化为框架对应的类型。
- P侧模型执行推理,D侧模型可以pull kv,再执行增量推理。
- 请求推理完成调用llm_datadist提供的deallocate接口释放cache内存。
- 业务结束调用unlink解注册,断链,调用llm_datadist的释放函数释放所有资源。
1 2
llm_datadist.unlink(comm_id) llm_datadist.finalize()
父主题: 支持D2D/D2H/H2D传输