序列化#

概述#

此示例展示了如何将 Pipeline 序列化为字符串。

序列化#

为了使用 C API 或 TensorFlow 插件(或者只是为了将 Pipeline 与模型一起保存,以便训练过程完全可重现),我们需要序列化 Pipeline。

让我们创建一个简单的 Pipeline,从 MXNet recordIO 格式读取数据(有关使用其他数据格式的示例,请参阅其他示例

[1]:
from nvidia.dali import pipeline_def, Pipeline
import nvidia.dali.fn as fn
import nvidia.dali.types as types
import numpy as np
import matplotlib.pyplot as plt
import os.path

test_data_root = os.environ["DALI_EXTRA_PATH"]
base = os.path.join(test_data_root, "db", "recordio")

idx_files = [base + "/train.idx"]
rec_files = [base + "/train.rec"]


@pipeline_def
def example_pipe():
    encoded, labels = fn.readers.mxnet(path=rec_files, index_path=idx_files)
    images = fn.decoders.image(encoded, device="mixed", output_type=types.RGB)
    images = fn.resize(
        images,
        interp_type=types.INTERP_LINEAR,
        resize_shorter=fn.random.uniform(range=(256.0, 480.0)),
    )
    images = fn.crop_mirror_normalize(
        images,
        dtype=types.FLOAT,
        crop=(224, 224),
        mean=[0.0, 0.0, 0.0],
        std=[1.0, 1.0, 1.0],
    )
    return images, labels
[2]:
batch_size = 16

pipe = example_pipe(batch_size=batch_size, num_threads=2, device_id=0, seed=12)

我们现在将序列化此 Pipeline,使用 Pipeline 类的 serialize 函数。

[3]:
s = pipe.serialize()

为了在 Python 中反序列化我们的 Pipeline,我们需要创建另一个 Pipeline,这次使用通用的 Pipeline 类。我们为新的 Pipeline 提供相同的种子,以便比较结果。

[4]:
pipe2 = Pipeline(batch_size=batch_size, num_threads=2, device_id=0, seed=12)

现在让我们使用 pipe 对象的序列化形式,使 pipe2 成为它的副本。

[5]:
pipe2.deserialize_and_build(s)

现在我们可以比较 2 个 Pipeline 的结果 - 原始的和反序列化的。

[6]:
pipe.build()
original_pipe_out = pipe.run()
serialized_pipe_out = pipe2.run()
[7]:
def check_difference(batch_1, batch_2):
    return [
        np.sum(np.abs(batch_1.at(i) - batch_2.at(i))) for i in range(batch_size)
    ]
[8]:
original_images, _ = original_pipe_out
serialized_images, _ = serialized_pipe_out
[9]:
check_difference(original_images.as_cpu(), serialized_images.as_cpu())
[9]:
[0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0]

两个 Pipeline 给出完全相同的结果。