From 36d7286b25b59d0e57c85aeb24157cf219b4281b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Redzy=C5=84ski?= Date: Mon, 22 Feb 2021 17:41:37 +0100 Subject: [PATCH 01/28] live: initial docs draft --- content/docs/dvclive/index.md | 18 ++++++++++++++++++ content/docs/dvclive/usage.md | 0 2 files changed, 18 insertions(+) create mode 100644 content/docs/dvclive/index.md create mode 100644 content/docs/dvclive/usage.md diff --git a/content/docs/dvclive/index.md b/content/docs/dvclive/index.md new file mode 100644 index 0000000000..da6b6a632b --- /dev/null +++ b/content/docs/dvclive/index.md @@ -0,0 +1,18 @@ +# dvclive + +[dvclive](https://cml.dev) is an open-source python library for monitoring +metrics in machine learning projects. Use it to log metrics during training. + +dvclive is integrated seamlesly with dvc and logs produced by it can be fed to +`dvc plots` command. Even though, one does not need dvc to visualize dvclive +logs, as they are saved into easily readable tsv format. + +We have created dvclive with two principles in mind: + +- **no dependencies** While you can install optional integrations for various + frameworks, basic dvclive installation does not need anything besides standard + python libs. +- **integration with DVC** DVC is able to recognize when its being used in + tandem with dvclive and is able to provide useful features - like producing + training summary during training. When used in DVC project user does not have + to call `dvclive.init` method. diff --git a/content/docs/dvclive/usage.md b/content/docs/dvclive/usage.md new file mode 100644 index 0000000000..e69de29bb2 From cbe791d7fc205b7c2fa599b59a8a915051df88ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Redzy=C5=84ski?= Date: Wed, 24 Feb 2021 02:18:17 +0100 Subject: [PATCH 02/28] live: initial usage section --- content/docs/dvclive/index.md | 3 +- content/docs/dvclive/usage.md | 146 ++++++++++++++++++++++++++++++++++ 2 files changed, 148 insertions(+), 1 deletion(-) diff --git a/content/docs/dvclive/index.md b/content/docs/dvclive/index.md index da6b6a632b..fa22dcb8ff 100644 --- a/content/docs/dvclive/index.md +++ b/content/docs/dvclive/index.md @@ -5,7 +5,8 @@ metrics in machine learning projects. Use it to log metrics during training. dvclive is integrated seamlesly with dvc and logs produced by it can be fed to `dvc plots` command. Even though, one does not need dvc to visualize dvclive -logs, as they are saved into easily readable tsv format. +logs, as they are saved into easily parsable tsv format, feel free to apply +custom visualization methods. We have created dvclive with two principles in mind: diff --git a/content/docs/dvclive/usage.md b/content/docs/dvclive/usage.md index e69de29bb2..d1e92432cc 100644 --- a/content/docs/dvclive/usage.md +++ b/content/docs/dvclive/usage.md @@ -0,0 +1,146 @@ +# Usage + +We will use sample [MNIST classification](http://yann.lecun.com/exdb/mnist/) +training code in order to see how one can introduce `dvclive` into the workflow. +In order to run the example, +[keras](https://keras.io/about/#installation-amp-compatibility) is required. + +The code: + +```python +from keras.datasets import mnist +from keras.models import Sequential +from keras.layers.core import Dense, Activation +from keras.utils import np_utils + +def load_data(): + (x_train, y_train), (x_test, y_test) = mnist.load_data() + + x_train = x_train.reshape(60000, 784) + x_test = x_test.reshape(10000, 784) + x_train = x_train.astype('float32') + x_test = x_test.astype('float32') + x_train /= 255 + x_test /= 255 + classes = 10 + y_train = np_utils.to_categorical(y_train, classes) + y_test = np_utils.to_categorical(y_test, classes) + return (x_train, y_train), (x_test, y_test) + +def get_model(): + model = Sequential() + model.add(Dense(512, input_dim=784)) + model.add(Activation('relu')) + + model.add(Dense(10, input_dim=512)) + + model.add(Activation('softmax')) + + model.compile(loss='categorical_crossentropy', + metrics=['accuracy'], optimizer='sgd') + return model + + +(x_train, y_train), (x_test, y_test) = load_data() +model = get_model() + +model.fit(x_train, + y_train, + validation_data=(x_test, y_test), + batch_size=128, + epochs=3) +``` + +Run the code to verify the training is running. + +In this example we are training the `model` for 10 epochs. Lets use `dvclive` to +log the `accuracy`, `loss`, `validation_accuracy` and `validation_loss` after +each epoch, so that we can observe how our training progresses. + +In order to do that, we will need to provide proper +[`Callback`](https://keras.io/api/callbacks/) for `fit` method: + +```python +from keras.callbacks import Callback +import dvclive +class DvcLiveCallback(Callback): + def on_epoch_end(self, epoch: int, logs: dict = None): + logs = logs or {} + for metric, value in logs.items(): + dvclive.log(metric, value) + dvclive.next_step() +``` + +We created callback, that, on the end of each epoch, will iterate over gathered +metrics (`logs`) and use `dvclive.log` function to log their respective value. +After logging the metrics, we call `dvclive.next_step` function to signal +`dvclive` that we are done with metrics logging for current epoch. + +In order to make it work with the training code, we need to do one more change, +we need to replace: + +```python +model.fit(x_train, + y_train, + validation_data=(x_test, y_test), + batch_size=128, + epochs=10) +``` + +with: + +```python +dvclive.init("training_metrics") +model.fit(x_train, + y_train, + validation_data=(x_test, y_test), + batch_size=128, + epochs=3, + callbacks=[MetricsCallback()]) +``` + +We call `dvclive.init` to tell `dvclive` to write metrics under +`training_metrics` directory. We also provide `callbacks` argument for `fit` +method with newly created callback. + +Rerun the code. + +After running the code, you can see that `training_metrics` directory has been +created. + +```bash +$ ls +training_metrics training_metrics.json train.py +``` + +Besides directory, `training_metrics.json` has been created. It's file +containing information about latest training step. You can prevent its creation +during `dvclive.init` call: + +```python +dvclive.init('training_metrics', summary=False) +``` + +`training_metrics` directory contains `*.tsv` files with names respective to +metrics logged during training: + +```bash +$ tree training_metrics + +training_metrics +├── accuracy.tsv +├── loss.tsv +├── val_accuracy.tsv +└── val_loss.tsv +``` + +Each of the files contains metric values logged in every training step: + +```bash +$ training_metrics/accuracy.tsv + +timestamp step accuracy +1614129197192 0 0.7612833380699158 +1614129198031 1 0.8736833333969116 +1614129198848 2 0.8907166719436646 +``` From d13ddf0f535933d846fc3f38ac99bff672013494 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Redzy=C5=84ski?= Date: Tue, 2 Mar 2021 19:22:02 +0100 Subject: [PATCH 03/28] dvclive docs: add usage with DVC section --- content/docs/dvclive/usage-with-dvc.md | 125 +++++++++++++++++++++++++ content/docs/dvclive/usage.md | 40 +++++--- static/img/dvclive_report.png | Bin 0 -> 131331 bytes 3 files changed, 152 insertions(+), 13 deletions(-) create mode 100644 content/docs/dvclive/usage-with-dvc.md create mode 100644 static/img/dvclive_report.png diff --git a/content/docs/dvclive/usage-with-dvc.md b/content/docs/dvclive/usage-with-dvc.md new file mode 100644 index 0000000000..51cf336514 --- /dev/null +++ b/content/docs/dvclive/usage-with-dvc.md @@ -0,0 +1,125 @@ +# dvclive with DVC + +Even though dvclive does not require DVC to function properly, it includes a lot +of integrations with DVC that user might find valuable. In this section we will +modify the [example from previous one](/doc/dvclive/usage) to see how DVC can +cooperate with dvclive. + +Let's use the code prepared in previous example and try to make it work with +dvc. Training file `train.py` content: + +```python +from keras.datasets import mnist +from keras.models import Sequential +from keras.layers.core import Dense, Activation +from keras.utils import np_utils + +def load_data(): + (x_train, y_train), (x_test, y_test) = mnist.load_data() + + x_train = x_train.reshape(60000, 784) + x_test = x_test.reshape(10000, 784) + x_train = x_train.astype('float32') + x_test = x_test.astype('float32') + x_train /= 255 + x_test /= 255 + classes = 10 + y_train = np_utils.to_categorical(y_train, classes) + y_test = np_utils.to_categorical(y_test, classes) + return (x_train, y_train), (x_test, y_test) + +def get_model(): + model = Sequential() + model.add(Dense(512, input_dim=784)) + model.add(Activation('relu')) + + model.add(Dense(10, input_dim=512)) + + model.add(Activation('softmax')) + + model.compile(loss='categorical_crossentropy', + metrics=['accuracy'], optimizer='sgd') + return model + + +from keras.callbacks import Callback +import dvclive + +class MetricsCallback(Callback): + def on_epoch_end(self, epoch: int, logs: dict = None): + logs = logs or {} + for metric, value in logs.items(): + dvclive.log(metric, value) + dvclive.next_step() + +(x_train, y_train), (x_test, y_test) = load_data() +model = get_model() + +dvclive.init("training_metrics") +model.fit(x_train, + y_train, + validation_data=(x_test, y_test), + batch_size=128, + epochs=3, + callbacks=[MetricsCallback()]) +``` + +DVC provides extensive integration with dvclive. When one is using dvclive in a +project managed by DVC, there is no need for manual initialization of dvclive +inside the code. + +So in case of our code we can remove the following line: + +```python +dvclive.init("training_metrics") +``` + +Now, lets use dvc to run the project: + +```dvc +$ dvc run -n train --live training_metrics -d train.py python train.py +``` + +DVC integration will allow to pass the information that `training_metrics` is +`path` argument for `dvclive.init`. Other supported args for DVC integration: + +- `--live-no-summary` - passes `summary=False` into the `dvclive`. +- `--live-no-html` - passes `html=False` into the `dvclive`. + +> Note that those `dvc run` params are only convinience methods. If you decide +> to invoke `dvclive.init` manually, the manual call config will override +> provided `run` args. In such case your `path` arg for `dvclive.init` must +> match `--live` argument. + +After the training is done you should see following content: + +```bash +$ ls + +dvc.lock training_metrics training_metrics.json +dvc.yaml training_metrics.html train.py +``` + +`training_metrics.json` and `training_metrics.html` are there because we did not +provide `--live-no-sumary` nor `--live-no-html`. If you will open +`training_metrics.html` in your browser, you will get plots for metrics logged +during the training. + +![](/img/dvclive_report.png) + +In `dvc.yaml` there is new stage defined, containing information about the +`dvclive` outputs: + +```bash +$ cat dvc.yaml + +stages: + train: + cmd: python train.py + deps: + - train.py + live: + training_metrics: + summary: true + html: true +``` diff --git a/content/docs/dvclive/usage.md b/content/docs/dvclive/usage.md index d1e92432cc..0c8f3b8bd1 100644 --- a/content/docs/dvclive/usage.md +++ b/content/docs/dvclive/usage.md @@ -5,7 +5,7 @@ training code in order to see how one can introduce `dvclive` into the workflow. In order to run the example, [keras](https://keras.io/about/#installation-amp-compatibility) is required. -The code: +The training code (`train.py` file): ```python from keras.datasets import mnist @@ -51,9 +51,9 @@ model.fit(x_train, epochs=3) ``` -Run the code to verify the training is running. +Run the code to verify the training is executing. -In this example we are training the `model` for 10 epochs. Lets use `dvclive` to +In this example we are training the `model` for 3 epochs. Lets use `dvclive` to log the `accuracy`, `loss`, `validation_accuracy` and `validation_loss` after each epoch, so that we can observe how our training progresses. @@ -63,7 +63,7 @@ In order to do that, we will need to provide proper ```python from keras.callbacks import Callback import dvclive -class DvcLiveCallback(Callback): +class MetricsCallback(Callback): def on_epoch_end(self, epoch: int, logs: dict = None): logs = logs or {} for metric, value in logs.items(): @@ -113,14 +113,6 @@ $ ls training_metrics training_metrics.json train.py ``` -Besides directory, `training_metrics.json` has been created. It's file -containing information about latest training step. You can prevent its creation -during `dvclive.init` call: - -```python -dvclive.init('training_metrics', summary=False) -``` - `training_metrics` directory contains `*.tsv` files with names respective to metrics logged during training: @@ -137,10 +129,32 @@ training_metrics Each of the files contains metric values logged in every training step: ```bash -$ training_metrics/accuracy.tsv +$ cat training_metrics/accuracy.tsv timestamp step accuracy 1614129197192 0 0.7612833380699158 1614129198031 1 0.8736833333969116 1614129198848 2 0.8907166719436646 ``` + +### Configuring dvclive + +Besides `training_metrics `directory, `training_metrics.json` has been created. +It's a file containing information about latest training step. You can prevent +its creation by providing proper `dvclive.init` config flag. + +Args supported by `dvclive.init`: + +- `path` - directory where `dvclive` will write its outputs +- `resume` (`False` by default) - If set to `True`, `dvclive` will try to read + latest `step` from `{path}` dir. Following `next_step` calls will increment + basing on found value. +- `step` (`0`) - If set, the `step` values in logs files will start incrementing + from given value. If provided alongside `resume`, `dvclive` will not try to + find latest `step` in `{path}` and start from `step`. +- `summary` (`True`) - upon each `next_step` call `dvclive` will dump a json + file containing all metrics gathered in last step. The json file has the + following name: `{path}.json`. +- `html` (`True`) - works only when `dvclive` is used alongside DVC. If true, + upon each `next_step` call, DVC will prepare summary of currently running + training with all metrics logged in `{path}`. diff --git a/static/img/dvclive_report.png b/static/img/dvclive_report.png new file mode 100644 index 0000000000000000000000000000000000000000..c9c4701d57a6415fee30b1388d6c70c557e8b560 GIT binary patch literal 131331 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%0D$T_8blKCQXkx4u=XVdEVfBMS8H_ebE&8>p?jt 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 literal 0 HcmV?d00001 From edd41385f93ee148da75a1156af440e5db1ff4aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Redzy=C5=84ski?= Date: Wed, 3 Mar 2021 11:21:14 +0100 Subject: [PATCH 04/28] Update content/docs/dvclive/index.md Co-authored-by: Dave Berenbaum --- content/docs/dvclive/index.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/content/docs/dvclive/index.md b/content/docs/dvclive/index.md index fa22dcb8ff..a03b19cd4b 100644 --- a/content/docs/dvclive/index.md +++ b/content/docs/dvclive/index.md @@ -1,7 +1,8 @@ # dvclive [dvclive](https://cml.dev) is an open-source python library for monitoring -metrics in machine learning projects. Use it to log metrics during training. +[dvclive](https://cml.dev) is an open-source python library for monitoring +the progress of metrics during training of machine learning projects. dvclive is integrated seamlesly with dvc and logs produced by it can be fed to `dvc plots` command. Even though, one does not need dvc to visualize dvclive From dde73640fa641dd45382ae7268493fd8b7bf2b38 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Redzy=C5=84ski?= Date: Wed, 3 Mar 2021 11:29:33 +0100 Subject: [PATCH 05/28] fixup --- content/docs/dvclive/index.md | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/content/docs/dvclive/index.md b/content/docs/dvclive/index.md index a03b19cd4b..c61149476e 100644 --- a/content/docs/dvclive/index.md +++ b/content/docs/dvclive/index.md @@ -1,8 +1,8 @@ # dvclive [dvclive](https://cml.dev) is an open-source python library for monitoring -[dvclive](https://cml.dev) is an open-source python library for monitoring -the progress of metrics during training of machine learning projects. +[dvclive](https://cml.dev) is an open-source python library for monitoring the +progress of metrics during training of machine learning projects. dvclive is integrated seamlesly with dvc and logs produced by it can be fed to `dvc plots` command. Even though, one does not need dvc to visualize dvclive @@ -16,5 +16,4 @@ We have created dvclive with two principles in mind: python libs. - **integration with DVC** DVC is able to recognize when its being used in tandem with dvclive and is able to provide useful features - like producing - training summary during training. When used in DVC project user does not have - to call `dvclive.init` method. + training summary during training. From 2285569f1020c8c07150b0cd6c05c918d3c04572 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Redzy=C5=84ski?= Date: Wed, 3 Mar 2021 21:48:55 +0100 Subject: [PATCH 06/28] Update content/docs/dvclive/index.md Co-authored-by: Jorge Orpinel --- content/docs/dvclive/index.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/content/docs/dvclive/index.md b/content/docs/dvclive/index.md index c61149476e..40b179e7c0 100644 --- a/content/docs/dvclive/index.md +++ b/content/docs/dvclive/index.md @@ -1,8 +1,7 @@ # dvclive -[dvclive](https://cml.dev) is an open-source python library for monitoring -[dvclive](https://cml.dev) is an open-source python library for monitoring the -progress of metrics during training of machine learning projects. +[dvclive](/doc/dvclive) is an open-source python library for monitoring +the progress of metrics during training of machine learning models. dvclive is integrated seamlesly with dvc and logs produced by it can be fed to `dvc plots` command. Even though, one does not need dvc to visualize dvclive From 4e9148c7e91d76ea41d0654c156483b89b50ea9b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Redzy=C5=84ski?= Date: Thu, 4 Mar 2021 00:20:14 +0100 Subject: [PATCH 07/28] Update content/docs/dvclive/index.md Co-authored-by: Jorge Orpinel --- content/docs/dvclive/index.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/content/docs/dvclive/index.md b/content/docs/dvclive/index.md index 40b179e7c0..b71d8ca798 100644 --- a/content/docs/dvclive/index.md +++ b/content/docs/dvclive/index.md @@ -3,10 +3,10 @@ [dvclive](/doc/dvclive) is an open-source python library for monitoring the progress of metrics during training of machine learning models. -dvclive is integrated seamlesly with dvc and logs produced by it can be fed to -`dvc plots` command. Even though, one does not need dvc to visualize dvclive -logs, as they are saved into easily parsable tsv format, feel free to apply -custom visualization methods. +Dvclive integrates seamlessly with [DVC](https://dvc.org/) and the logs it +produces can be fed as `dvc plots`. However, `dvc` is not needed to work with +`dvclive` logs, and since they're saved as easily parsable TSV files, you can +use your preferred visualization method. We have created dvclive with two principles in mind: From 8478818e8f8ada98d9cb028a5e662a9c028d0b14 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Redzy=C5=84ski?= Date: Thu, 4 Mar 2021 00:20:44 +0100 Subject: [PATCH 08/28] Update content/docs/dvclive/index.md Co-authored-by: Jorge Orpinel --- content/docs/dvclive/index.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/content/docs/dvclive/index.md b/content/docs/dvclive/index.md index b71d8ca798..97617baf73 100644 --- a/content/docs/dvclive/index.md +++ b/content/docs/dvclive/index.md @@ -8,11 +8,11 @@ produces can be fed as `dvc plots`. However, `dvc` is not needed to work with `dvclive` logs, and since they're saved as easily parsable TSV files, you can use your preferred visualization method. -We have created dvclive with two principles in mind: +We have created Dvclive with two principles in mind: -- **no dependencies** While you can install optional integrations for various - frameworks, basic dvclive installation does not need anything besides standard - python libs. -- **integration with DVC** DVC is able to recognize when its being used in - tandem with dvclive and is able to provide useful features - like producing - training summary during training. +- **No dependencies.** While you can install optional integrations for various + frameworks, the basic `dvclive` installation doesn't have requirements besides + [Python](https://www.python.org/). +- **DVC integration.** `dvc` recognizes when its being used along with + `dvclive`. This enables useful features automatically, like producing model + training summaries, among others. From 0f8b215e82d5b8da323a7877c447f41a6032726e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Redzy=C5=84ski?= Date: Thu, 4 Mar 2021 00:26:41 +0100 Subject: [PATCH 09/28] review refactor --- ...{usage-with-dvc.md => dvclive-with-dvc.md} | 65 ++++++++++++------- content/docs/sidebar.json | 12 ++++ 2 files changed, 54 insertions(+), 23 deletions(-) rename content/docs/dvclive/{usage-with-dvc.md => dvclive-with-dvc.md} (67%) diff --git a/content/docs/dvclive/usage-with-dvc.md b/content/docs/dvclive/dvclive-with-dvc.md similarity index 67% rename from content/docs/dvclive/usage-with-dvc.md rename to content/docs/dvclive/dvclive-with-dvc.md index 51cf336514..67f36174ac 100644 --- a/content/docs/dvclive/usage-with-dvc.md +++ b/content/docs/dvclive/dvclive-with-dvc.md @@ -74,26 +74,55 @@ So in case of our code we can remove the following line: dvclive.init("training_metrics") ``` -Now, lets use dvc to run the project: +Now, lets use dvc to create the stage: ```dvc -$ dvc run -n train --live training_metrics -d train.py python train.py +$ dvc stage add -n train --live training_metrics -d train.py python train.py ``` -DVC integration will allow to pass the information that `training_metrics` is -`path` argument for `dvclive.init`. Other supported args for DVC integration: +In `dvc.yaml` there is new stage defined, containing information about the +dvclive outputs. Inside the stage file, they are named `live`: + +```bash +$ cat dvc.yaml + +stages: + train: + cmd: python train.py + deps: + - train.py + live: + training_metrics: + summary: true + html: true +``` + +As you can see, `live` output has already some properties defined. + +- `summary` - if `true`, after each `next_step` call, dvclive will dump all + metrics gathered during the step into the JSON file named after `live` output. + In this case, it will be `training_metrics.json`. +- `html` - if `true`, after each `next_step` call, dvclive will signal `dvc` to + prepare training report for `live` output. Report is named after the `live` + output. In this case it will be `training_metrics.html`. -- `--live-no-summary` - passes `summary=False` into the `dvclive`. -- `--live-no-html` - passes `html=False` into the `dvclive`. +DVC integration allows to pass the information that `training_metrics` is `path` +argument for `dvclive.init`. Other supported args for DVC integration: -> Note that those `dvc run` params are only convinience methods. If you decide -> to invoke `dvclive.init` manually, the manual call config will override +- `--live-no-summary` - passes `summary=False` into the `dvc.yaml`. +- `--live-no-html` - passes `html=False` into the `dvc.yaml`. + +> Note that those `dvc stage add` params are only convinience methods. If you +> decide to invoke `dvclive.init` manually, the manual call config will override > provided `run` args. In such case your `path` arg for `dvclive.init` must > match `--live` argument. After the training is done you should see following content: ```bash +$ dvc repro train +... training happens + $ ls dvc.lock training_metrics training_metrics.json @@ -107,19 +136,9 @@ during the training. ![](/img/dvclive_report.png) -In `dvc.yaml` there is new stage defined, containing information about the -`dvclive` outputs: - -```bash -$ cat dvc.yaml +### Going further -stages: - train: - cmd: python train.py - deps: - - train.py - live: - training_metrics: - summary: true - html: true -``` +dvclive integration does not end here. dvclive is capable of creating checkpoint +signal files used by [experiments](/doc/start/experiments). See the sample +[repository](https://github.com/iterative/dvc-checkpoints-mnist) to see how to +make dvclive and experiments work together. diff --git a/content/docs/sidebar.json b/content/docs/sidebar.json index 733789ca25..9f4ddd76f7 100644 --- a/content/docs/sidebar.json +++ b/content/docs/sidebar.json @@ -477,5 +477,17 @@ "slug": "cml-with-npm" } ] + }, + { + "label": "dvclive", + "slug": "dvclive", + "source": "dvclive/index.md", + "children": [ + "usage", + { + "label": "dvclive with DVC", + "slug": "dvclive-with-dvc" + } + ] } ] From f17fdf972d85175e63542d0679d312374f35a4c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Redzy=C5=84ski?= Date: Thu, 4 Mar 2021 10:18:33 +0100 Subject: [PATCH 10/28] prettier complains fix --- content/docs/dvclive/index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/docs/dvclive/index.md b/content/docs/dvclive/index.md index 97617baf73..f2064acb12 100644 --- a/content/docs/dvclive/index.md +++ b/content/docs/dvclive/index.md @@ -1,7 +1,7 @@ # dvclive -[dvclive](/doc/dvclive) is an open-source python library for monitoring -the progress of metrics during training of machine learning models. +[dvclive](/doc/dvclive) is an open-source python library for monitoring the +progress of metrics during training of machine learning models. Dvclive integrates seamlessly with [DVC](https://dvc.org/) and the logs it produces can be fed as `dvc plots`. However, `dvc` is not needed to work with From 890d9a18e5ba554e16779724bdf1786ebaaa90fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Redzy=C5=84ski?= Date: Thu, 4 Mar 2021 10:27:01 +0100 Subject: [PATCH 11/28] fixes --- content/docs/dvclive/dvclive-with-dvc.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/content/docs/dvclive/dvclive-with-dvc.md b/content/docs/dvclive/dvclive-with-dvc.md index 67f36174ac..af5e66e720 100644 --- a/content/docs/dvclive/dvclive-with-dvc.md +++ b/content/docs/dvclive/dvclive-with-dvc.md @@ -117,12 +117,15 @@ argument for `dvclive.init`. Other supported args for DVC integration: > provided `run` args. In such case your `path` arg for `dvclive.init` must > match `--live` argument. -After the training is done you should see following content: +Run the training: ```bash $ dvc repro train -... training happens +``` + +After it is done you should see following content of your repository: +```bash $ ls dvc.lock training_metrics training_metrics.json From 280123ce6c165e22b582d6c190ac79f074b289c9 Mon Sep 17 00:00:00 2001 From: Jorge Orpinel Date: Mon, 8 Mar 2021 20:49:28 -0600 Subject: [PATCH 12/28] Update content/docs/dvclive/dvclive-with-dvc.md --- content/docs/dvclive/dvclive-with-dvc.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/docs/dvclive/dvclive-with-dvc.md b/content/docs/dvclive/dvclive-with-dvc.md index af5e66e720..fef66f28aa 100644 --- a/content/docs/dvclive/dvclive-with-dvc.md +++ b/content/docs/dvclive/dvclive-with-dvc.md @@ -1,7 +1,7 @@ # dvclive with DVC Even though dvclive does not require DVC to function properly, it includes a lot -of integrations with DVC that user might find valuable. In this section we will +of integrations with DVC that you might find valuable. In this section we will modify the [example from previous one](/doc/dvclive/usage) to see how DVC can cooperate with dvclive. From a5346650f46a4fbe6ff0051dcc68a1eab28de7ab Mon Sep 17 00:00:00 2001 From: Jorge Orpinel Date: Mon, 8 Mar 2021 20:50:19 -0600 Subject: [PATCH 13/28] Update content/docs/dvclive/dvclive-with-dvc.md --- content/docs/dvclive/dvclive-with-dvc.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/docs/dvclive/dvclive-with-dvc.md b/content/docs/dvclive/dvclive-with-dvc.md index fef66f28aa..70e3f00246 100644 --- a/content/docs/dvclive/dvclive-with-dvc.md +++ b/content/docs/dvclive/dvclive-with-dvc.md @@ -2,7 +2,7 @@ Even though dvclive does not require DVC to function properly, it includes a lot of integrations with DVC that you might find valuable. In this section we will -modify the [example from previous one](/doc/dvclive/usage) to see how DVC can +modify the [basic usage example](/doc/dvclive/usage) to see how DVC can cooperate with dvclive. Let's use the code prepared in previous example and try to make it work with From 3b373091a44cfc6d2dd2bba0dc8a0b9466423f0d Mon Sep 17 00:00:00 2001 From: Jorge Orpinel Date: Mon, 8 Mar 2021 20:51:06 -0600 Subject: [PATCH 14/28] Update content/docs/sidebar.json --- content/docs/sidebar.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/docs/sidebar.json b/content/docs/sidebar.json index 9f4ddd76f7..26e73097e7 100644 --- a/content/docs/sidebar.json +++ b/content/docs/sidebar.json @@ -479,7 +479,7 @@ ] }, { - "label": "dvclive", + "label": "Dvclive", "slug": "dvclive", "source": "dvclive/index.md", "children": [ From 54d78e06421bb887aa68a1fae5682e0eb11baf22 Mon Sep 17 00:00:00 2001 From: Jorge Orpinel Date: Mon, 8 Mar 2021 20:51:19 -0600 Subject: [PATCH 15/28] Update content/docs/sidebar.json --- content/docs/sidebar.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/docs/sidebar.json b/content/docs/sidebar.json index 26e73097e7..ba0f54fa60 100644 --- a/content/docs/sidebar.json +++ b/content/docs/sidebar.json @@ -485,7 +485,7 @@ "children": [ "usage", { - "label": "dvclive with DVC", + "label": "Dvclive with DVC", "slug": "dvclive-with-dvc" } ] From cf7fadb1b416b8ed31b881aead926b8cd74ef0c4 Mon Sep 17 00:00:00 2001 From: Jorge Orpinel Date: Mon, 8 Mar 2021 20:51:58 -0600 Subject: [PATCH 16/28] Update content/docs/dvclive/dvclive-with-dvc.md --- content/docs/dvclive/dvclive-with-dvc.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/docs/dvclive/dvclive-with-dvc.md b/content/docs/dvclive/dvclive-with-dvc.md index 70e3f00246..b91adbf733 100644 --- a/content/docs/dvclive/dvclive-with-dvc.md +++ b/content/docs/dvclive/dvclive-with-dvc.md @@ -1,4 +1,4 @@ -# dvclive with DVC +# Dvclive with DVC Even though dvclive does not require DVC to function properly, it includes a lot of integrations with DVC that you might find valuable. In this section we will From c7c0dc19c377cf607bc29324e83d4afab83d528b Mon Sep 17 00:00:00 2001 From: Jorge Orpinel Date: Mon, 8 Mar 2021 20:59:48 -0600 Subject: [PATCH 17/28] dvclive: capitalize Dvclive --- content/docs/dvclive/dvclive-with-dvc.md | 19 ++++++++++--------- content/docs/dvclive/usage.md | 6 +++--- 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/content/docs/dvclive/dvclive-with-dvc.md b/content/docs/dvclive/dvclive-with-dvc.md index b91adbf733..60cbae3573 100644 --- a/content/docs/dvclive/dvclive-with-dvc.md +++ b/content/docs/dvclive/dvclive-with-dvc.md @@ -1,9 +1,9 @@ # Dvclive with DVC -Even though dvclive does not require DVC to function properly, it includes a lot +Even though Dvclive does not require DVC to function properly, it includes a lot of integrations with DVC that you might find valuable. In this section we will modify the [basic usage example](/doc/dvclive/usage) to see how DVC can -cooperate with dvclive. +cooperate with the `dvclive` module. Let's use the code prepared in previous example and try to make it work with dvc. Training file `train.py` content: @@ -64,8 +64,8 @@ model.fit(x_train, callbacks=[MetricsCallback()]) ``` -DVC provides extensive integration with dvclive. When one is using dvclive in a -project managed by DVC, there is no need for manual initialization of dvclive +When one is using Dvclive in a +DVC project, there is no need for manual initialization of `dvclive` inside the code. So in case of our code we can remove the following line: @@ -81,7 +81,7 @@ $ dvc stage add -n train --live training_metrics -d train.py python train.py ``` In `dvc.yaml` there is new stage defined, containing information about the -dvclive outputs. Inside the stage file, they are named `live`: +Dvclive outputs. Inside the stage file, they are named `live`: ```bash $ cat dvc.yaml @@ -99,10 +99,10 @@ stages: As you can see, `live` output has already some properties defined. -- `summary` - if `true`, after each `next_step` call, dvclive will dump all +- `summary` - if `true`, after each `next_step` call, Dvclive will dump all metrics gathered during the step into the JSON file named after `live` output. In this case, it will be `training_metrics.json`. -- `html` - if `true`, after each `next_step` call, dvclive will signal `dvc` to +- `html` - if `true`, after each `next_step` call, Dvclive will signal `dvc` to prepare training report for `live` output. Report is named after the `live` output. In this case it will be `training_metrics.html`. @@ -141,7 +141,8 @@ during the training. ### Going further -dvclive integration does not end here. dvclive is capable of creating checkpoint +DVC integration does not end here. Dvclive is capable of creating checkpoint signal files used by [experiments](/doc/start/experiments). See the sample [repository](https://github.com/iterative/dvc-checkpoints-mnist) to see how to -make dvclive and experiments work together. +make `dvclive` and [DVC experiments](/doc/user-guide/experiment-management) +work together. diff --git a/content/docs/dvclive/usage.md b/content/docs/dvclive/usage.md index 0c8f3b8bd1..ce6b1e21a6 100644 --- a/content/docs/dvclive/usage.md +++ b/content/docs/dvclive/usage.md @@ -1,7 +1,7 @@ # Usage We will use sample [MNIST classification](http://yann.lecun.com/exdb/mnist/) -training code in order to see how one can introduce `dvclive` into the workflow. +training code in order to see how one can introduce Dvclive into the workflow. In order to run the example, [keras](https://keras.io/about/#installation-amp-compatibility) is required. @@ -74,7 +74,7 @@ class MetricsCallback(Callback): We created callback, that, on the end of each epoch, will iterate over gathered metrics (`logs`) and use `dvclive.log` function to log their respective value. After logging the metrics, we call `dvclive.next_step` function to signal -`dvclive` that we are done with metrics logging for current epoch. +Dvclive that we are done with metrics logging for current epoch. In order to make it work with the training code, we need to do one more change, we need to replace: @@ -137,7 +137,7 @@ timestamp step accuracy 1614129198848 2 0.8907166719436646 ``` -### Configuring dvclive +### Configuring Dvclive Besides `training_metrics `directory, `training_metrics.json` has been created. It's a file containing information about latest training step. You can prevent From 507d9912aeba092463238d04027fd94df99a0418 Mon Sep 17 00:00:00 2001 From: "Restyled.io" Date: Tue, 9 Mar 2021 03:00:11 +0000 Subject: [PATCH 18/28] Restyled by prettier --- content/docs/dvclive/dvclive-with-dvc.md | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/content/docs/dvclive/dvclive-with-dvc.md b/content/docs/dvclive/dvclive-with-dvc.md index 60cbae3573..5dbdf50cc2 100644 --- a/content/docs/dvclive/dvclive-with-dvc.md +++ b/content/docs/dvclive/dvclive-with-dvc.md @@ -64,9 +64,8 @@ model.fit(x_train, callbacks=[MetricsCallback()]) ``` -When one is using Dvclive in a -DVC project, there is no need for manual initialization of `dvclive` -inside the code. +When one is using Dvclive in a DVC project, there is no need for manual +initialization of `dvclive` inside the code. So in case of our code we can remove the following line: @@ -144,5 +143,5 @@ during the training. DVC integration does not end here. Dvclive is capable of creating checkpoint signal files used by [experiments](/doc/start/experiments). See the sample [repository](https://github.com/iterative/dvc-checkpoints-mnist) to see how to -make `dvclive` and [DVC experiments](/doc/user-guide/experiment-management) -work together. +make `dvclive` and [DVC experiments](/doc/user-guide/experiment-management) work +together. From a3da8ceecdf7b463bf0eb9d2b4ffb6ef01462b19 Mon Sep 17 00:00:00 2001 From: Jorge Orpinel Date: Mon, 8 Mar 2021 21:02:05 -0600 Subject: [PATCH 19/28] Update content/docs/dvclive/index.md --- content/docs/dvclive/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/docs/dvclive/index.md b/content/docs/dvclive/index.md index f2064acb12..65948f97d2 100644 --- a/content/docs/dvclive/index.md +++ b/content/docs/dvclive/index.md @@ -1,6 +1,6 @@ # dvclive -[dvclive](/doc/dvclive) is an open-source python library for monitoring the +[`dvclive`](/doc/dvclive) is an open-source python library for monitoring the progress of metrics during training of machine learning models. Dvclive integrates seamlessly with [DVC](https://dvc.org/) and the logs it From cd8a7295a4f474fe8f6a4af592c5fea912cdf100 Mon Sep 17 00:00:00 2001 From: Jorge Orpinel Date: Mon, 8 Mar 2021 21:02:57 -0600 Subject: [PATCH 20/28] Update content/docs/dvclive/index.md --- content/docs/dvclive/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/docs/dvclive/index.md b/content/docs/dvclive/index.md index 65948f97d2..6ddfaff16c 100644 --- a/content/docs/dvclive/index.md +++ b/content/docs/dvclive/index.md @@ -1,6 +1,6 @@ # dvclive -[`dvclive`](/doc/dvclive) is an open-source python library for monitoring the +[`dvclive`](/doc/dvclive) is an open-source Python library for monitoring the progress of metrics during training of machine learning models. Dvclive integrates seamlessly with [DVC](https://dvc.org/) and the logs it From 8b3dcf44cb62a8683a131dafa0477a17e3554ef6 Mon Sep 17 00:00:00 2001 From: Jorge Orpinel Date: Tue, 9 Mar 2021 02:28:08 -0600 Subject: [PATCH 21/28] dvclive: usage copy edits --- content/docs/dvclive/usage.md | 126 +++++++++++++++------------------- 1 file changed, 54 insertions(+), 72 deletions(-) diff --git a/content/docs/dvclive/usage.md b/content/docs/dvclive/usage.md index ce6b1e21a6..043e15ad7e 100644 --- a/content/docs/dvclive/usage.md +++ b/content/docs/dvclive/usage.md @@ -2,12 +2,12 @@ We will use sample [MNIST classification](http://yann.lecun.com/exdb/mnist/) training code in order to see how one can introduce Dvclive into the workflow. -In order to run the example, -[keras](https://keras.io/about/#installation-amp-compatibility) is required. -The training code (`train.py` file): +> Note that [keras](https://keras.io/about/#installation-amp-compatibility) is +> required throughout these examples. ```python +# train.py from keras.datasets import mnist from keras.models import Sequential from keras.layers.core import Dense, Activation @@ -51,14 +51,14 @@ model.fit(x_train, epochs=3) ``` -Run the code to verify the training is executing. +> You may want to run the code manually to verify that the model gets trained. In this example we are training the `model` for 3 epochs. Lets use `dvclive` to log the `accuracy`, `loss`, `validation_accuracy` and `validation_loss` after -each epoch, so that we can observe how our training progresses. +each epoch, so that we can observe how the training progresses. -In order to do that, we will need to provide proper -[`Callback`](https://keras.io/api/callbacks/) for `fit` method: +In order to do that, we will provide a +[`Callback`](https://keras.io/api/callbacks/) for the `fit` method call: ```python from keras.callbacks import Callback @@ -71,90 +71,72 @@ class MetricsCallback(Callback): dvclive.next_step() ``` -We created callback, that, on the end of each epoch, will iterate over gathered -metrics (`logs`) and use `dvclive.log` function to log their respective value. -After logging the metrics, we call `dvclive.next_step` function to signal -Dvclive that we are done with metrics logging for current epoch. - -In order to make it work with the training code, we need to do one more change, -we need to replace: - -```python -model.fit(x_train, - y_train, - validation_data=(x_test, y_test), - batch_size=128, - epochs=10) +On the end of each epoch, this callback will iterate over the gathered +metrics (`logs`) and use the `dvclive.log()` function to record their respective value. +After that we call `dvclive.next_step()` to signal +Dvclive that we are done logging for the current iteration. + +And in order to make that work, we need to plug it in with this change: + +```diff ++ dvclive.init("training_metrics") + model.fit(x_train, + y_train, + validation_data=(x_test, y_test), + batch_size=128, +- epochs=3) ++ epochs=3, ++ callbacks=[MetricsCallback()]) ``` -with: +We call `dvclive.init()` first, which tells Dvclive to write metrics under the +diven directory path (in this case `./training_metrics`). -```python -dvclive.init("training_metrics") -model.fit(x_train, - y_train, - validation_data=(x_test, y_test), - batch_size=128, - epochs=3, - callbacks=[MetricsCallback()]) -``` - -We call `dvclive.init` to tell `dvclive` to write metrics under -`training_metrics` directory. We also provide `callbacks` argument for `fit` -method with newly created callback. - -Rerun the code. - -After running the code, you can see that `training_metrics` directory has been -created. +After running the code, the `training_metrics` should be created: ```bash $ ls training_metrics training_metrics.json train.py ``` -`training_metrics` directory contains `*.tsv` files with names respective to -metrics logged during training: +The `*.tsv` files inside have names corresponding to the +metrics logged during training. Note that a `training_metrics.json` file has been created as well. +It's contains information about latest training step. You can prevent +its creation by sending `summary = False` to `dvclive.init()` (see all the [options](#initial-configuration)). -```bash -$ tree training_metrics -training_metrics -├── accuracy.tsv -├── loss.tsv -├── val_accuracy.tsv -└── val_loss.tsv +```bash +$ ls training_metrics +accuracy.tsv loss.tsv val_accuracy.tsv val_loss.tsv ``` -Each of the files contains metric values logged in every training step: +Each file contains metrics values logged in each epoch. For example: ```bash $ cat training_metrics/accuracy.tsv - timestamp step accuracy 1614129197192 0 0.7612833380699158 1614129198031 1 0.8736833333969116 1614129198848 2 0.8907166719436646 ``` -### Configuring Dvclive - -Besides `training_metrics `directory, `training_metrics.json` has been created. -It's a file containing information about latest training step. You can prevent -its creation by providing proper `dvclive.init` config flag. - -Args supported by `dvclive.init`: - -- `path` - directory where `dvclive` will write its outputs -- `resume` (`False` by default) - If set to `True`, `dvclive` will try to read - latest `step` from `{path}` dir. Following `next_step` calls will increment - basing on found value. -- `step` (`0`) - If set, the `step` values in logs files will start incrementing - from given value. If provided alongside `resume`, `dvclive` will not try to - find latest `step` in `{path}` and start from `step`. -- `summary` (`True`) - upon each `next_step` call `dvclive` will dump a json - file containing all metrics gathered in last step. The json file has the - following name: `{path}.json`. -- `html` (`True`) - works only when `dvclive` is used alongside DVC. If true, - upon each `next_step` call, DVC will prepare summary of currently running - training with all metrics logged in `{path}`. +### Initial configuration + +These are the arguments accepted by `dvclive.init()`: + +- `path` (**required**) - directory where `dvclive` will write TSV log files + +- `step` (`0` by default) - the `step` values in log files will start incrementing + from this value. + +- `resume` (`False`) - if set to `True`, Dvclive will try to read the + previous `step` from the `path` dir and start from that point (unless a `step` is passed explicitly). + Subsequent `next_step()` calls will increment the step. + +- `summary` (`True`) - upon each `next_step()` call, Dvclive will dump a JSON + file containing all metrics gathered in the last step. This file uses the + following naming: `.json` (`path` being the logging directory passed to `init()`). + +- `html` (`True`) - works only when Dvclive is used alongside DVC. If true, + upon each `next_step()` call, DVC will prepare summary of the training currently running, + with all metrics logged in `path`. From b4f87c116a473bdb326173f01ea3451d30b5bb9c Mon Sep 17 00:00:00 2001 From: "Restyled.io" Date: Tue, 9 Mar 2021 08:28:19 +0000 Subject: [PATCH 22/28] Restyled by prettier --- content/docs/dvclive/usage.md | 37 ++++++++++++++++++----------------- 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/content/docs/dvclive/usage.md b/content/docs/dvclive/usage.md index 043e15ad7e..dc50a3a98b 100644 --- a/content/docs/dvclive/usage.md +++ b/content/docs/dvclive/usage.md @@ -71,10 +71,10 @@ class MetricsCallback(Callback): dvclive.next_step() ``` -On the end of each epoch, this callback will iterate over the gathered -metrics (`logs`) and use the `dvclive.log()` function to record their respective value. -After that we call `dvclive.next_step()` to signal -Dvclive that we are done logging for the current iteration. +On the end of each epoch, this callback will iterate over the gathered metrics +(`logs`) and use the `dvclive.log()` function to record their respective value. +After that we call `dvclive.next_step()` to signal Dvclive that we are done +logging for the current iteration. And in order to make that work, we need to plug it in with this change: @@ -99,11 +99,11 @@ $ ls training_metrics training_metrics.json train.py ``` -The `*.tsv` files inside have names corresponding to the -metrics logged during training. Note that a `training_metrics.json` file has been created as well. -It's contains information about latest training step. You can prevent -its creation by sending `summary = False` to `dvclive.init()` (see all the [options](#initial-configuration)). - +The `*.tsv` files inside have names corresponding to the metrics logged during +training. Note that a `training_metrics.json` file has been created as well. +It's contains information about latest training step. You can prevent its +creation by sending `summary = False` to `dvclive.init()` (see all the +[options](#initial-configuration)). ```bash $ ls training_metrics @@ -126,17 +126,18 @@ These are the arguments accepted by `dvclive.init()`: - `path` (**required**) - directory where `dvclive` will write TSV log files -- `step` (`0` by default) - the `step` values in log files will start incrementing - from this value. +- `step` (`0` by default) - the `step` values in log files will start + incrementing from this value. -- `resume` (`False`) - if set to `True`, Dvclive will try to read the - previous `step` from the `path` dir and start from that point (unless a `step` is passed explicitly). - Subsequent `next_step()` calls will increment the step. +- `resume` (`False`) - if set to `True`, Dvclive will try to read the previous + `step` from the `path` dir and start from that point (unless a `step` is + passed explicitly). Subsequent `next_step()` calls will increment the step. - `summary` (`True`) - upon each `next_step()` call, Dvclive will dump a JSON file containing all metrics gathered in the last step. This file uses the - following naming: `.json` (`path` being the logging directory passed to `init()`). + following naming: `.json` (`path` being the logging directory passed to + `init()`). -- `html` (`True`) - works only when Dvclive is used alongside DVC. If true, - upon each `next_step()` call, DVC will prepare summary of the training currently running, - with all metrics logged in `path`. +- `html` (`True`) - works only when Dvclive is used alongside DVC. If true, upon + each `next_step()` call, DVC will prepare summary of the training currently + running, with all metrics logged in `path`. From 7c069347d1dbd363e934d95d5a1f0639c2c7c492 Mon Sep 17 00:00:00 2001 From: Jorge Orpinel Date: Tue, 9 Mar 2021 02:39:17 -0600 Subject: [PATCH 23/28] Update content/docs/dvclive/usage.md --- content/docs/dvclive/usage.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/docs/dvclive/usage.md b/content/docs/dvclive/usage.md index dc50a3a98b..0a835f4596 100644 --- a/content/docs/dvclive/usage.md +++ b/content/docs/dvclive/usage.md @@ -120,7 +120,7 @@ timestamp step accuracy 1614129198848 2 0.8907166719436646 ``` -### Initial configuration +## Initial configuration These are the arguments accepted by `dvclive.init()`: From 05ae8745ab7613811cbe0b95fdbe5f79859b7245 Mon Sep 17 00:00:00 2001 From: Jorge Orpinel Date: Tue, 9 Mar 2021 02:41:46 -0600 Subject: [PATCH 24/28] Update content/docs/dvclive/usage.md --- content/docs/dvclive/usage.md | 1 + 1 file changed, 1 insertion(+) diff --git a/content/docs/dvclive/usage.md b/content/docs/dvclive/usage.md index 0a835f4596..66fb32750f 100644 --- a/content/docs/dvclive/usage.md +++ b/content/docs/dvclive/usage.md @@ -8,6 +8,7 @@ training code in order to see how one can introduce Dvclive into the workflow. ```python # train.py + from keras.datasets import mnist from keras.models import Sequential from keras.layers.core import Dense, Activation From 402ef5b53188f7272f1d92679a41ab05055e54ed Mon Sep 17 00:00:00 2001 From: Jorge Orpinel Date: Tue, 9 Mar 2021 03:12:57 -0600 Subject: [PATCH 25/28] dvclive: DVC copy edits --- content/docs/dvclive/dvclive-with-dvc.md | 84 +++++++++--------------- 1 file changed, 32 insertions(+), 52 deletions(-) diff --git a/content/docs/dvclive/dvclive-with-dvc.md b/content/docs/dvclive/dvclive-with-dvc.md index 5dbdf50cc2..94921d9900 100644 --- a/content/docs/dvclive/dvclive-with-dvc.md +++ b/content/docs/dvclive/dvclive-with-dvc.md @@ -1,14 +1,14 @@ # Dvclive with DVC -Even though Dvclive does not require DVC to function properly, it includes a lot -of integrations with DVC that you might find valuable. In this section we will -modify the [basic usage example](/doc/dvclive/usage) to see how DVC can -cooperate with the `dvclive` module. +Even though Dvclive does not require DVC, they can integrate in several useful ways. -Let's use the code prepared in previous example and try to make it work with -dvc. Training file `train.py` content: +> In this section we will +> modify the [basic usage example](/doc/dvclive/usage) to see how DVC can +> cooperate with Dvclive module. ```python +# train.py + from keras.datasets import mnist from keras.models import Sequential from keras.layers.core import Dense, Activation @@ -55,7 +55,7 @@ class MetricsCallback(Callback): (x_train, y_train), (x_test, y_test) = load_data() model = get_model() -dvclive.init("training_metrics") +# dvclive.init("training_metrics") # Implicit with DVC model.fit(x_train, y_train, validation_data=(x_test, y_test), @@ -64,27 +64,20 @@ model.fit(x_train, callbacks=[MetricsCallback()]) ``` -When one is using Dvclive in a DVC project, there is no need for manual -initialization of `dvclive` inside the code. - -So in case of our code we can remove the following line: - -```python -dvclive.init("training_metrics") -``` +Note that when using Dvclive in a DVC project, there is no need for manual +initialization of Dvclive (no `dvclive.init()` call). -Now, lets use dvc to create the stage: +Let's use `dvc stage add` to create a stage to wrap this code (don't forget to `dvc init` first): ```dvc -$ dvc stage add -n train --live training_metrics -d train.py python train.py +$ dvc stage add -n train --live training_metrics + -d train.py python train.py ``` -In `dvc.yaml` there is new stage defined, containing information about the -Dvclive outputs. Inside the stage file, they are named `live`: - -```bash -$ cat dvc.yaml +`dvc.yaml` will contain a new `train` stage with the +Dvclive [configuration](/doc/dvclive/usage#initial-configuration) (in the `live` field): +```yaml stages: train: cmd: python train.py @@ -96,52 +89,39 @@ stages: html: true ``` -As you can see, `live` output has already some properties defined. - -- `summary` - if `true`, after each `next_step` call, Dvclive will dump all - metrics gathered during the step into the JSON file named after `live` output. - In this case, it will be `training_metrics.json`. -- `html` - if `true`, after each `next_step` call, Dvclive will signal `dvc` to - prepare training report for `live` output. Report is named after the `live` - output. In this case it will be `training_metrics.html`. +The value passed to `--live` (`training_metrics`) became the directory `path` +for Dvclive to write logs in. Other supported command options for DVC integration: -DVC integration allows to pass the information that `training_metrics` is `path` -argument for `dvclive.init`. Other supported args for DVC integration: +- `--live-no-summary` - passes `summary=False` to Dvclive. +- `--live-no-html` - passes `html=False` to Dvclive. -- `--live-no-summary` - passes `summary=False` into the `dvc.yaml`. -- `--live-no-html` - passes `html=False` into the `dvc.yaml`. +> Note that these are convenience CLI options. You can still +> use `dvclive.init()` manually, which it will override +> `dvc stage add` flags. Just be careful to match the `--live` value (CLI) and +> `path` argument (code). -> Note that those `dvc stage add` params are only convinience methods. If you -> decide to invoke `dvclive.init` manually, the manual call config will override -> provided `run` args. In such case your `path` arg for `dvclive.init` must -> match `--live` argument. - -Run the training: +Run the training with `dvc repro`: ```bash $ dvc repro train ``` -After it is done you should see following content of your repository: +After that's finished, you should see the following content in the project: ```bash $ ls - dvc.lock training_metrics training_metrics.json dvc.yaml training_metrics.html train.py ``` -`training_metrics.json` and `training_metrics.html` are there because we did not -provide `--live-no-sumary` nor `--live-no-html`. If you will open -`training_metrics.html` in your browser, you will get plots for metrics logged -during the training. +If you open +`training_metrics.html` in a browser, you'll see a plot for metrics logged +during the model training! ![](/img/dvclive_report.png) -### Going further +## Further integrations -DVC integration does not end here. Dvclive is capable of creating checkpoint -signal files used by [experiments](/doc/start/experiments). See the sample -[repository](https://github.com/iterative/dvc-checkpoints-mnist) to see how to -make `dvclive` and [DVC experiments](/doc/user-guide/experiment-management) work -together. +Dvclive is capable of creating _checkpoint_ +signal files used by [experiments](/doc/user-guide/experiment-management). See this example +[repository](https://github.com/iterative/dvc-checkpoints-mnist) to see how. From b0f5481b2264ec23ca2e6c24abd760a15465ebca Mon Sep 17 00:00:00 2001 From: "Restyled.io" Date: Tue, 9 Mar 2021 09:13:35 +0000 Subject: [PATCH 26/28] Restyled by prettier --- content/docs/dvclive/dvclive-with-dvc.md | 36 ++++++++++++------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/content/docs/dvclive/dvclive-with-dvc.md b/content/docs/dvclive/dvclive-with-dvc.md index 94921d9900..3622f745bf 100644 --- a/content/docs/dvclive/dvclive-with-dvc.md +++ b/content/docs/dvclive/dvclive-with-dvc.md @@ -1,10 +1,10 @@ # Dvclive with DVC -Even though Dvclive does not require DVC, they can integrate in several useful ways. +Even though Dvclive does not require DVC, they can integrate in several useful +ways. -> In this section we will -> modify the [basic usage example](/doc/dvclive/usage) to see how DVC can -> cooperate with Dvclive module. +> In this section we will modify the [basic usage example](/doc/dvclive/usage) +> to see how DVC can cooperate with Dvclive module. ```python # train.py @@ -67,22 +67,23 @@ model.fit(x_train, Note that when using Dvclive in a DVC project, there is no need for manual initialization of Dvclive (no `dvclive.init()` call). -Let's use `dvc stage add` to create a stage to wrap this code (don't forget to `dvc init` first): +Let's use `dvc stage add` to create a stage to wrap this code (don't forget to +`dvc init` first): ```dvc $ dvc stage add -n train --live training_metrics -d train.py python train.py ``` -`dvc.yaml` will contain a new `train` stage with the -Dvclive [configuration](/doc/dvclive/usage#initial-configuration) (in the `live` field): +`dvc.yaml` will contain a new `train` stage with the Dvclive +[configuration](/doc/dvclive/usage#initial-configuration) (in the `live` field): ```yaml stages: train: cmd: python train.py deps: - - train.py + - train.py live: training_metrics: summary: true @@ -90,15 +91,15 @@ stages: ``` The value passed to `--live` (`training_metrics`) became the directory `path` -for Dvclive to write logs in. Other supported command options for DVC integration: +for Dvclive to write logs in. Other supported command options for DVC +integration: - `--live-no-summary` - passes `summary=False` to Dvclive. - `--live-no-html` - passes `html=False` to Dvclive. -> Note that these are convenience CLI options. You can still -> use `dvclive.init()` manually, which it will override -> `dvc stage add` flags. Just be careful to match the `--live` value (CLI) and -> `path` argument (code). +> Note that these are convenience CLI options. You can still use +> `dvclive.init()` manually, which it will override `dvc stage add` flags. Just +> be careful to match the `--live` value (CLI) and `path` argument (code). Run the training with `dvc repro`: @@ -114,14 +115,13 @@ dvc.lock training_metrics training_metrics.json dvc.yaml training_metrics.html train.py ``` -If you open -`training_metrics.html` in a browser, you'll see a plot for metrics logged -during the model training! +If you open `training_metrics.html` in a browser, you'll see a plot for metrics +logged during the model training! ![](/img/dvclive_report.png) ## Further integrations -Dvclive is capable of creating _checkpoint_ -signal files used by [experiments](/doc/user-guide/experiment-management). See this example +Dvclive is capable of creating _checkpoint_ signal files used by +[experiments](/doc/user-guide/experiment-management). See this example [repository](https://github.com/iterative/dvc-checkpoints-mnist) to see how. From 837ba4a161e50f9f9d9b9db464c9779e013965d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Redzy=C5=84ski?= Date: Tue, 9 Mar 2021 11:09:27 +0100 Subject: [PATCH 27/28] Update content/docs/dvclive/usage.md Co-authored-by: Jorge Orpinel --- content/docs/dvclive/usage.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/docs/dvclive/usage.md b/content/docs/dvclive/usage.md index 66fb32750f..39b1690161 100644 --- a/content/docs/dvclive/usage.md +++ b/content/docs/dvclive/usage.md @@ -1,4 +1,4 @@ -# Usage +# Usage Guide We will use sample [MNIST classification](http://yann.lecun.com/exdb/mnist/) training code in order to see how one can introduce Dvclive into the workflow. From 1c60f278c47bf422bff207b907b068d0ee053c09 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Redzy=C5=84ski?= Date: Tue, 9 Mar 2021 11:30:07 +0100 Subject: [PATCH 28/28] fixup --- content/docs/dvclive/dvclive-with-dvc.md | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/content/docs/dvclive/dvclive-with-dvc.md b/content/docs/dvclive/dvclive-with-dvc.md index 3622f745bf..a0d5e2575c 100644 --- a/content/docs/dvclive/dvclive-with-dvc.md +++ b/content/docs/dvclive/dvclive-with-dvc.md @@ -120,8 +120,6 @@ logged during the model training! ![](/img/dvclive_report.png) -## Further integrations - -Dvclive is capable of creating _checkpoint_ signal files used by -[experiments](/doc/user-guide/experiment-management). See this example -[repository](https://github.com/iterative/dvc-checkpoints-mnist) to see how. +> Dvclive is capable of creating _checkpoint_ signal files used by +> [experiments](/doc/user-guide/experiment-management). See this example +> [repository](https://github.com/iterative/dvc-checkpoints-mnist) to see how.