@@ -94,7 +94,7 @@ ds = hb.data.ParquetDataset(
9494 batch_size = 1024 ,
9595 fields = [' a' , ' c' ])
9696# Convert results to sparse tensors.
97- ds = ds.apply(hb.data.to_sparse ())
97+ ds = ds.apply(hb.data.parse ())
9898ds = ds.prefetch(4 )
9999it = tf.data.make_one_shot_iterator(ds)
100100batch = it.get_next()
@@ -118,11 +118,61 @@ ds = filenames.apply(hb.data.read_parquet(1024, fields=fields))
118118ds = ds.prefetch(4 )
119119it = tf.data.make_one_shot_iterator(ds)
120120batch = it.get_next()
121- # {'a ': tensora , 'c ': tensorc }
121+ # {'A ': scalar_tensor , 'C ': sparse_tensor }
122122...
123123```
124124
125- ### 2.6 Benchmark
125+ ### 2.6 Example: Parse to tensors and sparse tensors
126+
127+ ``` python
128+ import tensorflow as tf
129+ import hybridbackend.tensorflow as hb
130+
131+ # Define data frame fields.
132+ fields = [
133+ hb.data.DataFrame.Field(' A' , tf.int64), # scalar
134+ hb.data.DataFrame.Field(' B' , tf.int64, shape = [32 ]), # fixed-length list
135+ hb.data.DataFrame.Field(' C' , tf.int64, ragged_rank = 1 ), # variable-length list
136+ hb.data.DataFrame.Field(' D' , tf.int64, ragged_rank = 1 )] # variable-length list
137+ # Read from parquet files by reading upstream filename dataset.
138+ ds = hb.data.ParquetDataset(
139+ ' /path/to/f1.parquet' ,
140+ fields = fields,
141+ batch_size = 1024 )
142+ ds = ds.apply(hb.data.parse(pad = {' D' : True }))
143+ ds = ds.prefetch(4 )
144+ it = tf.data.make_one_shot_iterator(ds)
145+ batch = it.get_next()
146+ # {'A': scalar_tensor, 'B': list_tensor, 'C': sparse_tensor, 'D': padded_list_tensor}
147+ ...
148+ ```
149+
150+ ### 2.7 Example: Remove dataset ops in exported saved model
151+
152+ ``` python
153+ import tensorflow as tf
154+ from tensorflow.tools.graph_transforms import TransformGraph
155+ import hybridbackend.tensorflow as hb
156+
157+ # ...
158+ model_inputs = {t.name.split(" :" )[0 ]: t for t in model.inputs}
159+ model_outputs = {t.name.split(" :" )[0 ]: t for t in model.outputs}
160+ train_graph_def = tf.get_default_graph().as_graph_def()
161+ predict_graph_def = TransformGraph(
162+ train_graph_def,
163+ list (model_inputs.keys()),
164+ list (model_outputs.keys()),
165+ [' strip_unused_nodes' ])
166+ with tf.Graph().as_default() as predict_graph:
167+ tf.import_graph_def(predict_graph_def, name = ' ' )
168+ with tf.Session(graph = predict_graph) as predict_sess:
169+ tf.saved_model.simple_save(
170+ predict_sess, export_dir,
171+ inputs = model_inputs,
172+ outputs = model_outputs)
173+ ```
174+
175+ ### 2.8 Benchmark
126176
127177In benchmark for reading 20k samples from 200 columns of a Parquet file,
128178` hb.data.ParquetDataset ` is about ** 21.51x faster** than
@@ -145,7 +195,7 @@ Parquet (SNAPPY) | 3346.10 | HybridBackend | 20 | 21.67
145195 Set `MALLOC_CONF` to `"background_thread:true,metadata_thp:auto"` to speed
146196 up memory access.
147197.. note::
148- Set `ARROW_NUM_THREADS` to read different columns in parallel.
198+ Set `ARROW_NUM_THREADS` to parse different columns in parallel.
149199```
150200
151201## 3. Data Pipeline Functions
@@ -155,7 +205,7 @@ HybridBackend supports various data pipeline functions for common tasks.
155205### 3.1 APIs
156206
157207``` {eval-rst}
158- .. autofunction:: hybridbackend.tensorflow.data.to_sparse
208+ .. autofunction:: hybridbackend.tensorflow.data.parse
159209.. autofunction:: hybridbackend.tensorflow.data.rebatch
160210```
161211
@@ -171,7 +221,7 @@ ds = hb.data.ParquetDataset(
171221 batch_size = 1024 ,
172222 fields = [' a' , ' c' ])
173223# Convert results to sparse tensors.
174- ds = ds.apply(hb.data.to_sparse ())
224+ ds = ds.apply(hb.data.parse ())
175225ds = ds.prefetch(4 )
176226it = tf.data.make_one_shot_iterator(ds)
177227batch = it.get_next()
@@ -196,7 +246,7 @@ ds = ds.shuffle(2048 // 256)
196246# Change batch size to 1024.
197247ds = ds.apply(hb.data.rebatch(1024 , fields = fields))
198248# Convert results to sparse tensors.
199- ds = ds.apply(hb.data.to_sparse ())
249+ ds = ds.apply(hb.data.parse ())
200250ds = ds.prefetch(4 )
201251it = tf.data.make_one_shot_iterator(ds)
202252batch = it.get_next()
0 commit comments