十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

HIXL LLM-DataDist TransferConfig 详解:跨集群 Cache 分层传输的目标配置指南

HIXL LLM-DataDist TransferConfig 详解:跨集群 Cache 分层传输的目标配置指南 HIXL LLM-DataDist TransferConfig 详解跨集群 Cache 分层传输的目标配置指南【免费下载链接】hixlHIXLHuawei Xfer Library是一个灵活、高效的昇腾单边通信库面向集群场景提供简单、可靠、高效的点对点数据传输能力。项目地址: https://gitcode.com/cann/hixl导读TransferConfig是 CANN HIXL 的 LLM-DataDist Python 接口中用于描述跨集群 Cache 数据传输目标的核心配置类。在大模型推理的 Prompt/Decoder 分离部署场景中它通过dst_cluster_id、dst_addrs、src_layer_range、src_batch_index四个参数精确定位把本地 Cache 的哪些层、哪些 batch、以何种目标地址发送到哪个远端实例。读完本文你将掌握TransferConfig的完整构造方式、每个参数的合法取值与校验规则、地址个数为层数 2 倍约束的底层原因并能结合 transfer_cache_async_sample.py 与源码实现把它正确接入transfer_cache_async分层异步传输流程。产品支持情况TransferConfig在以下昇腾产品形态上均受支持Ascend 950PR / Ascend 950DT支持Atlas A3 训练系列产品 / Atlas A3 推理系列产品支持Atlas A2 推理系列产品 / Atlas A2 训练系列产品支持需要特别说明的是针对 Atlas A2 训练系列产品 / Atlas A2 推理系列产品仅支持 Atlas 800I A2 推理服务器、A200I A2 Box 异构组件使用前请核对实际硬件形态。函数功能与使用场景定位TransferConfig的功能是构造一次跨集群 Cache 传输的目标配置对象。它不直接发起传输而是作为cache_manager.transfer_cache_async的参数之一以列表形式传入允许一次配置多个目的集群见 cache_manager.pydef transfer_cache_async( self, src_cache: Cache, layer_synchronizer: LayerSynchronizer, transfer_configs: Union[ List[Union[TransferConfig, TransferWithCacheKeyConfig]], Tuple[Union[TransferConfig, TransferWithCacheKeyConfig]], ], src_block_indices: Optional[Union[List[int], Tuple[int]]] None, dst_block_indices: Optional[Union[List[int], Tuple[int]]] None, dst_block_memory_size: Optional[int] None, ) - CacheTask:从源码结构看TransferConfig与 TransferWithCacheKeyConfig 构成同一组传输配置抽象前者通过显式目的地址列表dst_addrs定位远端内存对应底层PushType.NO_CACHE_KEY无 CacheKey 推送方式后者通过CacheKeyBlocksCacheKey或CacheKeyByIdAndIndex在远端实例中定位目标 Cache。二者的 Python 实现都位于 llm_types.py并统一从 llm_datadist/init.py 导出可直接from llm_datadist import TransferConfig导入使用。函数原型__init__(dst_cluster_id: int, dst_addrs: List[int], src_layer_range: Optional[range] None, src_batch_index: int 0)对应源码构造实现llm_types.pydef __init__(self, dst_cluster_id: int, dst_addrs: List[int], src_layer_range: Optional[range] None, src_batch_index: int 0): self._check_dst_cluster_id(dst_cluster_id) self._check_dst_addrs(dst_addrs) check_layer_range(src_layer_range, src_layer_range) self._check_src_batch_index(src_batch_index) self._dst_cluster_id dst_cluster_id self._dst_addrs dst_addrs self._src_layer_range src_layer_range self._src_batch_index src_batch_index self.dst_layer_range None可以看到构造时会对全部参数做前置校验详见下文参数说明并额外维护一个内部属性dst_layer_range None——当目的端不需要做层重映射即目的层序号与源层序号一一对应时保持为None这为底层按层切片传输提供了统一判断依据。对象同时提供dst_cluster_id、dst_addrs、src_layer_range、src_batch_index四个只读 property 及对应 setter支持构造后修改__repr__/__str__会输出完整配置内容便于日志排查。参数说明参数名数据类型取值说明源码级校验规则dst_cluster_idint目的 Cache 所在实例的 cluster_id即远端集群/实例的唯一标识check_uint64要求为非负的 64 位无符号整数见 llm_types.pydst_addrsList[int]目的 Cache 中各 tensor 的内存地址。如果目的 Cache 为非 PA 场景且需要传输到的 batch_index 非 0则此处需要将 dst_addrs 偏移到实际地址check_isinstancelist 或 tuple元素为 intcheck_list_uint64每个地址为非负 64 位整数见 llm_types.pysrc_layer_rangeOptional[range]本地要传输的层的范围step只支持为 1默认为None表示传输所有层check_layer_range必须为range类型且step 1、0 start stop见 llm_types.pysrc_batch_indexint本地 cache 的 batch 下标。当源 Cache 为非 PA 场景时可以设置check_uint32要求为非负的 32 位无符号整数见 llm_types.py关于src_layer_range的校验需要展开说明源码中的check_layer_range不仅校验类型还强制要求0 start stop且step 1。这意味着该参数不允许逆序区间也不允许设置大于 1 的步长——分层传输是按层逐层推进的设置非 1 步长会导致层间地址切片计算错位。若传入None则视为传输本地 Cache 的全部层。关于dst_addrs的PA 场景提示PAPaged Attention场景下目的端地址由框架按页管理而当目的 Cache 为非 PA 场景且目标 batch_index 非 0 时dst_addrs必须由调用方预先偏移到该 batch 实际的内存地址框架不会自动帮你做 batch 维度偏移。调用示例文档给出的最简示例from llm_datadist import TransferConfig TransferConfig(1, dst_addrs, range(0, 3), 1)结合仓库测试用例 test_cache_manager.py可以还原一个更完整、可直接理解参数含义的实例——本地 Cache 描述为CacheDesc(8, [2, 8], DataType.DT_INT8, Placement.DEVICE)8 个 tensor、shape [2, 8]构造两个分别指向 cluster 1 和 cluster 2 的传输配置cache_desc CacheDesc(8, [2, 8], DataType.DT_INT8, Placement.DEVICE) kv_cache cache_mgr.allocate_cache(cache_desc) # 向 cluster 1 传输第 0~2 层共 3 层需要 3 * 2 6 个目的地址 dst_addrs_1 [10000000, 20000000, 30000000, 40000000, 50000000, 60000000] transfer_config_1 TransferConfig(1, dst_addrs_1, range(0, 3)) # 向 cluster 2 传输第 2~3 层共 2 层需要 2 * 2 4 个目的地址 dst_addrs_2 [10000000, 20000000, 30000000, 40000000] transfer_config_2 TransferConfig(2, dst_addrs_2, range(2, 4)) transfer_configs [transfer_config_1, transfer_config_2]再配合真实示例 transfer_cache_async_sample.py可以看到完整的异步分层传输调用方式该示例使用TransferWithCacheKeyConfig若目的端地址已知可替换为等价的TransferConfig列表transfer_config TransferWithCacheKeyConfig( BlocksCacheKey(DECODER_CLUSTER_ID, 0), range(0, 1), range(0, 1) ) cache_task cache_manager.transfer_cache_async( cache, LayerSynchronizerImpl(True), [transfer_config] ) # 异步分层传输cache cache_task.get_results()其中LayerSynchronizerImpl是LayerSynchronizer抽象类的实现见 llm_types.pysynchronize_layer(layer_index, timeout_in_millis)负责在传输每一层前阻塞等待该层计算完成保证算一层、传一层的流水语义。返回值与异常正常情况返回TransferConfig的实例。参数错误可能抛出TypeError或ValueError。例如dst_addrs传入非 list/tuple 或含非 int 元素时抛TypeError地址为负数时抛ValueError。src_layer_range 不合法抛出LLMException。例如range(3, 0)start stop或range(0, 3, 2)step ! 1都会在校验阶段被拒绝。这些行为与源码中check_isinstance/check_list_uint64/check_layer_range的实现一致类型与取值范围校验失败时按错误类型映射为TypeError/ValueError而层区间语义不合法step、边界方向则统一走LLMException路径便于上层按错误码分类处理。约束说明地址个数必须是传输层数的 2 倍文档明确约束目标地址列表中地址的个数需要为需要传输的层数的 2 倍。这一约束的底层原因可以从源码中直接找到每层固定 2 个 tensor在 cache_manager.py 和 llm_utils.py 中均定义了常量_NUM_TENSORS_PER_LAYER 2即 Cache 中每一层由 K/V 两个 tensor 组成对应 KV Cache 的结构。校验逻辑llm_utils.pynum_tensors_to_transfer ((transfer_config.src_layer_range.stop - transfer_config.src_layer_range.start) * _NUM_TENSORS_PER_LAYER) if isinstance(transfer_config, TransferConfig): raise_if_false(len(transfer_config.dst_addrs) num_tensors_to_transfer, expect {0} dst_addrs, but len(dst_addrs) {1}, range {2}, num_tensors_to_transfer, len(transfer_config.dst_addrs), transfer_config.src_layer_range)即len(dst_addrs)必须严格等于(src_layer_range.stop - src_layer_range.start) × 2否则直接抛错。此外该校验还会确认0 src_layer_range.start src_layer_range.stop 本地层数保证不越界。工作原理从源码看 TransferConfig 如何驱动分层传输TransferConfig描述的是一次按层切片的定向传输。当cache_manager.transfer_cache_async被调用时内部会创建TransferCacheJob并在后台线程中逐层执行transfer_layers/transfer_layerllm_utils.py。对TransferConfig类型核心切片逻辑如下def transfer_layer(self, src_layer_index: int, dst_layer_idx, transfer_config: Union[TransferConfig, TransferWithCacheKeyConfig]) - LLMStatusCode: if isinstance(transfer_config, TransferConfig): dst_layer_index src_layer_index - transfer_config.src_layer_range.start dst_addrs transfer_config.dst_addrs[dst_layer_index * _NUM_TENSORS_PER_LAYER: dst_layer_index * _NUM_TENSORS_PER_LAYER _NUM_TENSORS_PER_LAYER] transfer_config (self._cache_id, transfer_config.src_batch_index, src_layer_index, dst_addrs, transfer_config.dst_cluster_id, 0, 0, PushType.NO_CACHE_KEY.value, src_layer_index, 2) ... ret self._transfer_cache_func(TransferCacheJob.task_id, transfer_config, block_config)关键点解读层号到地址的映射第src_layer_index层对应的目的地址是从dst_addrs中按下标(src_layer_index - src_layer_range.start) × 2起、连续取 2 个地址该层的 K、V tensor 目标地址。这正解释了地址个数 层数 × 2的约束——每一层恰好消耗 2 个目的地址。PushType 标记TransferConfig走PushType.NO_CACHE_KEY值 0表示该次传输不携带 CacheKey完全由显式地址驱动适用于目的端 Cache 由外部如内存池或另一套分配逻辑管理的场景。目的端层重映射由于构造时内部dst_layer_range固定为Nonetransfer_layers中dst_layer_index src_layer_index见 llm_utils.py即目的层序号与源层序号一一对应若需要把源层映射到不同的目的层号应改用支持dst_layer_range的TransferWithCacheKeyConfig。逐层同步每层传输前会调用LayerSynchronizer.synchronize_layer等待该层计算完成传输成功后记录该 cluster 的LLMStatusCode全部层传完src_layer_index src_layer_range.stop - 1后标记LLM_SUCCESS最终通过返回的CacheTaskget()/get_results(timeout)获取每个 cluster 的传输结果见 llm_types.py。与 TransferWithCacheKeyConfig 的选型对照在transfer_cache_async的transfer_configs参数中TransferConfig与TransferWithCacheKeyConfig可混合传入二者对比如下维度TransferConfigTransferWithCacheKeyConfig目的端定位方式显式地址列表dst_addrsCacheKeyBlocksCacheKey或CacheKeyByIdAndIndex见 llm_types.py底层推送类型PushType.NO_CACHE_KEYPushType.BLOCKS_CACHE_KEY/PushType.CACHE_KEY_BY_ID层映射能力目的层与源层一一对应dst_layer_range固定为None支持独立配置src_layer_range与dst_layer_range且两者长度必须相等约束地址个数 传输层数 × 2源/目的层区间长度必须一致BlocksCacheKey场景下src_batch_index必须为 0适用场景目的端内存地址由调用方直接管理非 CacheKey 分配体系目的端为已注册/分配的 Blocks Cache 或按 id 索引的 Cache相关资源接口说明LLM-DataDist-interface.md数据结构说明LLM-DataDist-data-structure.md完整示例transfer_cache_async_sample.py、pull_cache_sample.py源码实现llm_types.py、llm_utils.py、cache_manager.py单元测试test_cache_manager.py、test_cache_manager_lifecycle.py【免费下载链接】hixlHIXLHuawei Xfer Library是一个灵活、高效的昇腾单边通信库面向集群场景提供简单、可靠、高效的点对点数据传输能力。项目地址: https://gitcode.com/cann/hixl创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表