序列化#
概述#
此示例展示了如何将 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 给出完全相同的结果。