tensorflow / tensorflow/recommenders
Computing Top-K accuracy on validation data is unproportionately slow
@maciejkula is already working on this.
Since Oct 12, 2021.
- Dominant language
- Python
- Stars
- 2k
- Forks
- 300
- PR merge metrics
- No merged PRs in 30d
Description
I use TFRS in an e-commerce retail setting with a lot of purchase history data as well as click-stream data, using a multitask recommender model. I have created a model that works fine to train, evaluate and serve, with one unfortunate issue: validation during training takes 5x the time of the training, on a fraction of the data. To exemplify, I have 10M rows of interactions, that I split into 70/20/10 split for training/validation/test. There are 1M unique users and 100k unique items.
I train using 4 GPU's, and one epoch takes ~4 minutes to run through the 7M training rows, but another ~20 minutes to get Top-K accuracy on the validation data (2M rows). During training, I make sure to specify compute_metrics=not training.
My retrieval task is set up as follows, where I use as large batch-size as my hardware allows to speed it up as much as possible.
self.retrieval_task: tf.keras.layers.Layer = tfrs.tasks.Retrieval(
loss=...,
metrics=tfrs.metrics.FactorizedTopK(candidates=items_ds.batch(8192).map(self.item_model))
)
And I train as follows:
model.fit(train.batch(BATCH_SIZE),
epochs=15,
validation_data=val.batch(BATCH_SIZE)
)
If I run 15 epochs I spend 1 hour training and 5 hours validating, on one seventh of the data.
Is this immense time difference expected? Anything I can do to improve the performance during validation?
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Assessment
This issue has not been assessed yet.