组件

gem5art 组件

在 gem5 实验期间使用的所有唯一对象在 gem5art 中称为”组件”。 组件的示例包括:gem5 二进制文件、gem5 源代码仓库、Linux 内核源代码仓库、linux 二进制文件、磁盘镜像和 packer 二进制文件(用于构建磁盘镜像)。 此基础设施的目标是记录特定实验中使用的所有组件,并在将来需要执行相同实验时返回使用的组件集。

组件的描述用作该组件如何创建的文档。 gem5art 的目标之一是使这些组件自包含。 仅使用与组件一起存储的元数据,第三方应该能够完美地重现该组件。 (我们仍在朝着这个目标努力。 例如,我们正在研究使用 docker 创建组件,以将组件创建与其运行的宿主机平台分离。)

每个组件都有一组特征属性,如下所述:

此外,每个组件还具有以下隐式信息。

这些属性不是由用户指定的,而是由 gem5art 自动生成的(首次创建 Artifact 对象时)。

下面显示了用户如何使用 gem5art 创建 gem5 二进制组件的示例。 在此示例中,类型、名称和文档由 gem5art 用户决定。 建议使用在以后查询数据库时容易记住的名称。 文档属性应用于完整描述您正在保存的组件。

gem5_binary = Artifact.registerArtifact(
    command = 'scons build/X86/gem5.opt',
    typ = 'gem5 binary',
    name = 'gem5',
    cwd = 'gem5/',
    path =  'gem5/build/X86/gem5.opt',
    inputs = [gem5_repo,],
    documentation = '''
      Default gem5 binary compiled for the X86 ISA.
      This was built from the main gem5 repo (github.com/gem5/gem5) without
      any modifications. We recently updated to the current gem5 master
      which has a fix for memory channel address striping.
    '''
)

gem5art 的另一个目标是实现多个用户之间的组件共享,这是通过使用集中式数据库实现的。 基本上,每当用户尝试创建新组件时,都会搜索数据库以查找是否存在相同的组件。 如果存在,用户可以下载匹配的组件以供使用。 否则,新创建的组件将上传到数据库以供以后使用。 使用数据库还可以避免运行相同的实验(如果用户尝试执行数据库中已存在的完全相同的运行,则生成错误消息)。

创建组件

要创建 Artifact,您必须如上例所示使用 registerArtifact。 这是一个工厂方法,将最初创建组件。

调用 registerArtifact 时,组件将自动添加到数据库。 如果它已经存在,将返回指向该组件的指针。

registerArtifact 函数的参数用于文档,而不是作为从头创建组件的明确指示。 将来,可能会将此功能添加到 gem5art。

注意:创建新组件时,可能会出现警告消息,显示两个组件的某些属性(除了 hash 和 id)不匹配(在代码中检查组件相似性时)。用户应确保理解任何此类警告的原因。

使用数据库中的组件

如果组件已存储在数据库中,您可以仅使用 UUID 创建组件。 行为将与创建已存在的组件时相同。 组件的所有属性将从数据库填充。

ArtifactDB

此工作中使用的特定数据库是 MongoDB。 我们使用 MongoDB,因为它可以轻松存储大文件(例如,磁盘镜像),通过 pymongo 与 Python 紧密集成,并且具有灵活的接口以适应 gem5art 需求的变化。

目前,需要使用数据库才能使用 gem5。 但是,我们计划更改此默认设置,以允许 gem5art 也可以独立使用。

gem5art 允许您连接到任何数据库,但默认情况下假设在 localhost 的 mongodb://localhost:27017 上运行 MongoDB 实例。 您可以使用环境变量 GEM5ART_DB 来指定运行简单脚本时要连接的默认数据库,例如 GEM5ART_DB=mongodb://<remote>:27017"。 此外,您可以在脚本中调用 getDBConnection 时指定数据库的位置。

如果没有数据库存在或用户想要自己的数据库,您可以通过创建新目录并运行 mongodb docker 镜像来创建新数据库。 有关更多信息,请参阅 MongoDB docker 文档MongoDB 文档

docker run -p 27017:27017 -v <absolute path to the created directory>:/data/db --name mongo-<some tag> -d mongo

这使用官方 MongoDB Docker 镜像在 localhost 的默认端口上运行数据库。 如果 Docker 容器被终止,可以使用相同的命令行重新启动它,数据库应该是一致的。

连接到现有数据库

默认情况下,gem5art 将假设数据库在 mongodb://localhost:27017 上运行,这是 MongoDB 在 localhost 上的默认值。

环境变量 GEM5ART_DB 可以覆盖此默认值。

否则,要在使用 gem5art 时以编程方式设置数据库 URI,您可以将 URI 传递给 getDatabaseConnection 函数。

目前,gem5art 仅支持 MongoDB 数据库后端,但将其扩展到其他数据库应该很简单。

搜索数据库

gem5art 提供了一些用于搜索和访问数据库的便捷函数。 这些函数可以在 artifact.common_queries 中找到。

具体来说,我们提供以下函数:

从数据库下载

您还可以使用 gem5art 提供的函数下载与组件关联的文件。搜索和下载数据库中的项目的一个好方法是使用 Python 交互式 shell。 您可以使用 artifact 模块提供的函数搜索数据库(例如,getByNamegetByType 等)。 然后,一旦找到要下载的组件的 ID,就可以调用 downloadFile。 请参阅下面的示例。

$ python
Python 3.6.8 (default, Oct  7 2019, 12:59:55)
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from gem5art.artifact import *
>>> db = getDBConnection()
>>> for i in getDiskImages(db, limit=2): print(i)
...
ubuntu
    id: d4a54de8-3a1f-4d4d-9175-53c15e647afd
    type: disk image
    path: disk-image/ubuntu-image/ubuntu
    inputs: packer:fe8ba737-ffd4-44fa-88b7-9cd072f82979, fs-x86-test:94092971-4277-4d38-9e4a-495a7119a5e5, m5:69dad8b1-48d0-43dd-a538-f3196a894804
    Ubuntu with m5 binary installed and root auto login
ubuntu
    id: c54b8805-48d6-425d-ac81-9b1badba206e
    type: disk image
    path: disk-image/ubuntu-image/ubuntu
    inputs: packer:fe8ba737-ffd4-44fa-88b7-9cd072f82979, fs-x86-test:5bfaab52-7d04-49f2-8fea-c5af8a7f34a8, m5:69dad8b1-48d0-43dd-a538-f3196a894804
    Ubuntu with m5 binary installed and root auto login
>>> for i in getLinuxBinaries(db, limit=2): print(i)
...

vmlinux-5.2.3
    id: 8cfd9fbe-24d0-40b5-897e-beca3df80dd2
    type: kernel
    path: linux-stable/vmlinux-5.2.3
    inputs: fs-x86-test:94092971-4277-4d38-9e4a-495a7119a5e5, linux-stable:25feca9a-3642-458e-a179-f3705266b2fe
    Kernel binary for 5.2.3 with simple config file
vmlinux-5.2.3
    id: 9721d8c9-dc41-49ba-ab5c-3ed169e24166
    type: kernel
    path: linux-stable/vmlinux-5.2.3
    inputs: npb:85e6dd97-c946-4596-9b52-0bb145810d68, linux-stable:25feca9a-3642-458e-a179-f3705266b2fe
    Kernel binary for 5.2.3 with simple config file
>>> from uuid import UUID
>>> db.downloadFile(UUID('8cfd9fbe-24d0-40b5-897e-beca3df80dd2'), 'linux-stable/vmlinux-5.2.3')

再举一个例子,假设数据库中有一个名为 npb 的磁盘镜像(包含 NAS Parallel 基准测试),您想将磁盘镜像下载到本地目录。您可以执行以下操作来下载磁盘镜像:

import gem5art.artifact

db = gem5art.artifact.getDBConnection()

disks = gem5art.artifact.getByName(db, 'npb')

for disk in disks:
    if disk.type == 'disk image' and disk.documentation == 'npb disk image created on Nov 20':
        db.downloadFile(disk._id, 'npb')

在这里,我们假设可能有多个名为 npb 的磁盘镜像/组件,我们只对下载具有特定文档(’npb disk image created on Nov 20’)的 npb 磁盘镜像感兴趣。另外,请注意还有其他方法可以从数据库下载文件(尽管它们最终会使用 downloadFile 函数)。

上面使用的 downloadFile 方法的对偶是 upload

数据库模式

或者,您可以使用 pymongo Python 模块或 mongodb 命令行界面与数据库交互。 有关如何查询 MongoDB 数据库的更多信息,请参阅 MongoDB 文档

gem5art 有两个集合。 artifact_database.artifacts 存储所有组件的元数据,artifact_database.fs 是所有文件的 GridFS 存储。 GridFS 中的文件使用与 Artifacts 相同的 UUID 作为其主键。

您可以通过在 Python 中运行以下命令来列出所有组件的所有详细信息。

#!/usr/bin/env python3

from pymongo import MongoClient

db = MongoClient().artifact_database
for i in db.artifacts.find():
    print(i)

gem5art 还提供了一些方法来搜索数据库中特定类型或名称的组件。例如,要查找数据库中的所有磁盘镜像,您可以执行以下操作:

import gem5art.artifact
db = gem5art.artifact.getDBConnection('mongodb://localhost')
for i in gem5art.artifact.getDiskImages(db):
    print(i)

其他类似的方法包括:getLinuxBinaries()getgem5Binaries()

您可以使用 getByName() 方法使用 name 属性搜索数据库中的组件。例如,要搜索名为 gem5 的组件:

import gem5art.artifact
db = gem5art.artifact.getDBConnection('mongodb://localhost')
for i in gem5art.artifact.getByName(db, "gem5"):
    print(i)