From 3a485da00c3a5890ac30dab7ad99f4f4ea350aee Mon Sep 17 00:00:00 2001 From: Jorge Orpinel Date: Wed, 3 Feb 2021 12:05:57 -0600 Subject: [PATCH 001/100] config: better s3.configpath explanation (after #2140) --- content/docs/command-reference/cache/dir.md | 6 +++--- content/docs/command-reference/config.md | 8 ++++---- content/docs/command-reference/remote/modify.md | 11 ++++++++--- 3 files changed, 15 insertions(+), 10 deletions(-) diff --git a/content/docs/command-reference/cache/dir.md b/content/docs/command-reference/cache/dir.md index d689c40806..fbc4579c8d 100644 --- a/content/docs/command-reference/cache/dir.md +++ b/content/docs/command-reference/cache/dir.md @@ -29,10 +29,10 @@ cache directory. ## Options -- `--global` - modify a global config file (e.g. `~/.config/dvc/config`) instead - of the project's `.dvc/config`. +- `--global` - modify the global config file (e.g. `~/.config/dvc/config`) + instead of the project's `.dvc/config`. -- `--system` - modify a system config file (e.g. `/etc/dvc/config`) instead of +- `--system` - modify the system config file (e.g. `/etc/dvc/config`) instead of `.dvc/config`. - `--local` - modify a local [config file](/doc/command-reference/config) diff --git a/content/docs/command-reference/config.md b/content/docs/command-reference/config.md index b39ee0731a..539692f3be 100644 --- a/content/docs/command-reference/config.md +++ b/content/docs/command-reference/config.md @@ -61,11 +61,11 @@ multiple projects and users, respectively: need to specify private config option values that you don't want to track and share with Git (credentials, private locations, etc). -- `--global` - modify a global config file (e.g. `~/.config/dvc/config`) instead - of the project's `.dvc/config`. Useful to apply config options to all your - projects. +- `--global` - modify the global config file (e.g. `~/.config/dvc/config`) + instead of the project's `.dvc/config`. Useful to apply config options to all + your projects. -- `--system` - modify a system config file (e.g. `/etc/dvc/config`) instead of +- `--system` - modify the system config file (e.g. `/etc/dvc/config`) instead of `.dvc/config`. Useful to apply config options to all the projects (all users) in the machine. May require superuser access e.g. `sudo dvc config --system ...` (Linux). diff --git a/content/docs/command-reference/remote/modify.md b/content/docs/command-reference/remote/modify.md index 6c1705e41c..d82d905fd3 100644 --- a/content/docs/command-reference/remote/modify.md +++ b/content/docs/command-reference/remote/modify.md @@ -134,14 +134,19 @@ these parameters, you could use the following options. $ dvc remote modify myremote credentialpath /path/to/creds ``` -- `configpath` - path to the AWS config file. The location defaults to - `~/.aws/config`. It supports S3-specific - [configuration values](https://docs.aws.amazon.com/cli/latest/topic/s3-config.html#configuration-values): +- `configpath` - path to the + [AWS CLI config file](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-files.html). + The default AWS CLI config file path (e.g. `~/.aws/config`) is used if this + parameter isn't set. ```dvc $ dvc remote modify myremote --local configpath /path/to/config ``` + > Note that only the S3-specific + > [configuration values](https://docs.aws.amazon.com/cli/latest/topic/s3-config.html#configuration-values) + > are used. + - `endpointurl` - endpoint URL to access S3: ```dvc From c965762ca06e0c152f747f2863ac3c813b903206 Mon Sep 17 00:00:00 2001 From: Jorge Orpinel Date: Wed, 3 Feb 2021 13:25:36 -0600 Subject: [PATCH 002/100] remote: review ssh// URLs and auth info. per https://github.com/iterative/dvc.org/pull/1801#discussion_r495416929 --- content/docs/command-reference/pull.md | 4 ++-- content/docs/command-reference/push.md | 4 ++-- .../docs/command-reference/remote/modify.md | 7 ++++--- .../docs/user-guide/external-dependencies.md | 19 ++++++++++--------- 4 files changed, 18 insertions(+), 16 deletions(-) diff --git a/content/docs/command-reference/pull.md b/content/docs/command-reference/pull.md index eb47e16993..cc1d31908b 100644 --- a/content/docs/command-reference/pull.md +++ b/content/docs/command-reference/pull.md @@ -229,9 +229,9 @@ already set up and you can use `dvc remote list` to check them. To remember how it's done, and set a context for the example, let's define a default SSH remote: ```dvc -$ dvc remote add -d r1 ssh://_username_@_host_/path/to/dvc/remote/storage +$ dvc remote add -d r1 ssh://user@example.com/path/to/dvc/remote/storage $ dvc remote list -r1 ssh://_username_@_host_/path/to/dvc/remote/storage +r1 ssh://user@example.com/path/to/dvc/remote/storage ``` > DVC supports several diff --git a/content/docs/command-reference/push.md b/content/docs/command-reference/push.md index 89a36dbb4a..e295b6fec2 100644 --- a/content/docs/command-reference/push.md +++ b/content/docs/command-reference/push.md @@ -116,7 +116,7 @@ To use `dvc push` (without options), a default ```dvc $ dvc remote add --default r1 \ - ssh://_username_@_host_/path/to/dvc/cache/directory + ssh://user@example.com/path/to/dvc/cache/directory ``` > For existing projects, remotes are usually already set up. You @@ -124,7 +124,7 @@ $ dvc remote add --default r1 \ > > ```dvc > $ dvc remote list -> r1 ssh://_username_@_host_/path/to/dvc/cache/directory +> r1 ssh://user@example.com/path/to/dvc/cache/directory > ``` Push entire data cache from the current workspace to diff --git a/content/docs/command-reference/remote/modify.md b/content/docs/command-reference/remote/modify.md index d82d905fd3..9be2872327 100644 --- a/content/docs/command-reference/remote/modify.md +++ b/content/docs/command-reference/remote/modify.md @@ -515,7 +515,8 @@ more information. ### Click for SSH - `url` - remote location, in a regular - [SSH format](https://tools.ietf.org/id/draft-salowey-secsh-uri-00.html#sshsyntax): + [SSH format](https://tools.ietf.org/id/draft-salowey-secsh-uri-00.html#sshsyntax). + Note that this can already the `user` parameter, embedded into the URL: ```dvc $ dvc remote modify myremote url \ @@ -528,7 +529,7 @@ more information. > Note that your server's SFTP root might differ from its physical root (`/`). -- `user` - username to access the remote. +- `user` - username to access the remote: ```dvc $ dvc remote modify --local myremote user myuser @@ -539,7 +540,7 @@ more information. 1. `user` parameter set with this command (found in `.dvc/config`); 2. User defined in the URL (e.g. `ssh://user@example.com/path`); 3. User defined in `~/.ssh/config` for this host (URL); - 4. Current user + 4. Current system user - `port` - port to access the remote. diff --git a/content/docs/user-guide/external-dependencies.md b/content/docs/user-guide/external-dependencies.md index 76381e088b..91566f75cd 100644 --- a/content/docs/user-guide/external-dependencies.md +++ b/content/docs/user-guide/external-dependencies.md @@ -37,6 +37,9 @@ certain `dvc remote` types. Currently, the following protocols are supported: Let's take a look at defining and running a `download_file` stage that simply downloads a file from an external location, on all the supported location types. +> See the [Remote alias example](#example-using-dvc-remote-aliases) for info. on +> using remote locations that require manual authentication setup. +
### Click for Amazon S3 @@ -88,7 +91,7 @@ $ dvc run -n download_file \ $ dvc run -n download_file \ -d ssh://user@example.com/path/to/data.txt \ -o data.txt \ - scp user@example.com:/path/to/data.txt data.txt + scp ssh://user@example.com:/path/to/data.txt data.txt ``` ⚠️ DVC requires both SSH and SFTP access to work with remote SSH locations. @@ -144,10 +147,9 @@ $ dvc run -n download_file \ ## Example: Using DVC remote aliases You may want to encapsulate external locations as configurable entities that can -be managed independently. This is useful if multiple dependencies (or stages) -reuse the same location, or if its likely to change in the future. And if the -location requires authentication, you need a way to configure it in order to -connect. +be managed independently. This is useful if the connection requires +authentication, if multiple dependencies (or stages) reuse the same location, or +if the URL is likely to change in the future. [DVC remotes](/doc/command-reference/remote) can do just this. You may use `dvc remote add` to define them, and then use a special URL with format @@ -157,12 +159,11 @@ dependency. Let's see an example using SSH. First, register and configure the remote: ```dvc -$ dvc remote add myssh ssh://myserver.com -$ dvc remote modify --local myssh user myuser -$ dvc remote modify --local myssh password mypassword +$ dvc remote add myssh ssh://user@example.com +$ dvc remote modify --local myssh password 'mypassword' ``` -> Please refer to `dvc remote add` for more details like setting up access +> Please refer to `dvc remote modify` for more details like setting up access > credentials for the different remote types. Now, use an alias to this remote when defining the stage: From 1e08ff8fe4912dad2eb57342c73c1289d9e2d2be Mon Sep 17 00:00:00 2001 From: Jorge Orpinel Date: Wed, 3 Feb 2021 13:46:32 -0600 Subject: [PATCH 003/100] cmd: note ~/ paths are for Linux in remote modify --- content/docs/command-reference/remote/modify.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/content/docs/command-reference/remote/modify.md b/content/docs/command-reference/remote/modify.md index 9be2872327..c844ff66ff 100644 --- a/content/docs/command-reference/remote/modify.md +++ b/content/docs/command-reference/remote/modify.md @@ -539,7 +539,8 @@ more information. 1. `user` parameter set with this command (found in `.dvc/config`); 2. User defined in the URL (e.g. `ssh://user@example.com/path`); - 3. User defined in `~/.ssh/config` for this host (URL); + 3. User defined in the SSH config file (e.g. `~/.ssh/config`) for this host + (URL); 4. Current system user - `port` - port to access the remote. @@ -552,7 +553,8 @@ more information. 1. `port` parameter set with this command (found in `.dvc/config`); 2. Port defined in the URL (e.g. `ssh://example.com:1234/path`); - 3. Port defined in `~/.ssh/config` for this host (URL); + 3. Port defined in the SSH config file (e.g. `~/.ssh/config`) for this host + (URL); 4. Default SSH port 22 - `keyfile` - path to private key to access the remote. @@ -657,8 +659,8 @@ by HDFS. Read more about by expanding the WebHDFS section in - `hdfscli_config` - path to a `HdfsCLI` cfg file. WebHDFS access depends on `HdfsCLI`, which allows the usage of a configuration file by default located - in `~/.hdfscli.cfg`. In the file, multiple aliases can be set with their own - connection parameters, like `url` or `user`. If using a cfg file, + in `~/.hdfscli.cfg` (Linux). In the file, multiple aliases can be set with + their own connection parameters, like `url` or `user`. If using a cfg file, `webhdfs_alias` can be set to specify which alias to use. ```dvc From c67ec08f9adcb587517efcadfc8a53eb0cb17dfe Mon Sep 17 00:00:00 2001 From: Jorge Orpinel Date: Thu, 11 Feb 2021 08:26:43 -0600 Subject: [PATCH 004/100] typo in start/pipelines --- content/docs/start/data-pipelines.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/docs/start/data-pipelines.md b/content/docs/start/data-pipelines.md index 863808c75f..8abda6710f 100644 --- a/content/docs/start/data-pipelines.md +++ b/content/docs/start/data-pipelines.md @@ -222,7 +222,7 @@ This should be a good point to commit the changes with Git. These include ## Reproduce -The whole point of creating this `dvc.yaml` pipeline file is an ability to +The whole point of creating this `dvc.yaml` pipelines file is an ability to reproduce the pipeline: ```dvc From f64a563ae95d04c6d04b90bf08c4ab1af824acd0 Mon Sep 17 00:00:00 2001 From: Jorge Orpinel Date: Wed, 24 Feb 2021 22:59:16 -0600 Subject: [PATCH 005/100] ref: dummy exp run example and exp show Desc details from https://github.com/iterative/dvc.org/pull/1926/files?file-filters%5B%5D=.json#diff-eb5e116f8c720a515197a450f4ec1c06287a8c9abd2cf241e88dda549a853e23 --- content/docs/command-reference/exp/run.md | 17 ++++++ content/docs/command-reference/exp/show.md | 65 +++++++++++++++++++++- 2 files changed, 80 insertions(+), 2 deletions(-) diff --git a/content/docs/command-reference/exp/run.md b/content/docs/command-reference/exp/run.md index b69e675d9f..beab9e968f 100644 --- a/content/docs/command-reference/exp/run.md +++ b/content/docs/command-reference/exp/run.md @@ -139,3 +139,20 @@ CPU cores). regardless of this flag. - `-v`, `--verbose` - displays detailed tracing information. + +## Example: Modify parameters on-the-fly + +dvc.yaml with 1 param, 1 stage, and 1 metric + +Try a quick variation with `--set-param`... + +Check the results... + +Try again and check results (`-S`)... + +> Notice that experiments run as a series don't build up on each other, as they +> are all based of `HEAD`. + +## Example: + +... diff --git a/content/docs/command-reference/exp/show.md b/content/docs/command-reference/exp/show.md index dbc9842c45..2e553bee07 100644 --- a/content/docs/command-reference/exp/show.md +++ b/content/docs/command-reference/exp/show.md @@ -21,8 +21,9 @@ usage: dvc exp show [-h] [-q | -v] [-a] [-T] [--all-commits] [--no-pager] Shows experiments in a detailed table which includes parameters and metrics. Only the experiments derived from the Git `HEAD` are shown by default but all -experiments can be included with the `---all-commits` option. Experiments are -sorted by timestamp by default. +experiments can be included with `---all-commits` (see the command +[options](#options for more alternatives)). Experiments are sorted by timestamp +by default. Your terminal will enter a paginated screen by default, which you can exit by typing `Q` in your keyboard. Use `--no-pager` to print the entire table at once @@ -40,6 +41,66 @@ $ dvc exp show --no-pager └───────────────┴──────────┴─────────┴────────────┴─────────────────┘ ``` +## Filtering the output + +By default, the printed experiments table will include columns for all metrics +and params from the entire project. The `--include-metrics`, +`--exclude-metrics`, `--include-params`, and `--exclude-params` options can be +used to limit the columns to be displayed. Each option accepts a comma-separated +list of metric or param names. + +When an `--include-...` option is used, only the specified metric/param columns +will be displayed. When an `--exclude-...` option is used, all columns except +for those specified will be displayed. + +`--include-...` and `--exclude-...` will match nested metrics and params. So for +a stage `featurize` with params `max_features` and `ngrams`, +`--include-params=featurize` would include columns for both +`featurize.max_features` and `featurize.ngrams`. + +Metric and param columns are handled separately. So for the command +`dvc exp show --include-metrics=foo,bar`, `foo` and `bar` would be the only +metrics displayed in the output table, and all possible params columns would +also be displayed in the table. + +## Sorting the output + +By default, experiment rows will be sorted by timestamp in descending order. The +`--sort-by` and `--sort-order` options can be used to sort related experiment +rows on any single metric or param column. + +Note that when sorting experiments, related experiments will remain grouped +together. This means that for a given Git commit `abc123`, all experiments +derived from that commit will be sorted and grouped together. Experiments +derived from a different Git commit `def456` would be sorted in their own group. + +## Paging the output + +This command's output is automatically piped to +[Less](), if available in the +terminal. (The exact command used is `less --chop-long-lines --clear-screen`.) +If `less` is not available (e.g. on Windows), the output is simply printed out. + +> It's also possible to +> [enable Less paging on Windows](/doc/user-guide/running-dvc-on-windows#enabling-paging-with-less). + +### Providing a custom pager + +It's possible to override the default pager via the `DVC_PAGER` environment +variable. For example, the following command will replace the default pager with +[`more`](), for a single run: + +```dvc +$ DVC_PAGER=more dvc dag +``` + +For a persistent change, define `DVC_PAGER` in the shell configuration. For +example in Bash, we could add the following line to `~/.bashrc`: + +```bash +export DVC_PAGER=more +``` + ## Options - `-a`, `--all-branches` - include experiments derived from the tip of all Git From 6bd9b2a1dd9f69d77a1f5b08597c6d523796d95d Mon Sep 17 00:00:00 2001 From: elleobrien Date: Thu, 25 Feb 2021 13:41:00 -0800 Subject: [PATCH 006/100] Prettify --- content/docs/cml/self-hosted-runners.md | 256 ++++++++++++------------ 1 file changed, 126 insertions(+), 130 deletions(-) diff --git a/content/docs/cml/self-hosted-runners.md b/content/docs/cml/self-hosted-runners.md index 26365bf3c6..0592bc6853 100644 --- a/content/docs/cml/self-hosted-runners.md +++ b/content/docs/cml/self-hosted-runners.md @@ -1,161 +1,157 @@ # Self-hosted Runners -GitHub Actions are run on GitHub-hosted runners by default. However, there are -many great reasons to use your own runners: to take advantage of GPUs; to -orchestrate your team's shared computing resources, or to train in the cloud. +GitHub Actions and GitLab CI are run on GitHub- and GitLab- hosted runners by +default. However, there are many great reasons to use your own runners: to take +advantage of GPUs; to orchestrate your team's shared computing resources, or to +train in the cloud. -☝️ **Tip!** Check out the -[official GitHub documentation](https://help.github.com/en/actions/hosting-your-own-runners/about-self-hosted-runners) -to get started setting up your self-hosted runner. +☝️ **Tip!** Check out the official documentation from +[GitHub](https://help.github.com/en/actions/hosting-your-own-runners/about-self-hosted-runners) +and [GitLab](https://docs.gitlab.com/runner/) to get started setting up your +self-hosted runner. -### Allocating cloud resources with CML +## Allocating cloud resources with CML When a workflow requires computational resources (such as GPUs) CML can -automatically allocate cloud instances. For example, the following workflow -deploys a `t2.micro` instance on AWS EC2 and trains a model on the instance. -After the instance is idle for 120 seconds, it automatically shuts down. +automatically allocate cloud instances using `cml-runner`. You can spin up +instances on your AWS or Azure account (GCP support is forthcoming!). + +For example, the following workflow deploys a `t2.micro` instance on AWS EC2 and +trains a model on the instance. After the job runs, the instance automatically +shuts down. You might notice that this workflow is quite similar to the +[basic use case](#usage) highlighted in the beginning of the docs- that's +because it is! What's new is that we've added `cml-runner`, plus a few +environmental variables for passing your cloud service credentials to the +workflow. ```yaml -name: train-my-model +name: "Train-in-the-cloud" on: [push] + jobs: - deploy-cloud-runner: + deploy-runner: runs-on: [ubuntu-latest] - container: docker://dvcorg/cml:latest steps: - - name: deploy + - uses: iterative/setup-cml@v1 + - uses: actions/checkout@v2 + - name: "Deploy runner on EC2" + shell: bash env: - repo_token: ${{ secrets.REPO_TOKEN }} + repo_token: ${{ secrets.PERSONAL_ACCESS_TOKEN }} AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} run: | - echo "Deploying..." - - MACHINE="cml$(date +%s)" - docker-machine create \ - --driver amazonec2 \ - --amazonec2-instance-type t2.micro \ - --amazonec2-region us-east-1 \ - --amazonec2-zone f \ - --amazonec2-vpc-id vpc-06bc773d85a0a04f7 \ - --amazonec2-ssh-user ubuntu \ - $MACHINE - - eval "$(docker-machine env --shell sh $MACHINE)" - - ( - docker-machine ssh \ - $MACHINE "sudo mkdir -p /docker_machine && \ - sudo chmod 777 /docker_machine" && \ - docker-machine scp -r -q ~/.docker/machine \ - $MACHINE:/docker_machine && \ - - docker run --name runner -d \ - -v /docker_machine/machine:/root/.docker/machine \ - -e RUNNER_IDLE_TIMEOUT=120 \ - -e DOCKER_MACHINE=${MACHINE} \ - -e RUNNER_LABELS=cml \ - -e repo_token=$repo_token \ - -e RUNNER_REPO="https://github.com/${GITHUB_REPOSITORY}" \ - dvcorg/cml-py3 && \ - - sleep 20 && echo "Deployed $MACHINE" - ) || (echo y | docker-machine rm $MACHINE && exit 1) - train: - needs: deploy-cloud-runner - runs-on: [self-hosted, cml] - + cml-runner \ + --cloud aws \ + --cloud-region us-west \ + --cloud-type=t2.micro \ + --labels=cml-runner + name: model-training + needs: deploy-runner + runs-on: [self-hosted,cml-runner] + container: docker://dvcorg/cml-py3:latest steps: - - uses: actions/checkout@v2 - - name: cml_run - env: - repo_token: ${{ secrets.GITHUB_TOKEN }} - run: | - pip install -r requirements.txt - python train.py - - cat metrics.txt >> report.md - cml-publish confusion_matrix.png --md >> report.md - cml-send-comment report.md -``` - -Please note that for GCP's Compute Engine, deploying the cloud runner involves -different steps: - -```yaml -deploy-gce: - runs-on: [ubuntu-latest] - container: docker://dvcorg/cml:latest - - steps: - - name: deploy - shell: bash + - uses: actions/checkout@v2 + - name: "Train my model" env: - repo_token: ${{ secrets.REPO_TOKEN }} - GOOGLE_APPLICATION_CREDENTIALS_DATA: - ${{ secrets.GOOGLE_APPLICATION_CREDENTIALS_DATA }} + repo_token: ${{ secrets.PERSONAL_ACCESS_TOKEN }} run: | - echo "Deploying..." - - echo '${{ secrets.GOOGLE_APPLICATION_CREDENTIALS_DATA }}' \ - > gce-credentials.json - export GOOGLE_APPLICATION_CREDENTIALS='gce-credentials.json' - - RUNNER_LABELS="gce" - RUNNER_REPO="https://github.com/${GITHUB_REPOSITORY}" - MACHINE="cml$(date +%s)" - - docker-machine create --driver google \ - --google-machine-type "n1-standard-4" \ - --google-project "cml-project-279709" \ - $MACHINE - - eval "$(docker-machine env --shell sh $MACHINE)" - - ( - docker-machine ssh \ - $MACHINE "sudo mkdir -p /docker_machine && \ - sudo chmod 777 /docker_machine" && \ - docker-machine scp -r -q ~/.docker/machine/ \ - $MACHINE:/docker_machine && \ - docker-machine scp -q gce-credentials.json \ - $MACHINE:/docker_machine/gce-credentials.json && \ - - eval "$(docker-machine env --shell sh $MACHINE)" && \ - docker run --name runner -d \ - -v /docker_machine/gce-credentials.json:/gce-credentials.json \ - -e GOOGLE_APPLICATION_CREDENTIALS='/gce-credentials.json' \ - -v /docker_machine/machine:/root/.docker/machine \ - -e DOCKER_MACHINE=$MACHINE \ - -e repo_token=$repo_token \ - -e RUNNER_LABELS=$RUNNER_LABELS \ - -e RUNNER_REPO=$RUNNER_REPO \ - -e RUNNER_IDLE_TIMEOUT=120 \ - dvcorg/cml-py3 && \ - sleep 20 && echo "Deployed $MACHINE" - ) || (docker-machine rm -f $MACHINE && exit 1) + pip install -r requirements.txt + python train.py + + # Publish report with CML + cat metrics.txt > report.md + cml-send-comment report.md ``` -### Inputs +In the above workflow, the step `deploy-runner` launches an EC2 `t2-micro` +instance in the `us-west` region. The next step, `model-training`, runs on the +newly launched instance. + +**Note that you can use any container with this workflow!** While you must have +CML and its dependencies setup to use CML functions like `cml-send-comment` from +your instance, you can create your favorite training environment in the cloud by +pulling the Docker container of your choice. + +We like the +[CML container](https://github.com/iterative/cml/blob/master/docker/Dockerfile) +(`docker://dvcorg/cml-py3`) because it comes loaded with Python, CUDA, `git`, +`node` and other essentials for full-stack data science. But we don't mind if +you do it your way :) + +## Arguments + +The function `cml-runner` accepts the following arguments: + +| Argument | Description | Values | +| --------------------- | ------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------- | +| `--version` | Show version number | Boolean | +| `--labels` | Comma delimited runner labels | Default: `cml` | +| `--idle-timeout ` | Time in seconds for the runner to be waiting for jobs before shutting down. 0 waits forever. | Default: `300` | +| `--name` | Name displayed in the repo once registered | Default: `cml-` followed by a unique identifier, i.e. `cml-cfwj9rrari` | +| `--driver` | If not specified, driver is inferred from environmental variables | Choices: `github`,`gitlab` | +| `--repo` | Specifies the Git repository to be used. If not specified, repo is inferred from the environmental variables. | Example: `https://github.com/iterative/cml` | +| `--token` | Personal access token to be used. If not specified, it will be inferred from the environment. | `token` should be a string | +| ` --cloud` | Cloud provider to deploy the runner | Choices: `aws`,`azure` | +| `--cloud-region` | Region where the instance is deployed. | choices: `us-east`,`us-west`, `eu-west`, `eu-north`. Also accepts native cloud regions. Defaults to `us-west`. | +| `--cloud-type` | Instance type. | Choices: `m`, `l`, `xl`. Also supports native types like i.e. `t2.micro` | +| `--cloud-gpu` | GPU type. | Choices: `nogpu`,`k80`,`tesla` | +| `--cloud-hdd-size` | HDD size in GB. | Accepts integer values | +| `--cloud-ssh-private` | Your private RSA SSH key. If not provided will be generated by the Terraform-provider-Iterative. | Accepts string | +| `--cloud-spot` | Request a spot instance | Boolean | +| `--cloud-spot-price` | Spot max price. If not specified it takes current spot bidding pricing. | default: `-1` | +| `-h` | Show help | Boolean | + +## Environmental variables You will need to -[create a new personal access token](https://help.github.com/en/github/authenticating-to-github/creating-a-personal-access-token-for-the-command-line), -`REPO_TOKEN`, with repository read/write access. `REPO_TOKEN` must be added as a -secret in your project repository. +[create a personal access token](https://help.github.com/en/github/authenticating-to-github/creating-a-personal-access-token-for-the-command-line) +with repository read/write access and workflow privileges. In the example +workflow, this token is stored as `PERSONAL_ACCESS_TOKEN`. Note that you will also need to provide access credentials for your cloud compute resources as secrets. In the above example, `AWS_ACCESS_KEY_ID` and `AWS_SECRET_ACCESS_KEY` are required to deploy EC2 instances. -### Provisioning cloud compute +Click below to see credentials needed for supported cloud service providers. + +
-In the above example, we use -[Docker Machine](https://docs.docker.com/machine/concepts/) to provision -instances. Please see their documentation for further details. +### AWS -Note several CML-specific arguments to `docker run`: +```yaml +env: + AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} + AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + AWS_SESSION_TOKEN: ${{ secrets.AWS_SESSION_TOKEN }} +``` + +Note that `AWS_SESSION_TOKEN` is optional. + +
+ +
+ +### Azure + +```yaml +env: + AZURE_STORAGE_CONNECTION_STRING: + ${{ secrets.AZURE_STORAGE_CONNECTION_STRING }} + AZURE_STORAGE_CONTAINER_NAME: ${{ secrets.AZURE_STORAGE_CONTAINER_NAME }} +``` + +
+ +### Using on-premise machines as self-hosted runners + +You can also use the new `cml-runner` function to set up a local self-hosted +runner. On your local machine or on-premise GPU cluster, you'll install CML as a +package and then run: + +```yaml +cml-runner \ --repo $your_project_repository_url \ +--token=$personal_access_token \ --labels tf \ --idle-timeout 180 +``` -- `repo_token` should be set to your repository's personal access token -- `RUNNER_REPO` should be set to the URL of your project repository -- The docker container should be given as `dvcorg/cml`, `dvcorg/cml-py3`, - `dvc/org/cml-gpu`, or `dvcorg/cml-gpu-py3` +Now your machine will be listening for workflows from your project repository. From 5e5aa54fda680606c743966d2435289e6e4aef29 Mon Sep 17 00:00:00 2001 From: elleobrien Date: Thu, 25 Feb 2021 13:47:50 -0800 Subject: [PATCH 007/100] Prettify --- content/docs/cml/cml-with-dvc.md | 56 +++++++++++++++++++++ content/docs/cml/start-github.md | 83 ++++++++++++++++++++++++++++++++ 2 files changed, 139 insertions(+) diff --git a/content/docs/cml/cml-with-dvc.md b/content/docs/cml/cml-with-dvc.md index fcf4693c65..bcb3ab497b 100644 --- a/content/docs/cml/cml-with-dvc.md +++ b/content/docs/cml/cml-with-dvc.md @@ -135,3 +135,59 @@ env: ```
+ +## For GitHub Actions Users: Try the `setup-dvc` Action! + +The [iterative/setup-dvc](https://github.com/iterative/setup-dvc) action is a +JavaScript action that sets up [DVC](https://dvc.org/) in your workflow. + +### Usage + +This action can be run on `ubuntu-latest`, `macos-latest`, `windows-latest`. +When running on `windows-latest`, Python 3 is a dependency that should be setup +first (and +[there's an action for that](https://github.com/actions/setup-python)). + +Basic usage: + +```yaml +steps: + - uses: actions/checkout@v2 + + - uses: iterative/setup-dvc@v1 +``` + +Windows: + +```yaml +steps: + - uses: actions/checkout@v2 + + - uses: actions/setup-python@v2 + with: + python-version: '3.x' + + - uses: iterative/setup-dvc@v1 +``` + +A specific version can be pinned to your workflow using the `version` argument. + +```yaml +steps: + - uses: actions/checkout@v2 + + - uses: iterative/setup-dvc@v1 + with: + version: '1.0.1' +``` + +### Inputs + +The following inputs are supported. + +- `version` - (optional) The version of DVC to install. A value of `latest` will + install the latest version of DVC. Defaults to `latest`. + +### Outputs + +Setup DVC has no outputs. diff --git a/content/docs/cml/start-github.md b/content/docs/cml/start-github.md index 09fcfca820..e058974dc1 100644 --- a/content/docs/cml/start-github.md +++ b/content/docs/cml/start-github.md @@ -73,3 +73,86 @@ a report generated. CML functions let you display relevant results from the workflow, like model performance metrics and vizualizations, in GitHub checks and comments. What kind of workflow you want to run, and want to put in your CML report, is up to you. + +## The CML GitHub Action + +In the above example, we got the CML functions thanks to our Docker container. +But there's another way for GitHub Actions users to get CML: the `setup-cml` +Action! + +The [iterative/setup-cml](https://github.com/iterative/setup-cml) action is a +JavaScript workflow that provides [CML](https://cml.dev/) functions in your +GitHub Actions workflow. The action allows users to install CML without using +the CML Docker container. + +This action gives you: + +- Functions like `cml-publish` and `cml-send-comment` for publishing data + visualization and metrics from your CI workflow as comments in a pull request. +- `cml-runner`, a function that enables workflows to provision cloud and + on-premise computing resources for training models +- The freedom 🦅 to mix and match CML with your favorite data science tools and + environments + +Note that CML does not include DVC and its dependencies- for that, you want the +[Setup DVC Action](https://github.com/iterative/setup-dvc). + +### Usage + +This action has been tested on `ubuntu-latest` and `macos-latest`. + +Basic usage: + +```yaml +steps: + - uses: actions/checkout@v2 + + - uses: iterative/cml-action@v1 +``` + +A specific version can be pinned to your workflow. + +```yaml +steps: + - uses: actions/checkout@v2 + + - uses: iterative/setup-cml@v1 + with: + version: '1.0.1' +``` + +### Inputs + +The following inputs are supported. + +- `version` - (optional) The version of CML to install. A value of `latest` will + install the latest version of CML functions. Defaults to `latest`. + +## Outputs + +Setup CML has no outputs. + +### A complete example + +![](https://github.com/iterative/cml/blob/master/imgs/cml_first_report.png) _A +sample CML report from a machine learning project displayed in a Pull Request._ + +Assume that we have a machine learning script, `train.py`, that outputs an image +`plot.png`. + +```yaml +steps: + - uses: actions/checkout@v2 + + - uses: iterative/setup-cml@v1 + with: + version: latest + + - run: | + # train will generate plot.png + python train.py + + echo 'My first CML report' > report.md + cml-publish plot.png --md > report.md + cml-send-comment report.md +``` From f13c33488dac25f6781d0bef056a1e767fb9efa8 Mon Sep 17 00:00:00 2001 From: elleobrien Date: Thu, 25 Feb 2021 13:50:43 -0800 Subject: [PATCH 008/100] prettify --- content/docs/cml/start-github.md | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/content/docs/cml/start-github.md b/content/docs/cml/start-github.md index e058974dc1..53db50d768 100644 --- a/content/docs/cml/start-github.md +++ b/content/docs/cml/start-github.md @@ -132,13 +132,10 @@ The following inputs are supported. Setup CML has no outputs. -### A complete example - -![](https://github.com/iterative/cml/blob/master/imgs/cml_first_report.png) _A -sample CML report from a machine learning project displayed in a Pull Request._ +### A complete workflow Assume that we have a machine learning script, `train.py`, that outputs an image -`plot.png`. +`plot.png`. A potential workflow will look like this: ```yaml steps: From 4f87a567566d19616cdaafe7d1805550b7e3ed09 Mon Sep 17 00:00:00 2001 From: Jorge Orpinel Date: Sat, 27 Feb 2021 07:32:44 -0600 Subject: [PATCH 009/100] ref: remove dummy Examples from exp run --- content/docs/command-reference/exp/run.md | 19 +------------------ 1 file changed, 1 insertion(+), 18 deletions(-) diff --git a/content/docs/command-reference/exp/run.md b/content/docs/command-reference/exp/run.md index 7e8972ce71..44468efc14 100644 --- a/content/docs/command-reference/exp/run.md +++ b/content/docs/command-reference/exp/run.md @@ -16,7 +16,7 @@ usage: dvc exp run [-h] [-q | -v] [-f] [targets [targets ...]] positional arguments: - targets Stages to reproduce. 'dvc.yaml' by default. + targets Stages to reproduce. 'dvc.yaml' by default ``` ## Description @@ -139,20 +139,3 @@ CPU cores). regardless of this flag. - `-v`, `--verbose` - displays detailed tracing information. - -## Example: Modify parameters on-the-fly - -dvc.yaml with 1 param, 1 stage, and 1 metric - -Try a quick variation with `--set-param`... - -Check the results... - -Try again and check results (`-S`)... - -> Notice that experiments run as a series don't build up on each other, as they -> are all based of `HEAD`. - -## Example: - -... From 3d0ae89c4928247ab87640385e3955c123c50545 Mon Sep 17 00:00:00 2001 From: Jorge Orpinel Date: Sat, 27 Feb 2021 07:36:59 -0600 Subject: [PATCH 010/100] ref: add exp branch Desc and Options --- content/docs/command-reference/exp/branch.md | 38 ++++++++++++++++++++ content/docs/sidebar.json | 4 +++ 2 files changed, 42 insertions(+) create mode 100644 content/docs/command-reference/exp/branch.md diff --git a/content/docs/command-reference/exp/branch.md b/content/docs/command-reference/exp/branch.md new file mode 100644 index 0000000000..5cc6b174f6 --- /dev/null +++ b/content/docs/command-reference/exp/branch.md @@ -0,0 +1,38 @@ +# exp branch + +Commit the results from any [experiment](/doc/command-reference/exp) to Git, in +a new branch (which will become the current workspace). + +## Synopsis + +```usage +usage: dvc exp branch [-h] [-q | -v] experiment branch + +positional arguments: + experiment Experiment to be promoted + branch Git branch name to use +``` + +## Description + +Makes a Git branch off the last commit (`HEAD`) based on the given `experiment`, +using the `branch` name provided. + +This is equivalent to using `dvc exp apply` (applies the results from any +experiment to the workspace) followed by Git branching and committing: + +```dvc +$ dvc exp apply experiment +$ git checkout -b branch +$ git commit ... +``` + +## Options + +- `-h`, `--help` - shows the help message and exit. + +- `-q`, `--quiet` - do not write anything to standard output. Exit with 0 if no + problems arise, otherwise 1. + +- `-v`, `--verbose` - displays detailed tracing information from executing the + `dvc pull` command. diff --git a/content/docs/sidebar.json b/content/docs/sidebar.json index 733789ca25..6ea9dcb076 100644 --- a/content/docs/sidebar.json +++ b/content/docs/sidebar.json @@ -238,6 +238,10 @@ { "label": "exp apply", "slug": "apply" + }, + { + "label": "exp branch", + "slug": "branch" } ] }, From b78258dfbe051bdb560d6b9d9fd6ff7f174ba194 Mon Sep 17 00:00:00 2001 From: Jorge Orpinel Date: Sun, 28 Feb 2021 03:01:58 -0600 Subject: [PATCH 011/100] ref: doc exp run --rev/reset --- content/docs/api-reference/make_checkpoint.md | 3 +- content/docs/command-reference/exp/run.md | 38 ++++++++++++++----- content/docs/command-reference/repro.md | 2 +- .../project-structure/internal-files.md | 4 +- 4 files changed, 33 insertions(+), 14 deletions(-) diff --git a/content/docs/api-reference/make_checkpoint.md b/content/docs/api-reference/make_checkpoint.md index 8e44b0799e..314a9b77b4 100644 --- a/content/docs/api-reference/make_checkpoint.md +++ b/content/docs/api-reference/make_checkpoint.md @@ -41,7 +41,8 @@ implement the steps above yourself. The stage definition in `dvc.yaml` should contain at least one output with the `checkpoint: true` value set, so that DVC registers -its checkpoints. +its checkpoints. This is needed so that the experiment can later restart based +on that output's last cached state. ⚠️ Using the `checkpoint` field in `dvc.yaml` is only compatibly with `dvc exp run`, `dvc repro` will abort if any stage contains it. diff --git a/content/docs/command-reference/exp/run.md b/content/docs/command-reference/exp/run.md index 5c9086de9c..1353d4f8cf 100644 --- a/content/docs/command-reference/exp/run.md +++ b/content/docs/command-reference/exp/run.md @@ -67,14 +67,23 @@ committing them to the Git repo. Unnecessary ones can be removed with To track successive steps in a longer experiment, you can register checkpoints with DVC during your code or script runtime (similar to a logger). -To do so, first mark stage `outs` with `checkpoint: true` in `dvc.yaml`. Then, -in the corresponding code, either call the `dvc.api.make_checkpoint()` function -(Python), or write a signal file (any programming language) following the same -steps as `make_checkpoint()` — please refer to that reference for details. - ⚠️ Using the `checkpoint` field in `dvc.yaml` is only compatibly with `dvc exp run`, `dvc repro` will abort if any stage contains it. +To do so, first mark stage `outs` with `checkpoint: true` in `dvc.yaml`. Having +at least a checkpoint output is needed so that the experiment can +later restart based on that output's last cached state. + +Then, in the corresponding code, either call the `dvc.api.make_checkpoint()` +function (Python), or write a signal file (any programming language) following +the same steps as `make_checkpoint()` — please refer to that reference for +details. + +The `--rev` and `--reset` options of this command are specifically designed to +help you manage checkpoint experiments. The former lets you continue an +experiment from a previously registered checkpoint (having made some changes to +code, params, etc.). The latter restarts the whole process from scratch. +
### How are checkpoints captured by DVC? @@ -95,7 +104,7 @@ execution. `dvc exp show` will mark queued experiments with an asterisk `*`. Use `dvc exp run --run-all` to process this queue. Adding `-j` (`--jobs`), queued experiments can be run in parallel for better performance. This creates a temporary workspace copy (in `.dvc/tmp/exp` where _n_ is the job number) for -each subprocess. +each subprocess (see also `--temp`). ⚠️ Parallel runs are experimental and may be unstable at this time. ⚠️ Make sure you're using a number of jobs that your environment can handle (no more than the @@ -119,10 +128,8 @@ CPU cores). name will generated by default, such as `exp-f80g4` (based on the experiment's hash). -- `-f`, `--force` - reproduce an experiment pipeline, regenerating its results, - even if no changes were found. For `checkpoint` experiments, `dvc exp run -f` - will force regeneration of an existing checkpoint experiment branch from - scratch. +- `--temp` - run this experiment in a separate temporary directory (in + `.dvc/tmp/exp`) instead of your workspace. Useful for - `--queue` - place this experiment at the end of a line for future execution, but do not actually run it yet. Use `dvc exp run --run-all` to process the @@ -134,6 +141,17 @@ CPU cores). - `-j `, `--jobs ` - run this `number` of queued experiments in parallel. Only applicable when used in conjunction with `--run-all`. +- `-r `, `--rev ` - continue an experiment from a specific + checkpoint name or hash (`commit`). Required for explicitly resuming + checkpoints in queued or temp dir runs. + +- `--reset` - restart a checkpoint experiment from scratch (resets existing + checkpoints to the initial state). + +- `-f`, `--force` - reproduce pipelines even if no changes were found (same as + `dvc repro -f`). For `checkpoint` experiments, this restarts form scratch, + like `--reset`. + - `-h`, `--help` - prints the usage/help message, and exit. - `-q`, `--quiet` - do not write anything to standard output. Exit with 0 if all diff --git a/content/docs/command-reference/repro.md b/content/docs/command-reference/repro.md index 30e41612a8..810b31b82f 100644 --- a/content/docs/command-reference/repro.md +++ b/content/docs/command-reference/repro.md @@ -127,7 +127,7 @@ up-to-date and only execute the final stage. recursive search for changed dependencies. Multiple stages are executed (non-recursively) if multiple stage names are given as `targets`. -- `-f`, `--force` - reproduce a pipeline, regenerating its results, even if no +- `-f`, `--force` - reproduce pipelines, regenerating its results, even if no changes were found. This executes all of the stages by default, but it can be limited with the `targets` argument, or the `-s`, `-p` options. diff --git a/content/docs/user-guide/project-structure/internal-files.md b/content/docs/user-guide/project-structure/internal-files.md index 4cda3b0a38..97fab90fe2 100644 --- a/content/docs/user-guide/project-structure/internal-files.md +++ b/content/docs/user-guide/project-structure/internal-files.md @@ -61,8 +61,8 @@ operation. dependencies and outputs, to allow safely running multiple DVC commands in parallel -- `.dvc/tmp/exp`: workspace copy number _n_ for - [parallel experiments](/doc/command-reference/exp/run#queueing-and-parallel-execution). +- `.dvc/tmp/exp`: _n_th workspace copy, used for temporary or + parallel experiments (see `dvc exp run`). ## Structure of the cache directory From 75d148bfb83bc085f99c57dabb1d0a64c55f7853 Mon Sep 17 00:00:00 2001 From: "Restyled.io" Date: Tue, 2 Mar 2021 05:20:30 +0000 Subject: [PATCH 012/100] Restyled by prettier --- content/docs/user-guide/project-structure/internal-files.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/docs/user-guide/project-structure/internal-files.md b/content/docs/user-guide/project-structure/internal-files.md index 97fab90fe2..369b98fca1 100644 --- a/content/docs/user-guide/project-structure/internal-files.md +++ b/content/docs/user-guide/project-structure/internal-files.md @@ -61,7 +61,7 @@ operation. dependencies and outputs, to allow safely running multiple DVC commands in parallel -- `.dvc/tmp/exp`: _n_th workspace copy, used for temporary or +- `.dvc/tmp/exp`: _n_th workspace copy, used for temporary or parallel experiments (see `dvc exp run`). ## Structure of the cache directory From fe9b698e9cf5c1e74db08da66d221b4436915898 Mon Sep 17 00:00:00 2001 From: Jorge Orpinel Date: Sun, 28 Feb 2021 03:40:37 -0600 Subject: [PATCH 013/100] ref: doc exp list + exp run copy edits --- content/docs/command-reference/exp/list.md | 44 ++++++++++++++++++++++ content/docs/command-reference/exp/run.md | 7 ++-- content/docs/sidebar.json | 4 ++ 3 files changed, 51 insertions(+), 4 deletions(-) create mode 100644 content/docs/command-reference/exp/list.md diff --git a/content/docs/command-reference/exp/list.md b/content/docs/command-reference/exp/list.md new file mode 100644 index 0000000000..6b5fb1f6cd --- /dev/null +++ b/content/docs/command-reference/exp/list.md @@ -0,0 +1,44 @@ +# exp list + +List `dvc experiments` in a DVC repository (remote or local). + +## Synopsis + +```usage +usage: dvc experiments list [-h] [-q | -v] [--rev ] [--all] + [git_remote] + +positional arguments: + git_remote Optional Git remote name or repo URL +``` + +## Description + +Prints a list of experiments found in the current repository, and the branch/tag +or commit they're based on. This is similar to `dvc exp show --no-pager`, but +limited to experiment names and with very simple formatting. See also +`dvc exp run`. + +If a working `git_remote` name (e.g. `origin`) or valid Git repo's URL is +provided, lists experiments in that repository instead (if any). + +> Note that this utility doesn't require an existing DVC project to +> run from when a `git_remote` URL is given. + +Only experiments derived from the `HEAD` commit are listed by default (see the +options below). + +## Options + +- `--rev ` - list experiments derived from the specified Git commit + (instead of `HEAD`). + +- `--all` - list all experiments in the repository (overrides `--rev`). + +- `-h`, `--help` - shows the help message and exit. + +- `-q`, `--quiet` - do not write anything to standard output. Exit with 0 if no + problems arise, otherwise 1. + +- `-v`, `--verbose` - displays detailed tracing information from executing the + `dvc pull` command. diff --git a/content/docs/command-reference/exp/run.md b/content/docs/command-reference/exp/run.md index 1353d4f8cf..49db26c644 100644 --- a/content/docs/command-reference/exp/run.md +++ b/content/docs/command-reference/exp/run.md @@ -1,7 +1,7 @@ # exp run -Run an experiment: reproduce a variation of a committed -[pipeline](/doc/command-reference/dag) in a hidden project branch. +Run an [experiment](/doc/command-reference/exp): reproduce a variation of a +committed [pipeline](/doc/command-reference/dag) in a hidden project branch. > Similar to `dvc repro` but for > [experimentation](/doc/user-guide/experiment-management). @@ -142,8 +142,7 @@ CPU cores). parallel. Only applicable when used in conjunction with `--run-all`. - `-r `, `--rev ` - continue an experiment from a specific - checkpoint name or hash (`commit`). Required for explicitly resuming - checkpoints in queued or temp dir runs. + checkpoint name or hash (`commit`). - `--reset` - restart a checkpoint experiment from scratch (resets existing checkpoints to the initial state). diff --git a/content/docs/sidebar.json b/content/docs/sidebar.json index 6ea9dcb076..e0a33d31ce 100644 --- a/content/docs/sidebar.json +++ b/content/docs/sidebar.json @@ -242,6 +242,10 @@ { "label": "exp branch", "slug": "branch" + }, + { + "label": "exp list", + "slug": "list" } ] }, From 376ea709deb6f5757089641e177d582634e8cead Mon Sep 17 00:00:00 2001 From: Jorge Orpinel Date: Sun, 28 Feb 2021 04:06:09 -0600 Subject: [PATCH 014/100] ref: doc exp gc --- content/docs/command-reference/exp/gc.md | 59 ++++++++++++++++++++++++ content/docs/sidebar.json | 12 +++++ 2 files changed, 71 insertions(+) create mode 100644 content/docs/command-reference/exp/gc.md diff --git a/content/docs/command-reference/exp/gc.md b/content/docs/command-reference/exp/gc.md new file mode 100644 index 0000000000..eca8f24c28 --- /dev/null +++ b/content/docs/command-reference/exp/gc.md @@ -0,0 +1,59 @@ +# exp gc + +Remove `dvc experiments` from the project. + +## Synopsis + +```usage +usage: dvc exp gc [-h] [-q | -v] [-w] + [-a] [-T] [--all-commits] [--queued] [-f] +``` + +## Description + +This command can delete (garbage collect) experiments that exist in the project +but are no longer needed. + +> See **How does DVC track experiments?** in `dvc exp run` to learn more about +> DVC experiment storage. + +To avoid accidentally deleting work, it doesn't do anything unless one or a +combination of scope options are provided (`--workspace`, `--all-branches`, +`--all-tags`, `--all-commits`). Use these to indicate which experiments are +still needed. See the [Options](#options) section for more details. + +Note that after removing experiments, the corresponding data which may no longer +be needed still remains in the cache. You can use `dvc gc` +separately to delete it. + +## Options + +- `-w`, `--workspace` - keep _only_ experiments derived from the current + workspace This option is enabled automatically if `--all-tags`, + `--all-branches`, or `--all-commits` are used. + +- `-a`, `--all-branches` - keep experiments derived from the tips of all Git + branches as well as the workspace (implies `-w`). Note that this can be + combined with `-T` below, for example using the `-aT` flag. + +- `-T`, `--all-tags` - same as `-a` above, but applies to Git tags as well as + the workspace (implies `-w`). Note that both options can be combined, for + example using the `-aT` flag. + +- `--all-commits` - same as `-a` or `-T` above, but applies to _all_ Git commits + as well as the workspace (implies `-w`). This is mainly only needed when + clearing the experiments run queue. + +- `--queued` - keep experiments that haven't been run yet (defined via + `dvc exp run --queue`) . The experiment run queue will typically be cleared if + this option isn't used. + +- `-f`, `--force` - force garbage collection. Skip confirmation prompt. + +- `-h`, `--help` - shows the help message and exit. + +- `-q`, `--quiet` - do not write anything to standard output. Exit with 0 if no + problems arise, otherwise 1. + +- `-v`, `--verbose` - displays detailed tracing information from executing the + `dvc pull` command. diff --git a/content/docs/sidebar.json b/content/docs/sidebar.json index e0a33d31ce..f77e5b704b 100644 --- a/content/docs/sidebar.json +++ b/content/docs/sidebar.json @@ -243,6 +243,18 @@ "label": "exp branch", "slug": "branch" }, + { + "label": "exp gc", + "slug": "gc" + }, + { + "label": "exp push", + "slug": "push" + }, + { + "label": "exp pull", + "slug": "pull" + }, { "label": "exp list", "slug": "list" From f7eed423274705966eeb3058f158e797070db8fb Mon Sep 17 00:00:00 2001 From: Jorge Orpinel Date: Sun, 28 Feb 2021 04:06:09 -0600 Subject: [PATCH 015/100] ref: doc exp gc --- content/docs/command-reference/exp/gc.md | 59 ++++++++++++++++++++++++ content/docs/sidebar.json | 12 +++++ 2 files changed, 71 insertions(+) create mode 100644 content/docs/command-reference/exp/gc.md diff --git a/content/docs/command-reference/exp/gc.md b/content/docs/command-reference/exp/gc.md new file mode 100644 index 0000000000..4f8ce6b033 --- /dev/null +++ b/content/docs/command-reference/exp/gc.md @@ -0,0 +1,59 @@ +# exp gc + +Remove `dvc experiments` from the project. + +## Synopsis + +```usage +usage: dvc exp gc [-h] [-q | -v] [-w] + [-a] [-T] [--all-commits] [--queued] [-f] +``` + +## Description + +This command can delete (garbage collect) experiments that exist in the project +but are no longer needed. + +> See **How does DVC track experiments?** in `dvc exp run` to learn more about +> DVC experiment storage. + +To avoid accidentally deleting work, `dvc exp gc` doesn't do anything unless one +or a combination of scope options are provided (`--workspace`, `--all-branches`, +`--all-tags`, `--all-commits`). Use these to indicate which experiments are +still needed. See the [Options](#options) section for more details. + +Note that after removing experiments, the corresponding data which may no longer +be needed still remains in the cache. You can use `dvc gc` +separately to delete it. + +## Options + +- `-w`, `--workspace` - keep _only_ experiments derived from the current + workspace This option is enabled automatically if `--all-tags`, + `--all-branches`, or `--all-commits` are used. + +- `-a`, `--all-branches` - keep experiments derived from the tips of all Git + branches as well as the workspace (implies `-w`). Note that this can be + combined with `-T` below, for example using the `-aT` flag. + +- `-T`, `--all-tags` - same as `-a` above, but applies to Git tags as well as + the workspace (implies `-w`). Note that both options can be combined, for + example using the `-aT` flag. + +- `--all-commits` - same as `-a` or `-T` above, but applies to _all_ Git commits + as well as the workspace (implies `-w`). This is mainly only needed when + clearing the experiments run queue. + +- `--queued` - keep experiments that haven't been run yet (defined via + `dvc exp run --queue`) . The experiment run queue will typically be cleared if + this option isn't used. + +- `-f`, `--force` - force garbage collection. Skip confirmation prompt. + +- `-h`, `--help` - shows the help message and exit. + +- `-q`, `--quiet` - do not write anything to standard output. Exit with 0 if no + problems arise, otherwise 1. + +- `-v`, `--verbose` - displays detailed tracing information from executing the + `dvc pull` command. diff --git a/content/docs/sidebar.json b/content/docs/sidebar.json index e0a33d31ce..f77e5b704b 100644 --- a/content/docs/sidebar.json +++ b/content/docs/sidebar.json @@ -243,6 +243,18 @@ "label": "exp branch", "slug": "branch" }, + { + "label": "exp gc", + "slug": "gc" + }, + { + "label": "exp push", + "slug": "push" + }, + { + "label": "exp pull", + "slug": "pull" + }, { "label": "exp list", "slug": "list" From 1801a7548c1790ac0335a9915b82865936cc4a51 Mon Sep 17 00:00:00 2001 From: Jorge Orpinel Date: Sun, 28 Feb 2021 04:34:58 -0600 Subject: [PATCH 016/100] ref: explain how to continue checkpoint experiments in exp run per https://github.com/iterative/dvc.org/pull/2243#pullrequestreview-601428869 --- content/docs/command-reference/exp/run.md | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/content/docs/command-reference/exp/run.md b/content/docs/command-reference/exp/run.md index 49db26c644..4c49802c3f 100644 --- a/content/docs/command-reference/exp/run.md +++ b/content/docs/command-reference/exp/run.md @@ -67,22 +67,30 @@ committing them to the Git repo. Unnecessary ones can be removed with To track successive steps in a longer experiment, you can register checkpoints with DVC during your code or script runtime (similar to a logger). -⚠️ Using the `checkpoint` field in `dvc.yaml` is only compatibly with -`dvc exp run`, `dvc repro` will abort if any stage contains it. - To do so, first mark stage `outs` with `checkpoint: true` in `dvc.yaml`. Having at least a checkpoint output is needed so that the experiment can later restart based on that output's last cached state. +⚠️ Using the `checkpoint` field in `dvc.yaml` is only compatibly with +`dvc exp run`, `dvc repro` will abort if any stage contains it. + Then, in the corresponding code, either call the `dvc.api.make_checkpoint()` function (Python), or write a signal file (any programming language) following the same steps as `make_checkpoint()` — please refer to that reference for details. -The `--rev` and `--reset` options of this command are specifically designed to -help you manage checkpoint experiments. The former lets you continue an -experiment from a previously registered checkpoint (having made some changes to -code, params, etc.). The latter restarts the whole process from scratch. +Once this is setup, you can use `dvc exp run` to begin the experiment. You may +interrupt this process manually (e.g. with Ctrl + `C`) if needed, and DVC will +automatically [apply](/doc/command-reference/exp/apply) the last checkpoint to +the workspace (overwriting any further changes done by the stage). +Simply `dvc exp run` again to continue. + +The `--rev` and `--reset` options also help you manage checkpoint experiment +runs. The former lets you continue an experiment from a specific checkpoint +(having made some changes to code, params, etc.). The latter restarts the whole +process from scratch. + +Note that `dvc exp show` displays checkpoints with a special branching format.
From 96c55bec79413ad42d168c237d4ca6d91275ea85 Mon Sep 17 00:00:00 2001 From: Jorge Orpinel Date: Sun, 28 Feb 2021 13:05:21 -0600 Subject: [PATCH 017/100] ref: doc exp push/pull --- content/docs/command-reference/exp/pull.md | 62 ++++++++++++++++++++++ content/docs/command-reference/exp/push.md | 62 ++++++++++++++++++++++ 2 files changed, 124 insertions(+) create mode 100644 content/docs/command-reference/exp/pull.md create mode 100644 content/docs/command-reference/exp/push.md diff --git a/content/docs/command-reference/exp/pull.md b/content/docs/command-reference/exp/pull.md new file mode 100644 index 0000000000..cf80bfb43d --- /dev/null +++ b/content/docs/command-reference/exp/pull.md @@ -0,0 +1,62 @@ +# exp pull + +Download a single [experiment](/doc/command-reference/exp) to a Git remote, and +its data to a `dvc remote`. + +## Synopsis + +```usage +usage: dvc experiments pull [-h] [-q | -v] [-f] [--no-cache] + [-r ] [-j ] [--run-cache] + git_remote experiment + +positional arguments: + git_remote Git remote name or repo URL + experiment Experiment to pull +``` + +## Description + +The `dvc exp push` and `dvc exp pull` commands are the means for sharing +experiments across repository copies via Git (and DVC) remotes. + +> Plain `git push` and `git pull` don't work with `dvc experiments` because +> these are saved under custom Git references. See **How does DVC track +> experiments?** in `dvc exp run` to learn more about DVC experiment storage. + +A working `git_remote` name (e.g. `origin`) or valid Git repo's URL is required, +as well as a single `experiment` name or hash (see `dvc exp run`) to pull. + +By default, this command will also try to [pull](/doc/command-reference/pull) +all cached data associated with the experiment to DVC +[remote storage](/doc/command-reference/remote), unless `--no-cache` is used. +The default remote is used (see `dvc remote default`) unless a specific one is +given with `--remote`. + +## Options + +- `-f`, `--force` - rewrite the `experiment` commit if it already exists in the + local repo. Equivalent to `git push --force` (rewrites history) + +- `--no-cache` - do not pull cached files files associated with this experiment + from DVC remote storage. + +- `-r `, `--remote ` - name of the `dvc remote` to pull cached files + to. + +- `--run-cache` - downloads all available history of stage runs to the + `dvc remote` (to the cache only, like `dvc fetch --run-cache`). + +- `-j `, `--jobs ` - parallelism level for DVC to upload data to + remote storage. The default value is `4 * cpu_count()`. For SSH remotes, the + default is `4`. Note that the default value can be set using the `jobs` config + option with `dvc remote modify`. Using more jobs may improve the overall + transfer speed. + +- `-h`, `--help` - shows the help message and exit. + +- `-q`, `--quiet` - do not write anything to standard output. Exit with 0 if no + problems arise, otherwise 1. + +- `-v`, `--verbose` - displays detailed tracing information from executing the + `dvc pull` command. diff --git a/content/docs/command-reference/exp/push.md b/content/docs/command-reference/exp/push.md new file mode 100644 index 0000000000..627fc96452 --- /dev/null +++ b/content/docs/command-reference/exp/push.md @@ -0,0 +1,62 @@ +# exp push + +Upload a single [experiment](/doc/command-reference/exp) to a Git remote, and +its data to a `dvc remote`. + +## Synopsis + +```usage +usage: dvc experiments push [-h] [-q | -v] [-f] [--no-cache] + [-r ] [-j ] [--run-cache] + git_remote experiment + +positional arguments: + git_remote Git remote name or repo URL + experiment Experiment to push +``` + +## Description + +The `dvc exp push` and `dvc exp pull` commands are the means for sharing +experiments across repository copies via Git (and DVC) remotes. + +> Plain `git push` and `git pull` don't work with `dvc experiments` because +> these are saved under custom Git references. See **How does DVC track +> experiments?** in `dvc exp run` to learn more about DVC experiment storage. + +A working `git_remote` name (e.g. `origin`) or valid Git repo's URL is required, +as well as a single `experiment` name or hash (see `dvc exp run`) to push. + +This command will also try to [push](/doc/command-reference/push) all +cached data associated with the experiment to DVC +[remote storage](/doc/command-reference/remote), unless `--no-cache` is used. +The default remote is used (see `dvc remote default`) unless a specific one is +given with `--remote`. + +## Options + +- `-f`, `--force` - rewrite the `experiment` commit if it already exists in the + Git remote. Equivalent to `git push --force` (rewrites history) + +- `--no-cache` - do not push cached files associated with this experiment to a + DVC remote. + +- `-r `, `--remote ` - name of the `dvc remote` to push cached files + to. + +- `--run-cache` - uploads all available history of stage runs to the + `dvc remote`. + +- `-j `, `--jobs ` - parallelism level for DVC to upload data to + remote storage. The default value is `4 * cpu_count()`. For SSH remotes, the + default is `4`. Note that the default value can be set using the `jobs` config + option with `dvc remote modify`. Using more jobs may improve the overall + transfer speed. + +- `-h`, `--help` - shows the help message and exit. + +- `-q`, `--quiet` - do not write anything to standard output. Exit with 0 if no + problems arise, otherwise 1. + +- `-v`, `--verbose` - displays detailed tracing information from executing the + `dvc pull` command. From 4036de7f46f92d9b578db9c58f9abe876562b475 Mon Sep 17 00:00:00 2001 From: Jorge Orpinel Date: Sun, 28 Feb 2021 14:21:25 -0600 Subject: [PATCH 018/100] ref: corresctions on exp run --rev per https://github.com/iterative/dvc.org/pull/2243#discussion_r585306363 --- content/docs/command-reference/exp/run.md | 35 ++++++++++++----------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/content/docs/command-reference/exp/run.md b/content/docs/command-reference/exp/run.md index 7c8418c893..9f923304d3 100644 --- a/content/docs/command-reference/exp/run.md +++ b/content/docs/command-reference/exp/run.md @@ -79,16 +79,15 @@ function (Python), or write a signal file (any programming language) following the same steps as `make_checkpoint()` — please refer to that reference for details. -Once this is setup, you can use `dvc exp run` to begin the experiment. You may -interrupt this process manually (e.g. with Ctrl + `C`) if needed, and DVC will -automatically [apply](/doc/command-reference/exp/apply) the last checkpoint to -the workspace (overwriting any further changes done by the stage). -Simply `dvc exp run` again to continue. +Once this is setup, you can use `dvc exp run` to begin the experiment. When the +process finishes or gets interrupted (e.g. with Ctrl + `C`), DVC will +[apply](/doc/command-reference/exp/apply) the last checkpoint to the +workspace (overwriting any further changes done by the stage). -The `--rev` and `--reset` options also help you manage checkpoint experiment -runs. The former lets you continue an experiment from a specific checkpoint -(having made some changes to code, params, etc.). The latter restarts the whole -process from scratch. +`dvc exp run` again will continue from this point (useful for interrupted runs). +Use `--reset` to roll-back the workspace to `HEAD` and restart the whole +experiment. Alternatively, you can use `--rev` to continue from a specific +(previous) checkpoint. Note that `dvc exp show` displays checkpoints with a special branching format. @@ -109,10 +108,12 @@ The `--queue` option lets you create an experiment as usual, except that nothing is actually run. Instead, the experiment is put in a wait-list for later execution. `dvc exp show` will mark queued experiments with an asterisk `*`. -Use `dvc exp run --run-all` to process this queue. Adding `-j` (`--jobs`), -queued experiments can be run in parallel for better performance. This creates a -temporary workspace copy (in `.dvc/tmp/exp` where _n_ is the job number) for -each subprocess (see also `--temp`). +Use `dvc exp run --run-all` to process this queue. Note that if the queued +experiments use checkpoints, `--run-all` implies `--reset` (restarts them). + +Adding `-j` (`--jobs`), experiment queues can be run in parallel for better +performance. This creates a temporary workspace copy for each subprocess (in +`.dvc/tmp/exp` where _n_ is the job number). See also `--temp`. ⚠️ Parallel runs are experimental and may be unstable at this time. ⚠️ Make sure you're using a number of jobs that your environment can handle (no more than the @@ -137,20 +138,22 @@ CPU cores). hash). - `--temp` - run this experiment in a separate temporary directory (in - `.dvc/tmp/exp`) instead of your workspace. Useful for + `.dvc/tmp/exp`) instead of your workspace. - `--queue` - place this experiment at the end of a line for future execution, but do not actually run it yet. Use `dvc exp run --run-all` to process the queue. - `--run-all` - run all queued experiments (see `--queue`). Use `-j` to execute - them [in parallel](#queueing-and-parallel-execution). + them [in parallel](#queueing-and-parallel-execution). For checkpoint + experiments, this implies `--reset`. - `-j `, `--jobs ` - run this `number` of queued experiments in parallel. Only applicable when used in conjunction with `--run-all`. - `-r `, `--rev ` - continue an experiment from a specific - checkpoint name or hash (`commit`). + checkpoint name or hash (`commit`). This is needed for example to resume + experiments from `--queue` or `--temp` runs. - `--reset` - restart a checkpoint experiment from scratch (resets the workspace and clears existing checkpoints before the run). Implies `--force`, so that From 14cb489035a2d5a22c4132351dc34e6ed499f6e3 Mon Sep 17 00:00:00 2001 From: Jorge Orpinel Date: Sun, 28 Feb 2021 15:10:53 -0600 Subject: [PATCH 019/100] ref: update exp branch Desc per https://github.com/iterative/dvc.org/pull/2243#pullrequestreview-601462824 --- content/docs/command-reference/exp/branch.md | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/content/docs/command-reference/exp/branch.md b/content/docs/command-reference/exp/branch.md index 5cc6b174f6..7e448806fc 100644 --- a/content/docs/command-reference/exp/branch.md +++ b/content/docs/command-reference/exp/branch.md @@ -1,7 +1,7 @@ # exp branch -Commit the results from any [experiment](/doc/command-reference/exp) to Git, in -a new branch (which will become the current workspace). +Commit the results from an [experiment](/doc/command-reference/exp) in a new Git +branch, which will become the workspace. ## Synopsis @@ -15,18 +15,23 @@ positional arguments: ## Description -Makes a Git branch off the last commit (`HEAD`) based on the given `experiment`, -using the `branch` name provided. +Makes a +[Git branch](https://git-scm.com/book/en/v2/Git-Branching-Basic-Branching-and-Merging) +off the last commit (`HEAD`) based on the given `experiment`, using the `branch` +name provided. The new branch is switched into (`git checkout`). -This is equivalent to using `dvc exp apply` (applies the results from any -experiment to the workspace) followed by Git branching and committing: +In most cases this is equivalent to using `dvc exp apply` (applies the +`experiment` results to the workspace) followed by Git branching and committing: ```dvc $ dvc exp apply experiment $ git checkout -b branch -$ git commit ... +$ git add . && git commit ``` +For [checkpoints](/doc/command-reference/exp/run#checkpoints), the `experiment` +(custom Git branch) is merged into the new `branch`. + ## Options - `-h`, `--help` - shows the help message and exit. From 5a35b3381a87ffe79d4987f2bef1bc4fb97e5185 Mon Sep 17 00:00:00 2001 From: Jorge Orpinel Date: Sun, 28 Feb 2021 15:11:31 -0600 Subject: [PATCH 020/100] ref: mention how to delete exps from git remotes in exp push per https://github.com/iterative/dvc.org/pull/2243#discussion_r585311945 --- content/docs/command-reference/exp/pull.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/content/docs/command-reference/exp/pull.md b/content/docs/command-reference/exp/pull.md index cf80bfb43d..e5c55bd43e 100644 --- a/content/docs/command-reference/exp/pull.md +++ b/content/docs/command-reference/exp/pull.md @@ -33,6 +33,9 @@ all cached data associated with the experiment to DVC The default remote is used (see `dvc remote default`) unless a specific one is given with `--remote`. +> 💡 Note that `git push --delete ` can be used to +> delete a pushed experiment. + ## Options - `-f`, `--force` - rewrite the `experiment` commit if it already exists in the From 49259c90e70614249eac6c455dcc3be5e56c9316 Mon Sep 17 00:00:00 2001 From: Jorge Orpinel Date: Sun, 28 Feb 2021 22:15:59 -0600 Subject: [PATCH 021/100] ref: doc exp remove and gc update --- content/docs/command-reference/exp/gc.md | 6 ++-- content/docs/command-reference/exp/remove.md | 33 ++++++++++++++++++++ content/docs/sidebar.json | 4 +++ 3 files changed, 40 insertions(+), 3 deletions(-) create mode 100644 content/docs/command-reference/exp/remove.md diff --git a/content/docs/command-reference/exp/gc.md b/content/docs/command-reference/exp/gc.md index 4f8ce6b033..1e5e8c4be3 100644 --- a/content/docs/command-reference/exp/gc.md +++ b/content/docs/command-reference/exp/gc.md @@ -1,6 +1,6 @@ # exp gc -Remove `dvc experiments` from the project. +Remove unnecessary `dvc experiments` from the project. ## Synopsis @@ -29,7 +29,7 @@ separately to delete it. ## Options - `-w`, `--workspace` - keep _only_ experiments derived from the current - workspace This option is enabled automatically if `--all-tags`, + workspace. This option is enabled automatically if `--all-tags`, `--all-branches`, or `--all-commits` are used. - `-a`, `--all-branches` - keep experiments derived from the tips of all Git @@ -45,7 +45,7 @@ separately to delete it. clearing the experiments run queue. - `--queued` - keep experiments that haven't been run yet (defined via - `dvc exp run --queue`) . The experiment run queue will typically be cleared if + `dvc exp run --queue`). The experiment run queue will typically be cleared if this option isn't used. - `-f`, `--force` - force garbage collection. Skip confirmation prompt. diff --git a/content/docs/command-reference/exp/remove.md b/content/docs/command-reference/exp/remove.md new file mode 100644 index 0000000000..d52311a8d3 --- /dev/null +++ b/content/docs/command-reference/exp/remove.md @@ -0,0 +1,33 @@ +# exp remove + +Remove specific `dvc experiments` from the project. + +## Synopsis + +```usage +usage: dvc experiments remove [-h] [-q | -v] [--queue] + [experiment [experiment ...]] + +Remove local experiments. +``` + +## Description + +Deletes one or more experiments indicated by name or hash (see `dvc exp run`). + +With `--queue`, the queue of experiments is cleared. + +## Options + +- `--queue` - remove all experiments that haven't been run yet (defined via + `dvc exp run --queue`). + +- `-f`, `--force` - force garbage collection. Skip confirmation prompt. + +- `-h`, `--help` - shows the help message and exit. + +- `-q`, `--quiet` - do not write anything to standard output. Exit with 0 if no + problems arise, otherwise 1. + +- `-v`, `--verbose` - displays detailed tracing information from executing the + `dvc pull` command. diff --git a/content/docs/sidebar.json b/content/docs/sidebar.json index f77e5b704b..9c09cc57c7 100644 --- a/content/docs/sidebar.json +++ b/content/docs/sidebar.json @@ -243,6 +243,10 @@ "label": "exp branch", "slug": "branch" }, + { + "label": "exp remove", + "slug": "remove" + }, { "label": "exp gc", "slug": "gc" From e087517e80529e4e48f903dcdfae1dc8703083f9 Mon Sep 17 00:00:00 2001 From: Jorge Orpinel Date: Sun, 28 Feb 2021 22:33:47 -0600 Subject: [PATCH 022/100] ref: exp gc corrections per https://github.com/iterative/dvc.org/pull/2243#discussion_r585293932 and https://github.com/iterative/dvc.org/pull/2243#discussion_r585294053 --- content/docs/command-reference/exp/gc.md | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/content/docs/command-reference/exp/gc.md b/content/docs/command-reference/exp/gc.md index 1e5e8c4be3..8816f9f457 100644 --- a/content/docs/command-reference/exp/gc.md +++ b/content/docs/command-reference/exp/gc.md @@ -28,9 +28,9 @@ separately to delete it. ## Options -- `-w`, `--workspace` - keep _only_ experiments derived from the current - workspace. This option is enabled automatically if `--all-tags`, - `--all-branches`, or `--all-commits` are used. +- `-w`, `--workspace` - keep _only_ experiments derived from the Git `HEAD` + commits (default base commit for `dvc exp run`). This option is enabled + automatically if `--all-tags`, `--all-branches`, or `--all-commits` are used. - `-a`, `--all-branches` - keep experiments derived from the tips of all Git branches as well as the workspace (implies `-w`). Note that this can be @@ -44,9 +44,10 @@ separately to delete it. as well as the workspace (implies `-w`). This is mainly only needed when clearing the experiments run queue. -- `--queued` - keep experiments that haven't been run yet (defined via - `dvc exp run --queue`). The experiment run queue will typically be cleared if - this option isn't used. +- `--queued` - keep also experiments that haven't been run yet (defined via + `dvc exp run --queue`). A scope option (`-w`, `-a`, etc.) is required along + with this. The experiment run queue will typically be cleared if this option + isn't used. - `-f`, `--force` - force garbage collection. Skip confirmation prompt. From 64f67540b2270f1c19d6320a2c2bf6242c0a0715 Mon Sep 17 00:00:00 2001 From: Jorge Orpinel Date: Sun, 28 Feb 2021 22:40:32 -0600 Subject: [PATCH 023/100] ref: mention checkpoints in exp show and list per https://github.com/iterative/dvc.org/pull/2243#pullrequestreview-601481786 --- content/docs/command-reference/exp/list.md | 3 +++ content/docs/command-reference/exp/show.md | 9 +++++---- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/content/docs/command-reference/exp/list.md b/content/docs/command-reference/exp/list.md index 6b5fb1f6cd..e0bbf086b2 100644 --- a/content/docs/command-reference/exp/list.md +++ b/content/docs/command-reference/exp/list.md @@ -28,6 +28,9 @@ provided, lists experiments in that repository instead (if any). Only experiments derived from the `HEAD` commit are listed by default (see the options below). +> Note that [checkpoints](/doc/command-reference/exp/run#checkpoints) are not +> listed, only the parent experiment. + ## Options - `--rev ` - list experiments derived from the specified Git commit diff --git a/content/docs/command-reference/exp/show.md b/content/docs/command-reference/exp/show.md index d1926610e8..1a49b974fa 100644 --- a/content/docs/command-reference/exp/show.md +++ b/content/docs/command-reference/exp/show.md @@ -19,10 +19,11 @@ usage: dvc exp show [-h] [-q | -v] [-a] [-T] [--all-commits] [--no-pager] ## Description -Displays experiments in a detailed table which includes their parent, name (or -hash), metrics, and parameters. Only the experiments derived from the Git `HEAD` -are shown by default but all experiments can be included with the -`--all-commits` option. Example: +Displays experiments and +[checkpoints](/doc/command-reference/exp/run#checkpoints) in a detailed table +which includes their parent, name (or hash), metrics, and parameters. Only the +experiments derived from the Git `HEAD` are shown by default but all experiments +can be included with the `--all-commits` option. Example: ```dvc $ dvc exp show From 67348489365216efac6dee85f13fcc4f04ed5b3a Mon Sep 17 00:00:00 2001 From: Jorge Orpinel Date: Sun, 28 Feb 2021 22:51:11 -0600 Subject: [PATCH 024/100] guide: correct .dvc/tmp/exps dir path per https://github.com/iterative/dvc.org/pull/2243#pullrequestreview-602041147 --- content/docs/command-reference/exp/run.md | 4 ++-- content/docs/user-guide/project-structure/internal-files.md | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/content/docs/command-reference/exp/run.md b/content/docs/command-reference/exp/run.md index 9f923304d3..74e6e808ac 100644 --- a/content/docs/command-reference/exp/run.md +++ b/content/docs/command-reference/exp/run.md @@ -113,7 +113,7 @@ experiments use checkpoints, `--run-all` implies `--reset` (restarts them). Adding `-j` (`--jobs`), experiment queues can be run in parallel for better performance. This creates a temporary workspace copy for each subprocess (in -`.dvc/tmp/exp` where _n_ is the job number). See also `--temp`. +`.dvc/tmp/exps` where _n_ is the job number). See also `--temp`. ⚠️ Parallel runs are experimental and may be unstable at this time. ⚠️ Make sure you're using a number of jobs that your environment can handle (no more than the @@ -138,7 +138,7 @@ CPU cores). hash). - `--temp` - run this experiment in a separate temporary directory (in - `.dvc/tmp/exp`) instead of your workspace. + `.dvc/tmp/exps`) instead of your workspace. - `--queue` - place this experiment at the end of a line for future execution, but do not actually run it yet. Use `dvc exp run --run-all` to process the diff --git a/content/docs/user-guide/project-structure/internal-files.md b/content/docs/user-guide/project-structure/internal-files.md index 369b98fca1..108c86324f 100644 --- a/content/docs/user-guide/project-structure/internal-files.md +++ b/content/docs/user-guide/project-structure/internal-files.md @@ -61,8 +61,8 @@ operation. dependencies and outputs, to allow safely running multiple DVC commands in parallel -- `.dvc/tmp/exp`: _n_th workspace copy, used for temporary or - parallel experiments (see `dvc exp run`). +- `.dvc/tmp/exps`: This directory will contain workspace copies used for + temporary or parallel experiments (see `dvc exp run`). ## Structure of the cache directory From b6cd1024f5c0790dbbf57f8f1f6dd4de5c162a22 Mon Sep 17 00:00:00 2001 From: Jorge Orpinel Date: Sun, 28 Feb 2021 23:00:13 -0600 Subject: [PATCH 025/100] ref: corrections on exp run --temp per https://github.com/iterative/dvc.org/pull/2243#pullrequestreview-602130689 --- content/docs/command-reference/exp/run.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/content/docs/command-reference/exp/run.md b/content/docs/command-reference/exp/run.md index 74e6e808ac..805f46b48b 100644 --- a/content/docs/command-reference/exp/run.md +++ b/content/docs/command-reference/exp/run.md @@ -113,7 +113,7 @@ experiments use checkpoints, `--run-all` implies `--reset` (restarts them). Adding `-j` (`--jobs`), experiment queues can be run in parallel for better performance. This creates a temporary workspace copy for each subprocess (in -`.dvc/tmp/exps` where _n_ is the job number). See also `--temp`. +`.dvc/tmp/exps`). See also `--temp`. ⚠️ Parallel runs are experimental and may be unstable at this time. ⚠️ Make sure you're using a number of jobs that your environment can handle (no more than the @@ -137,9 +137,6 @@ CPU cores). name will generated by default, such as `exp-f80g4` (based on the experiment's hash). -- `--temp` - run this experiment in a separate temporary directory (in - `.dvc/tmp/exps`) instead of your workspace. - - `--queue` - place this experiment at the end of a line for future execution, but do not actually run it yet. Use `dvc exp run --run-all` to process the queue. @@ -151,6 +148,9 @@ CPU cores). - `-j `, `--jobs ` - run this `number` of queued experiments in parallel. Only applicable when used in conjunction with `--run-all`. +- `--temp` - run this experiment in a separate temporary directory (in + `.dvc/tmp/exps`) instead of your workspace. + - `-r `, `--rev ` - continue an experiment from a specific checkpoint name or hash (`commit`). This is needed for example to resume experiments from `--queue` or `--temp` runs. From 2463e4496ac5c251004b72b3b6a7a18269badf3a Mon Sep 17 00:00:00 2001 From: Jorge Orpinel Date: Sun, 28 Feb 2021 23:07:47 -0600 Subject: [PATCH 026/100] ref: correct exp branch per https://github.com/iterative/dvc.org/pull/2243#pullrequestreview-602130689 --- content/docs/command-reference/exp/branch.md | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/content/docs/command-reference/exp/branch.md b/content/docs/command-reference/exp/branch.md index 7e448806fc..325b2ff8d5 100644 --- a/content/docs/command-reference/exp/branch.md +++ b/content/docs/command-reference/exp/branch.md @@ -20,17 +20,20 @@ Makes a off the last commit (`HEAD`) based on the given `experiment`, using the `branch` name provided. The new branch is switched into (`git checkout`). -In most cases this is equivalent to using `dvc exp apply` (applies the -`experiment` results to the workspace) followed by Git branching and committing: - -```dvc -$ dvc exp apply experiment -$ git checkout -b branch -$ git add . && git commit +In most cases this is similar to using `dvc exp apply` (applies the `experiment` +results to the workspace) followed by Git branching and committing, except that +`dvc exp branch` **does not** switch into the created `branch`. Equivalent to +this: + +```bash +[master] $ git checkout -b branch +[branch] $ dvc exp apply experiment +[branch] $ git add . && git commit +[branch] $ git checkout master ``` For [checkpoints](/doc/command-reference/exp/run#checkpoints), the `experiment` -(custom Git branch) is merged into the new `branch`. +(custom Git branch with multiple commits) is merged into the new `branch`. ## Options From 87e7376f0450360e603bb75663f4d30692f6d05f Mon Sep 17 00:00:00 2001 From: Jorge Orpinel Date: Sun, 28 Feb 2021 23:49:26 -0600 Subject: [PATCH 027/100] ref: exp branch and remove usage blocks --- content/docs/command-reference/exp/branch.md | 2 +- content/docs/command-reference/exp/remove.md | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/content/docs/command-reference/exp/branch.md b/content/docs/command-reference/exp/branch.md index 325b2ff8d5..d060f52769 100644 --- a/content/docs/command-reference/exp/branch.md +++ b/content/docs/command-reference/exp/branch.md @@ -9,7 +9,7 @@ branch, which will become the workspace. usage: dvc exp branch [-h] [-q | -v] experiment branch positional arguments: - experiment Experiment to be promoted + experiment Experiment to commit/merge branch Git branch name to use ``` diff --git a/content/docs/command-reference/exp/remove.md b/content/docs/command-reference/exp/remove.md index d52311a8d3..d196f9c21c 100644 --- a/content/docs/command-reference/exp/remove.md +++ b/content/docs/command-reference/exp/remove.md @@ -8,7 +8,8 @@ Remove specific `dvc experiments` from the project. usage: dvc experiments remove [-h] [-q | -v] [--queue] [experiment [experiment ...]] -Remove local experiments. +positional arguments: + experiment Experiments to remove. ``` ## Description From 257cd16599fc1bdb1b73091aaa2c073d1686224c Mon Sep 17 00:00:00 2001 From: Jorge Orpinel Date: Tue, 2 Mar 2021 20:24:12 -0600 Subject: [PATCH 028/100] Update content/docs/command-reference/exp/pull.md Co-authored-by: Dave Berenbaum --- content/docs/command-reference/exp/pull.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/docs/command-reference/exp/pull.md b/content/docs/command-reference/exp/pull.md index e5c55bd43e..3db8fa15e0 100644 --- a/content/docs/command-reference/exp/pull.md +++ b/content/docs/command-reference/exp/pull.md @@ -1,7 +1,7 @@ # exp pull -Download a single [experiment](/doc/command-reference/exp) to a Git remote, and -its data to a `dvc remote`. +Download a single [experiment](/doc/command-reference/exp) from a Git remote, and +its data from a `dvc remote`. ## Synopsis From 610cf1eeefb61a4f172d84910f67e510d09a2858 Mon Sep 17 00:00:00 2001 From: "Restyled.io" Date: Wed, 3 Mar 2021 02:24:29 +0000 Subject: [PATCH 029/100] Restyled by prettier --- content/docs/command-reference/exp/pull.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/docs/command-reference/exp/pull.md b/content/docs/command-reference/exp/pull.md index 3db8fa15e0..155a675dbc 100644 --- a/content/docs/command-reference/exp/pull.md +++ b/content/docs/command-reference/exp/pull.md @@ -1,7 +1,7 @@ # exp pull -Download a single [experiment](/doc/command-reference/exp) from a Git remote, and -its data from a `dvc remote`. +Download a single [experiment](/doc/command-reference/exp) from a Git remote, +and its data from a `dvc remote`. ## Synopsis From a56c8db49f798a0f50d97591d87441c9ed421bf7 Mon Sep 17 00:00:00 2001 From: Batuhan Taskaya Date: Mon, 1 Mar 2021 10:07:21 +0300 Subject: [PATCH 030/100] cmd: add to-cache docs --- content/docs/command-reference/add.md | 52 +++++++++++++++++++++++++-- 1 file changed, 50 insertions(+), 2 deletions(-) diff --git a/content/docs/command-reference/add.md b/content/docs/command-reference/add.md index 8ffeb47ef3..4267d3c7ed 100644 --- a/content/docs/command-reference/add.md +++ b/content/docs/command-reference/add.md @@ -160,8 +160,10 @@ not. [remote storage](/doc/command-reference/remote) to transfer external target to (can only be used with `--to-remote`). -- `-o `, `--out ` - destination `path` for the transferred data (can - only be used with `--to-remote`). +- `-o `, `--out ` - destination `path` for the transferred data. If + used with `--to-remote`, the data will be transferred to the remote storage. + Else, it will be transferred [to the cache](#example-transfer-to-cache) and + will be linked to the workspace. - `--desc ` - user description of the data (optional). This doesn't affect any DVC operations. @@ -378,3 +380,49 @@ system that can handle it), they can use `dvc pull` as usual: A data.xml 1 file added and 1 file fetched ``` + +## Example: Transfer to cache + +When you have a large dataset in an external location, you may want to add it to +your cache without actually copying it into the workspace first. This might be +due to cache and workspace are in separate disks, which only the cache can +handle that size of data. After the data is saved to your cache, we link it to +your workspace with the +[preffered links](/doc/user-guide/large-dataset-optimization#file-link-types-for-the-dvc-cache). + +Let's initalize a DVC project; + +```dvc +$ mkdir example # workspace +$ cd example +$ git init +$ dvc init +``` + +Afterwards, let's setup a shared cache by following +[this](https://dvc.org/doc/use-cases/shared-development-server#preparation) +tutorial. When it is ready to go, we can add `data.xml` to our cache directly; + +``` +$ dvc add https://data.dvc.org/get-started/data.xml -o data.xml +``` + +Depending on the cache type configured on our workspace (can be set using +`cache.type` config value), the data is either linked up or just copied over. +For this use case, a reflink or a symlink is suggested. + +``` +$ ls +data.xml data.xml.dvc +``` + +As it can be seen, this option doesn't track the source unlike +[import-url](/doc/command-reference/import-url). + +``` + $ cat data.xml.dvc +outs: +- md5: a304afb96060aad90176268345e10355 + nfiles: 1 + path: data.xml +``` From 8754c3e9641bbbac9e2d6ac5658a79ee6cf546b5 Mon Sep 17 00:00:00 2001 From: Jorge Orpinel Date: Mon, 1 Mar 2021 02:38:42 -0600 Subject: [PATCH 031/100] ref: fix exp branch intro --- content/docs/command-reference/exp/branch.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/docs/command-reference/exp/branch.md b/content/docs/command-reference/exp/branch.md index d060f52769..69b726e92a 100644 --- a/content/docs/command-reference/exp/branch.md +++ b/content/docs/command-reference/exp/branch.md @@ -1,7 +1,7 @@ # exp branch Commit the results from an [experiment](/doc/command-reference/exp) in a new Git -branch, which will become the workspace. +branch. ## Synopsis From 5dc9a8619dfd9cdf91832395693a6bf3fa3cd902 Mon Sep 17 00:00:00 2001 From: Jorge Orpinel Date: Mon, 1 Mar 2021 02:56:44 -0600 Subject: [PATCH 032/100] ref: fix exp branch explanations --- content/docs/command-reference/exp/apply.md | 2 +- content/docs/command-reference/exp/branch.md | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/content/docs/command-reference/exp/apply.md b/content/docs/command-reference/exp/apply.md index 8a805120bd..9167047bd0 100644 --- a/content/docs/command-reference/exp/apply.md +++ b/content/docs/command-reference/exp/apply.md @@ -1,6 +1,6 @@ # exp apply -Apply the results from any [experiment](/doc/command-reference/exp) to the +Apply the results from an [experiment](/doc/command-reference/exp) to the workspace. ## Synopsis diff --git a/content/docs/command-reference/exp/branch.md b/content/docs/command-reference/exp/branch.md index 69b726e92a..abc13f3c31 100644 --- a/content/docs/command-reference/exp/branch.md +++ b/content/docs/command-reference/exp/branch.md @@ -18,7 +18,9 @@ positional arguments: Makes a [Git branch](https://git-scm.com/book/en/v2/Git-Branching-Basic-Branching-and-Merging) off the last commit (`HEAD`) based on the given `experiment`, using the `branch` -name provided. The new branch is switched into (`git checkout`). +name provided. This makes the given experiment +[persistent](/doc/user-guide/experiment-management#persistent-experiments) in +the repo. In most cases this is similar to using `dvc exp apply` (applies the `experiment` results to the workspace) followed by Git branching and committing, except that @@ -35,6 +37,8 @@ this: For [checkpoints](/doc/command-reference/exp/run#checkpoints), the `experiment` (custom Git branch with multiple commits) is merged into the new `branch`. +To switch into the new branch, use `git checkout branch` and `dvc checkout`. + ## Options - `-h`, `--help` - shows the help message and exit. From d81a0925ffb43e33883804d4432ace6eea0a2cce Mon Sep 17 00:00:00 2001 From: Jorge Orpinel Date: Mon, 1 Mar 2021 02:56:44 -0600 Subject: [PATCH 033/100] ref: fix exp branch explanations rel https://github.com/iterative/dvc.org/pull/2243#discussion_r586030465 --- content/docs/command-reference/exp/apply.md | 2 +- content/docs/command-reference/exp/branch.md | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/content/docs/command-reference/exp/apply.md b/content/docs/command-reference/exp/apply.md index 8a805120bd..9167047bd0 100644 --- a/content/docs/command-reference/exp/apply.md +++ b/content/docs/command-reference/exp/apply.md @@ -1,6 +1,6 @@ # exp apply -Apply the results from any [experiment](/doc/command-reference/exp) to the +Apply the results from an [experiment](/doc/command-reference/exp) to the workspace. ## Synopsis diff --git a/content/docs/command-reference/exp/branch.md b/content/docs/command-reference/exp/branch.md index 69b726e92a..abc13f3c31 100644 --- a/content/docs/command-reference/exp/branch.md +++ b/content/docs/command-reference/exp/branch.md @@ -18,7 +18,9 @@ positional arguments: Makes a [Git branch](https://git-scm.com/book/en/v2/Git-Branching-Basic-Branching-and-Merging) off the last commit (`HEAD`) based on the given `experiment`, using the `branch` -name provided. The new branch is switched into (`git checkout`). +name provided. This makes the given experiment +[persistent](/doc/user-guide/experiment-management#persistent-experiments) in +the repo. In most cases this is similar to using `dvc exp apply` (applies the `experiment` results to the workspace) followed by Git branching and committing, except that @@ -35,6 +37,8 @@ this: For [checkpoints](/doc/command-reference/exp/run#checkpoints), the `experiment` (custom Git branch with multiple commits) is merged into the new `branch`. +To switch into the new branch, use `git checkout branch` and `dvc checkout`. + ## Options - `-h`, `--help` - shows the help message and exit. From 2465c6de026f487512facb4a1be06525704cce5d Mon Sep 17 00:00:00 2001 From: Jorge Orpinel Date: Mon, 1 Mar 2021 03:35:12 -0600 Subject: [PATCH 034/100] ref: exp pull/push = git push/pull refs/exps... per https://github.com/iterative/dvc.org/pull/2243#discussion_r586058358 --- content/docs/command-reference/exp/pull.md | 13 +++++++++---- content/docs/command-reference/exp/push.md | 13 +++++++++---- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/content/docs/command-reference/exp/pull.md b/content/docs/command-reference/exp/pull.md index 155a675dbc..807cae4643 100644 --- a/content/docs/command-reference/exp/pull.md +++ b/content/docs/command-reference/exp/pull.md @@ -1,7 +1,7 @@ # exp pull -Download a single [experiment](/doc/command-reference/exp) from a Git remote, -and its data from a `dvc remote`. +Download an [experiment](/doc/command-reference/exp) from a Git remote, and its +data from a `dvc remote`. ## Synopsis @@ -20,12 +20,17 @@ positional arguments: The `dvc exp push` and `dvc exp pull` commands are the means for sharing experiments across repository copies via Git (and DVC) remotes. -> Plain `git push` and `git pull` don't work with `dvc experiments` because +> Plain `git push` and `git fetch` don't work with `dvc experiments` because > these are saved under custom Git references. See **How does DVC track > experiments?** in `dvc exp run` to learn more about DVC experiment storage. A working `git_remote` name (e.g. `origin`) or valid Git repo's URL is required, -as well as a single `experiment` name or hash (see `dvc exp run`) to pull. +as well as an `experiment` name or hash (see `dvc exp run`) to pull. + +The first action of `dvc exp pull` is to download the `experiment` so it's +available in the local repository (equivalent to +`git fetch refs/exps/`). Use `dvc exp show` to explore +your local experiments. By default, this command will also try to [pull](/doc/command-reference/pull) all cached data associated with the experiment to DVC diff --git a/content/docs/command-reference/exp/push.md b/content/docs/command-reference/exp/push.md index 627fc96452..972e070c8b 100644 --- a/content/docs/command-reference/exp/push.md +++ b/content/docs/command-reference/exp/push.md @@ -1,7 +1,7 @@ # exp push -Upload a single [experiment](/doc/command-reference/exp) to a Git remote, and -its data to a `dvc remote`. +Upload an [experiment](/doc/command-reference/exp) to a Git remote, and its data +to a `dvc remote`. ## Synopsis @@ -20,12 +20,17 @@ positional arguments: The `dvc exp push` and `dvc exp pull` commands are the means for sharing experiments across repository copies via Git (and DVC) remotes. -> Plain `git push` and `git pull` don't work with `dvc experiments` because +> Plain `git push` and `git fetch` don't work with `dvc experiments` because > these are saved under custom Git references. See **How does DVC track > experiments?** in `dvc exp run` to learn more about DVC experiment storage. A working `git_remote` name (e.g. `origin`) or valid Git repo's URL is required, -as well as a single `experiment` name or hash (see `dvc exp run`) to push. +as well as an `experiment` name or hash (see `dvc exp run`) to push. + +The first action of `dvc exp push` is to upload the `experiment` to the Git +remote so it can be pulled later from other repo clones (equivalent to +`git push refs/exps/`). Use `dvc exp list ` +to see experiments in the remote. This command will also try to [push](/doc/command-reference/push) all cached data associated with the experiment to DVC From 281f54a8bfd4f1cd58e18aed371d01484949c11f Mon Sep 17 00:00:00 2001 From: Jorge Orpinel Date: Mon, 1 Mar 2021 03:53:13 -0600 Subject: [PATCH 035/100] ref: link run-cache in exp pu* rel https://github.com/iterative/dvc.org/pull/2243#discussion_r586058795 --- content/docs/command-reference/exp/pull.md | 6 ++++-- content/docs/command-reference/exp/push.md | 5 +++-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/content/docs/command-reference/exp/pull.md b/content/docs/command-reference/exp/pull.md index 807cae4643..af00cfc2d1 100644 --- a/content/docs/command-reference/exp/pull.md +++ b/content/docs/command-reference/exp/pull.md @@ -52,8 +52,10 @@ given with `--remote`. - `-r `, `--remote ` - name of the `dvc remote` to pull cached files to. -- `--run-cache` - downloads all available history of stage runs to the - `dvc remote` (to the cache only, like `dvc fetch --run-cache`). +- `--run-cache` - downloads all available history of + [stage runs](/doc/user-guide/project-structure/internal-files#run-cache) from + the `dvc remote` (to the cache only, like `dvc fetch --run-cache`). Note that + `dvc exp run ` is necessary to checkout these files. - `-j `, `--jobs ` - parallelism level for DVC to upload data to remote storage. The default value is `4 * cpu_count()`. For SSH remotes, the diff --git a/content/docs/command-reference/exp/push.md b/content/docs/command-reference/exp/push.md index 972e070c8b..16fc4e27f3 100644 --- a/content/docs/command-reference/exp/push.md +++ b/content/docs/command-reference/exp/push.md @@ -49,8 +49,9 @@ given with `--remote`. - `-r `, `--remote ` - name of the `dvc remote` to push cached files to. -- `--run-cache` - uploads all available history of stage runs to the - `dvc remote`. +- `--run-cache` - uploads all available history of + [stage runs](/doc/user-guide/project-structure/internal-files#run-cache) to + the `dvc remote`. - `-j `, `--jobs ` - parallelism level for DVC to upload data to remote storage. The default value is `4 * cpu_count()`. For SSH remotes, the From 98d590b584479be6c32ca57e10b2cfe2242c1103 Mon Sep 17 00:00:00 2001 From: Jorge Orpinel Date: Mon, 1 Mar 2021 03:57:40 -0600 Subject: [PATCH 036/100] ref: copy edit in exp branch --- content/docs/command-reference/exp/branch.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/docs/command-reference/exp/branch.md b/content/docs/command-reference/exp/branch.md index abc13f3c31..8af16b5e64 100644 --- a/content/docs/command-reference/exp/branch.md +++ b/content/docs/command-reference/exp/branch.md @@ -28,8 +28,8 @@ results to the workspace) followed by Git branching and committing, except that this: ```bash -[master] $ git checkout -b branch -[branch] $ dvc exp apply experiment +[master] $ git checkout -b +[branch] $ dvc exp apply [branch] $ git add . && git commit [branch] $ git checkout master ``` From eac96f86799f7fd7920bccb36f77d027297379d1 Mon Sep 17 00:00:00 2001 From: Jorge Orpinel Date: Mon, 1 Mar 2021 06:02:01 -0600 Subject: [PATCH 037/100] typos --- content/docs/command-reference/remote/modify.md | 3 ++- content/docs/user-guide/external-dependencies.md | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/content/docs/command-reference/remote/modify.md b/content/docs/command-reference/remote/modify.md index 2dd03de0fa..cb32f4a7a5 100644 --- a/content/docs/command-reference/remote/modify.md +++ b/content/docs/command-reference/remote/modify.md @@ -506,7 +506,8 @@ more information. - `url` - remote location, in a regular [SSH format](https://tools.ietf.org/id/draft-salowey-secsh-uri-00.html#sshsyntax). - Note that this can already the `user` parameter, embedded into the URL: + Note that this can already include the `user` parameter, embedded into the + URL: ```dvc $ dvc remote modify myremote url \ diff --git a/content/docs/user-guide/external-dependencies.md b/content/docs/user-guide/external-dependencies.md index 91566f75cd..1d471955df 100644 --- a/content/docs/user-guide/external-dependencies.md +++ b/content/docs/user-guide/external-dependencies.md @@ -91,7 +91,7 @@ $ dvc run -n download_file \ $ dvc run -n download_file \ -d ssh://user@example.com/path/to/data.txt \ -o data.txt \ - scp ssh://user@example.com:/path/to/data.txt data.txt + scp user@example.com:/path/to/data.txt data.txt ``` ⚠️ DVC requires both SSH and SFTP access to work with remote SSH locations. From f24e58dbb02b6de4d8156c4bfec367a12b50e188 Mon Sep 17 00:00:00 2001 From: Jorge Orpinel Date: Mon, 1 Mar 2021 13:08:11 -0600 Subject: [PATCH 038/100] Update content/docs/command-reference/add.md --- content/docs/command-reference/add.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/docs/command-reference/add.md b/content/docs/command-reference/add.md index 4267d3c7ed..91a2c4a86e 100644 --- a/content/docs/command-reference/add.md +++ b/content/docs/command-reference/add.md @@ -381,7 +381,7 @@ A data.xml 1 file added and 1 file fetched ``` -## Example: Transfer to cache +## Example: Transfer to the cache When you have a large dataset in an external location, you may want to add it to your cache without actually copying it into the workspace first. This might be From 7f56e4d82e651453d900e62d9157a13391ebd3ac Mon Sep 17 00:00:00 2001 From: Batuhan Taskaya Date: Tue, 2 Mar 2021 16:07:27 +0300 Subject: [PATCH 039/100] apply suggestions --- content/docs/command-reference/add.md | 106 +++++++++++++------------- 1 file changed, 55 insertions(+), 51 deletions(-) diff --git a/content/docs/command-reference/add.md b/content/docs/command-reference/add.md index 91a2c4a86e..13a109899d 100644 --- a/content/docs/command-reference/add.md +++ b/content/docs/command-reference/add.md @@ -151,6 +151,11 @@ not. > Note that external outputs typically require an external cache setup. See > link above for more details. +- `-o `, `--out ` - destination `path` inside the workspace, to + [transfer](#example-transfer-to-cache) an external target into cache, and + track it in-place. Note that this can be combined with `--to-remote` to avoid + storing the data locally, while still adding it to the project. + - `--to-remote` - import an external target, but don't move it into the workspace, nor cache it. [Transfer it](#example-transfer-to-remote-storage) it directly to remote storage (the default one, unless `-r` is specified) @@ -160,11 +165,6 @@ not. [remote storage](/doc/command-reference/remote) to transfer external target to (can only be used with `--to-remote`). -- `-o `, `--out ` - destination `path` for the transferred data. If - used with `--to-remote`, the data will be transferred to the remote storage. - Else, it will be transferred [to the cache](#example-transfer-to-cache) and - will be linked to the workspace. - - `--desc ` - user description of the data (optional). This doesn't affect any DVC operations. @@ -334,6 +334,56 @@ $ tree .dvc/cache Only the hash values of the `dir/` directory (with `.dir` file extension) and `file2` have been cached. +## Example: Transfer to the cache + +When you have a large dataset in an external location, you may want to add it to +the project without having to copy it into the workspace. Maybe +your local disk doesn't even have enough space, but you have setup an +[external cache](/doc/use-cases/shared-development-server#configure-the-external-shared-cache) +that could handle it. + +The `--out` option lets you add external paths in a way that they are +cached first, and then +[linked](/doc/user-guide/large-dataset-optimization#file-link-types-for-the-dvc-cache) +to a given path inside the workspace. Let's initialize a DVC +project: + +```dvc +$ mkdir example # workspace +$ cd example +$ git init +$ dvc init +``` + +Now we can add a `data.xml` file via HTTP for example, putting it a local path +in our project: + +``` +$ dvc add https://data.dvc.org/get-started/data.xml -o data.xml + +To track the changes with git, run: + + git add data.xml.dvc + +$ ls +data.xml data.xml.dvc +``` + +The resulting `.dvc` file will save the provided local `path` as if the data was +always there, while the `md5` hash points to the copy of the data that has now +been transferred to the cache. Let's check the contents of `data.xml.dvc` in +this case: + +```yaml +outs: + - md5: a304afb96060aad90176268345e10355 + nfiles: 1 + path: data.xml +``` + +> For a similar operation that actually keeps a connection to the data source, +> please see `dvc import-url`. + ## Example: Transfer to remote storage When you have a large dataset in an external location, you may want to track it @@ -380,49 +430,3 @@ system that can handle it), they can use `dvc pull` as usual: A data.xml 1 file added and 1 file fetched ``` - -## Example: Transfer to the cache - -When you have a large dataset in an external location, you may want to add it to -your cache without actually copying it into the workspace first. This might be -due to cache and workspace are in separate disks, which only the cache can -handle that size of data. After the data is saved to your cache, we link it to -your workspace with the -[preffered links](/doc/user-guide/large-dataset-optimization#file-link-types-for-the-dvc-cache). - -Let's initalize a DVC project; - -```dvc -$ mkdir example # workspace -$ cd example -$ git init -$ dvc init -``` - -Afterwards, let's setup a shared cache by following -[this](https://dvc.org/doc/use-cases/shared-development-server#preparation) -tutorial. When it is ready to go, we can add `data.xml` to our cache directly; - -``` -$ dvc add https://data.dvc.org/get-started/data.xml -o data.xml -``` - -Depending on the cache type configured on our workspace (can be set using -`cache.type` config value), the data is either linked up or just copied over. -For this use case, a reflink or a symlink is suggested. - -``` -$ ls -data.xml data.xml.dvc -``` - -As it can be seen, this option doesn't track the source unlike -[import-url](/doc/command-reference/import-url). - -``` - $ cat data.xml.dvc -outs: -- md5: a304afb96060aad90176268345e10355 - nfiles: 1 - path: data.xml -``` From 0486442b227bb75409f76f14f16441b28d10e29b Mon Sep 17 00:00:00 2001 From: Ruslan Kuprieiev Date: Tue, 2 Mar 2021 21:52:25 +0200 Subject: [PATCH 040/100] install: deb: add signature --- content/docs/install/linux.md | 1 + 1 file changed, 1 insertion(+) diff --git a/content/docs/install/linux.md b/content/docs/install/linux.md index e181548390..bccbf162d7 100644 --- a/content/docs/install/linux.md +++ b/content/docs/install/linux.md @@ -71,6 +71,7 @@ Add `--beta` for the latest tagged release candidate, or `--edge` for the latest $ sudo wget \ https://dvc.org/deb/dvc.list \ -O /etc/apt/sources.list.d/dvc.list +$ wget -qO - https://dvc.org/deb/iterative.asc | sudo apt-key add - $ sudo apt update $ sudo apt install dvc ``` From 84540b2b7682a268a19568cf65f11c2912365fde Mon Sep 17 00:00:00 2001 From: Ruslan Kuprieiev Date: Wed, 3 Mar 2021 02:12:36 +0200 Subject: [PATCH 041/100] add rpm --- content/docs/install/linux.md | 1 + 1 file changed, 1 insertion(+) diff --git a/content/docs/install/linux.md b/content/docs/install/linux.md index bccbf162d7..934de20004 100644 --- a/content/docs/install/linux.md +++ b/content/docs/install/linux.md @@ -86,6 +86,7 @@ $ sudo apt install dvc $ sudo wget \ https://dvc.org/rpm/dvc.repo \ -O /etc/yum.repos.d/dvc.repo +$ wget -qO - https://dvc.org/rpm/iterative.asc | sudo rpm --import $ sudo yum update $ sudo yum install dvc ``` From 65a11bc062e915995a818515a865fe68b4eb2b99 Mon Sep 17 00:00:00 2001 From: Ruslan Kuprieiev Date: Wed, 3 Mar 2021 02:17:15 +0200 Subject: [PATCH 042/100] Update content/docs/install/linux.md --- content/docs/install/linux.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/docs/install/linux.md b/content/docs/install/linux.md index 934de20004..aaf93a08bb 100644 --- a/content/docs/install/linux.md +++ b/content/docs/install/linux.md @@ -86,7 +86,7 @@ $ sudo apt install dvc $ sudo wget \ https://dvc.org/rpm/dvc.repo \ -O /etc/yum.repos.d/dvc.repo -$ wget -qO - https://dvc.org/rpm/iterative.asc | sudo rpm --import +$ sudo rpm --import https://dvc.org/rpm/iterative.asc $ sudo yum update $ sudo yum install dvc ``` From cad5b4ed937fa9ceb75758873695e49452e4f292 Mon Sep 17 00:00:00 2001 From: Dmitry Petrov Date: Tue, 2 Mar 2021 20:22:26 -0800 Subject: [PATCH 043/100] DVC 2.0 release --- content/blog/2021-03-03-dvc-2-0-release.md | 695 ++++++++++++++++++ .../images/2021-03-03/dvc-2-0-release.png | Bin 0 -> 205914 bytes 2 files changed, 695 insertions(+) create mode 100644 content/blog/2021-03-03-dvc-2-0-release.md create mode 100644 static/uploads/images/2021-03-03/dvc-2-0-release.png diff --git a/content/blog/2021-03-03-dvc-2-0-release.md b/content/blog/2021-03-03-dvc-2-0-release.md new file mode 100644 index 0000000000..fb59f6e10c --- /dev/null +++ b/content/blog/2021-03-03-dvc-2-0-release.md @@ -0,0 +1,695 @@ +--- +title: DVC 2.0 Pre-Release +date: 2021-03-03 +description: | + Today is DVC 2.0 release day! Watch a video from DVC-team when we explain the + new features and read more details in this blog post. + +descriptionLong: | + Today is DVC 2.0 release day! Watch a video from DVC-team when we explain the + new features and read more details in this blog post. + + New features: + + 🧪 Lightweight ML experiments + + 📍 ML model checkpoints versioning + + 📈 Dvc-live - new open-source library for metrics logging + + 🔗 ML pipeline templating and iterative foreach-stages + + 🤖 CML - new way to get GPU/CPU in clouds and GitHub Action support + +picture: 2021-03-03/dvc-2-0-release.png +pictureComment: DVC 2.0 Release +author: dmitry_petrov +commentsUrl: https://discuss.dvc.org/t/dvc-2-0-release/695 +tags: + - Release + - MLOps + - DataOps + - CI/CD for ML +--- + +## TL;DR; video + +THIS IS A DRAFT + +https://www.youtube.com/watch?v=cqxlr9za69c + +## What is new in DVC 2.0? + +Versioning data, code and ML models and keeping your ML projects reproducible +and sharable was always a strong point of using DVC. Now we are bringing the +reproducibility to the ML exerimentation phase. + +The biggest changes in new DVC are related to _ML experiments_. Now DVC captures +data, code and models in a single `dvc exp run` command. That makes the entire +process of ML experimentation reproducible. + +ML models checkpoints and ML metrics logger is an additional improvement related +to the experiment functionality but mostly focuded on deep learning scenarios +when metrics and models need to be tracked and preserved each epoch (of each 10 +epoch). + +⚠️ DVC 2.0 is the first release with these feature and we keep ML experiment in +experementation mode (sorry about this terminology 😅) + +_ML pipelines_ is another big improvement in DVC 2.0. We are introducing +variable in pipelines as well as forach-stages. These are the most asked +features during the last year. + +New CML provides an easier way of allocating cloud CPU or GPU resources +including spote instances. And a new GitHub Action makes CML and DVC easy to use +from GitHub workflows. + +## Install + +The new version is generaly available! + +Install DVC 2.0 [through OS packages](https://dvc.org/doc/install) or as Python +library: + +```dvc +$ pip install --upgrade dvc +``` + +CML is pre-installed in CML docker containers `dvcorg/cml` & `dvcorg/cml-py3` +and also available as an NPM package: + +```dvc +$ npm i -g @dvcorg/cml +``` + +## Lightweight ML experiments + +DVC uses Git versioning as the basis for ML experiments. This solid foundation +makes each experiment reproducible and accessible from the project's history. +This Git-based approach works very well for ML projects with mature models when +only a few new experiments per day are run. + +However, in more active development, when dozens or hundreds of experiments need +to be run in a single day, Git creates overhead — each experiment run requires +additional Git commands `git add/commit`, and comparing all experiments is +difficult. + +We are introducing lightweight experiments in DVC 2.0! This is how you can +auto-track ML experiments without any overhead from ML engineers. + +⚠️ Note, our new ML experiment features (`dvc exp`) are experimental. This means +that the commands might change a bit in the following minor releases. + +`dvc exp run` can run an ML experiment with a new hyperparameter from +`params.yaml` while `dvc exp diff` shows metrics and params difference: + +```dvc +$ dvc exp run --set-param featurize.max_features=3000 + +Reproduced experiment(s): exp-bb55c +Experiment results have been applied to your workspace. + +$ dvc exp diff +Path Metric Value Change +scores.json auc 0.57462 0.0072197 + +Path Param Value Change +params.yaml featurize.max_features 3000 1500 +``` + +More experiments: + +```dvc +$ dvc exp run --set-param featurize.max_features=4000 +Reproduced experiment(s): exp-9bf22 +Experiment results have been applied to your workspace. + +$ dvc exp run --set-param featurize.max_features=5000 +Reproduced experiment(s): exp-63ee0 +Experiment results have been applied to your workspace. + +$ dvc exp run --set-param featurize.max_features=5000 \ + --set-param featurize.ngrams=3 +Reproduced experiment(s): exp-80655 +Experiment results have been applied to your workspace. +``` + +In the examples above, hyperparameters were changed with the `--set-param` +option, but you can make these changes by modifying the params file instead. In +fact _any code or data files can be changed_ and `dvc exp run` will capture the +variations. + +See all the runs: + +```dvc +$ dvc exp show --no-pager --no-timestamp \ + --include-params featurize.max_features,featurize.ngrams +┏━━━━━━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━┓ +┃ Experiment ┃ auc ┃ featurize.max_features ┃ featurize.ngrams ┃ +┡━━━━━━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━┩ +│ workspace │ 0.56359 │ 5000 │ 3 │ +│ master │ 0.5674 │ 1500 │ 2 │ +│ ├── exp-80655 │ 0.56359 │ 5000 │ 3 │ +│ ├── exp-63ee0 │ 0.5515 │ 5000 │ 2 │ +│ ├── exp-9bf22 │ 0.56448 │ 4000 │ 2 │ +│ └── exp-bb55c │ 0.57462 │ 3000 │ 2 │ +└───────────────┴─────────┴────────────────────────┴──────────────────┘ +``` + +Under the hood, DVC uses Git to store the experiments' meta-information. A +straight-forward implementation would create visible branches and auto-commit in +them, but that approach would over-pollute the branch namespace very quickly. To +avoid this issue, we introduced custom Git references `exps`, the same way as +GitHub uses custom references `pulls` to track pull requests (this is an +interesting technical topic that deserves a separate blog post). Below you can +see how it works. + +No artificial branches, only custom references `exps` (do not worry if you don't +understand this part - it is an implementation detail): + +```dvc +$ git branch +* master + +$ git show-ref +5649f62d845fdc29e28ea6f7672dd729d3946940 refs/exps/exec/EXEC_APPLY +5649f62d845fdc29e28ea6f7672dd729d3946940 refs/exps/exec/EXEC_BRANCH +5649f62d845fdc29e28ea6f7672dd729d3946940 refs/exps/71/67904d89e116f28daf7a6e4c0878268117c893/exp-80655 +f16e7b7c804cf52d91d1d11850c15963fb2a8d7b refs/exps/97/d69af70c6fb4bc59aefb9a87437dcd28b3bde4/exp-63ee0 +0566d42cddb3a8c4eb533f31027f0febccbbc2dd refs/exps/91/94265d5acd847e1c439dd859aa74b1fc3d73ad/exp-bb55c +9bb067559583990a8c5d499d7435c35a7c9417b7 refs/exps/49/5c835cd36772123e82e812d96eabcce320f7ec/exp-9bf22 +``` + +The best experiment can be promoted to the workspace and committed to Git. + +```dvc +$ dvc exp apply exp-bb55c +$ git add . +$ git commit -m 'optimize max feature size' +``` + +Alternatively, an experiment can be promoted to a branch (`big_fr_size` branch +in this case): + +```dvc +$ dvc exp branch exp-80655 big_fr_size +Git branch 'big_fr_size' has been created from experiment 'exp-c695f'. +To switch to the new branch run: + + git checkout big_fr_size +``` + +Remove all the experiments that were not used: + +```dvc +$ dvc exp gc --workspace --force +``` + +## ML model checkpoints versioning + +ML model checkpoints are an essential part of deep learning. ML engineers prefer +to save the model files (or weights) at checkpoints during a training process +and return back when metrics start diverging or learning is not fast enough. + +The checkpoints create a different dynamic around ML modeling process and need a +special support from the toolset: + +1. Track and save model checkpoints (DVC outputs) periodically, not only the + final result or training epoch. +2. Save metrics corresponding to each of the checkpoints. +3. Reuse checkpoints - warm-start training with an existing model file, + corresponding code, dataset version and metrics. + +This new behavior is supported in DVC 2.0. Now, DVC can version all your +checkpoints with corresponding code and data. It brings the reproducibility of +DL processes to the next level - every checkpoint is reproducible. + +This is how you define checkpoints with live-metrics: + +```dvc +$ dvc stage add -n train \ + -d users.csv -d train.py \ + -p dropout,epochs,lr,process \ + --checkpoint model.h5 \ + --live logs \ + python train.py + +Creating 'dvc.yaml' +Adding stage 'train' in 'dvc.yaml' +``` + +Note, we use `dvc stage add` command instead of `dvc run`. Starting from DVC 2.0 +we begin extracting all stage specific functionality under `dvc stage` umbrella. +`dvc run` is still working, but will be deprecated in the following major DVC +version (most likely in 3.0). + +Start the training process and interrupt it after 5 epochs: + +```dvc +$ dvc exp run +'users.csv.dvc' didn't change, skipping +Running stage 'train': +> python train.py +... +^CTraceback (most recent call last): +... +KeyboardInterrupt +``` + +Navigate in checkpoints: + +```dvc +$ dvc exp show --no-pager --no-timestamp +┏━━━━━━━━━━━━━━━┳━━━━━━┳━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┳━━━┳━━━━━━━━┳━━━┓ +┃ Experiment ┃ step ┃ loss ┃ accuracy ┃ val_loss ┃ … ┃ epochs ┃ … ┃ +┡━━━━━━━━━━━━━━━╇━━━━━━╇━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━╇━━━╇━━━━━━━━╇━━━┩ +│ workspace │ 4 │ 2.0702 │ 0.30388 │ 2.025 │ … │ 5 │ … │ +│ master │ - │ - │ - │ - │ … │ 5 │ … │ +│ │ ╓ exp-e15bc │ 4 │ 2.0702 │ 0.30388 │ 2.025 │ … │ 5 │ … │ +│ │ ╟ 5ea8327 │ 4 │ 2.0702 │ 0.30388 │ 2.025 │ … │ 5 │ … │ +│ │ ╟ bc0cf02 │ 3 │ 2.1338 │ 0.23988 │ 2.0883 │ … │ 5 │ … │ +│ │ ╟ f8cf03f │ 2 │ 2.1989 │ 0.17932 │ 2.1542 │ … │ 5 │ … │ +│ │ ╟ 7575a44 │ 1 │ 2.2694 │ 0.12833 │ 2.223 │ … │ 5 │ … │ +│ ├─╨ a72c526 │ 0 │ 2.3416 │ 0.0959 │ 2.2955 │ … │ 5 │ … │ +└───────────────┴──────┴────────┴──────────┴──────────┴───┴────────┴───┘ +``` + +Each of the checkpoints above is a separate experiment with all data, code, +paramaters and metrics. You can use the same `dvc exp apply` command to extract +any of these. + +Another run continues this process. You can see how accuracy metrics are +increasing - DVC does not remove the model/checkpoint and training code trains +on top of it: + +```dvc +$ dvc exp run +Existing checkpoint experiment 'exp-e15bc' will be resumed +... +^C +KeyboardInterrupt + +$ dvc exp show --no-pager --no-timestamp +┏━━━━━━━━━━━━━━━┳━━━━━━┳━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┳━━━┳━━━━━━━━┳━━━┓ +┃ Experiment ┃ step ┃ loss ┃ accuracy ┃ val_loss ┃ … ┃ epochs ┃ … ┃ +┡━━━━━━━━━━━━━━━╇━━━━━━╇━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━╇━━━╇━━━━━━━━╇━━━┩ +│ workspace │ 9 │ 1.7845 │ 0.58125 │ 1.7381 │ … │ 5 │ … │ +│ master │ - │ - │ - │ - │ … │ 5 │ … │ +│ │ ╓ exp-e15bc │ 9 │ 1.7845 │ 0.58125 │ 1.7381 │ … │ 5 │ … │ +│ │ ╟ 205a8d3 │ 9 │ 1.7845 │ 0.58125 │ 1.7381 │ … │ 5 │ … │ +│ │ ╟ dd23d96 │ 8 │ 1.8369 │ 0.54173 │ 1.7919 │ … │ 5 │ … │ +│ │ ╟ 5bb3a1f │ 7 │ 1.8929 │ 0.49108 │ 1.8474 │ … │ 5 │ … │ +│ │ ╟ 6dc5610 │ 6 │ 1.951 │ 0.43433 │ 1.9046 │ … │ 5 │ … │ +│ │ ╟ a79cf29 │ 5 │ 2.0088 │ 0.36837 │ 1.9637 │ … │ 5 │ … │ +│ │ ╟ 5ea8327 │ 4 │ 2.0702 │ 0.30388 │ 2.025 │ … │ 5 │ … │ +│ │ ╟ bc0cf02 │ 3 │ 2.1338 │ 0.23988 │ 2.0883 │ … │ 5 │ … │ +│ │ ╟ f8cf03f │ 2 │ 2.1989 │ 0.17932 │ 2.1542 │ … │ 5 │ … │ +│ │ ╟ 7575a44 │ 1 │ 2.2694 │ 0.12833 │ 2.223 │ … │ 5 │ … │ +│ ├─╨ a72c526 │ 0 │ 2.3416 │ 0.0959 │ 2.2955 │ … │ 5 │ … │ +└───────────────┴──────┴────────┴──────────┴──────────┴───┴────────┴───┘ +``` + +After modifying the code, data, or params, the same process can be resumed. DVC +recognizes the change and shows it (see experiment `b363267`): + +```dvc +$ vi train.py # modify code +$ vi params.yaml # modify params + +$ dvc exp run +Modified checkpoint experiment based on 'exp-e15bc' will be created +... + +$ dvc exp show --no-pager --no-timestamp +┏━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━┳━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┳━━━┳━━━━━━━━┳━━━┓ +┃ Experiment ┃ step ┃ loss ┃ accuracy ┃ val_loss ┃ … ┃ epochs ┃ … ┃ +┡━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━╇━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━╇━━━╇━━━━━━━━╇━━━┩ +│ workspace │ 13 │ 1.5841 │ 0.69262 │ 1.5381 │ … │ 15 │ … │ +│ master │ - │ - │ - │ - │ … │ 5 │ … │ +│ │ ╓ exp-7ff06 │ 13 │ 1.5841 │ 0.69262 │ 1.5381 │ … │ 15 │ … │ +│ │ ╟ 6c62fec │ 12 │ 1.6325 │ 0.67248 │ 1.5857 │ … │ 15 │ … │ +│ │ ╟ 4baca3c │ 11 │ 1.6817 │ 0.64855 │ 1.6349 │ … │ 15 │ … │ +│ │ ╟ b363267 (2b06de7) │ 10 │ 1.7323 │ 0.61925 │ 1.6857 │ … │ 15 │ … │ +│ │ ╓ 2b06de7 │ 9 │ 1.7845 │ 0.58125 │ 1.7381 │ … │ 5 │ … │ +│ │ ╟ 205a8d3 │ 9 │ 1.7845 │ 0.58125 │ 1.7381 │ … │ 5 │ … │ +│ │ ╟ dd23d96 │ 8 │ 1.8369 │ 0.54173 │ 1.7919 │ … │ 5 │ … │ +│ │ ╟ 5bb3a1f │ 7 │ 1.8929 │ 0.49108 │ 1.8474 │ … │ 5 │ … │ +│ │ ╟ 6dc5610 │ 6 │ 1.951 │ 0.43433 │ 1.9046 │ … │ 5 │ … │ +│ │ ╟ a79cf29 │ 5 │ 2.0088 │ 0.36837 │ 1.9637 │ … │ 5 │ … │ +│ │ ╟ 5ea8327 │ 4 │ 2.0702 │ 0.30388 │ 2.025 │ … │ 5 │ … │ +│ │ ╟ bc0cf02 │ 3 │ 2.1338 │ 0.23988 │ 2.0883 │ … │ 5 │ … │ +│ │ ╟ f8cf03f │ 2 │ 2.1989 │ 0.17932 │ 2.1542 │ … │ 5 │ … │ +│ │ ╟ 7575a44 │ 1 │ 2.2694 │ 0.12833 │ 2.223 │ … │ 5 │ … │ +│ ├─╨ a72c526 │ 0 │ 2.3416 │ 0.0959 │ 2.2955 │ … │ 5 │ … │ +└───────────────────────┴──────┴────────┴──────────┴──────────┴───┴────────┴───┘ +``` + +Sometimes you might need to train the model from scratch. The reset option +removes the checkpoint file before training: `dvc exp run --reset`. + +## Metrics logging + +Continuously logging ML metrics is a very common practice in the ML world. +Instead of a simple command-line output with the metrics values, many ML +engineers prefer visuals and plots. These plots can be organized in a "database" +of ML experiments to keep track of a project. There are many special solutions +for metrics collecting and experiment tracking such as sacred, mlflow, weight +and biases, neptune.ai, or others. + +With DVC 2.0, we are releasing a new open-source library +[DVC-Live](https://github.com/iterative/dvclive) that provides functionality for +tracking model metrics and organizing metrics in simple text files in a way that +DVC can visualize the metrics with navigation in Git history. So, DVC can show +you a metrics difference between the current model and a model in `master` or +any other branch. + +This approach is similar to the other metrics tracking tools with the difference +that Git becomes a "database" or of ML experiments. + +### Generate metrics file + +Install the library: + +```dvc +$ pip install dvclive +``` + +Instrument your code: + +```python +import dvclive +from dvclive.keras import DvcLiveCallback + +dvclive.init("logs") #, summarize=True) + +... + +model.fit(... + # Set up DVC-Live callback: + callbacks=[ DvcLiveCallback() ] + ) + +``` + +During the training you will see the metrics files that are continuously +populated each epochs: + +```dvc +$ ls logs/ +accuracy.tsv loss.tsv val_accuracy.tsv val_loss.tsv + +$ head logs/accuracy.tsv +timestamp step accuracy +1613645582716 0 0.7360000014305115 +1613645585478 1 0.8349999785423279 +1613645587322 2 0.8830000162124634 +1613645589125 3 0.9049999713897705 +1613645590891 4 0.9070000052452087 +1613645592681 5 0.9279999732971191 +1613645594490 6 0.9430000185966492 +1613645596232 7 0.9369999766349792 +1613645598034 8 0.9430000185966492 +``` + +In addition to the continuous metrics files, you will see the summary metrics +file and HTML file with the same file prefix. The summary file contains the +result of the latest epoch: + +```dvc +$ cat logs.json | python -m json.tool +{ + "step": 41, + "loss": 0.015958430245518684, + "accuracy": 0.9950000047683716, + "val_loss": 13.705962181091309, + "val_accuracy": 0.5149999856948853 +} +``` + +The HTML file contains all the visuals for continuous metrics as well as the +summary metrics on a single page: + +![](/uploads/images/2021-02-18/dvclive-html.png) + +Note, the HTML and the summary metrics files are generating automatically for +each. So, you can monitor model performance in realtime. + +### Git-navigation with the metrics file + +DVC repository is NOT required to use the live metrics functionality from the +above. It works independently from DVC. + +DVC repository becomes useful when the metrics and plots are committed in your +Git repository, and you need navigation around the metrics. + +Metrics difference between workspace and the last Git commit: + +```dvc +$ git status -s + M logs.json + M logs/accuracy.tsv + M logs/loss.tsv + M logs/val_accuracy.tsv + M logs/val_loss.tsv + M train.py +?? model.h5 + +$ dvc metrics diff --target logs.json +Path Metric Old New Change +logs.json accuracy 0.995 0.99 -0.005 +logs.json loss 0.01596 0.03036 0.0144 +logs.json step 41 36 -5 +logs.json val_accuracy 0.515 0.5175 0.0025 +logs.json val_loss 13.70596 3.29033 -10.41563 +``` + +The difference between a particular commit/branch/tag or between two commits: + +```dvc +$ dvc metrics diff --target logs.json HEAD^ 47b85c +Path Metric Old New Change +logs.json accuracy 0.995 0.998 0.003 +logs.json loss 0.01596 0.01951 0.00355 +logs.json step 41 82 41 +logs.json val_accuracy 0.515 0.51 -0.005 +logs.json val_loss 13.70596 5.83056 -7.8754 +``` + +The same Git-navigation works with the plots: + +```dvc +$ dvc plots diff --target logs +file:///Users/dmitry/src/exp-dc/plots.html +``` + +![](/uploads/images/2021-02-18/dvclive-diff-html.png) + +Another nice thing about the live metrics - they work across ML experiments and +checkpoints, if properly set up in dvc stages. To set up live metrics, you need +to specify the metrics directory in the `live` section of a stage: + +```yaml +stages: + train: + cmd: python train.py + live: + logs: + cache: false + summary: true + report: true + deps: + - data +``` + +## ML pipelines parameterization and foreach stages + +After introducing the multi-stage pipeline file `dvc.yaml`, it was quickly +adopted among our users. The DVC team got tons of positive feedback from them, +as well as feature requests. + +### Pipeline parameters from `vars` + +The most requested feature was the ability to use parameters in `dvc.yaml`. For +example. So, you can pass the same seed value or filename to multiple stages in +the pipeline. + +```yaml +vars: + train_matrix: train.pkl + test_matrix: test.pkl + seed: 20210215 + +... + +stages: + process: + cmd: python process.py \ + --seed ${seed} \ + --train ${train_matrix} \ + --test ${test_matrix} + outs: + - ${test_matrix} + - ${train_matrix} + + ... + + train: + cmd: python train.py ${train_matrix} --seed ${seed} + deps: + - ${train_matrix} +``` + +Also, it gives an ability to localize all the important parameters in a single +`vars` block and play with them. This is a natural thing to do for scenarios +like NLP or when hyperparameter optimization is happening not only in the model +training code but in the data processing as well. + +### Pipeline parameters from params files + +It is quite common to define pipeline parameters in a config file or a +parameters file (like `params.yaml`) instead of in the pipeline file `dvc.yaml` +itself. These parameters defined in `params.yaml` can also be used in +`dvc.yaml`. + +```yaml +# params.yaml +models: + us: + thresh: 10 + filename: 'model-us.hdf5' +``` + +```yaml +# dvc.yaml +stages: + build-us: + cmd: >- + python script.py + --out ${models.us.filename} + --thresh ${models.us.thresh} + outs: + - ${models.us.filename} +``` + +DVC properly tracks params dependencies for each stage starting from the +previous DVC version 1.0. See the +[`--params` option](/doc/command-reference/run#for-displaying-and-comparing-data-science-experiments) +of `dvc run` for more details. + +### Iterating over params with foreach stages + +Iterating over params was a frequently requested feature. Now users can define +multiple similar stages with a templatized command. + +```yaml +stages: + build: + foreach: + gb: + thresh: 15 + filename: 'model-gb.hdf5' + us: + thresh: 10 + filename: 'model-us.hdf5' + do: + cmd: >- + python script.py --out ${item.filename} --thresh ${item.thresh} + outs: + - ${item.filename} +``` + +## New method to provision cloud compute in new CML release + +We are releasing new CML release 0.3 together with DVC 2.0. We developed a brand +new CML command `cml-runner` that hides much of the complexity of configuring +and provisioning an instance, keeping your workflows free of bash scripting +clutter. + +The new approach uses our new +[Iterative Terraform Provider](https://github.com/iterative/terraform-provider-iterative) +under the hood instead of Docker Machine, as in the first version of CML. + +This example workflow to launch an EC2 instance from a GitHub Action workflow +and then train a model. We hope you'll agree it's shorter, sweeter, and more +powerful than ever! + +```yaml +name: 'Train in the cloud' +on: [push] + +jobs: + deploy-runner: + runs-on: [ubuntu-latest] + steps: + - uses: iterative/setup-cml@v1 + - uses: actions/checkout@v2 + - name: deploy + shell: bash + env: + repo_token: ${{ secrets.PERSONAL_ACCESS_TOKEN }} + AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} + AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + run: | + cml-runner \ + --cloud aws \ + --cloud-region us-west \ + --cloud-type=t2.micro \ + --labels=cml-runner + train-model: + needs: deploy-runner + runs-on: [self-hosted, cml-runner] + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-python@v2 + with: + python-version: '3.x' + - name: 'Train my model' + run: | + pip install -r requirements.txt + python train.py +``` + +You'll get a pull request that looks something like this: + +![](/uploads/images/2021-02-22/sample_pr.png) + +All the code to replicate this example is up on a +[brand new demo repository](https://github.com/iterative/cml-runner-base-case). + +Please find more details in the +[CML 0.3 pre-release blog post](https://dvc.org/blog/cml-runner-prerelease) or +in the [CML website](https://cml.dev/). + +## GitHub Actions in new CML release + +One more thing: you might've noticed in our example workflow above that there's +a [new CML GitHub Action](https://github.com/iterative/setup-cml)! The new +Action helps you setup CML, giving you one more way to mix and match the CML +suite of functions with your preferred environment. + +The new Action is designed to be a straightforward, all-in-one install that +gives you immediate use of functions like `cml-publish` and `cml-runner`. You'll +add this step to your workflow: + +```yaml +steps: + - uses: actions/checkout@v2 + - uses: iterative/cml-action@v1 +``` + +[More details are in the docs!](https://github.com/iterative/setup-cml) + +The same way you can reference DVC as a GitHub Action: + +```yaml +steps: + - uses: actions/checkout@v2 + - uses: iterative/dvc-action@v1 +``` + +[See DVC GitHub Action](https://github.com/iterative/setup-dvc) + +## Thank you! + +Thank you for all DVC users and community members for the help. Please try out +the new DVC and CML releases and do not get lost in your ML experiments! diff --git a/static/uploads/images/2021-03-03/dvc-2-0-release.png b/static/uploads/images/2021-03-03/dvc-2-0-release.png new file mode 100644 index 0000000000000000000000000000000000000000..bf7ffdf55656d441b21134b4e084086296f23067 GIT binary patch literal 205914 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�BNOUgyiQj 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 _0fBw3?uIsi7yF{9Qyqg6%MXM9u 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

hM>Z$OU%uF8*ODV&MJp{sDjp!#l{0lLD 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

Z*4V>FQYs?IO+*2ccTofAO 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 z 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
dJR%YYe@iy29^0tE~YAaLpR_2K=v_CT$8`2se8- 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 K`<3sFI{#ni$k#>y literal 0 HcmV?d00001 From 6b3fa3532023dfbe689bd23983a567c799e5abd9 Mon Sep 17 00:00:00 2001 From: Dmitry Petrov Date: Wed, 3 Mar 2021 00:08:45 -0800 Subject: [PATCH 044/100] update intro and add braking changes --- content/blog/2021-03-03-dvc-2-0-release.md | 68 ++++++++++++++-------- 1 file changed, 45 insertions(+), 23 deletions(-) diff --git a/content/blog/2021-03-03-dvc-2-0-release.md b/content/blog/2021-03-03-dvc-2-0-release.md index fb59f6e10c..96f41989ce 100644 --- a/content/blog/2021-03-03-dvc-2-0-release.md +++ b/content/blog/2021-03-03-dvc-2-0-release.md @@ -40,29 +40,37 @@ https://www.youtube.com/watch?v=cqxlr9za69c ## What is new in DVC 2.0? -Versioning data, code and ML models and keeping your ML projects reproducible -and sharable was always a strong point of using DVC. Now we are bringing the -reproducibility to the ML exerimentation phase. - -The biggest changes in new DVC are related to _ML experiments_. Now DVC captures -data, code and models in a single `dvc exp run` command. That makes the entire -process of ML experimentation reproducible. - -ML models checkpoints and ML metrics logger is an additional improvement related -to the experiment functionality but mostly focuded on deep learning scenarios -when metrics and models need to be tracked and preserved each epoch (of each 10 -epoch). - -⚠️ DVC 2.0 is the first release with these feature and we keep ML experiment in -experementation mode (sorry about this terminology 😅) - -_ML pipelines_ is another big improvement in DVC 2.0. We are introducing -variable in pipelines as well as forach-stages. These are the most asked -features during the last year. - -New CML provides an easier way of allocating cloud CPU or GPU resources -including spote instances. And a new GitHub Action makes CML and DVC easy to use -from GitHub workflows. +We are working on DVC project for alsmost 4 years. In the previous versions we +have build a great foundation on versioning data, code and ML models that helps +making your ML projects reproducible. + +With 2.0 release we are going deeper to machine learning and deep learning +scenarios such as **experiment management**, **ML model checkpoints** and **ML +metrics logging**. These scenarios are widely adopted by ML practicioners and +instrumented with custome tools or external frameworks and SaaS services. **Our +vision is to make ML experimentation experience distributed like Git, +independent on external SaaS platforms and introducing proper data and model +management to it**. + +⚠️ DVC 2.0 is the first release with ML experements and we keep this +functionality in experementation mode (yeah, experiments in experementation mode +😅). It means that the API might change a bit in the following releases. + +**ML pipelines parametrization** is another big improvement in DVC 2.0. This is +the most asked features during the last year. We are introducing variables in +pipelines as well as forach-stages. This is a significant improvements for users +who work on multi-stages ML projects that is very common for NLP projects. + +A better **CPU/GPU resource allocation** is another important direction for DVC. +Together with DVC 2.0 we are releasing new version 0.3 of CML (CI/CD for ML). It +aims to hide all complexity of coulds from data scientists and ML engineers. We +develop a brend new Iterative Terraform Provider to reach this goal and simplify +end user experience. In future releases, we expect DVC using this Terraform +provider to access cloud resources directly. + +The last but not least important part - we made the new release with **minimum +breaking changes to our API**. That makes migration to DVC 2.0 smooth and less +risky. ## Install @@ -689,6 +697,20 @@ steps: [See DVC GitHub Action](https://github.com/iterative/setup-dvc) +## Breaking changes + +We put a lot of efforts to make this release with very minimum amount of +breaking changes to simplify migration to the new version for the users: + +1. Dropped support for external outputs in Google Cloud Storage and changed the + default checksum from md5 to etag. +2. Dropped support for login with p12 files on service authentication for Google + Drive. +3. Stages without dependencies will not always run as if changed. Instead, use + --always-changed. +4. Environment variables inside the cmd of a stage using `${VAR}` syntax must be + escaped as `\${VAR}` in 2.0 due to the use of `${}` syntax for templating. + ## Thank you! Thank you for all DVC users and community members for the help. Please try out From e701e569b60482e6e6c5d5b3515ca50b18d3638e Mon Sep 17 00:00:00 2001 From: Dmitry Petrov Date: Wed, 3 Mar 2021 01:28:19 -0800 Subject: [PATCH 045/100] Update video --- content/blog/2021-03-03-dvc-2-0-release.md | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/content/blog/2021-03-03-dvc-2-0-release.md b/content/blog/2021-03-03-dvc-2-0-release.md index 96f41989ce..9841fc358d 100644 --- a/content/blog/2021-03-03-dvc-2-0-release.md +++ b/content/blog/2021-03-03-dvc-2-0-release.md @@ -19,7 +19,7 @@ descriptionLong: | 🔗 ML pipeline templating and iterative foreach-stages - 🤖 CML - new way to get GPU/CPU in clouds and GitHub Action support + 🤖 CML - new way to get GPU/CPU in clouds and GitHub Actions support picture: 2021-03-03/dvc-2-0-release.png pictureComment: DVC 2.0 Release @@ -34,9 +34,7 @@ tags: ## TL;DR; video -THIS IS A DRAFT - -https://www.youtube.com/watch?v=cqxlr9za69c +https://www.youtube.com/watch?v=h-ioXYurEJo ## What is new in DVC 2.0? @@ -48,9 +46,9 @@ With 2.0 release we are going deeper to machine learning and deep learning scenarios such as **experiment management**, **ML model checkpoints** and **ML metrics logging**. These scenarios are widely adopted by ML practicioners and instrumented with custome tools or external frameworks and SaaS services. **Our -vision is to make ML experimentation experience distributed like Git, +vision** is to make ML experimentation experience distributed (like Git), independent on external SaaS platforms and introducing proper data and model -management to it**. +management to ML experiments. ⚠️ DVC 2.0 is the first release with ML experements and we keep this functionality in experementation mode (yeah, experiments in experementation mode 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 046/100] 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 047/100] 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 048/100] 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 049/100] 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 050/100] 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 c2091e9d4dcf2f9f92ea5bf54b962d2de5524c25 Mon Sep 17 00:00:00 2001 From: Saugat Pachhai Date: Wed, 3 Mar 2021 16:41:10 +0545 Subject: [PATCH 051/100] Change vars to be a list instead of dictionary --- content/blog/2021-03-03-dvc-2-0-release.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/content/blog/2021-03-03-dvc-2-0-release.md b/content/blog/2021-03-03-dvc-2-0-release.md index 9841fc358d..9274bdeb60 100644 --- a/content/blog/2021-03-03-dvc-2-0-release.md +++ b/content/blog/2021-03-03-dvc-2-0-release.md @@ -521,9 +521,9 @@ the pipeline. ```yaml vars: - train_matrix: train.pkl - test_matrix: test.pkl - seed: 20210215 + - train_matrix: train.pkl + - test_matrix: test.pkl + - seed: 20210215 ... From f00301e8a90b18af5a06bff6aa8355e478d7db3d Mon Sep 17 00:00:00 2001 From: Emre Sahin Date: Wed, 3 Mar 2021 16:19:16 +0300 Subject: [PATCH 052/100] This fixes #2153 by removing the incorrect permissions. --- content/docs/command-reference/config.md | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/content/docs/command-reference/config.md b/content/docs/command-reference/config.md index 95da6f418d..889b245571 100644 --- a/content/docs/command-reference/config.md +++ b/content/docs/command-reference/config.md @@ -64,11 +64,11 @@ multiple projects and users, respectively: need to specify private config option values that you don't want to track and share with Git (credentials, private locations, etc). -- `--global` - modify the global config file (e.g. `~/.config/dvc/config`) - instead of the project's `.dvc/config`. Useful to apply config options to all - your projects. +- `--global` - modify a global config file (e.g. `~/.config/dvc/config`) instead + of the project's `.dvc/config`. Useful to apply config options to all your + projects. -- `--system` - modify the system config file (e.g. `/etc/dvc/config`) instead of +- `--system` - modify a system config file (e.g. `/etc/dvc/config`) instead of `.dvc/config`. Useful to apply config options to all the projects (all users) in the machine. May require superuser access e.g. `sudo dvc config --system ...` (Linux). @@ -179,11 +179,16 @@ This section contains the following options, which affect the project's > set. - `cache.shared` - permissions for newly created or downloaded cache files and - directories. The default is `0o664`(rw-r--r--) for files and `0o755` - (rwxr-xr-x) for directories. The only accepted value right now is `group`, - which makes DVC use `0o664` (rw-rw-r--) for files and `0o775` (rwxrwxr-x) for - directories, which is useful when you are using a a - [shared development server](/doc/use-cases/shared-development-server). + directories. The only accepted value right now is `group`, which makes DVC use + `664` (rw-rw-r--) for files and `775` (rwxrwxr-x) for directories. This is + useful when using a + [shared development server](/doc/use-cases/shared-development-server). The + default permissions for cache files is system dependent. In Linux and macOS + default permissions of cache is determined using + [`os.umask`](https://docs.python.org/3/library/os.html#os.umask). In Windows + due to the limitations of + [`os.chmod`](https://docs.python.org/3/library/os.html#os.chmod) only + read-only bit can be set. - `cache.local` - name of a _local remote_ to use as a [custom cache](/doc/user-guide/managing-external-data#examples) directory. From 94c7d3a328de8e3dbc7317c66293d8172269d886 Mon Sep 17 00:00:00 2001 From: Dmitry Petrov Date: Wed, 3 Mar 2021 06:02:43 -0800 Subject: [PATCH 053/100] Update content/blog/2021-03-03-dvc-2-0-release.md Co-authored-by: Saugat Pachhai --- content/blog/2021-03-03-dvc-2-0-release.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/blog/2021-03-03-dvc-2-0-release.md b/content/blog/2021-03-03-dvc-2-0-release.md index 9274bdeb60..92ee25d2ab 100644 --- a/content/blog/2021-03-03-dvc-2-0-release.md +++ b/content/blog/2021-03-03-dvc-2-0-release.md @@ -1,5 +1,5 @@ --- -title: DVC 2.0 Pre-Release +title: DVC 2.0 Release date: 2021-03-03 description: | Today is DVC 2.0 release day! Watch a video from DVC-team when we explain the From 1d8159a9e43f7411c5853b81ff474ee6c33d6f15 Mon Sep 17 00:00:00 2001 From: Dave Berenbaum Date: Wed, 3 Mar 2021 10:22:21 -0500 Subject: [PATCH 054/100] copy edits to 2.0 release blog post (#2258) --- content/blog/2021-03-03-dvc-2-0-release.md | 65 +++++++++++----------- 1 file changed, 32 insertions(+), 33 deletions(-) diff --git a/content/blog/2021-03-03-dvc-2-0-release.md b/content/blog/2021-03-03-dvc-2-0-release.md index 92ee25d2ab..a559df5016 100644 --- a/content/blog/2021-03-03-dvc-2-0-release.md +++ b/content/blog/2021-03-03-dvc-2-0-release.md @@ -38,41 +38,41 @@ https://www.youtube.com/watch?v=h-ioXYurEJo ## What is new in DVC 2.0? -We are working on DVC project for alsmost 4 years. In the previous versions we -have build a great foundation on versioning data, code and ML models that helps -making your ML projects reproducible. - -With 2.0 release we are going deeper to machine learning and deep learning -scenarios such as **experiment management**, **ML model checkpoints** and **ML -metrics logging**. These scenarios are widely adopted by ML practicioners and -instrumented with custome tools or external frameworks and SaaS services. **Our -vision** is to make ML experimentation experience distributed (like Git), -independent on external SaaS platforms and introducing proper data and model -management to ML experiments. - -⚠️ DVC 2.0 is the first release with ML experements and we keep this -functionality in experementation mode (yeah, experiments in experementation mode -😅). It means that the API might change a bit in the following releases. - -**ML pipelines parametrization** is another big improvement in DVC 2.0. This is -the most asked features during the last year. We are introducing variables in -pipelines as well as forach-stages. This is a significant improvements for users -who work on multi-stages ML projects that is very common for NLP projects. +We have been working on DVC for alsmost 4 years. In the previous versions, we +have built a great foundation on versioning data, code and ML models that helps +make your ML projects reproducible. + +With the 2.0 release, we are going deeper into machine learning and deep +learning scenarios such as **experiment management**, **ML model checkpoints** +and **ML metrics logging**. These scenarios are widely adopted by ML +practicioners and instrumented with custom tools or external frameworks and SaaS +services. **Our vision** is to make the ML experimentation experience +distributed (like Git) and independent of external SaaS platforms, and to +introduce proper data and model management to ML experiments. + +⚠️ DVC 2.0 is the first release with ML experements, which is still in +experementation mode (yeah, experiments in experementation mode 😅), so the API +might change a bit in the following releases. + +**ML pipelines parametrization** is another big improvement in DVC 2.0. This was +the most requested feature during the last year. We are introducing variables in +pipelines as well as foreach-stages. This is a significant improvement for users +who work on multi-stages ML projects, which is very common for NLP projects. A better **CPU/GPU resource allocation** is another important direction for DVC. Together with DVC 2.0 we are releasing new version 0.3 of CML (CI/CD for ML). It -aims to hide all complexity of coulds from data scientists and ML engineers. We -develop a brend new Iterative Terraform Provider to reach this goal and simplify -end user experience. In future releases, we expect DVC using this Terraform -provider to access cloud resources directly. +aims to hide all complexity of clouds from data scientists and ML engineers. We +developed a brend new Iterative Terraform Provider to reach this goal and +simplify the end-user experience. In future releases, we expect DVC to use this +Terraform provider to access cloud resources directly. The last but not least important part - we made the new release with **minimum -breaking changes to our API**. That makes migration to DVC 2.0 smooth and less -risky. +breaking changes to our API**. That makes migration to DVC 2.0 smooth and +low-risk. ## Install -The new version is generaly available! +The new version is generally available! Install DVC 2.0 [through OS packages](https://dvc.org/doc/install) or as Python library: @@ -81,8 +81,8 @@ library: $ pip install --upgrade dvc ``` -CML is pre-installed in CML docker containers `dvcorg/cml` & `dvcorg/cml-py3` -and also available as an NPM package: +CML is pre-installed in the CML docker containers `dvcorg/cml` & +`dvcorg/cml-py3` and also available as an NPM package: ```dvc $ npm i -g @dvcorg/cml @@ -142,8 +142,7 @@ Experiment results have been applied to your workspace. In the examples above, hyperparameters were changed with the `--set-param` option, but you can make these changes by modifying the params file instead. In -fact _any code or data files can be changed_ and `dvc exp run` will capture the -variations. +fact _any code can be changed_ and `dvc exp run` will capture the variations. See all the runs: @@ -705,11 +704,11 @@ breaking changes to simplify migration to the new version for the users: 2. Dropped support for login with p12 files on service authentication for Google Drive. 3. Stages without dependencies will not always run as if changed. Instead, use - --always-changed. + `--always-changed`. 4. Environment variables inside the cmd of a stage using `${VAR}` syntax must be escaped as `\${VAR}` in 2.0 due to the use of `${}` syntax for templating. ## Thank you! -Thank you for all DVC users and community members for the help. Please try out +Thank you to all DVC users and community members for the help. Please try out the new DVC and CML releases and do not get lost in your ML experiments! 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 055/100] 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 f31ecdf0a75a164562a4c428f76425c3bcb06656 Mon Sep 17 00:00:00 2001 From: Ruslan Kuprieiev Date: Wed, 3 Mar 2021 22:59:26 +0200 Subject: [PATCH 056/100] download: update to 2.0.1 --- src/components/DownloadButton/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/DownloadButton/index.tsx b/src/components/DownloadButton/index.tsx index 113d641a88..1b897c18db 100644 --- a/src/components/DownloadButton/index.tsx +++ b/src/components/DownloadButton/index.tsx @@ -9,7 +9,7 @@ import { logEvent } from '../../utils/front/ga' import styles from './styles.module.css' -const VERSION = `1.11.15` +const VERSION = `2.0.1` enum OS { UNKNOWN = '...', 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 057/100] 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 058/100] 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 059/100] 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 060/100] 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 061/100] 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 37f2fd5e760b5aa4c7ef008b6cc29ecc9111cc99 Mon Sep 17 00:00:00 2001 From: Benjamin Jones Date: Thu, 4 Mar 2021 16:43:53 +0000 Subject: [PATCH 062/100] Fixed typo (#2264) ### Our favorite details The new `cml-runner` function lets you turn on instances, including GPU, high-memory and **spot** instances --- content/blog/2021-02-22-cml-runner-prerelease.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/blog/2021-02-22-cml-runner-prerelease.md b/content/blog/2021-02-22-cml-runner-prerelease.md index 572bb990e3..aa196014b0 100644 --- a/content/blog/2021-02-22-cml-runner-prerelease.md +++ b/content/blog/2021-02-22-cml-runner-prerelease.md @@ -119,7 +119,7 @@ All the code to replicate this example is up on a ### Our favorite details The new `cml-runner` function lets you turn on instances, including GPU, -high-memory and sport instances, and kick off a new workflow using the hardware +high-memory and spot instances, and kick off a new workflow using the hardware and environment of your choice—and of course, it'll turn _off_ those instances after a configurable timeout! In the first CML release, this took [more than 30 lines of code](https://github.com/iterative/cml_cloud_case/blob/master/.github/workflows/cml.yaml) From 34e76b7be88e4ba07c8801c6f830a37e88dacc86 Mon Sep 17 00:00:00 2001 From: Benjamin Jones Date: Thu, 4 Mar 2021 16:44:39 +0000 Subject: [PATCH 063/100] fixed typo (#2263) ## What is new in DVC 2.0? We have been working on DVC for *almost* 4 years. --- content/blog/2021-03-03-dvc-2-0-release.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/blog/2021-03-03-dvc-2-0-release.md b/content/blog/2021-03-03-dvc-2-0-release.md index a559df5016..b3f0bd7f07 100644 --- a/content/blog/2021-03-03-dvc-2-0-release.md +++ b/content/blog/2021-03-03-dvc-2-0-release.md @@ -38,7 +38,7 @@ https://www.youtube.com/watch?v=h-ioXYurEJo ## What is new in DVC 2.0? -We have been working on DVC for alsmost 4 years. In the previous versions, we +We have been working on DVC for almost 4 years. In the previous versions, we have built a great foundation on versioning data, code and ML models that helps make your ML projects reproducible. From 6acdfaed706ab3eec6bf837891aae57371ab5f49 Mon Sep 17 00:00:00 2001 From: Dmitry Petrov Date: Thu, 4 Mar 2021 14:04:18 -0800 Subject: [PATCH 064/100] dvc 2.0 post - small fixes (#2267) --- content/blog/2021-03-03-dvc-2-0-release.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/content/blog/2021-03-03-dvc-2-0-release.md b/content/blog/2021-03-03-dvc-2-0-release.md index b3f0bd7f07..f2e44cf081 100644 --- a/content/blog/2021-03-03-dvc-2-0-release.md +++ b/content/blog/2021-03-03-dvc-2-0-release.md @@ -45,13 +45,13 @@ make your ML projects reproducible. With the 2.0 release, we are going deeper into machine learning and deep learning scenarios such as **experiment management**, **ML model checkpoints** and **ML metrics logging**. These scenarios are widely adopted by ML -practicioners and instrumented with custom tools or external frameworks and SaaS +practitioners and instrumented with custom tools or external frameworks and SaaS services. **Our vision** is to make the ML experimentation experience distributed (like Git) and independent of external SaaS platforms, and to introduce proper data and model management to ML experiments. ⚠️ DVC 2.0 is the first release with ML experements, which is still in -experementation mode (yeah, experiments in experementation mode 😅), so the API +experimentation mode (yeah, experiments in experimentation mode 😅), so the API might change a bit in the following releases. **ML pipelines parametrization** is another big improvement in DVC 2.0. This was @@ -62,7 +62,7 @@ who work on multi-stages ML projects, which is very common for NLP projects. A better **CPU/GPU resource allocation** is another important direction for DVC. Together with DVC 2.0 we are releasing new version 0.3 of CML (CI/CD for ML). It aims to hide all complexity of clouds from data scientists and ML engineers. We -developed a brend new Iterative Terraform Provider to reach this goal and +developed a brand new Iterative Terraform Provider to reach this goal and simplify the end-user experience. In future releases, we expect DVC to use this Terraform provider to access cloud resources directly. @@ -101,7 +101,7 @@ additional Git commands `git add/commit`, and comparing all experiments is difficult. We are introducing lightweight experiments in DVC 2.0! This is how you can -auto-track ML experiments without any overhead from ML engineers. +auto-track ML experiments without any overhead. ⚠️ Note, our new ML experiment features (`dvc exp`) are experimental. This means that the commands might change a bit in the following minor releases. @@ -216,8 +216,8 @@ ML model checkpoints are an essential part of deep learning. ML engineers prefer to save the model files (or weights) at checkpoints during a training process and return back when metrics start diverging or learning is not fast enough. -The checkpoints create a different dynamic around ML modeling process and need a -special support from the toolset: +The checkpoints create a different dynamics around ML modeling process and need +a special support from the toolset: 1. Track and save model checkpoints (DVC outputs) periodically, not only the final result or training epoch. From e15dc3906995b3cc4e3e789c92eacdd9a8a2b5d1 Mon Sep 17 00:00:00 2001 From: Dave Berenbaum Date: Mon, 8 Mar 2021 10:35:24 -0500 Subject: [PATCH 065/100] fix usage bug in dvc exp run (#2277) --- content/docs/command-reference/exp/run.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/docs/command-reference/exp/run.md b/content/docs/command-reference/exp/run.md index 805f46b48b..8dcf1292a9 100644 --- a/content/docs/command-reference/exp/run.md +++ b/content/docs/command-reference/exp/run.md @@ -11,7 +11,7 @@ committed [pipeline](/doc/command-reference/dag) in a hidden project branch. ```usage usage: dvc exp run [-h] [-q | -v] [-f] [ ...] - [--params [:]] + [--set-param [:]] [-n ] [--queue] [--run-all] [-j ] [targets [targets ...]] From cf8e3d4401635a382085b82174af255ec83e40c5 Mon Sep 17 00:00:00 2001 From: Saugat Pachhai Date: Tue, 9 Mar 2021 00:25:53 +0545 Subject: [PATCH 066/100] getting-started: data versioning: remove mkdir when getting dataset (#2275) `dvc get` can create the folder if it does not exist already. --- content/docs/start/data-versioning.md | 1 - 1 file changed, 1 deletion(-) diff --git a/content/docs/start/data-versioning.md b/content/docs/start/data-versioning.md index c26dc16619..49f8801246 100644 --- a/content/docs/start/data-versioning.md +++ b/content/docs/start/data-versioning.md @@ -29,7 +29,6 @@ Having initialized a project in the previous section, get the data file we will be using later like this: ```dvc -$ mkdir data $ dvc get https://github.com/iterative/dataset-registry \ get-started/data.xml -o data/data.xml ``` From 280123ce6c165e22b582d6c190ac79f074b289c9 Mon Sep 17 00:00:00 2001 From: Jorge Orpinel Date: Mon, 8 Mar 2021 20:49:28 -0600 Subject: [PATCH 067/100] 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 068/100] 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 069/100] 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 070/100] 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 071/100] 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 072/100] 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 073/100] 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 074/100] 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 075/100] 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 076/100] 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 077/100] 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 078/100] 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 079/100] 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 080/100] 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 081/100] 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 082/100] 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 083/100] 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. From 785c5c8c5150a9410e9c6f73c68ca7ff594c26ff Mon Sep 17 00:00:00 2001 From: Emre Sahin Date: Tue, 9 Mar 2021 17:01:45 +0300 Subject: [PATCH 084/100] revert the->a changes back --- content/docs/command-reference/config.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/content/docs/command-reference/config.md b/content/docs/command-reference/config.md index 889b245571..6f4d5d5933 100644 --- a/content/docs/command-reference/config.md +++ b/content/docs/command-reference/config.md @@ -64,11 +64,11 @@ multiple projects and users, respectively: need to specify private config option values that you don't want to track and share with Git (credentials, private locations, etc). -- `--global` - modify a global config file (e.g. `~/.config/dvc/config`) instead - of the project's `.dvc/config`. Useful to apply config options to all your - projects. +- `--global` - modify the global config file (e.g. `~/.config/dvc/config`) + instead of the project's `.dvc/config`. Useful to apply config options to all + your projects. -- `--system` - modify a system config file (e.g. `/etc/dvc/config`) instead of +- `--system` - modify the system config file (e.g. `/etc/dvc/config`) instead of `.dvc/config`. Useful to apply config options to all the projects (all users) in the machine. May require superuser access e.g. `sudo dvc config --system ...` (Linux). From 338f338f14d26b969df15a1c655be3925492c85d Mon Sep 17 00:00:00 2001 From: Emre Sahin Date: Tue, 9 Mar 2021 17:02:25 +0300 Subject: [PATCH 085/100] Update content/docs/command-reference/config.md Co-authored-by: Jorge Orpinel --- content/docs/command-reference/config.md | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/content/docs/command-reference/config.md b/content/docs/command-reference/config.md index 889b245571..0a2c0f09d3 100644 --- a/content/docs/command-reference/config.md +++ b/content/docs/command-reference/config.md @@ -183,12 +183,9 @@ This section contains the following options, which affect the project's `664` (rw-rw-r--) for files and `775` (rwxrwxr-x) for directories. This is useful when using a [shared development server](/doc/use-cases/shared-development-server). The - default permissions for cache files is system dependent. In Linux and macOS - default permissions of cache is determined using - [`os.umask`](https://docs.python.org/3/library/os.html#os.umask). In Windows - due to the limitations of - [`os.chmod`](https://docs.python.org/3/library/os.html#os.chmod) only - read-only bit can be set. + default permissions for cache files is system dependent. In Linux and MacOS + for example, they're determined using + [`os.umask`](https://docs.python.org/3/library/os.html#os.umask). - `cache.local` - name of a _local remote_ to use as a [custom cache](/doc/user-guide/managing-external-data#examples) directory. From 7dcf1020f19c2005701c1460079db892903a7b27 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 9 Mar 2021 08:43:57 -0800 Subject: [PATCH 086/100] build(deps): bump elliptic from 6.5.3 to 6.5.4 (#2284) Bumps [elliptic](https://github.com/indutny/elliptic) from 6.5.3 to 6.5.4. - [Release notes](https://github.com/indutny/elliptic/releases) - [Commits](https://github.com/indutny/elliptic/compare/v6.5.3...v6.5.4) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- yarn.lock | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/yarn.lock b/yarn.lock index 97b4cf6e07..592cf46252 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3437,10 +3437,10 @@ bmp-js@^0.1.0: resolved "https://registry.yarnpkg.com/bmp-js/-/bmp-js-0.1.0.tgz#e05a63f796a6c1ff25f4771ec7adadc148c07233" integrity sha1-4Fpj95amwf8l9Hcex62twUjAcjM= -bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.4.0: - version "4.11.9" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.9.tgz#26d556829458f9d1e81fc48952493d0ba3507828" - integrity sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw== +bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.9: + version "4.12.0" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" + integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== bn.js@^5.1.1: version "5.1.2" @@ -3549,7 +3549,7 @@ braces@^3.0.1, braces@~3.0.2: dependencies: fill-range "^7.0.1" -brorand@^1.0.1: +brorand@^1.0.1, brorand@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= @@ -5666,17 +5666,17 @@ elegant-spinner@^2.0.0: integrity sha512-5YRYHhvhYzV/FC4AiMdeSIg3jAYGq9xFvbhZMpPlJoBsfYgrw2DSCYeXfat6tYBu45PWiyRr3+flaCPPmviPaA== elliptic@^6.0.0, elliptic@^6.5.2: - version "6.5.3" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.3.tgz#cb59eb2efdaf73a0bd78ccd7015a62ad6e0f93d6" - integrity sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw== + version "6.5.4" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" + integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== dependencies: - bn.js "^4.4.0" - brorand "^1.0.1" + bn.js "^4.11.9" + brorand "^1.1.0" hash.js "^1.0.0" - hmac-drbg "^1.0.0" - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - minimalistic-crypto-utils "^1.0.0" + hmac-drbg "^1.0.1" + inherits "^2.0.4" + minimalistic-assert "^1.0.1" + minimalistic-crypto-utils "^1.0.1" "emoji-regex@>=6.0.0 <=6.1.1": version "6.1.1" @@ -8550,7 +8550,7 @@ highlight.js@^8.1.0: resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-8.9.1.tgz#b8a9c5493212a9392f0222b649c9611497ebfb88" integrity sha1-uKnFSTISqTkvAiK2SclhFJfr+4g= -hmac-drbg@^1.0.0: +hmac-drbg@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= @@ -11423,7 +11423,7 @@ minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== -minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: +minimalistic-crypto-utils@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= From dceb32032e4e96f329c9b8714929018f8e122736 Mon Sep 17 00:00:00 2001 From: Jorge Orpinel Date: Wed, 10 Mar 2021 13:30:53 -0600 Subject: [PATCH 087/100] ref: update add --out text --- content/docs/command-reference/add.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/content/docs/command-reference/add.md b/content/docs/command-reference/add.md index 13a109899d..e737732e37 100644 --- a/content/docs/command-reference/add.md +++ b/content/docs/command-reference/add.md @@ -151,9 +151,9 @@ not. > Note that external outputs typically require an external cache setup. See > link above for more details. -- `-o `, `--out ` - destination `path` inside the workspace, to - [transfer](#example-transfer-to-cache) an external target into cache, and - track it in-place. Note that this can be combined with `--to-remote` to avoid +- `-o `, `--out ` - destination `path` to make a local target copy, or to + [transfer](#example-transfer-to-cache) an external target into the cache and workspace. + Note that this can be combined with `--to-remote` to avoid storing the data locally, while still adding it to the project. - `--to-remote` - import an external target, but don't move it into the From 88eee983ad18f084eceb9be729bd1ac72707f17c Mon Sep 17 00:00:00 2001 From: Jorge Orpinel Date: Wed, 10 Mar 2021 13:32:30 -0600 Subject: [PATCH 088/100] Update content/docs/command-reference/add.md --- content/docs/command-reference/add.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/docs/command-reference/add.md b/content/docs/command-reference/add.md index e737732e37..8e3abce31f 100644 --- a/content/docs/command-reference/add.md +++ b/content/docs/command-reference/add.md @@ -152,7 +152,7 @@ not. > link above for more details. - `-o `, `--out ` - destination `path` to make a local target copy, or to - [transfer](#example-transfer-to-cache) an external target into the cache and workspace. + [transfer](#example-transfer-to-cache) an external target into the cache (and link to workspace). Note that this can be combined with `--to-remote` to avoid storing the data locally, while still adding it to the project. From ce2218328f7258b5d07d7fc2d02edced0d4f0875 Mon Sep 17 00:00:00 2001 From: Jorge Orpinel Date: Wed, 10 Mar 2021 13:37:08 -0600 Subject: [PATCH 089/100] ref: copy deit add -o example --- content/docs/command-reference/add.md | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/content/docs/command-reference/add.md b/content/docs/command-reference/add.md index 8e3abce31f..a746c30760 100644 --- a/content/docs/command-reference/add.md +++ b/content/docs/command-reference/add.md @@ -338,15 +338,15 @@ Only the hash values of the `dir/` directory (with `.dir` file extension) and When you have a large dataset in an external location, you may want to add it to the project without having to copy it into the workspace. Maybe -your local disk doesn't even have enough space, but you have setup an +your local disk doesn't have enough space, but you have setup an [external cache](/doc/use-cases/shared-development-server#configure-the-external-shared-cache) that could handle it. The `--out` option lets you add external paths in a way that they are cached first, and then [linked](/doc/user-guide/large-dataset-optimization#file-link-types-for-the-dvc-cache) -to a given path inside the workspace. Let's initialize a DVC -project: +to a given path inside the workspace. Let's initialize an +example DVC project to try this: ```dvc $ mkdir example # workspace @@ -358,19 +358,15 @@ $ dvc init Now we can add a `data.xml` file via HTTP for example, putting it a local path in our project: -``` +```dvc $ dvc add https://data.dvc.org/get-started/data.xml -o data.xml -To track the changes with git, run: - - git add data.xml.dvc - $ ls data.xml data.xml.dvc ``` The resulting `.dvc` file will save the provided local `path` as if the data was -always there, while the `md5` hash points to the copy of the data that has now +already in the workspace, while the `md5` hash points to the copy of the data that has now been transferred to the cache. Let's check the contents of `data.xml.dvc` in this case: From a7bee1235ef436377d77d523a492073ac5db63b1 Mon Sep 17 00:00:00 2001 From: "Restyled.io" Date: Wed, 10 Mar 2021 19:37:21 +0000 Subject: [PATCH 090/100] Restyled by prettier --- content/docs/command-reference/add.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/content/docs/command-reference/add.md b/content/docs/command-reference/add.md index a746c30760..1ac87d9708 100644 --- a/content/docs/command-reference/add.md +++ b/content/docs/command-reference/add.md @@ -151,10 +151,10 @@ not. > Note that external outputs typically require an external cache setup. See > link above for more details. -- `-o `, `--out ` - destination `path` to make a local target copy, or to - [transfer](#example-transfer-to-cache) an external target into the cache (and link to workspace). - Note that this can be combined with `--to-remote` to avoid - storing the data locally, while still adding it to the project. +- `-o `, `--out ` - destination `path` to make a local target copy, + or to [transfer](#example-transfer-to-cache) an external target into the cache + (and link to workspace). Note that this can be combined with `--to-remote` to + avoid storing the data locally, while still adding it to the project. - `--to-remote` - import an external target, but don't move it into the workspace, nor cache it. [Transfer it](#example-transfer-to-remote-storage) it @@ -345,8 +345,8 @@ that could handle it. The `--out` option lets you add external paths in a way that they are cached first, and then [linked](/doc/user-guide/large-dataset-optimization#file-link-types-for-the-dvc-cache) -to a given path inside the workspace. Let's initialize an -example DVC project to try this: +to a given path inside the workspace. Let's initialize an example +DVC project to try this: ```dvc $ mkdir example # workspace @@ -366,9 +366,9 @@ data.xml data.xml.dvc ``` The resulting `.dvc` file will save the provided local `path` as if the data was -already in the workspace, while the `md5` hash points to the copy of the data that has now -been transferred to the cache. Let's check the contents of `data.xml.dvc` in -this case: +already in the workspace, while the `md5` hash points to the copy of the data +that has now been transferred to the cache. Let's check the contents of +`data.xml.dvc` in this case: ```yaml outs: From 48a931982651dee3f2fd360d509adf45f9fdbce9 Mon Sep 17 00:00:00 2001 From: Jorge Orpinel Date: Wed, 10 Mar 2021 13:39:38 -0600 Subject: [PATCH 091/100] ref: cache tooltip in add -o ex. --- content/docs/command-reference/add.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/docs/command-reference/add.md b/content/docs/command-reference/add.md index 1ac87d9708..1d0ef04ad9 100644 --- a/content/docs/command-reference/add.md +++ b/content/docs/command-reference/add.md @@ -367,8 +367,8 @@ data.xml data.xml.dvc The resulting `.dvc` file will save the provided local `path` as if the data was already in the workspace, while the `md5` hash points to the copy of the data -that has now been transferred to the cache. Let's check the contents of -`data.xml.dvc` in this case: +that has now been transferred to the cache. Let's check the +contents of `data.xml.dvc` in this case: ```yaml outs: From 6f9652ec523904e4ef00b9e2e79257a297cfd10f Mon Sep 17 00:00:00 2001 From: Peter Rowlands Date: Thu, 11 Mar 2021 15:10:11 +0900 Subject: [PATCH 092/100] cmd: document -c/--checkpoints for `run` and `stage add` --- content/docs/command-reference/run.md | 7 ++++++- content/docs/command-reference/stage/add.md | 7 ++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/content/docs/command-reference/run.md b/content/docs/command-reference/run.md index c6862d8850..de7eb04046 100644 --- a/content/docs/command-reference/run.md +++ b/content/docs/command-reference/run.md @@ -12,7 +12,7 @@ usage: dvc run [-h] [-q | -v] -n [-d ] [-o ] [-w ] [--no-exec] [-f] [--no-run-cache] [--no-commit] [--outs-persist ] [--outs-persist-no-cache ] - [--always-changed] [--external] [--desc ] + [-c ] [--always-changed] [--external] [--desc ] command positional arguments: @@ -192,6 +192,11 @@ $ dvc run -n second_stage './another_script.sh $MYENVVAR' - `--outs-persist-no-cache ` - the same as `-outs-persist` except that outputs are not tracked by DVC (same as with `-O` above). +- `-c :]`, `--params [:]` - specify a set of [parameter dependencies](/doc/command-reference/params) the stage depends on, from a parameters file. This is done by sending a comma separated list as diff --git a/content/docs/command-reference/stage/add.md b/content/docs/command-reference/stage/add.md index 270f64887f..9437252cc0 100644 --- a/content/docs/command-reference/stage/add.md +++ b/content/docs/command-reference/stage/add.md @@ -10,7 +10,7 @@ usage: dvc stage add [-h] [-q | -v] -n [-d ] [-o ] [-m ] [-M ] [--plots ] [--plots-no-cache ] [-w ] [-f] [--outs-persist ] - [--outs-persist-no-cache ] + [--outs-persist-no-cache ] [-c ] [--always-changed] [--external] [--desc ] command @@ -187,6 +187,11 @@ data science experiments. - `--outs-persist-no-cache ` - the same as `-outs-persist` except that outputs are not tracked by DVC (same as with `-O` above). +- `-c :]`, `--params [:]` - specify a set of [parameter dependencies](/doc/command-reference/params) the stage depends on, from a parameters file. This is done by sending a comma separated list as From c08d58f4c7dab3cb27aeefe75171e7fae8a2c3ed Mon Sep 17 00:00:00 2001 From: Jorge Orpinel Date: Thu, 11 Mar 2021 13:43:03 -0600 Subject: [PATCH 093/100] ref: update run/stage add -c desc --- content/docs/command-reference/run.md | 7 +++---- content/docs/command-reference/stage/add.md | 7 +++---- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/content/docs/command-reference/run.md b/content/docs/command-reference/run.md index de7eb04046..c486e2a7ee 100644 --- a/content/docs/command-reference/run.md +++ b/content/docs/command-reference/run.md @@ -192,10 +192,9 @@ $ dvc run -n second_stage './another_script.sh $MYENVVAR' - `--outs-persist-no-cache ` - the same as `-outs-persist` except that outputs are not tracked by DVC (same as with `-O` above). -- `-c ` - the same as `-o` but also marks the + output as a [checkpoint](/doc/command-reference/exp/run#checkpoints). + Implies `--no-exec`. This makes the stage incompatible with `dvc repro`. - `-p [:]`, `--params [:]` - specify a set of [parameter dependencies](/doc/command-reference/params) the stage depends diff --git a/content/docs/command-reference/stage/add.md b/content/docs/command-reference/stage/add.md index 9437252cc0..d270c9204d 100644 --- a/content/docs/command-reference/stage/add.md +++ b/content/docs/command-reference/stage/add.md @@ -187,10 +187,9 @@ data science experiments. - `--outs-persist-no-cache ` - the same as `-outs-persist` except that outputs are not tracked by DVC (same as with `-O` above). -- `-c ` - the same as `-o` but also marks the + output as a [checkpoint](/doc/command-reference/exp/run#checkpoints). + Implies `--no-exec`. This makes the stage incompatible with `dvc repro`. - `-p [:]`, `--params [:]` - specify a set of [parameter dependencies](/doc/command-reference/params) the stage depends From 1540cc29e8825d5aece1d4bb2ef85958afce6016 Mon Sep 17 00:00:00 2001 From: "Restyled.io" Date: Thu, 11 Mar 2021 19:45:56 +0000 Subject: [PATCH 094/100] Restyled by prettier --- content/docs/command-reference/run.md | 4 ++-- content/docs/command-reference/stage/add.md | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/content/docs/command-reference/run.md b/content/docs/command-reference/run.md index c486e2a7ee..b78d37e76c 100644 --- a/content/docs/command-reference/run.md +++ b/content/docs/command-reference/run.md @@ -193,8 +193,8 @@ $ dvc run -n second_stage './another_script.sh $MYENVVAR' outputs are not tracked by DVC (same as with `-O` above). - `-c ` - the same as `-o` but also marks the - output as a [checkpoint](/doc/command-reference/exp/run#checkpoints). - Implies `--no-exec`. This makes the stage incompatible with `dvc repro`. + output as a [checkpoint](/doc/command-reference/exp/run#checkpoints). Implies + `--no-exec`. This makes the stage incompatible with `dvc repro`. - `-p [:]`, `--params [:]` - specify a set of [parameter dependencies](/doc/command-reference/params) the stage depends diff --git a/content/docs/command-reference/stage/add.md b/content/docs/command-reference/stage/add.md index d270c9204d..968795a18f 100644 --- a/content/docs/command-reference/stage/add.md +++ b/content/docs/command-reference/stage/add.md @@ -188,8 +188,8 @@ data science experiments. outputs are not tracked by DVC (same as with `-O` above). - `-c ` - the same as `-o` but also marks the - output as a [checkpoint](/doc/command-reference/exp/run#checkpoints). - Implies `--no-exec`. This makes the stage incompatible with `dvc repro`. + output as a [checkpoint](/doc/command-reference/exp/run#checkpoints). Implies + `--no-exec`. This makes the stage incompatible with `dvc repro`. - `-p [:]`, `--params [:]` - specify a set of [parameter dependencies](/doc/command-reference/params) the stage depends From 32e6bb7bc37c6c2efa2c996cc3b7f9a71ef5f3e4 Mon Sep 17 00:00:00 2001 From: Ruslan Kuprieiev Date: Fri, 12 Mar 2021 00:11:20 +0200 Subject: [PATCH 095/100] download: update to 2.0.5 --- src/components/DownloadButton/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/DownloadButton/index.tsx b/src/components/DownloadButton/index.tsx index 1b897c18db..8c09bafbb1 100644 --- a/src/components/DownloadButton/index.tsx +++ b/src/components/DownloadButton/index.tsx @@ -9,7 +9,7 @@ import { logEvent } from '../../utils/front/ga' import styles from './styles.module.css' -const VERSION = `2.0.1` +const VERSION = `2.0.5` enum OS { UNKNOWN = '...', From 37cd9b1e1d8ce3abdb2f24f1bcc9e1cc1b59c0f0 Mon Sep 17 00:00:00 2001 From: Roger Date: Fri, 12 Mar 2021 19:52:33 -0500 Subject: [PATCH 096/100] Add target="_blank" rel="noopener noreferrer" to external-link (#2295) --- plugins/external-link-plugin/index.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/plugins/external-link-plugin/index.js b/plugins/external-link-plugin/index.js index 730810eaba..dd3aa59cea 100644 --- a/plugins/external-link-plugin/index.js +++ b/plugins/external-link-plugin/index.js @@ -15,7 +15,9 @@ function isCorrectExternalLinkAttr(attrsKeyTagArray) { function renderTag(attrs) { return `

- +

${escape(attrs.title)}

${escape(attrs.description)}
From 7e09c414e341c62492b78036de68aab7bf64c7b8 Mon Sep 17 00:00:00 2001 From: Saugat Pachhai Date: Sat, 13 Mar 2021 06:38:14 +0545 Subject: [PATCH 097/100] document plots diff/show --open flag (#2293) --- content/docs/command-reference/plots/diff.md | 4 +++- content/docs/command-reference/plots/show.md | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/content/docs/command-reference/plots/diff.md b/content/docs/command-reference/plots/diff.md index cfff56bb34..1620e742da 100644 --- a/content/docs/command-reference/plots/diff.md +++ b/content/docs/command-reference/plots/diff.md @@ -11,7 +11,7 @@ usage: dvc plots diff [-h] [-q | -v] [-t ] [-x ] [-y ] [--no-header] [--title ] [--x-label ] [--y-label ] [-o ] - [--show-vega] + [--show-vega] [--open] [revisions [revisions ...]] positional arguments: @@ -91,6 +91,8 @@ all the current plots, without comparisons. [Vega specification](https://vega.github.io/vega/docs/specification/) file instead of HTML. See `dvc plots` for more info. +- `--open` - opens the generated plot directly in the browser. + - `--no-header` - lets DVC know that CSV or TSV `--targets` do not have a header. A 0-based numeric index can be used to identify each column instead of names. diff --git a/content/docs/command-reference/plots/show.md b/content/docs/command-reference/plots/show.md index caff00c157..692dd49a7e 100644 --- a/content/docs/command-reference/plots/show.md +++ b/content/docs/command-reference/plots/show.md @@ -8,7 +8,7 @@ Generate [plot](/doc/command-reference/plots) from a metrics file. usage: dvc plots show [-h] [-q | -v] [-t ] [-x ] [-y ] [--no-header] [--title ] [--x-label ] [--y-label ] [-o ] - [--show-vega] + [--show-vega] [--open] [targets [targets ...]] positional arguments: @@ -65,6 +65,8 @@ please see `dvc plots`. [Vega specification](https://vega.github.io/vega/docs/specification/) file instead of HTML. See `dvc plots` for more info. +- `--open` - opens the generated plot directly in the browser. + - `--no-header` - lets DVC know that CSV or TSV `targets` do not have a header. A 0-based numeric index can be used to identify each column instead of names. From aac075164ed6e5c263c26e406d16a9b15f56355d Mon Sep 17 00:00:00 2001 From: Emre Sahin Date: Sat, 13 Mar 2021 04:06:59 +0300 Subject: [PATCH 098/100] cmd: fix params example for using custom params file (#2262) * ws changes * converted the example of `dvc.lock` to a dict --- content/docs/command-reference/params/index.md | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/content/docs/command-reference/params/index.md b/content/docs/command-reference/params/index.md index 2a7cbfa4d7..730e4af03f 100644 --- a/content/docs/command-reference/params/index.md +++ b/content/docs/command-reference/params/index.md @@ -240,10 +240,11 @@ stages: deps: - users.csv params: - - BOOL - - INT - - TrainConfig.EPOCHS - - TrainConfig.layers + - params.py: + - BOOL + - INT + - TrainConfig.EPOCHS + - TrainConfig.layers outs: - model.pkl ``` @@ -257,10 +258,11 @@ stages: - path: users.csv md5: 23be4307b23dcd740763d5fc67993f11 params: - INT: 5 - BOOL: true - TrainConfig.EPOCHS: 70 - TrainConfig.layers: 9 + params.py: + INT: 5 + BOOL: true + TrainConfig.EPOCHS: 70 + TrainConfig.layers: 9 outs: - path: model.pkl md5: 1c06b4756f08203cc496e4061b1e7d67 From 2cd74b834c1ed05a4a1d3bbb373b6707cda86c36 Mon Sep 17 00:00:00 2001 From: Jorge Orpinel Date: Fri, 12 Mar 2021 20:04:11 -0600 Subject: [PATCH 099/100] Misc. updates (#2296) * guide: fix links to GDrive anchor * ref: update stage:add desc. * cases: typo in DR * guide: consistent internal guide hash examples * guide: fix wdit links in dvc.yaml guide * ref: improve dag desc. * term: username -> user name --- content/docs/command-reference/dag.md | 9 +++--- content/docs/command-reference/remote/add.md | 2 +- .../docs/command-reference/remote/modify.md | 28 +++++++++---------- content/docs/command-reference/stage/add.md | 9 +++--- content/docs/use-cases/data-registries.md | 2 +- content/docs/user-guide/contributing/core.md | 2 +- .../project-structure/internal-files.md | 4 +-- .../project-structure/pipelines-files.md | 11 ++++---- .../user-guide/setup-google-drive-remote.md | 4 +-- 9 files changed, 36 insertions(+), 35 deletions(-) diff --git a/content/docs/command-reference/dag.md b/content/docs/command-reference/dag.md index e520db3464..08f673c665 100644 --- a/content/docs/command-reference/dag.md +++ b/content/docs/command-reference/dag.md @@ -17,8 +17,9 @@ positional arguments: A data pipeline, in general, is a series of data processing [stages](/doc/command-reference/run) (for example, console commands that take an -input and produce an output). A pipeline may produce intermediate -data, and has a final result. +input and produce an outcome). The connections between stages are formed by the +output of one turning into the dependency of another. +A pipeline may produce intermediate data, and has a final result. Data science and machine learning pipelines typically start with large raw datasets, include intermediate featurization and training stages, and produce a @@ -32,8 +33,8 @@ restore one or more pipelines later (see `dvc repro`). > DVC builds a dependency graph > ([DAG](https://en.wikipedia.org/wiki/Directed_acyclic_graph)) to do this. -`dvc dag` command displays the stages of a pipeline up to the target stage. If -`target` is omitted, it will show the full project DAG. +The `dvc dag` command displays the stages of a pipeline up to the target stage. +If `target` is omitted, it will show the full project DAG. ## Options diff --git a/content/docs/command-reference/remote/add.md b/content/docs/command-reference/remote/add.md index d0a49041ea..e535501727 100644 --- a/content/docs/command-reference/remote/add.md +++ b/content/docs/command-reference/remote/add.md @@ -359,7 +359,7 @@ $ dvc remote modify --local myremote user myuser $ dvc remote modify --local myremote token 'mytoken' ``` -> The username and password may contain sensitive user info. Therefore, it's +> The user name and password may contain sensitive user info. Therefore, it's > safer to add it with the `--local` option, so it's written to a Git-ignored > config file. See `dvc remote modify` for a full list of WebHDFS parameters. diff --git a/content/docs/command-reference/remote/modify.md b/content/docs/command-reference/remote/modify.md index cb32f4a7a5..f211878c30 100644 --- a/content/docs/command-reference/remote/modify.md +++ b/content/docs/command-reference/remote/modify.md @@ -348,7 +348,7 @@ a full guide on using Google Drive as DVC remote storage. ``` - `gdrive_client_id` - Client ID for authentication with OAuth 2.0 when using a - [custom Google Client project](/doc/user-guide/setup-google-drive-remote#using-a-custom-google-cloud-project). + [custom Google Client project](/doc/user-guide/setup-google-drive-remote#using-a-custom-google-cloud-project-recommended). Also requires using `gdrive_client_secret`. ```dvc @@ -520,13 +520,13 @@ more information. > Note that your server's SFTP root might differ from its physical root (`/`). -- `user` - username to access the remote: +- `user` - user name to access the remote: ```dvc $ dvc remote modify --local myremote user myuser ``` - The order in which DVC picks the username: + The order in which DVC picks the user name: 1. `user` parameter set with this command (found in `.dvc/config`); 2. User defined in the URL (e.g. `ssh://user@example.com/path`); @@ -560,7 +560,7 @@ more information. $ dvc remote modify --local myremote password mypassword ``` -> The username and password (may) contain sensitive user info. Therefore, it's +> The user name and password (may) contain sensitive user info. Therefore, it's > safer to add them with the `--local` option, so they're written to a > Git-ignored config file. @@ -607,13 +607,13 @@ Read more about by expanding the WebHDFS section in $ dvc remote modify myremote url hdfs://user@example.com/path ``` -- `user` - username to access the remote. +- `user` - user name to access the remote. ```dvc $ dvc remote modify --local myremote user myuser ``` -> The username may contain sensitive user info. Therefore, it's safer to add it +> The user name may contain sensitive user info. Therefore, it's safer to add it > with the `--local` option, so it's written to a Git-ignored config file.
@@ -632,7 +632,7 @@ by HDFS. Read more about by expanding the WebHDFS section in $ dvc remote modify myremote url webhdfs://user@example.com/path ``` -- `user` - username to access the remote, can be empty in case of using `token` +- `user` - user name to access the remote, can be empty in case of using `token` or if using a `HdfsCLI` cfg file. May only be used when Hadoop security is off. Defaults to current user as determined by `whoami`. @@ -685,7 +685,7 @@ by HDFS. Read more about by expanding the WebHDFS section in $ dvc remote modify --local myremote webhdfs_alias myalias ``` -> The username, token, webhdfs_alias, and hdfscli_config may contain sensitive +> The user name, token, webhdfs_alias, and hdfscli_config may contain sensitive > user info. Therefore, it's safer to add it with the `--local` option, so it's > written to a Git-ignored config file. @@ -740,14 +740,14 @@ by HDFS. Read more about by expanding the WebHDFS section in $ dvc remote modify myremote custom_auth_header 'My-Header' ``` -- `user` - username to use when the `auth` parameter is set to `basic` or +- `user` - user name to use when the `auth` parameter is set to `basic` or `digest`. ```dvc $ dvc remote modify --local myremote user myuser ``` - The order in which DVC picks the username: + The order in which DVC picks the user name: 1. `user` parameter set with this command (found in `.dvc/config`); 2. User defined in the URL (e.g. `http://user@example.com/path`); @@ -758,7 +758,7 @@ by HDFS. Read more about by expanding the WebHDFS section in $ dvc remote modify myremote --local password mypassword ``` -> The username and password (may) contain sensitive user info. Therefore, it's +> The user name and password (may) contain sensitive user info. Therefore, it's > safer to add them with the `--local` option, so they're written to a > Git-ignored config file. @@ -799,14 +799,14 @@ by HDFS. Read more about by expanding the WebHDFS section in $ dvc remote modify --local myremote token 'mytoken' ``` -- `user` - username for WebDAV server, can be empty in case of using `token` +- `user` - user name for WebDAV server, can be empty in case of using `token` authentication. ```dvc $ dvc remote modify --local myremote user myuser ``` - The order in which DVC searches for username is: + The order in which DVC searches for user name is: 1. `user` parameter set with this command (found in `.dvc/config`); 2. User defined in the URL (e.g. `webdavs://user@example.com/endpoint/path`) @@ -818,7 +818,7 @@ by HDFS. Read more about by expanding the WebHDFS section in $ dvc remote modify --local myremote password mypassword ``` -> The username, password, and token (may) contain sensitive user info. +> The user name, password, and token (may) contain sensitive user info. > Therefore, it's safer to add them with the `--local` option, so they're > written to a Git-ignored config file. diff --git a/content/docs/command-reference/stage/add.md b/content/docs/command-reference/stage/add.md index 968795a18f..15a1b00636 100644 --- a/content/docs/command-reference/stage/add.md +++ b/content/docs/command-reference/stage/add.md @@ -20,8 +20,8 @@ positional arguments: ## Description -Creates or updates stages in a [pipeline](/doc/command-reference/dag) (saved to -`dvc.yaml` in the current working directory). +Writes stage definitions to `dvc.yaml` (in the current working directory). To +update an existing stage, overwrite it with the `-f` (`--force`) option. A stage name is required and can be provided using the `-n` (`--name`) option. Most of the other [options](#options) help with defining different kinds of @@ -29,8 +29,9 @@ Most of the other [options](#options) help with defining different kinds of remaining terminal input provided to `dvc stage add` after `-`/`--` flags will become the required [`command` argument](#the-command-argument). -`dvc repro` can be used to execute pipelines after their stages have been -defined. +Stages whose dependencies are outputs from other stages form +[pipelines](/doc/command-reference/dag). `dvc repro` can be used to rebuild +their dependency graph, and execute them.
diff --git a/content/docs/use-cases/data-registries.md b/content/docs/use-cases/data-registries.md index b9b1adef1c..e9f43faed0 100644 --- a/content/docs/use-cases/data-registries.md +++ b/content/docs/use-cases/data-registries.md @@ -156,7 +156,7 @@ with dvc.api.open(model_path, repo_url) as fd: ``` This opens `model.pkl` as a file descriptor. This example illustrates a simple -ML model **deployment** method, but it could be extended to more advances +ML model **deployment** method, but it could be extended to more advanced scenarios such as a _model zoo_. See also the `dvc.api.read()` and `dvc.api.get_url()` functions. diff --git a/content/docs/user-guide/contributing/core.md b/content/docs/user-guide/contributing/core.md index 6abb5f5f3a..139126d767 100644 --- a/content/docs/user-guide/contributing/core.md +++ b/content/docs/user-guide/contributing/core.md @@ -39,7 +39,7 @@ contributing! Get the latest development version. Fork and clone the repo: ```dvc -$ git clone git@github.com:/dvc.git +$ git clone git@github.com:/dvc.git ``` Make sure that you have Python 3 installed. Version 3.6 or higher is required to diff --git a/content/docs/user-guide/project-structure/internal-files.md b/content/docs/user-guide/project-structure/internal-files.md index 108c86324f..c148059876 100644 --- a/content/docs/user-guide/project-structure/internal-files.md +++ b/content/docs/user-guide/project-structure/internal-files.md @@ -122,8 +122,8 @@ inside (as a JSON array), identified by their hash values: ```dvc $ cat .dvc/cache/19/6a322c107c2572335158503c64bfba.dir -[{"md5": "dff70c0392d7d386c39a23c64fcc0376", "relpath": "cat.jpeg"}, -{"md5": "29a6c8271c0c8fbf75d3b97aecee589f", "relpath": "index.jpeg"}] +[{"md5": "200b40427ee0998e9802335d98f08cd98f", "relpath": "cat.jpeg"}, +{"md5": "d41d8cd98f00b204e9800998ecf8427e", "relpath": "index.jpeg"}] ``` That's how DVC knows that the other two cached files belong in the directory. diff --git a/content/docs/user-guide/project-structure/pipelines-files.md b/content/docs/user-guide/project-structure/pipelines-files.md index 044653b0e6..f50213f7c6 100644 --- a/content/docs/user-guide/project-structure/pipelines-files.md +++ b/content/docs/user-guide/project-structure/pipelines-files.md @@ -159,9 +159,8 @@ stages: To load additional params files, list them in the top `vars`, in the desired order, e.g.: -> Params file paths will be evaluated based on -> [`wdir`](/doc/user-guide/project-structure/pipelines-files#specification), if -> one given. +> Params file paths will be evaluated based on [`wdir`](#stage-entries), if one +> given. ```yaml vars: @@ -210,9 +209,9 @@ example, `{"grp": {"a": 1}}` merges with `{"grp": {"b": 2}}`, but not with ⚠️ Known limitations of local `vars`: -- [`wdir`](/doc/user-guide/project-structure/pipelines-files#specification) - cannot use values from local `vars`, as DVC uses the working directory first - (to load any values from params files listed in `vars`). +- [`wdir`](#stage-entries) cannot use values from local `vars`, as DVC uses the + working directory first (to load any values from params files listed in + `vars`). - `foreach` is also incompatible with local `vars` at the moment. The substitution expression supports these forms: diff --git a/content/docs/user-guide/setup-google-drive-remote.md b/content/docs/user-guide/setup-google-drive-remote.md index 385239d431..6e97607440 100644 --- a/content/docs/user-guide/setup-google-drive-remote.md +++ b/content/docs/user-guide/setup-google-drive-remote.md @@ -8,7 +8,7 @@ DVC uses the Google Drive API to synchronize your DVC project data with this type of remote storage, so it's subject to certain usage limits and quotas, which by default are shared with other GDrive remote storage users. For heavy use, it's highly recommended to -[connect using a custom Google Cloud project](#using-a-custom-google-cloud-project), +[connect using a custom Google Cloud project](#using-a-custom-google-cloud-project-recommended), which puts you in control of these limits. Having your own GC project, it's also possible to @@ -172,7 +172,7 @@ running inside a Compute Engine, automatic CI/CD, etc. No interactive user OAuth authentication is needed. > This requires having your own -> [GC project](/doc/user-guide/setup-google-drive-remote#using-a-custom-google-cloud-project) +> [GC project](/doc/user-guide/setup-google-drive-remote#using-a-custom-google-cloud-project-recommended) > as explained above. 1. To From 84093cd213b653279839320942c1a767690dfc9a Mon Sep 17 00:00:00 2001 From: Jorge Orpinel Date: Sat, 13 Mar 2021 22:27:38 -0600 Subject: [PATCH 100/100] More misc. updates (#2299) * guide: update Ext Data guide link to add to-cache/remote examples per https://github.com/iterative/dvc.org/pull/2246#issuecomment-796981567 * ref: config options copy edits * ref: destroy copy edit --- content/docs/command-reference/config.md | 29 ++++++++++--------- content/docs/command-reference/destroy.md | 10 +++---- .../docs/user-guide/managing-external-data.md | 7 +++-- 3 files changed, 24 insertions(+), 22 deletions(-) diff --git a/content/docs/command-reference/config.md b/content/docs/command-reference/config.md index aaf7372f46..98831f1420 100644 --- a/content/docs/command-reference/config.md +++ b/content/docs/command-reference/config.md @@ -11,7 +11,7 @@ usage: dvc config [-h] [--global | --system | --local] [-q | -v] [-u] positional arguments: name Option name in format: section.option or remote.name.option e.g. 'core.check_update', 'cache.dir', 'remote.myremote.url' - value Option value. + value Option value. ``` ## Description @@ -187,25 +187,26 @@ This section contains the following options, which affect the project's for example, they're determined using [`os.umask`](https://docs.python.org/3/library/os.html#os.umask). -- `cache.local` - name of a _local remote_ to use as a - [custom cache](/doc/user-guide/managing-external-data#examples) directory. - (Refer to `dvc remote` for more information on "local remotes".) This will - overwrite the value provided to `dvc config cache.dir` or `dvc cache dir`. +The following parameters allow setting an +[external cache](/doc/user-guide/managing-external-data#examples) location. A +[DVC remote](/doc/command-reference/remote) name is used (instead of the URL) +because often it's necessary to configure authentication or other connection +settings, and configuring a remote is the way that can be done. -- `cache.s3` - name of an Amazon S3 remote to use as - [external cache](/doc/user-guide/managing-external-data#examples). +- `cache.local` - name of a _local remote_ to use as external cache (refer to + `dvc remote` for more info. on "local remotes".) This will overwrite the value + in `cache.dir` (see `dvc cache dir`). -- `cache.gs` - name of a Google Cloud Storage remote to use as - [external cache](/doc/user-guide/managing-external-data#examples). +- `cache.s3` - name of an Amazon S3 remote to use as external cache. -- `cache.ssh` - name of an SSH remote to use as - [external cache](/doc/user-guide/managing-external-data#examples). +- `cache.gs` - name of a Google Cloud Storage remote to use as external cache. -- `cache.hdfs` - name of an HDFS remote to use as - [external cache](/doc/user-guide/managing-external-data#examples). +- `cache.ssh` - name of an SSH remote to use as external cache. + +- `cache.hdfs` - name of an HDFS remote to use as external cache. - `cache.webhdfs` - name of an HDFS remote with WebHDFS enabled to use as - [external cache](/doc/user-guide/managing-external-data#examples). + external cache. > Avoid using the same [DVC remote](/doc/command-reference/remote) (used for > `dvc push`, `dvc pull`, etc.) as external cache, because it may cause file diff --git a/content/docs/command-reference/destroy.md b/content/docs/command-reference/destroy.md index 8f1111af76..8c4a4fb695 100644 --- a/content/docs/command-reference/destroy.md +++ b/content/docs/command-reference/destroy.md @@ -12,8 +12,8 @@ usage: dvc destroy [-h] [-q | -v] [-f] ## Description -`dvc destroy` removes `dvc.yaml` and `.dvc` files, as well as the internal -`.dvc/` directory from the workspace. +`dvc destroy` removes `dvc.yaml`, `.dvc` files, and the internal `.dvc/` +directory from the project. Note that the cache directory will be removed as well, unless it's set to an @@ -99,9 +99,9 @@ $ ls -a .git code.py foo ``` -`dvc destroy` command removed `foo.dvc` and the `.dvc/` directory from the -workspace. But the cache files that are present in `/mnt/cache` -still persist: +`dvc destroy` removed `foo.dvc` and the internal `.dvc/` directory from +project. But the cache files that are present in `/mnt/cache` +persist: ```dvc $ tree /mnt/cache diff --git a/content/docs/user-guide/managing-external-data.md b/content/docs/user-guide/managing-external-data.md index e038c0e6b7..1a1588358d 100644 --- a/content/docs/user-guide/managing-external-data.md +++ b/content/docs/user-guide/managing-external-data.md @@ -2,9 +2,10 @@ > ⚠️ This is an advanced feature that we don't recommend using unless you really > know what you are doing. Artifacts added with --external are not affected by -> `dvc push/pull/status -c`. You are likely looking for -> [straight-to-remote/cache](https://github.com/iterative/dvc/issues/4520) -> functionality or `dvc import-url` +> `dvc push/pull/status -c`. You are likely looking for straight +> [to-cache](/doc/command-reference/add#example-transfer-to-the-cache) or +> [to-remote](/doc/command-reference/add#example-transfer-to-remote-storage) +> transfers, or `dvc import-url`). There are cases when data is so large, or its processing is organized in such a way, that its preferable to avoid moving it from its original location. For