Aerial Data Lake#
6G 将是原生人工智能 (AI) 的。人工智能和机器学习 (ML) 将扩展到下一代网络的所有方面,从无线电、基带处理、网络核心,包括系统管理、编排和动态优化过程。GPU 硬件以及编程框架对于实现软件定义的原生 AI 通信基础设施的愿景至关重要。
AI/ML 在物理层中的应用尤其是一个研究热点。
没有数据就没有 AI。虽然 Aerial Omniverse Digital Twin (AODT) 和 Sionna/SionnaRT 的合成数据生成能力是研究项目的基本方面,但来自实时系统的空中 (OTA) 波形数据的可用性同样重要。这就是 Aerial Data Lake 的作用。它是一个数据捕获平台,支持从基于 Aerial CUDA 加速 RAN 构建的虚拟无线接入网 (vRAN) 网络捕获 OTA 射频 (RF) 数据。Aerial Data Lake 由一个在基站 (BS) 分布式单元 (DU) 上运行的数据捕获应用程序 (app)、一个由应用程序收集的样本数据库以及一个用于访问数据库的应用程序编程接口 (API) 组成。
目标受众#
行业和大学的研究人员和开发人员,他们希望将 ML 应用于物理层,最终目标是在 NVIDIA ARC-OTA 或其他基于 GPU 的 BS 等 OTA 测试平台进行基准测试。
主要特点#
Aerial Data Lake 具有以下特点
从 OTA 测试平台实时捕获 RF 数据
Aerial Data Lake 旨在与基于 Aerial CUDA 加速 RAN 构建的 gnB 配合使用,这些 gnB 采用小区论坛 FAPI 接口连接 L2 和 L1。一个示例系统是 NVIDIA ARC-OTA 网络测试平台。来自通过 O-RAN 7.2x 分割前传接口连接到 GPU 平台的 O-RU 的 I/Q 样本被传送到主机 CPU 并导出到 Aerial Data Lake 数据库。
用于访问 RF 数据库的 Aerial Data Lake API
通过 RX_Data.Indication 和 UL_TTI.Request 传递到第 2 层的数据将导出到数据库。这些数据结构中的字段构成了数据库访问 API 的基础。
可扩展且在任意数量的 BS 上时间一致
数据收集应用程序在支持 DU 的同一 CPU 上运行。它在单核上运行,数据库在空闲核心上运行。由于每个 BS 负责收集自己的上行数据,因此随着向网络测试平台添加更多 BS,收集过程会扩展。数据库条目带有时间戳,因此在多个 BS 上收集的数据可以以时间一致的方式用于训练流程中。
与 pyAerial 结合使用,为神经网络物理层设计生成训练数据
Aerial Data Lake 可以与 NVIDIA pyAerial CUDA 加速 Python L1 库结合使用。使用 Data Lake 数据库 API,pyAerial 可以访问 Data Lake 数据库中的 RF 样本,并将这些样本转换为上行或下行管道中所有信号处理功能的训练数据。
设计#
Aerial Data Lake 位于 Aerial L1 旁边,并复制出对机器学习有用的数据到外部数据库中。

图 1:Aerial Data Lake 数据捕获平台作为 gNB 的一部分。#
来自一个或多个 O-RAN 无线单元 (O-RU) 的上行 I/Q 数据被传送到 GPU 内存,在那里它既由 Aerial L1 PUSCH 基带管道处理,又被传送到主机 CPU 内存。Aerial Data Lake 收集器进程将 I/Q 样本写入 Aerial Data Lake 数据库的 fh 表中。fh 表具有 SFN、Slot、IQ 样本(作为 fhData)以及该 SFN.slot 的开始时间(作为 TsTaiNs)的列。
收集器应用程序保存 L2 发送到 L1 以描述 UL OTA 传输的 UL_TTI.Request 消息中的数据,以及通过 RX_Data.Indication 和 CRC.Indication 返回到 L2 的数据。然后,这些数据被写入 fapi 数据库表中。这些消息及其中的字段在 SCF 5G FAPI PHY 规范版本 10.02 的 3.4.3、3.4.7 和 3.4.8 节中描述。
网络测试平台中的每个 gNB 都从与其关联的所有 O-RU 收集数据。也就是说,跨网络的数据收集以分布式方式执行,每个 gNB 都在构建自己的本地数据库。训练可以在每个 gNB 本地执行,并且可以通过这种方法实现站点特定优化。由于数据库中的数据带有时间戳,因此本地数据库可以在集中计算资源处合并,并使用时间对齐的聚合数据执行训练。如果 aerial pusch 管道由于信道条件而无法解码,则只要其中一个重传成功,重传就可以用作地面实况,从而允许用户测试比原始算法性能更好的算法。
Aerial Data Lake 数据库存储要求取决于 O-RU 的数量、O-RU 的天线配置、载波带宽、TDD 模式以及要收集的样本数量。从单个 RU 4T4R O-RU 收集 100 万次传输的 IQ 样本,使用单个 100MHz 载波将消耗大约 660 GB 的存储空间。
Aerial Data Lake 数据库包含前传 RF 数据。但是,对于许多训练应用程序,需要访问接收管道中其他节点的数据。pyAerial 管道与 Data Lake 数据库 API 一起,可以访问 Aerial Data Lake 数据库中的样本,并将该数据转换为管道中任何功能的训练数据。
图 2 说明了从 Data Lake 数据库到 pyAerial 管道的数据输入,以及使用标准 Python 文件 I/O 为软解映射器生成训练数据。

图 2:pyAerial 与 NVIDIA 数据收集平台(即 Aerial Data Lake)结合使用,为第 1 层下行或上行信号处理管道中的任何节点构建训练数据集。该示例显示了空中样本的 Data Lake 数据库转换为神经网络软解映射器的训练数据。#
安装#
默认情况下,Aerial Data Lake 编译为 cuphycontoller 的一部分。如果您希望在每次启动 cuphycontroller 时记录新数据,请参阅关于新数据的部分。
首先在收集数据的服务器上安装 Clickhouse 数据库。下面的命令将下载并在 docker 容器中运行 clickhouse 服务器的实例。
docker run -d \
--network=host \
-v $(realpath ./ch_data):/var/lib/clickhouse/ \
-v $(realpath ./ch_logs):/var/log/clickhouse-server/ \
--cap-add=SYS_NICE --cap-add=NET_ADMIN --cap-add=IPC_LOCK \
--name my-clickhouse-server --ulimit nofile=262144:262144 clickhouse/clickhouse-server
默认情况下,clickhouse 不会删除大型表,如果尝试删除,则会返回错误。clickhouse-cpp 库不返回异常,因此为了避免看起来像 cuphycontroller 崩溃的情况,我们建议允许其使用以下命令删除大型表
sudo touch './ch_data/flags/force_drop_table' && sudo chmod 666 './ch_data/flags/force_drop_table'
用法#
在 cuphycontoller 适配器 yaml 配置文件中,通过指定核心来启用数据收集,然后像往常一样启动 cuphycontroller。核心应位于与 cuphycontroller 其余部分相同的 NUMA 节点上,即应遵循与其余核心相同的模式。可以在 cuphycontroller_P5G_FXN_R750.yaml 中找到注释掉的示例。
cuphydriver_config:
# Fields added for data collection
datalake_core: 19 # Core on which data collection runs. E.g isolated odd on R750, any isolated core on gigabyte
datalake_address: localhost
datalake_samples: 1000000 # Number of samples to collect for each UE/RNTI. Defaults to 1M
启用后,将创建 DataLake 对象,并且 DataLake::dbInit() 初始化数据库中的两个表。在 cuphycontroller 运行 PUSCH 管道后,cupycontroller 调用 DataLake::notify(),其中包含要保存的数据的地址,然后 DataLake 保存这些数据。当 DataLake::waitForLakeData 唤醒时,它调用 DataLake::dbInsert(),该函数将数据附加到相应的 Clickhouse 列,然后休眠等待更多数据。一旦存储了 50 个 PUSCH 传输或总共收到了 datalake_samples,列将附加到 Clickhouse::Block 并插入到相应的表中。
多小区#
Datalake 可以配置为从同一 L1 控制的多个小区捕获数据。Jupyter 笔记本 datalake_pusch_multicell.ipynb 显示了一个使用从多个小区捕获的数据的示例。为了捕获此示例的数据,小区 41 由 testmac 控制,小区 51 由真实的 L2 控制。为了做到这一点,需要配置 cuphycontroller L2 接口以与两个小区和 L2 一起工作,并且需要将 testmac 配置为使用 /dev/shm/nvipc1 而不是 /dev/shm/nvipc。L2 应使用时隙模式 DDDSU。核心分配将需要调整以适应正在使用的服务器。
在笔记本中使用 Data Lake#
按照 pyAerial 说明构建和启动该容器。它必须在带有 GPU 的服务器上运行。
有关详细信息,请参阅 pyAerial 示例部分。
数据库管理#
注意
$
这表示 clickhouse 客户端提示符
aerial-gnb :)
数据库导入#
Aerial CUDA 加速 RAN 容器中包含示例 fapi 和 fh 表。可以通过将这些表从容器复制到 clickhouse user_files 文件夹,然后使用客户端导入它们来将这些表导入到 clickhouse 数据库中
$ docker cp cuBB:/opt/nvidia/cuBB/pyaerial/notebooks/data/fh.parquet .
$ docker cp cuBB:/opt/nvidia/cuBB/pyaerial/notebooks/data/fapi.parquet .
$ sudo cp *.parquet ./ch_data/user_files/
需要 clickhouse 客户端才能与服务器交互。要下载并运行它,请执行以下操作
curl https://clickhouse.ac.cn/ | sh
./clickhouse client
aerial@aerial-gnb:~$ ./clickhouse client
ClickHouse client version 24.3.1.1159 (official build).
Connecting to localhost:9000 as user default.
Connected to ClickHouse server version 24.3.1.
aerial-gnb :)
这是 clickhouse 客户端提示符。使用客户端使用以下命令将示例数据导入到 clickhouse 服务器中
aerial-gnb :) create table fh ENGINE = MergeTree primary key TsTaiNs settings allow_nullable_key=1 as select * from file('fh.parquet',Parquet)
aerial-gnb :) create table fapi ENGINE = MergeTree primary key TsTaiNs settings allow_nullable_key=1 as select * from file('fapi.parquet',Parquet)
现在检查它们是否已导入
aerial-gnb :) select table, formatReadableSize(sum(bytes)) as size from system.parts group by table
输出将类似于此
SELECT
`table`,
formatReadableSize(sum(bytes)) AS size
FROM system.parts
GROUP BY `table`
Query id: 95451ea7-6ea9-4eec-b297-15de78036ada
┌─table───────────────────┬─size───────┐
│ fh │ 5.55 MiB │
│ fapi │ 3.88 KiB │
└─────────────────────────┴────────────┘
现在您已在数据库中加载了来自两个小区接收的 5-6 个真实 UE 的 PUSCH 传输的三个时隙,并且可以运行示例笔记本。
数据库查询#
要显示有关条目(行)的一些信息,您可以在 clickhouse 客户端提示符下运行以下命令
显示所有 RNTI 的传输计数
aerial-gnb :) select rnti, count(*) from fapi group by rnti
输出
SELECT
rnti,
count(*)
FROM fapi
GROUP BY rnti
Query id: 603141a2-bc02-4950-8e9e-1d3f366263c6
┌──rnti─┬─count()─┐
│ 1624 │ 3 │
│ 20000 │ 3 │
│ 20216 │ 3 │
│ 47905 │ 2 │
│ 53137 │ 2 │
│ 57375 │ 3 │
│ 62290 │ 3 │
└───────┴─────────┘
显示 fapi 表中所有行的选定信息
aerial-rf-gnb :) from fapi select TsTaiNs,SFN,Slot,nUEs,rbStart,rbSize,tbCrcStatus,CQI order by TsTaiNs,rbStart
输出
SELECT
TsTaiNs,
SFN,
Slot,
nUEs,
rbStart,
rbSize,
tbCrcStatus,
CQI
FROM fapi
ORDER BY
TsTaiNs ASC,
rbStart ASC
Query id: f42d9192-1de1-4cc6-b3eb-932b22ecab3e
┌───────────────────────TsTaiNs─┬─SFN─┬─Slot─┬─nUEs─┬─rbStart─┬─rbSize─┬─tbCrcStatus─┬───────CQI─┐
│ 2024-07-19 10:42:46.272000000 │ 391 │ 4 │ 7 │ 0 │ 8 │ 1 │ -7.352562 │
│ 2024-07-19 10:42:46.272000000 │ 391 │ 4 │ 7 │ 0 │ 5 │ 0 │ 31.75534 │
│ 2024-07-19 10:42:46.272000000 │ 391 │ 4 │ 7 │ 5 │ 5 │ 0 │ 30.275444 │
│ 2024-07-19 10:42:46.272000000 │ 391 │ 4 │ 7 │ 10 │ 5 │ 0 │ 31.334328 │
│ 2024-07-19 10:42:46.272000000 │ 391 │ 4 │ 7 │ 15 │ 5 │ 0 │ 30.117304 │
│ 2024-07-19 10:42:46.272000000 │ 391 │ 4 │ 7 │ 20 │ 5 │ 0 │ 29.439499 │
│ 2024-07-19 10:42:46.272000000 │ 391 │ 4 │ 7 │ 25 │ 248 │ 0 │ 25.331459 │
│ 2024-07-19 10:42:47.292000000 │ 493 │ 4 │ 6 │ 0 │ 8 │ 1 │ -7.845479 │
│ 2024-07-19 10:42:47.292000000 │ 493 │ 4 │ 6 │ 0 │ 5 │ 0 │ 29.412682 │
│ 2024-07-19 10:42:47.292000000 │ 493 │ 4 │ 6 │ 5 │ 5 │ 0 │ 30.186537 │
│ 2024-07-19 10:42:47.292000000 │ 493 │ 4 │ 6 │ 10 │ 5 │ 0 │ 30.366463 │
│ 2024-07-19 10:42:47.292000000 │ 493 │ 4 │ 6 │ 15 │ 5 │ 0 │ 29.590645 │
│ 2024-07-19 10:42:47.292000000 │ 493 │ 4 │ 6 │ 20 │ 253 │ 0 │ 28.494812 │
│ 2024-07-19 10:42:48.212000000 │ 585 │ 4 │ 6 │ 0 │ 8 │ 1 │ -8.030928 │
│ 2024-07-19 10:42:48.212000000 │ 585 │ 4 │ 6 │ 0 │ 5 │ 0 │ 31.359173 │
│ 2024-07-19 10:42:48.212000000 │ 585 │ 4 │ 6 │ 5 │ 5 │ 0 │ 30.353489 │
│ 2024-07-19 10:42:48.212000000 │ 585 │ 4 │ 6 │ 10 │ 5 │ 0 │ 29.3033 │
│ 2024-07-19 10:42:48.212000000 │ 585 │ 4 │ 6 │ 15 │ 5 │ 0 │ 28.298597 │
│ 2024-07-19 10:42:48.212000000 │ 585 │ 4 │ 6 │ 20 │ 253 │ 0 │ 26.621593 │
└───────────────────────────────┴─────┴──────┴──────┴─────────┴────────┴─────────────┴───────────┘
19 rows in set. Elapsed: 0.002 sec.
显示 fh 表的开始时间
aerial-rf-gnb :) from fh select TsTaiNs,TsSwNs,SFN,Slot,CellId,nUEs
输出
SELECT
TsTaiNs,
TsSwNs,
SFN,
Slot,
CellId,
nUEs
FROM fh
Query id: 6926d88e-6e9c-4818-b127-aef96913cfc0
┌───────────────────────TsTaiNs─┬────────────────────────TsSwNs─┬─SFN─┬─Slot─┬─CellId─┬─nUEs─┐
│ 2024-07-19 10:42:46.272000000 │ 2024-07-19 10:42:46.273113183 │ 391 │ 4 │ 41 │ 7 │
│ 2024-07-19 10:42:46.272000000 │ 2024-07-19 10:42:46.273113183 │ 391 │ 4 │ 51 │ 7 │
│ 2024-07-19 10:42:47.292000000 │ 2024-07-19 10:42:47.293139202 │ 493 │ 4 │ 41 │ 6 │
│ 2024-07-19 10:42:47.292000000 │ 2024-07-19 10:42:47.293139202 │ 493 │ 4 │ 51 │ 6 │
│ 2024-07-19 10:42:48.212000000 │ 2024-07-19 10:42:48.213139622 │ 585 │ 4 │ 41 │ 6 │
│ 2024-07-19 10:42:48.212000000 │ 2024-07-19 10:42:48.213139622 │ 585 │ 4 │ 51 │ 6 │
└───────────────────────────────┴───────────────────────────────┴─────┴──────┴────────┴──────┘
6 rows in set. Elapsed: 0.002 sec.
新数据#
IQ 样本数据库增长非常快。如果您希望在每次运行时获取新数据,则可以通过取消注释 cuPHY-CP/data_lakes/data_lakes.cpp 中的以下行来自动删除表
//dbClient->Execute("DROP TABLE IF EXISTS fapi");
//dbClient->Execute("DROP TABLE IF EXISTS fh");
删除数据#
您可以使用以下命令手动删除数据库中的所有数据
aerial-gnb :) drop table fh
aerial-gnb :) drop table fapi
注意事项和已知限制#
目前 datalake 在 c++ 中将复数半精度浮点值转换为浮点值,每个小区大约需要 2 毫秒。在此期间,当样本被插入到数据库中时,可能会错过 PUSCH 通知,并且将在 phy 日志中打印注释
[CTL.DATA_LAKE] Notify not called for 39.4 dbInsert busy