text: import hugectr
  from hugectr.tools import DataGenerator, DataGeneratorParams
  from mpi4py import MPI
  
  # Norm data generation
  data_generator_params = DataGeneratorParams(
    format = hugectr.DataReaderType_t.Norm,
    label_dim = 1,
    dense_dim = 13,
    num_slot = 27,
    i64_input_key = False,
    source = "./wdl_norm/file_list.txt",
    eval_source = "./wdl_norm/file_list_test.txt",
    slot_size_array = [634776, 203750, 18573, 14082, 7020, 18966, 4, 6382, 1246, 49, 185920, 71354, 67346, 11, 2166, 7340, 60, 4, 934, 15, 204208, 141572, 199066, 60940, 9115, 72, 34],
    nnz_array = [2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
    check_type = hugectr.Check_t.Sum
  )
  data_generator = DataGenerator(data_generator_params)
  data_generator.generate()
  
  # WDL train
  solver = hugectr.CreateSolver(max_eval_batches = 1280,
                                batchsize_eval = 1024,
                                batchsize = 1024,
                                lr = 0.001,
                                vvgpu = [[0]],
                                repeat_dataset = True)
  reader = hugectr.DataReaderParams(data_reader_type = data_generator_params.format,
                                    source = [data_generator_params.source],
                                    eval_source = data_generator_params.eval_source,
                                    check_type = data_generator_params.check_type)
  optimizer = hugectr.CreateOptimizer(optimizer_type = hugectr.Optimizer_t.Adam,
                                      update_type = hugectr.Update_t.Global,
                                      beta1 = 0.9,
                                      beta2 = 0.999,
                                      epsilon = 0.0000001)
  model = hugectr.Model(solver, reader, optimizer)
  model.add(hugectr.Input(label_dim = data_generator_params.label_dim, label_name = "label",
                          dense_dim = data_generator_params.dense_dim, dense_name = "dense",
                          data_reader_sparse_param_array = 
                          # the total number of slots should be equal to data_generator_params.num_slot
                          [hugectr.DataReaderSparseParam("wide_data", 2, True, 1),
                          hugectr.DataReaderSparseParam("deep_data", 1, True, 26)]))
  model.add(hugectr.SparseEmbedding(embedding_type = hugectr.Embedding_t.DistributedSlotSparseEmbeddingHash, 
                              workspace_size_per_gpu_in_mb = 23,
                              embedding_vec_size = 1,
                              combiner = "sum",
                              sparse_embedding_name = "sparse_embedding2",
                              bottom_name = "wide_data",
                              optimizer = optimizer))
  model.add(hugectr.SparseEmbedding(embedding_type = hugectr.Embedding_t.DistributedSlotSparseEmbeddingHash, 
                              workspace_size_per_gpu_in_mb = 358,
                              embedding_vec_size = 16,
                              combiner = "sum",
                              sparse_embedding_name = "sparse_embedding1",
                              bottom_name = "deep_data",
                              optimizer = optimizer))
  model.add(hugectr.DenseLayer(layer_type = hugectr.Layer_t.Reshape,
                              bottom_names = ["sparse_embedding1"],
                              top_names = ["reshape1"],
                              leading_dim=416))
  model.add(hugectr.DenseLayer(layer_type = hugectr.Layer_t.Reshape,
                              bottom_names = ["sparse_embedding2"],
                              top_names = ["reshape2"],
                              leading_dim=1))
  model.add(hugectr.DenseLayer(layer_type = hugectr.Layer_t.Concat,
                              bottom_names = ["reshape1", "dense"],
                              top_names = ["concat1"]))
  model.add(hugectr.DenseLayer(layer_type = hugectr.Layer_t.InnerProduct,
                              bottom_names = ["concat1"],
                              top_names = ["fc1"],
                              num_output=1024))
  model.add(hugectr.DenseLayer(layer_type = hugectr.Layer_t.ReLU,
                              bottom_names = ["fc1"],
                              top_names = ["relu1"]))
  model.add(hugectr.DenseLayer(layer_type = hugectr.Layer_t.Dropout,
                              bottom_names = ["relu1"],
                              top_names = ["dropout1"],
                              dropout_rate=0.5))
  model.add(hugectr.DenseLayer(layer_type = hugectr.Layer_t.InnerProduct,
                              bottom_names = ["dropout1"],
                              top_names = ["fc2"],
                              num_output=1024))
  model.add(hugectr.DenseLayer(layer_type = hugectr.Layer_t.ReLU,
                              bottom_names = ["fc2"],
                              top_names = ["relu2"]))
  model.add(hugectr.DenseLayer(layer_type = hugectr.Layer_t.Dropout,
                              bottom_names = ["relu2"],
                              top_names = ["dropout2"],
                              dropout_rate=0.5))
  model.add(hugectr.DenseLayer(layer_type = hugectr.Layer_t.InnerProduct,
                              bottom_names = ["dropout2"],
                              top_names = ["fc3"],
                              num_output=1))
  model.add(hugectr.DenseLayer(layer_type = hugectr.Layer_t.Add,
                              bottom_names = ["fc3", "reshape2"],
                              top_names = ["add1"]))
  model.add(hugectr.DenseLayer(layer_type = hugectr.Layer_t.BinaryCrossEntropyLoss,
                              bottom_names = ["add1", "label"],
                              top_names = ["loss"]))
  model.compile()
  model.summary()
  model.fit(max_iter = 5120, display = 200, eval_interval = 1000)
  