Nixl#

概述#

NIXL(NVIDIA 推理传输库)是一个高性能库,旨在加速 AI 推理框架中的点对点通信。它通过模块化插件架构提供对各种类型内存(CPU 和 GPU)和存储的抽象,使得推理管道中不同组件之间的数据传输和协调更加高效。

LMCache 支持将 NIXL 用作存储后端,允许将显存或 CPU 内存保存到存储中。

前提条件#

  • LMCache: 使用 pip install lmcache 安装

  • NIXL: 从 NIXL GitHub repository 安装

  • 模型访问:有效的 Hugging Face 令牌 (HF_TOKEN) 用于 Llama 3.1 8B Instruct

配置 LMCache NIXL 卸载的方法#

配置文件

通过 LMCACHE_CONFIG_FILE=lmcache-config.yaml 传入

示例 lmcache-config.yaml 用于 POSIX 后端:

chunk_size: 256
nixl_buffer_size: 1073741824 # 1GB
nixl_buffer_device: cpu
extra_config:
  enable_nixl_storage: true
  nixl_backend: POSIX
  nixl_pool_size: 64
  nixl_path: /mnt/nixl/cache/
  use_direct_io: true
  nixl_use_hugepages: true  # optional, requires pre-allocated hugepages

关键设置:

  • nixl_buffer_size: NIXL 传输的缓冲区大小。

  • nixl_pool_size: 初始化时为 nixl 后端打开的描述符数量。设置为 0 以启用动态模式。

  • nixl_path: 存储文件将保存的目录(例如 /mnt/nixl/)。对于将数据存储到文件的 NIXL 后端,这是必需的。

  • nixl_buffer_device: 指定 NIXL 管理的内存应该位于何处。对于 "GDS"、"GDS_MT" 和 "OBJ" 后端,支持 "cpu" 或 "cuda";对于 "POSIX"、"HF3FS" 和 "AZURE_BLOB",必须为 "cpu"。

  • nixl_backend: 配置用于存储的 nixl 后端。

  • nixl_use_hugepages: whether to use Linux hugepages (2 MiB) for the NIXL CPU buffer. Not supported for GPU buffers. Requires pre-allocated hugepages (sysctl vm.nr_hugepages). Default: false.

备注

支持的后端包括:["GDS", "GDS_MT", "POSIX", "HF3FS", "OBJ", "AZURE_BLOB"]。

后端特定参数应通过 extra_config.nixl_backend_params 提供。有关具体信息,请参阅 NIXL 文档。

示例 lmcache-config.yaml 用于使用 S3 API 的 OBJ 后端:

chunk_size: 256
nixl_buffer_size: 1073741824 # 1GB
nixl_buffer_device: cpu
extra_config:
  enable_nixl_storage: true
  nixl_backend: OBJ
  nixl_pool_size: 64
  nixl_path: /mnt/nixl/cache/
  nixl_backend_params:
    access_key: <your_access_key>
    secret_key: <your_secret_key>
    bucket: <your_bucket>
    region: <your_region>

示例 lmcache-config.yaml 用于使用 liburing 的 POSIX 后端:

备注

使用带有 liburing 支持的 POSIX 后端需要将 NIXL 构建为支持 liburing。

chunk_size: 256
nixl_buffer_size: 1073741824 # 1GB
nixl_buffer_device: cpu
extra_config:
  enable_nixl_storage: true
  nixl_backend: POSIX
  nixl_pool_size: 64
  nixl_path: /mnt/nixl/cache/
  use_direct_io: True
  nixl_backend_params:
    use_uring: "true"

示例 lmcache-config.yaml 用于 AZURE_BLOB 后端,通过 Azure Blob Storage API 进行卸载:

chunk_size: 256
nixl_buffer_size: 1073741824 # 1GB
nixl_buffer_device: cpu
extra_config:
  enable_nixl_storage: true
  nixl_backend: AZURE_BLOB
  nixl_pool_size: 64
  nixl_path: /mnt/nixl/cache/
  nixl_backend_params:
    account_url: https://<your_azure_storage_account_name>.blob.core.windows.net
    container_name: <your_container_name>

每个工作节点的端点分配#

当使用 OBJ 后端与多个张量并行 (TP) 工作节点时,您可以通过提供一个端点列表来在多个对象存储端点之间分配工作节点,方法是使用 nixl_endpoint_list。每个工作节点根据其 ``local_worker_id``(其主机内的工作节点 ID)以轮询方式选择一个端点。

extra_config:
  enable_nixl_storage: true
  nixl_backend: OBJ
  nixl_pool_size: 64
  nixl_path: /mnt/nixl/cache/
  nixl_endpoint_list:
    - https://node-0.object-storage:9021
    - https://node-1.object-storage:9021
    - https://node-2.object-storage:9021
  nixl_backend_params:
    access_key: <your_access_key>
    secret_key: <your_secret_key>
    bucket: <your_bucket>
    region: <your_region>

备注

当设置 nixl_endpoint_list 时,nixl_backend_params 中的任何 endpoint_override 值将被忽略(会记录警告)。

动态模式#

Nixl 存储后端还支持动态模式,该模式按需创建 nixl 存储描述符,而不是在初始化时创建。

为了使用动态模式,extra_config.nixl_pool_size 应设置为 0。

限制#

  • 动态模式目前仅支持 nixl OBJ 和 AZURE_BLOB 后端。

  • save_unfull_chunk 必须设置为 False。

示例 lmcache-config.yaml 用于动态模式的 OBJ 后端:

chunk_size: 256
local_cpu: False
save_unfull_chunk: False
enable_async_loading: False # set to True to test async loading
# buffer size has to be divisible by chunk size
# 2880MiB is divisible by 256 token chunk for Qwen3-4B/8B/32B
nixl_buffer_size: 3019898880
nixl_buffer_device: cpu
extra_config:
  enable_nixl_storage: true
  nixl_backend: OBJ
  nixl_pool_size: 0
  nixl_presence_cache: False
  nixl_async_put: False
  nixl_backend_params:
    access_key: <your_access_key>
    secret_key: <your_secret_key>
    bucket: <your_bucket>
    region: <your_region>
    endpoint_override: https://url-to-object-storage
    ca_bundle: path to self-signed certificate # remove this line if not using self-signed certificate

示例 lmcache-config.yaml 用于动态模式的 AZURE_BLOB 后端:

chunk_size: 256
local_cpu: False
save_unfull_chunk: False
enable_async_loading: False # set to True to test async loading
# buffer size has to be divisible by chunk size
# 2880MiB is divisible by 256 token chunk for Qwen3-4B/8B/32B
nixl_buffer_size: 3019898880
nixl_buffer_device: cpu
extra_config:
  enable_nixl_storage: true
  nixl_backend: AZURE_BLOB
  nixl_pool_size: 0
  nixl_presence_cache: False
  nixl_async_put: False
  nixl_backend_params:
    account_url: https://<your_azure_storage_account_name>.blob.core.windows.net
    container_name: <your_container_name>