跳转至

dev-sandbox

dev-sandbox 测量 Ascend 主机内存到设备显存的拷贝带宽,覆盖普通内存、O_DIRECT、共享内存等分配方式与多流 CE、FFTS direct H2D SDMA 等传输引擎,并支持 GQA(每卡各自本地内存)和 MLA(单块共享内存分发到所有卡)两种拓扑。

← 返回 UCM Toolkit 文档

IO 流与 UCM KV cache 的关系

UCM 采用分层 KV cache:设备显存(HBM,最快)→ 主机内存(layer cache,次之)→ 磁盘(POSIX store,最慢)。当请求所需 KV 数据未命中显存时,需要从主机内存(或磁盘)加载回显存,这一步 主机→设备(H2D)拷贝 正是 dev-sandbox copy 测量的环节;aio 子功能则单独测量磁盘 dump/load 带宽。

┌──────────────────── UCM 分层 KV cache ────────────────────┐
│                                                           │
│  ┌──────────────┐     H2D 拷贝       ┌────────────────┐  │
│  │  主机内存     │ ══════════════════▶ │ 设备显存 (HBM)  │  │
│  │ (layer cache)│   CE 多流 / SDMA   │  (KV cache)    │  │
│  └──────┬───────┘                    └────────────────┘  │
│         │ dump/load                                       │
│  ┌──────▼───────┐                                       │
│  │ 磁盘 (POSIX)  │ ◀── aio 子功能测量磁盘带宽             │
│  └──────────────┘                                       │
└───────────────────────────────────────────────────────────┘

不同的传输引擎代表 H2D 阶段不同的硬件拷贝路径:

传输引擎 含义 对应 UCM 环节
多流 CE(--sdma false) Copy Engine 硬件 DMA,4 流并发提交以提升吞吐。 常规 H2D 加载路径:从主机 layer cache 把 KV 块拷回显存。
FFTS direct H2D SDMA(--sdma true) 走 SDMA 的 direct H2D 直通路径,配合 FFTS 快速任务调度,延迟更低。 对 direct H2D 直通路径的 KV 加载带宽评估。

主机内存分配方式对应不同的 KV 来源/拓扑:

分配方式 含义 拓扑
普通主机内存(--iodirect false) 锁页主机内存(pinned),每卡各自一份。 GQA:每卡从本地 host buffer 加载各自 KV。
O_DIRECT(--iodirect true) O_DIRECT 风格 mmap 主机内存,绕过页缓存,贴近 UCM 直接读文件的路径。 GQA:开启 O_DIRECT 后每卡的本地 KV 读入路径。
共享内存 一块 POSIX shared memory host buffer,经 fork fan-out 分发到所有卡。 MLA:多卡共享同一份 host KV 数据。

两种拓扑的数据流:

GQA:每卡各自本地 host buffer → 各自显存(每卡独立一路 H2D)

  host buf(卡0) ── 多流 CE / SDMA ──▶ device HBM(卡0)
  host buf(卡1) ── 多流 CE / SDMA ──▶ device HBM(卡1)
  host buf(卡2) ── 多流 CE / SDMA ──▶ device HBM(卡2)
   ...                                  ...
  host buf(卡N) ── 多流 CE / SDMA ──▶ device HBM(卡N)

MLA:一块共享 host buffer fan-out 到所有卡

                 ┌──▶ device HBM(卡0)
 shared host buf ┼──▶ device HBM(卡1)   (fork fan-out,每卡多流 CE / SDMA)
                 └──▶ device HBM(卡N)

快速使用

ucm-toolkit run dev-sandbox --model-type <gqa|mla> --iodirect <true|false> --sdma <true|false> [参数...]

三个选择参数:

参数 取值 含义
--model-type gqa / mla 模型类型。
--iodirect true / false 是否开启 O_DIRECT(直接 IO,绕过页缓存)。
--sdma true / false 是否走 SDMA(direct H2D SDMA 传输路径)。

三个参数组合决定测试场景:

模型 IO-direct SDMA 测试场景
gqa false false 多卡各自从本地主机内存,用多流 CE 拷到显存。
gqa true false 多卡各自用 O_DIRECT 方式从本地主机内存,多流 CE 拷到显存。
gqa false true 多卡各自从主机内存,用 FFTS direct H2D SDMA 拷到显存。
gqa true true 多卡各自用 O_DIRECT 方式从主机内存,走 FFTS direct H2D SDMA 拷到显存。
mla false false 一块共享主机内存在多卡间分发,每卡用多流 CE 拷到各自显存。
mla true false 同上(MLA 不区分 iodirect,走同一 CE 路径)。
mla false true 一块共享主机内存,用 FFTS direct H2D SDMA 分发到各卡显存。
mla true true 同上(MLA 不区分 iodirect,走同一 SDMA 路径)。

运行参数

三个选择参数之后可以接以下参数(全部可选,不传则用默认值):

参数 含义 默认值 示例
-s 单个数据块大小 512M -s 16K、-s 1M
-n 数据块数量 8 -n 512
-i 迭代轮数 128 -i 128
-d 设备(卡)数量 8 -d 8
-f 分片数(仅 SDMA 场景相关) 0 -f 4

示例

# 测 GQA + 多流 CE:16K 块 × 512 块 × 128 轮 × 8 卡
ucm-toolkit run dev-sandbox --model-type gqa --iodirect false --sdma false \
  -s 16K -n 512 -i 128 -d 8

# 用默认参数测 MLA 共享分发 + SDMA
ucm-toolkit run dev-sandbox --model-type mla --iodirect false --sdma true

输出示例

下面是两条命令在 8 卡 Ascend 910B3 上的真实输出(具体数值因机器而异):

GQA + 多流 CE(每卡各自本地 host buffer → 各自显存):

[[ all_host_to_all_device_ce_multi_stream ]] memcpy from all host to all device with ce using multi stream and fork submit
  From              To                Method    Size(KB)  Count   Submit(us)-(Min/Max/Avg/P50/P90)        Copy(us)-(Min/Max/Avg/P50/P90)              BW(GB/s)
  acl::host::all    acl::device::all  CE-MS-FORK16        4096    878 / 2576 / 1117 / 1112 / 1269         3155 / 4101 / 3736 / 3759 / 3905            16.729

MLA + 多流 CE(一块共享 host buffer fan-out 到所有卡):

[[ one_share_host_to_all_device_ce_multi_stream ]] memcpy from one shared host to all device with ce using multi stream and fork submit
  From              To                Method    Size(KB)  Count   Submit(us)-(Min/Max/Avg/P50/P90)        Copy(us)-(Min/Max/Avg/P50/P90)              BW(GB/s)
  acl::shm::0       acl::device::all  CE-MS-FORK16        4096    1056 / 1270 / 1162 / 1161 / 1209        3914 / 5024 / 4471 / 4424 / 4852            13.979

MLA 用 acl::shm::0 作为数据源(共享内存),GQA 用 acl::host::all(多卡各自主机内存);两者 Count 均为"卡数 × -n"(8 × 512 = 4096)。--sdma true 对应的 FFTS direct H2D SDMA 路径需要机器支持 FFTS 特性,输出格式与上表一致,仅 Method/Copy 数值不同。

输出字段释义:

字段 含义
标题行 [[ ... ]] 实际执行的 case 名称与简介,可用来确认 --model-type/--iodirect/--sdma 映射到了哪个 case。
From / To 数据源 / 目的地内存类型。acl::host::all = 多卡各自主机内存,acl::shm::0 = 共享内存,acl::device::all = 所有卡显存。
Method 传输引擎,如 CE-MS-FORK = 多流 CE + fork fan-out(列宽恰好被方法名填满,故输出中 CE-MS-FORK 与紧随其后的 Size(KB) 数值连写为 CE-MS-FORK16)。
Size(KB) 单个数据块大小,对应 -s(如 -s 16K → 16)。
Count 实际拷贝的数据块总数。多卡 fork 场景下为"卡数 × -n"(如 8 卡 × 512 = 4096)。
Submit(us) 提交阶段耗时统计(微秒),按 Min/Max/Avg/P50/P90 给出。
Copy(us) 实际拷贝耗时统计(微秒),按 Min/Max/Avg/P50/P90 给出,是计算带宽的基准。
BW(GB/s) 聚合带宽 = Size × Count × 1e6 / Copy.avg,单位 GB/s,越大越好。

首次使用

首次运行前需先构建项目:

ucm-toolkit build dev-sandbox

构建细节(后端选择、自定义路径等)、底层原生子命令(copy/trans/aio)与完整 case 表见 开发者文档。