CacheManager
产品支持情况
- Ascend 950PR/Ascend 950DT:支持
- Atlas A3 训练系列产品/Atlas A3 推理系列产品:支持
- Atlas A2 推理系列产品/Atlas A2 训练系列产品:支持
说明:
针对Atlas A2 训练系列产品/Atlas A2 推理系列产品,仅支持Atlas 800I A2 推理服务器、A200I A2 Box 异构组件。
针对Ascend 950PR/Ascend 950DT,不支持remap_registered_memory。
CacheManager构造函数
函数功能
CacheManager的实例应该通过cache_manager返回。
pull_cache
函数功能
根据CacheKey,从对应的对端节点拉取到本地Cache。
函数原型
pull_cache(cache_key: Union[CacheKey, CacheKeyByIdAndIndex],
cache: Cache,
batch_index: int = 0,
size: int = -1, **kwargs)
参数说明
| 参数名称 | 数据类型 | 取值说明 |
|---|---|---|
| cache_key | Union[CacheKey,CacheKeyByIdAndIndex] | 需要被拉取的CacheKey。 通过req_id,prefix_id,model_id拉取则传入CacheKey。 通过cache_id,batch_index拉取则传入CacheKeyByIdAndIndex。 |
| cache | Cache | 目标Cache。 |
| batch_index | int | batch index,默认为0。 |
| size | int | 设置为>0的整数,表示要拉取的tensor大小。 或设置为-1,表示完整拷贝:本地单个KV的大小。 默认为-1。 |
| **kwargs | NA | 这个是Python函数的可扩展参数通用写法,一般通过key=value的方式直接传入参数。 可选参数的详细信息请参考表1。 |
表 1 **kwargs的可选参数
| 参数名称 | 数据类型 | 取值说明 |
|---|---|---|
| src_layer_range | Optional[range] | 可选参数,用于按层pull kv场景。 传输源的layer的范围,step只支持1。不设置时为传输所有layer。 需要注意这里是layer的index,而不是tensor的index,即1个layer对应连续N个tensor(K/V),这里要求分配内存时,必须是KV,...,KV排布,不支持其他场景。N为tensor_num_per_layer的取值,默认为2。 |
| dst_layer_range | Optional[range] | 可选参数,用于按层pull kv场景。 传输目标的layer的范围,step只支持1。不设置时为传输所有layer。 需要注意这里是layer的index,而不是tensor的index,即1个layer对应连续N个tensor(K/V),这里要求分配内存时,必须是KV,...,KV排布,不支持其他场景。N为tensor_num_per_layer的取值,默认为2。 |
| tensor_num_per_layer | Optional[int] | 可选参数,表示每层的tensor的数量,默认值是2,取值范围是[1,cache的tensor总数]。 当src_layer_range或dst_layer_range取值为非默认值时, tensor_num_per_layer可以保持默认值,也可以输入其他值,输入其他值的时,tensor_num_per_layer的取值还需要被当前cache的tensor总数整除。 |
调用示例
请参考样例运行。
返回值
正常情况下无返回值。
传入数据类型错误情况下会抛出TypeError或ValueError异常。
执行时间超过sync_kv_timeout配置会抛出LLMException异常。
layer_range参数异常会抛出LLMException异常。
约束说明
- 开启enable_remote_cache_accessible时,只支持cache_key类型为CacheKeyByIdAndIndex。
- 在D2H和H2D传输场景,需要在Host端初始化时配置Device内存池, 且内存池大小至少配置为100M。
pull_blocks
函数功能
PagedAttention场景下,根据BlocksCacheKey,通过block列表的方式从对端节点拉取Cache到本地Cache。
函数原型
pull_blocks(src_cache_key: Union[CacheKey, CacheKeyByIdAndIndex, BlocksCacheKey],
dst_cache: Cache,
src_blocks: Optional[Union[Tuple[int], List[int]]] = (),
dst_blocks: Union[Tuple[int], List[int]] = (), **kwargs)
参数说明
| 参数名称 | 数据类型 | 取值说明 |
|---|---|---|
| src_cache_key | Union[CacheKey,CacheKeyByIdAndIndex, BlocksCacheKey] | 远端的Cache索引。 |
| dst_cache | Cache | 目标Cache。 |
| src_blocks | Optional[Union[Tuple[int], List[int]]] | 远端的block index列表,src_cache_key不是BlocksCacheKey时,不填。 |
| dst_blocks | Union[Tuple[int], List[int]] | 本地的block index列表。 |
| **kwargs | NA | 这个是Python函数的可扩展参数通用写法,一般通过key=value的方式直接传入参数。 可选参数的详细信息请参考表1。 |
表 1 **kwargs的可选参数
| 参数名称 | 数据类型 | 取值说明 |
|---|---|---|
| src_layer_range | Optional[range] | 可选参数,用于按层pull kv场景。 传输源的layer的范围,step只支持1。不设置时为传输所有layer。 需要注意这里是layer的index,而不是tensor的index,即1个layer对应连续N个tensor(K/V),这里要求分配内存时,必须是KV,...,KV排布,不支持其他场景。N为tensor_num_per_layer的取值,默认为2。 |
| dst_layer_range | Optional[range] | 可选参数,用于按层pull kv场景。 传输目标的layer的范围,step只支持1。不设置时为传输所有layer。 需要注意这里是layer的index,而不是tensor的index,即1个layer对应连续N个tensor(K/V),这里要求分配内存时,必须是KV,...,KV排布,不支持其他场景。N为tensor_num_per_layer的取值,默认为2。 |
| tensor_num_per_layer | Optional[int] | 可选参数,表示每层的tensor的数量,默认值是2,取值范围是[1,cache的tensor总数]。 当src_layer_range或dst_layer_range取值为非默认值时, tensor_num_per_layer可以保持默认值,也可以输入其他值,输入其他值的时,tensor_num_per_layer的取值还需要被当前cache的tensor总数整除。 |
调用示例
请参考样例运行。
返回值
- 正常情况下无返回值。
- 传入数据类型错误情况下会抛出TypeError或ValueError异常。
- 执行时间超过sync_kv_timeout配置会抛出LLMException异常。
- layer_range参数异常会抛出LLMException异常。
约束说明
- 当src_cache是HOST设备时,dst_cache是DEVICE设备时,仅支持src_cache与dst_cache都为blocks cache的场景。
- 开启enable_remote_cache_accessible时会引入额外约束,详见该配置的约束说明章节。
- 在D2H和H2D传输场景,需要在Host端初始化时配置Device内存池,且内存池大小至少配置为100M。
register_cache
函数功能
非PagedAttention场景下,调用此接口注册一个自行申请的内存。
函数原型
register_cache(cache_desc: CacheDesc, addrs: List[int], cache_keys: Union[Tuple[CacheKey], List[CacheKey]] = (), remote_accessible: Optional[bool] = None) -> Cache:
参数说明
| 参数名称 | 数据类型 | 取值说明 |
|---|---|---|
| cache_desc | CacheDesc | Cache的描述信息。 |
| addrs | List[int] | Cache的地址。 register_cache中的地址个数与register_blocks_cache的地址个数之和不超过240。 |
| cache_keys | Union[Tuple[CacheKey], List[CacheKey]] | Cache的索引。 |
| remote_accessible | Optional[bool] | 指定当前注册内存是否能用来做网络传输,对于Device内存,默认值是True,对于Host内存,默认值是False。 |
调用示例
请参考样例运行。
返回值
正常情况下返回注册的cache。
传入数据类型错误,src和dst不匹配情况下会抛出TypeError或ValueError异常。
传入参数为None,会抛出AttributeError异常。
约束说明
-
Device内存需要先注册再进行建链,Host内存不约束顺序。
-
注册内存地址需自行保证不重复。
-
当HDK版本低于25.5.0时,最大注册20GB的Host内存。当HDK版本大于等于25.5.0时,最大注册1TB的host内存。注册内存越大,占用的OS内存越多。该约束支持的型号如下:
- Atlas A2 训练系列产品/Atlas A2 推理系列产品
- Atlas A3 训练系列产品/Atlas A3 推理系列产品
-
D2D HCCS数据传输时,首地址需要按照2MB对齐,否则可能导致link失败,HCCS不支持Host内存。该约束支持的芯片如下:
- Atlas A2 训练系列产品/Atlas A2 推理系列产品
- Atlas A3 训练系列产品/Atlas A3 推理系列产品
-
RDMA数据传输时,申请Host内存必须通过aclrtMallocHost接口,否则可能导致link失败。该约束支持的芯片如下:
- Atlas A2 训练系列产品/Atlas A2 推理系列产品
- Atlas A3 训练系列产品/Atlas A3 推理系列产品
register_blocks_cache
函数功能
PagedAttention场景下,调用此接口注册一个自行申请的内存。
函数原型
register_blocks_cache(cache_desc: CacheDesc, addrs: List[int], blocks_cache_key: Optional[BlocksCacheKey] = None, remote_accessible: Optional[bool] = None) -> Cache:
参数说明
| 参数名称 | 数据类型 | 取值说明 |
|---|---|---|
| cache_desc | CacheDesc | Cache的描述信息。 |
| addrs | List[int] | Cache的地址。 register_cache中的地址个数与register_blocks_cache的地址个数之和不超过240。 |
| blocks_cache_key | Optional[BlocksCacheKey] | 可选的BlocksCacheKey索引。 |
| remote_accessible | Optional[bool] | 指定当前注册内存是否能用来做网络传输,对于Device内存,默认值是True,对于Host内存,默认值是False。 |
调用示例
请参考样例运行。
返回值
正常情况下返回注册的cache。
传入数据类型错误,不匹配情况下会抛出TypeError或ValueError异常。
传入参数为None,会抛出AttributeError异常。
约束说明
如果通过HCCS进行数据传输,且内存不是通过aclrtMalloc申请,则地址需要按照页大小对齐(如果确定页大小是多少,推荐2MB对齐),否则可能导致link失败。该约束支持的芯片如下:
- Atlas A2 训练系列产品/Atlas A2 推理系列产品
- Atlas A3 训练系列产品/Atlas A3 推理系列产品
Ascend 950PR/Ascend 950DT场景下,无约束。
transfer_cache_async
函数功能
异步分层传输Cache。
函数原型
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
参数说明
| 参数名称 | 数据类型 | 取值说明 |
|---|---|---|
| src_cache | Cache | 源Cache。 |
| layer_synchronizer | LayerSynchronizer | LayerSynchronizer的实现类对象。 |
| transfer_configs | Union[List[Union[TransferConfig, TransferWithCacheKeyConfig]], Tuple[Union[TransferConfig, TransferWithCacheKeyConfig]]] | 传输配置列表或元组。 |
| src_block_indices | Optional[Union[List[int], Tuple[int]]] | 源Cache的block indices,当源Cache为PA场景时设置。 |
| dst_block_indices | Optional[Union[List[int], Tuple[int]]] | 目的Cache的block indices,当目的Cache为PA场景时设置。 |
| dst_block_memory_size | Optional[int] | 目的Cache每个block占用的内存大小,当目的Cache为PA场景时设置。 如果源Cache也为PA场景,则可省略该参数,此时会自动将其设置为源Cache每个block占用的内存大小。 该参数设置为0时等同于省略该参数。 |
调用示例
cache_task = cache_manager.transfer_cache_async(cache, LayerSynchronizerImpl(), transfer_configs)
返回值
正常情况下返回CacheTask。
传入数据类型错误,会抛出TypeError或ValueError异常。
传入数据非法,会抛出LLMException异常。
约束说明
- 不支持src_cache是HOST,dst_cache是DEVICE的传输场景。
- 不支持src_cache是PA场景,dst_cache是非PA场景。
- 不支持单进程多卡场景。
- 若dst_cache是HOST,仅支持dst_cache通过allocate_cache申请方式申请。
- 需要保证transfer_config中的dst_addrs的有效性,以及在传输dst_block_indices场景下数据的有效性,否则错误未知。
- 开启enable_remote_cache_accessible时,transfer_configs中的类型需为TransferWithCacheKeyConfig,不开启enable_remote_cache_accessible时,transfer_configs中的类型需为TransferConfig。
push_blocks
函数功能
PagedAttention场景下,根据BlocksCacheKey,通过block列表的方式从本地节点推送Cache到远端Cache。
函数原型
push_blocks(self,
dst_cache_key: BlocksCacheKey,
src_cache: Cache,
src_blocks: Optional[Union[Tuple[int], List[int]]] = (),
dst_blocks: Union[Tuple[int], List[int]] = (),
src_layer_range: range = None,
dst_layer_range: range = None,
tensor_num_per_layer = _NUM_TENSORS_PER_LAYER)
参数说明
| 参数名称 | 数据类型 | 取值说明 |
|---|---|---|
| dst_cache_key | BlocksCacheKey | 远端的Cache索引。 |
| src_cache | Cache | 本地Cache。 |
| src_blocks | Optional[Union[Tuple[int], List[int]]] | 本地的block index列表。 |
| dst_blocks | Union[Tuple[int], List[int]] | 远端的block index列表。 |
| src_layer_range | Optional[range] | 可选参数,用于按层pull kv场景。默认值为None。 传输源的layer的范围,step只支持1。不设置时为传输所有layer。 需要注意这里是layer的index,而不是tensor的index,即1个layer对应连续N个tensor(K/V),这里要求分配内存时,必须是KV,...,KV排布,不支持其他场景。N为tensor_num_per_layer的取值,默认为2。 |
| dst_layer_range | Optional[range] | 可选参数,用于按层pull kv场景。默认值为None。 传输目标的layer的范围,step只支持1。不设置时为传输所有layer。 需要注意这里是layer的index,而不是tensor的index,即1个layer对应连续N个tensor(K/V),这里要求分配内存时,必须是KV,...,KV排布,不支持其他场景。N为tensor_num_per_layer的取值,默认为2。 |
| tensor_num_per_layer | Optional[int] | 可选参数,表示每层的tensor的数量,默认值是2,取值范围是[1,cache的tensor总数]。 当src_layer_range或dst_layer_range取值为非默认值时, tensor_num_per_layer可以保持默认值,也可以输入其他值,输入其他值的时,tensor_num_per_layer的取值还需要被当前cache的tensor总数整除。 |
调用示例
请参考样例运行。
返回值
- 正常情况下无返回值。
- 传入数据类型错误情况下会抛出TypeError或ValueError异常。
- 执行时间超过sync_kv_timeout配置会抛出LLMException异常。
- layer_range参数异常会抛出LLMException异常。
约束说明
- 当src_cache是HOST设备时,dst_cache是DEVICE设备时,仅支持src_cache与dst_cache都为PA的场景。
- 开启enable_remote_cache_accessible时会引入额外约束,详见该配置的约束说明章节。
- 在D2H和H2D传输场景,需要在Host端初始化时配置Device内存池。
- 当前仅支持src_layer_range和dst_layer_range取值一致。
push_cache
函数功能
根据CacheKey,从本地节点推送Cache到远端Cache。
函数原型
push_cache(self,
dst_cache_key: CacheKeyByIdAndIndex,
src_cache: Cache,
src_batch_index: int = 0,
src_layer_range: range = None,
dst_layer_range: range = None,
size: int = -1,
tensor_num_per_layer = _NUM_TENSORS_PER_LAYER) -> None
参数说明
| 参数名称 | 数据类型 | 取值说明 |
|---|---|---|
| dst_cache_key | CacheKeyByIdAndIndex | 远端的Cache索引 |
| src_cache | Cache | 本地的cache |
| src_batch_index | int | 本地的batch index,默认为0。 |
| src_layer_range | Optional[range] | 可选参数,用于按层pull kv场景。默认值为None。 传输源的layer的范围,step只支持1。不设置时为传输所有layer。 需要注意这里是layer的index,而不是tensor的index,即1个layer对应连续N个tensor(K/V),这里要求分配内存时,必须是KV,...,KV排布,不支持其他场景。N为tensor_num_per_layer的取值,默认为2。 |
| dst_layer_range | Optional[range] | 可选参数,用于按层pull kv场景。默认值为None。 传输目标的layer的范围,step只支持1。不设置时为传输所有layer。 需要注意这里是layer的index,而不是tensor的index,即1个layer对应连续N个tensor(K/V),这里要求分配内存时,必须是KV,...,KV排布,不支持其他场景。N为tensor_num_per_layer的取值,默认为2。 |
| tensor_num_per_layer | Optional[int] | 可选参数,表示每层的tensor的数量,默认值是2,取值范围是[1,cache的tensor总数]。 当src_layer_range或dst_layer_range取值为非默认值时, tensor_num_per_layer可以保持默认值,也可以输入其他值,输入其他值的时,tensor_num_per_layer的取值还需要被当前cache的tensor总数整除。 |
| size | int | 一个tensor传输的大小,默认值-1表示本地单个KV的大小,暂不支持其他设置。 |
调用示例
请参考样例运行。
返回值
正常情况下无返回值。
传入数据类型错误情况下会抛出TypeError或ValueError异常。
执行时间超过sync_kv_timeout配置会抛出LLMException异常。
layer_range参数异常会抛出LLMException异常。
约束说明
- 当src_cache是HOST设备时,dst_cache是DEVICE设备时,仅支持src_cache与dst_cache都为连续cache的场景。
- 开启enable_remote_cache_accessible时,只支持cache_key类型为CacheKeyByIdAndIndex。
- 在D2H和H2D传输场景,需要在Host端初始化时配置Device内存池。
- 当前仅支持src_layer_range和dst_layer_range取值一致。
remap_registered_memory
函数功能
大模型推理过程中,如果发生内存UCE故障,即返回错误码ACL_ERROR_RT_DEVICE_MEM_ERROR,上层框架需要先判断发生该故障的内存是否为KV Cache内存,如果不是,请参考PyTorch的torch_npu.npu.restart_device接口的说明获取并修复内存UCE的错误虚拟地址。如果是KV Cache内存,还需要再调用该接口修复注册给网卡的KV Cache内存。
说明
本接口为预留接口,暂不支持。
函数原型
remap_registered_memory(mem_infos: Union[MemInfo, list[MemInfo]]) -> None
参数说明
| 参数名称 | 数据类型 | 取值说明 |
|---|---|---|
| mem_infos | Union[MemInfo, list[MemInfo]] | 内存信息,或者内存信息的列表。 |
调用示例
from llm_datadist import *
role = LLMRole.PROMPT # 发生故障的角色
cluster_id = 1 # 发生故障的LLMDataDist id
datadist = LLMDataDist(role, cluster_id)
cache_manager = datadist.cache_manager
addr = 12345678 # 发生故障的地址
size = 1024 # 发生故障的地址大小
mem_info = MemInfo(Memtype.MEM_TYPE_DEVICE, addr, size)
cache_manager.remap_registered_memory(mem_info)
返回值
正常情况下无返回值。
传入数据类型错误情况下会抛出TypeError或ValueError异常。
Ascend 950PR/Ascend 950DT不支持该接口。
约束说明
当前仅支持Device类型的内存修复。
unregister_cache
函数功能
解除注册一个自行申请的内存。
函数原型
unregister_cache(cache_id: int) -> None
参数说明
| 参数名称 | 数据类型 | 取值说明 |
|---|---|---|
| cache_id | int | 调用register_cache或register_blocks_cache返回的cache的id。 |
调用示例
请参考样例运行。
返回值
正常情况下无返回值。
传入数据类型错误情况下会抛出TypeError或ValueError异常。
约束说明
- 当前仅支持配置local_comm_res场景使用。
- 调用该接口之前,需要先调用unlink进行断链,否则会导致HCCL报错。