diff --git a/assets/main.css b/assets/main.css index ac44b1d..25e05c5 100644 --- a/assets/main.css +++ b/assets/main.css @@ -319,7 +319,7 @@ header { } .tutorial-title h2 { - font-size: 1rem; + font-size: 1.25rem; font-weight: 600; color: var(--zenml-dark); margin: 0; diff --git a/pipelines/caching/cache_pipeline.py b/pipelines/caching/cache_pipeline.py index 106786d..19277ec 100644 --- a/pipelines/caching/cache_pipeline.py +++ b/pipelines/caching/cache_pipeline.py @@ -11,9 +11,8 @@ @step(enable_cache=True) def slow_step() -> Annotated[int, "answer"]: - logger.info("Starting slow computation (3 seconds)...") + logger.info("šŸ”„ Actually computing result... (sleeping 3 seconds)") time.sleep(3) - logger.info("Computation completed!") return 42 @@ -23,10 +22,17 @@ def cache_pipeline(): if __name__ == "__main__": - logger.info("First run - will take ~3 seconds") - cache_pipeline() # first run ~3 s - - logger.info("Second run - should be instant (cache hit)") - cache_pipeline() # second run instant (cache hit) + logger.info("\n" + "="*60) + logger.info(">>> RUN 1: First execution (no cache available)") + logger.info("="*60) + cache_pipeline() + + logger.info("\n" + "="*60) + logger.info(">>> RUN 2: Second execution (cache should be used)") + logger.info("="*60) + cache_pipeline() + + logger.info("\nšŸ’” Notice: The step's log message only appears in Run 1!") + logger.info(" In Run 2, the step was skipped entirely due to caching.") log_dashboard_urls("cache_pipeline") diff --git a/pipelines/caching/caching.md b/pipelines/caching/caching.md index 1d89a4f..06ad35b 100644 --- a/pipelines/caching/caching.md +++ b/pipelines/caching/caching.md @@ -1,7 +1,3 @@ -# Caching - Smart Re-runs - -Learn how ZenML's caching system can save you time by avoiding redundant computations. - ## What you'll learn - How to enable caching on steps @@ -28,4 +24,5 @@ def slow_step() -> Annotated[int, "answer"]: ## Try it yourself -Run this pipeline twice! The first run takes ~3 seconds, the second is instant thanks to caching. \ No newline at end of file +Run this pipeline twice! The first run takes ~3 seconds, the second is instant +thanks to caching. diff --git a/pipelines/completion/completion.md b/pipelines/completion/completion.md index 1f7d7a0..afebd6d 100644 --- a/pipelines/completion/completion.md +++ b/pipelines/completion/completion.md @@ -14,7 +14,7 @@ You Completed the Tutorial -You've successfully completed the **ZenML Interactive Tutorial** and mastered the fundamentals of MLOps with ZenML! +You've successfully completed the **ZenML Interactive Tutorial** and mastered the fundamentals of using ZenML for MLOps!
diff --git a/pipelines/fanOut/fanOut.md b/pipelines/fanOut/fanOut.md index 2a981dc..c15ffa5 100644 --- a/pipelines/fanOut/fanOut.md +++ b/pipelines/fanOut/fanOut.md @@ -1,7 +1,3 @@ -# Fan-out/Fan-in - Parallel Processing - -Learn how to create parallel workflows that split work across multiple steps and then combine the results. - ## What you'll learn - How to create parallel processing patterns @@ -29,4 +25,5 @@ def fan_pipeline(parallel: int = 4): ## Try it yourself -Run this pipeline to see how it processes data in parallel across multiple steps, then combines the results! \ No newline at end of file +Run this pipeline to see how it processes data in parallel across multiple +steps, then combines the results! diff --git a/pipelines/fanOut/fan_pipeline.py b/pipelines/fanOut/fan_pipeline.py index c2f92a9..35c1a20 100644 --- a/pipelines/fanOut/fan_pipeline.py +++ b/pipelines/fanOut/fan_pipeline.py @@ -1,11 +1,3 @@ -""" -Shows parallel fan-out (multiple identical steps) and a fan-in step that -gathers all their outputs via the Client API. - -Run it once and observe the printed summary. Re-run: cache is OFF so you -see the steps execute every time. -""" - from typing_extensions import Annotated from zenml import get_step_context, pipeline, step from zenml.client import Client diff --git a/pipelines/helloWorld/helloWorld.md b/pipelines/helloWorld/helloWorld.md index e510199..a3edffe 100644 --- a/pipelines/helloWorld/helloWorld.md +++ b/pipelines/helloWorld/helloWorld.md @@ -1,5 +1,3 @@ -# Hello World - Steps & Pipelines - Welcome to your first ZenML pipeline! This tutorial introduces the fundamental concepts of **steps** and **pipelines**. ## What you'll learn @@ -30,4 +28,5 @@ def hello_pipeline(): ## Try it yourself -Click the **Run Pipeline** button to execute your first ZenML pipeline and see the output! \ No newline at end of file +Click the **Run Pipeline** button to execute your first ZenML pipeline and see +the output! diff --git a/pipelines/metadata/metadata.md b/pipelines/metadata/metadata.md index 36d9674..a5238ce 100644 --- a/pipelines/metadata/metadata.md +++ b/pipelines/metadata/metadata.md @@ -1,7 +1,3 @@ -# Metadata - Recording Useful Facts - -Learn how to log metadata to track important information about your pipeline runs. - ## What you'll learn - How to use `log_metadata()` to record key information @@ -29,4 +25,4 @@ def compute_accuracy() -> Annotated[float, "accuracy_metric"]: ## Try it yourself -Run this pipeline and check the ZenML dashboard to see the metadata card! \ No newline at end of file +Run this pipeline and check the ZenML dashboard to see the metadata card! diff --git a/pipelines/parameters/parameters.md b/pipelines/parameters/parameters.md index 64fc8d0..ac05558 100644 --- a/pipelines/parameters/parameters.md +++ b/pipelines/parameters/parameters.md @@ -1,7 +1,3 @@ -# Parameters - Configurable Behavior - -Learn how to make your pipelines configurable with parameters. - ## What you'll learn - How to add parameters to steps and pipelines @@ -31,4 +27,4 @@ def param_pipeline(number: int = 3, factor: int = 2): ## Try it yourself -Run this pipeline to see how parameters control the multiplication operation! \ No newline at end of file +Run this pipeline to see how parameters control the multiplication operation! diff --git a/pipelines/retries/retries.md b/pipelines/retries/retries.md index 59aaef6..80affb7 100644 --- a/pipelines/retries/retries.md +++ b/pipelines/retries/retries.md @@ -1,7 +1,3 @@ -# Retries & Hooks - Robust Pipelines - -Learn how to build resilient pipelines that can handle failures gracefully with automatic retries and hooks. - ## What you'll learn - How to configure automatic retries for flaky steps @@ -32,4 +28,5 @@ def flaky() -> Annotated[str, "result"]: ## Try it yourself -Run this pipeline multiple times! Sometimes it succeeds immediately, sometimes it needs retries to handle the random failures. \ No newline at end of file +Run this pipeline multiple times! Sometimes it succeeds immediately, sometimes +it needs retries to handle the random failures. diff --git a/pipelines/retries/robust_pipeline.py b/pipelines/retries/robust_pipeline.py index 69efa63..24d4b5f 100644 --- a/pipelines/retries/robust_pipeline.py +++ b/pipelines/retries/robust_pipeline.py @@ -1,8 +1,3 @@ -""" -Demonstrates automatic retries *and* a failure hook. -Run it a few times – roughly half will need 1–2 retries. -""" - import random import time diff --git a/pipelines/stepIO/stepIO.md b/pipelines/stepIO/stepIO.md index 5a70396..1c3058f 100644 --- a/pipelines/stepIO/stepIO.md +++ b/pipelines/stepIO/stepIO.md @@ -1,7 +1,3 @@ -# Step I/O - Typed Inputs and Outputs - -Now let's learn how to pass data between steps with proper type annotations. - ## What you'll learn - How to define typed step outputs using `Annotated` types @@ -37,4 +33,5 @@ def count_rows( ## Try it yourself -Run this pipeline to see how data flows from the `load_data` step to the `count_rows` step! \ No newline at end of file +Run this pipeline to see how data flows from the `load_data` step to the +`count_rows` step! diff --git a/pipelines/tagging/tagged_pipeline.py b/pipelines/tagging/tagged_pipeline.py index d2b86c9..e353c49 100644 --- a/pipelines/tagging/tagged_pipeline.py +++ b/pipelines/tagging/tagged_pipeline.py @@ -1,12 +1,3 @@ -""" -Artifact Tagging Demonstration -This example shows different ways to tag artifacts in ZenML: -1. Regular tags on artifacts using ArtifactConfig -2. Cascade tags from pipeline to artifacts -3. Dynamic tagging within steps -4. Filtering artifacts by tags -""" - from typing import Annotated import pandas as pd diff --git a/pipelines/tagging/tagging.md b/pipelines/tagging/tagging.md index aea40f2..098dfbe 100644 --- a/pipelines/tagging/tagging.md +++ b/pipelines/tagging/tagging.md @@ -1,7 +1,3 @@ -# Tagging - Keep Runs Organized - -Learn how to use tags to organize and categorize your pipeline runs. - ## What you'll learn - How to add simple tags to pipelines @@ -27,4 +23,5 @@ def tagged_pipeline(): ## Try it yourself -Run this pipeline multiple times and watch how the exclusive tag automatically moves to the latest run! \ No newline at end of file +Run this pipeline multiple times and watch how the exclusive tag automatically +moves to the latest run! diff --git a/pipelines/visualizations/visualizations-dashboard.png b/pipelines/visualizations/visualizations-dashboard.png new file mode 100644 index 0000000..c67235a Binary files /dev/null and b/pipelines/visualizations/visualizations-dashboard.png differ diff --git a/pipelines/visualizations/visualizations.md b/pipelines/visualizations/visualizations.md index 8de6779..58b0adf 100644 --- a/pipelines/visualizations/visualizations.md +++ b/pipelines/visualizations/visualizations.md @@ -1,7 +1,3 @@ -# Visualizations - Custom Charts - -Learn how to create automatic and custom visualizations that appear in the ZenML dashboard. - ## What you'll learn - How ZenML automatically visualizes common data types @@ -30,6 +26,9 @@ def scatter(df: pd.DataFrame) -> Annotated[HTMLString, "scatter_plot"]: - **HTMLString type** lets you embed rich content in the dashboard - **Dashboard integration** makes results easily shareable +![Two visualizations generated by this pipeline](./pipelines/visualizations/visualizations-dashboard.png) + ## Try it yourself -Run this pipeline and check the dashboard to see both the automatic DataFrame visualization and the custom scatter plot! \ No newline at end of file +Run this pipeline and check the dashboard to see both the automatic DataFrame +visualization and the custom scatter plot! diff --git a/pipelines/welcome/welcome.md b/pipelines/welcome/welcome.md index ad5e630..f1b9e4c 100644 --- a/pipelines/welcome/welcome.md +++ b/pipelines/welcome/welcome.md @@ -1,7 +1,7 @@
-# Welcome to ZenML Interactive Tutorial! +# Welcome to the ZenML Interactive Tutorial! This hands-on tutorial will teach you **ZenML fundamentals** through 10 progressive lessons. Each lesson introduces exactly **one new concept** with copy-paste code examples. diff --git a/utils.py b/utils.py index c457ee6..2569f6c 100644 --- a/utils.py +++ b/utils.py @@ -19,9 +19,9 @@ def log_dashboard_urls(pipeline_name: str): ) dashboard_url = f"{base_url}/runs/{run.id}" - logger.info("\n" + "=" * 50) + logger.info("\n" + "=" * 60) logger.info("āœ… Pipeline execution complete!") logger.info(f"🌐 View pipeline in dashboard: {base_url}/pipelines/{pipeline_name}") logger.info(f"🌐 View this run: {dashboard_url}") logger.info(f"🌐 View all artifacts: {base_url}/artifacts") - logger.info("=" * 50) + logger.info("=" * 60)