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
+
+
## 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)