Distributed LLM Inference & GPU Engineering
A production-oriented guide to GPU architecture and distributed inference for large language models, covering memory planning, batching, KV cache, parallelism, scheduling, model serving, Kubernetes concepts, multimodal inference, profiling, and high-throughput system design.
Distributed LLM Inference & GPU Engineering
1. Introduction#
Running a small language model locally is very different from serving a large model to thousands of users.
A production inference system must answer questions such as:
textCan the model fit into GPU memory? How many requests can run concurrently? How should requests be batched? How much KV cache is required? Should the model use multiple GPUs? How should traffic be routed? How do we scale replicas? How do we measure performance?
A useful high-level architecture is:
Architecture & Data FlowCLIENTS | v API Gateway | v Load Balancer | +--------+--------+ | | v v Inference Pod A Inference Pod B | | v v GPU(s) A GPU(s) B | | +--------+--------+ | v Model Weights
This notebook focuses on the engineering underneath this layer.
2. Learning Objectives
By the end of this notebook, you should understand:
- GPU architecture basics
- GPU memory
- Compute vs memory bandwidth
- Model memory estimation
- KV cache
- Prefill and decode
- Latency metrics
- Throughput metrics
- Continuous batching
- Dynamic batching
- Request scheduling
- Tensor parallelism
- Pipeline parallelism
- Data parallelism
- Expert parallelism
- Distributed inference
- Communication overhead
- GPU utilization
- Quantization
- Model serving
- vLLM-style serving concepts
- Kubernetes deployment
- GPU scheduling
- Autoscaling
- Multimodal inference
- Performance profiling
- Capacity planning
- Reliability
- Cost optimization
- Production architecture
3. GPU Fundamentals
A GPU contains many parallel compute resources.
Conceptually:
Architecture & Data FlowGPU | +--> Compute units | +--> High-bandwidth memory | +--> Memory controllers | +--> Interconnect
LLM inference relies heavily on both:
textCompute + Memory bandwidth
4. CPU vs GPU
CPU:
textFewer powerful cores Strong sequential performance Flexible workloads
GPU:
textMany parallel execution units High memory bandwidth Excellent for matrix operations
Transformer inference contains large matrix operations, making GPUs highly useful.
5. GPU Memory
GPU memory stores:
textModel weights KV cache Activations Temporary buffers Runtime state
A model that technically fits its weights may still fail during inference because of:
textKV cache Concurrent requests Framework overhead
6. Model Weight Memory
A rough estimate:
Mathematical FormulationMemory ≈ parameters × bytes per parameter
Examples:
Mathematical FormulationFP32 = 4 bytes FP16 = 2 bytes BF16 = 2 bytes INT8 ≈ 1 byte INT4 ≈ 0.5 bytes
For a 7B model at FP16:
Mathematical Formulation7 × 10^9 × 2 ≈ 14 GB
This is only an estimate of the weights.
7. Real Runtime Memory
Actual memory:
Mathematical FormulationTotal memory = weights + KV cache + activations + runtime overhead
Therefore:
›14 GB weights
does not mean:
›14 GB GPU is sufficient
8. KV Cache
During autoregressive generation, attention needs previously generated tokens.
The system can cache key/value tensors.
Architecture & Data FlowPrompt tokens | v Attention | v K/V cache | v Next token
This avoids recomputing everything from scratch for every generated token.
9. Why KV Cache Matters
As:
›Context length increases
and:
›Concurrent requests increase
KV cache memory can become a major constraint.
Therefore capacity planning must include:
textModel weights + KV cache
10. Prefill vs Decode
LLM inference has two broad phases.
Prefill#
Process the input prompt.
Architecture & Data FlowLarge prompt | v Parallel processing
Decode#
Generate output tokens one at a time.
Architecture & Data FlowToken | v Next token | v Next token | v Next token
11. Prefill Characteristics
Prefill is often:
textCompute-intensive Parallel Sensitive to prompt length
Large prompts can create substantial compute demand.
12. Decode Characteristics
Decode is often:
textMemory-bandwidth-sensitive Sequential per request Sensitive to KV cache
Serving many concurrent requests can improve GPU utilization.
13. Time to First Token
TTFT:
›Time To First Token
Conceptually:
Architecture & Data Flowrequest received | v queue | v prefill | v first token
TTFT is important for interactive applications.
14. Time Per Output Token
After the first token:
Architecture & Data Flowtoken 1 | v token 2 | v token 3
The time between generated tokens affects perceived generation speed.
15. End-to-End Latency
Total latency may include:
textNetwork Queue Routing Prefill Decode Post-processing
A useful mental model:
Mathematical FormulationTotal latency = queue + prefill + decode + network
16. Throughput
Throughput measures work completed over time.
Examples:
textrequests / second tokens / second input tokens / second output tokens / second
A system optimized for minimum latency is not necessarily optimized for maximum throughput.
17. Latency vs Throughput
Interactive tutor:
›Low latency
Batch document processing:
›High throughput
Different workloads require different optimization strategies.
18. Batch Inference
Instead of:
Architecture & Data FlowRequest A -> GPU Request B -> GPU Request C -> GPU
batch:
Architecture & Data FlowA B C | v GPU
Batching can increase hardware utilization.
19. Static Batching
Requests are grouped before execution.
Architecture & Data FlowWait | v Collect requests | v Batch | v Execute
The problem:
›Short request
may wait for:
›Long request
20. Dynamic Batching
The server dynamically groups requests.
Architecture & Data FlowIncoming requests | v Batch scheduler | v GPU
This can improve utilization while controlling waiting time.
21. Continuous Batching
LLM serving can continuously add and remove sequences from execution.
Conceptually:
textStep 1: A B C Step 2: A B D Step 3: A D E
Completed requests leave the batch while new requests enter.
This is particularly useful for autoregressive generation.
22. Why Continuous Batching Matters
Without it:
Architecture & Data FlowLong generation | v GPU resources remain tied to batch
With continuous batching:
Architecture & Data FlowCompleted sequence | v Slot becomes available | v New sequence enters
This can significantly improve serving efficiency.
23. Request Scheduling
The scheduler decides:
textWhich requests run? When? At what priority? With what batch?
Possible priorities:
textInteractive Normal Batch Background
24. Fair Scheduling
A production system should avoid:
›One tenant consumes all GPU capacity.
Use:
textPer-tenant quotas Priority classes Concurrency limits Fair scheduling
25. Tensor Parallelism
Tensor parallelism splits model computation across GPUs.
Conceptually:
Architecture & Data FlowLarge matrix | +----+----+ | | v v GPU 1 GPU 2 | | +----+----+ | v Combined result
This allows a model that cannot fit on one GPU to use multiple GPUs.
26. Tensor Parallel Tradeoffs
Advantages:
textLarger models More GPU memory Potential higher compute capacity
Costs:
textGPU-to-GPU communication Network/interconnect requirements Operational complexity
27. Pipeline Parallelism
Pipeline parallelism places different model layers on different GPUs.
Architecture & Data FlowGPU 1 Layers 1–N | v GPU 2 Layers N+1–M | v GPU 3 Layers M+1–K
28. Pipeline Parallel Tradeoffs
Advantages:
›Large model support Memory distribution
Challenges:
textPipeline bubbles Communication Scheduling complexity
29. Data Parallelism
Each replica has a copy of the model.
Architecture & Data FlowLoad Balancer / | \ v v v GPU A GPU B GPU C Model Model Model
Useful for increasing:
›Overall request throughput
30. Tensor vs Pipeline vs Data Parallelism
| Strategy | Main Purpose |
|---|---|
| Tensor parallelism | Split computation |
| Pipeline parallelism | Split layers |
| Data parallelism | Replicate model |
| Expert parallelism | Distribute MoE experts |
A production system may combine multiple strategies.
31. Expert Parallelism
Mixture-of-Experts models contain specialized experts.
Architecture & Data FlowRouter | +---------+---------+ | | | v v v Expert A Expert B Expert C
Only selected experts may execute for each token.
Expert parallelism distributes experts across devices.
32. Distributed Inference
A large deployment might look like:
Architecture & Data FlowRouter | +----------+----------+ | | v v Replica A Replica B / \ / \ v v v v GPU1 GPU2 GPU3 GPU4
Each replica may itself use tensor parallelism.
33. GPU Interconnect
Multi-GPU systems depend on communication.
Important concepts include:
textPCIe NVLink Network fabric Collective communication
The faster the communication path, the less costly some distributed operations can be.
34. Communication Overhead
Distributed inference is not free.
Conceptually:
Mathematical FormulationCompute + Communication = Total execution time
If communication dominates:
›More GPUs
may not produce:
›Proportionally more performance
35. Scaling Efficiency
Ideal:
Architecture & Data Flow1 GPU -> 100 units 2 GPU -> 200 units 4 GPU -> 400 units
Real systems may achieve:
›2 GPU -> 175 4 GPU -> 300
because of:
textCommunication Synchronization Scheduling Memory constraints
36. Quantization
Quantization reduces numerical precision.
Common formats:
textFP16 BF16 INT8 INT4
Benefits:
textLower memory Potentially higher throughput Lower infrastructure cost
Tradeoffs:
textPossible quality loss Kernel compatibility Accuracy variation
37. Quantization Evaluation
Compare:
textOriginal model vs Quantized model
Measure:
textAccuracy Reasoning Generation quality Latency Memory Throughput
Never assume lower precision is automatically better.
38. Model Serving
An inference server should manage:
textModel loading Request queue Batching Scheduling GPU execution Streaming Metrics Health checks
The application should communicate through a stable API.
39. Inference Server Architecture
Architecture & Data FlowHTTP / gRPC | v Request Parser | v Scheduler | v Batch Manager | v Model Runtime | v GPU
40. vLLM-Style Serving
Modern LLM serving systems commonly optimize:
textContinuous batching KV cache management Memory utilization Request scheduling Streaming
vLLM is one well-known example of this class of infrastructure.
The important engineering concepts are more general than any single serving framework.
41. Paged KV Cache
A large number of variable-length sequences makes naive contiguous memory management inefficient.
Paged KV-cache approaches manage cache memory in blocks.
Conceptually:
Architecture & Data FlowGPU memory +------+------+------+------+ |page 1|page 2|page 3|page 4| +------+------+------+------+ Request A -> page 1, page 4 Request B -> page 2 Request C -> page 3
This improves memory utilization.
42. Prefix Caching
Many requests may share the same prefix.
Example:
textSystem prompt + Course instructions + Student question
If the prefix is reused, caching can reduce repeated computation.
Useful for:
textLong system prompts Shared enterprise instructions Educational course context
43. GPU Utilization
A GPU can be underutilized because of:
textSmall batches CPU bottlenecks Data transfer Poor scheduling Memory limits
High GPU utilization alone does not guarantee good user experience.
Always measure:
textLatency Throughput Memory Queue time
44. Performance Profiling
Profiling identifies bottlenecks.
Measure:
textCPU time GPU time Memory usage Kernel execution Data transfer Communication
45. Bottleneck Analysis
Suppose:
Mathematical FormulationGPU utilization = 40% CPU utilization = 95%
The bottleneck may be outside the GPU.
Suppose:
Mathematical FormulationGPU utilization = 95% Latency = high
The workload may be compute- or memory-bound.
Always profile before optimizing.
46. Roofline Mental Model
Performance can be limited by:
textCompute capacity or Memory bandwidth
LLM workloads can move between these regimes depending on:
textBatch size Sequence length Phase Model architecture Precision
47. Prefill Optimization
For long prompts:
textOptimize compute Optimize kernels Use efficient batching Use prefix caching
48. Decode Optimization
For generation:
textOptimize memory movement KV cache Batching Scheduling Quantization
Decode optimization is especially important for high-concurrency interactive systems.
49. Speculative Decoding
A smaller model can propose tokens.
Architecture & Data FlowSmall model | v Candidate tokens | v Large model verifies | v Accepted tokens
If successful, this can reduce generation latency.
The effectiveness depends on:
textDraft model quality Task distribution Acceptance rate Hardware
50. Multimodal Inference
Modern applications may process:
textText Images Audio Video
The architecture may be:
Architecture & Data FlowInput | +--> Text encoder +--> Vision encoder +--> Audio encoder | v Multimodal representation | v LLM / multimodal model | v Output
51. Vision Workloads
Image processing can add:
textImage decoding Resizing Vision encoding GPU memory
Multiple images can significantly increase request memory.
52. Audio Workloads
Audio systems may require:
textAudio decoding Resampling Speech recognition LLM reasoning Text-to-speech
A voice assistant can therefore involve several model stages.
53. Video Workloads
Video is particularly expensive because it contains many frames.
A system may use:
textFrame sampling Scene detection Visual embeddings Audio transcription Temporal aggregation
Do not blindly process every frame.
54. Multimodal Educational Example
A student uploads:
›Image of a geometry problem
Pipeline:
Architecture & Data FlowImage | v Vision model | v Problem extraction | v Course RAG | v Tutor model | v Explanation
55. Kubernetes Concepts
A production GPU platform often uses orchestration.
Concepts:
textPod Deployment Service Node GPU resource Scheduler ConfigMap Secret
56. GPU Nodes
A cluster may contain:
›CPU nodes GPU nodes
GPU workloads should be scheduled onto appropriate GPU nodes.
57. GPU Scheduling
Scheduling can consider:
textGPU type GPU memory Available capacity Model requirements Tenant Priority
Example:
Architecture & Data FlowLarge model -> 80 GB GPU node Small model -> 24 GB GPU node
58. Model Placement
A model should be placed according to:
textMemory requirements Traffic Latency target GPU availability Communication needs
59. Replica Scaling
For data-parallel replicas:
Architecture & Data FlowTraffic | v Load Balancer | +--> Replica 1 +--> Replica 2 +--> Replica 3
Scale replicas according to workload.
60. Autoscaling Signals
Useful signals include:
textQueue depth Requests per second TTFT GPU utilization Active sequences
A single CPU-style metric may not capture AI workload pressure.
61. Warm vs Cold Starts
Loading a large model can take significant time.
Cold start:
Architecture & Data FlowContainer | v Load model | v Initialize runtime | v Ready
Warm replica:
Architecture & Data FlowReady | v Request
Production systems often keep critical models warm.
62. Capacity Planning
Estimate:
textExpected traffic Average prompt tokens Average output tokens Peak concurrency Latency target Model size GPU capacity
Then estimate required replicas.
63. Example Capacity Exercise
Suppose:
Mathematical Formulation10 requests/sec Average output = 200 tokens
Output volume:
Mathematical Formulation10 × 200 = 2,000 output tokens/sec
If one replica reliably produces:
›500 output tokens/sec
then a rough baseline is:
Mathematical Formulation2,000 / 500 = 4 replicas
Add headroom for:
textTraffic spikes Failures Scheduling Latency targets
64. Queueing
If incoming traffic exceeds processing capacity:
Architecture & Data FlowRequests | v Queue | v GPU workers
Queue depth is an important scaling signal.
65. Backpressure
Without backpressure:
Architecture & Data FlowTraffic spike | v Unlimited queue | v Memory exhaustion
With backpressure:
Architecture & Data FlowTraffic spike | v Limit queue | +--> Reject +--> Delay +--> Degrade
66. Graceful Degradation
During overload:
Architecture & Data FlowLarge model | v Small model
or:
Architecture & Data FlowFull RAG | v Reduced retrieval
or:
Architecture & Data FlowSynchronous | v Asynchronous
Degradation policies should be explicit.
67. Model Gateway + Distributed Inference
Architecture & Data FlowAI Gateway | Model Router | +-----------------+-----------------+ | | v v Large Model Pool Small Model Pool | | | | v v v v GPU Pod GPU Pod GPU Pod GPU Pod | | | | +-------+ +-------+
68. Reliability
Distributed inference should handle:
textGPU failure Node failure Model crash Provider failure Network failure Out-of-memory errors Queue overload
69. Health Checks
Useful health states:
textStarting Ready Degraded Unhealthy Draining
Before sending traffic:
textModel loaded GPU available Runtime initialized
should be verified.
70. Draining
Before shutting down a replica:
Architecture & Data FlowStop new requests | v Finish active requests | v Release resources | v Terminate
This prevents unnecessary user-facing failures.
71. Cost Optimization
Major cost drivers:
textGPU hours Model size Replica count Idle capacity Token volume
Optimization strategies:
textQuantization Better batching Autoscaling Smaller models Caching Model routing Batch inference
72. Multi-Model Serving
A platform may serve:
textEmbedding model Small LLM Large LLM Vision model Speech model Reranker
Challenges include:
textGPU memory fragmentation Model loading Scheduling Traffic isolation
73. Model Pooling
Instead of loading every model everywhere:
Architecture & Data FlowGPU Pool A -> Small models GPU Pool B -> Large model GPU Pool C -> Vision
This can simplify capacity planning.
74. Model Loading Strategies
Always loaded#
Low latency, high memory cost.
On demand#
Lower idle cost, higher cold-start latency.
Hybrid#
Keep critical models loaded and load infrequent models dynamically.
75. Production Architecture
Architecture & Data FlowUSERS | v API Gateway | v AI Gateway | +--------------+--------------+ | | | v v v Auth/Policy Router Rate Limit | +------------------+------------------+ | | | v v v Text LLM Vision Model Speech | | | v v v Inference Pool Inference Pool Inference Pool | | | +------------------+------------------+ | v GPU Cluster | +------------+------------+ | | | v v v GPU Nodes GPU Nodes GPU Nodes | v Observability | +-----------+-----------+ | | v v Metrics Traces
76. Educational AI GPU Architecture
Architecture & Data FlowEDUCATIONAL USERS | v AI Gateway | Model Router | +---------------------+---------------------+ | | | v v v Tutor LLM Vision Model Speech Models | | | v v v GPU Pool A GPU Pool B GPU Pool C | | | +---------------------+---------------------+ | v RAG Services | v Course Knowledge
77. Educational Capacity Planning
Peak traffic may occur:
textBefore exams After school hours During assignments During live learning events
The platform should model these peaks rather than using only daily averages.
78. Sovereign AI GPU Deployment
For sensitive educational workloads:
Architecture & Data FlowPrivate network | v AI Gateway | v Private Model Cluster | +--> GPU nodes +--> Private vector DB +--> Private object storage
Data remains within the approved environment.
79. Distributed Inference Project 1
Deploy a small open-weight LLM.
Measure:
textModel load time GPU memory TTFT Output tokens/sec Concurrent requests
80. Distributed Inference Project 2
Compare:
textSingle GPU vs Multi-GPU
Measure:
textLatency Throughput Scaling efficiency Communication overhead
81. Distributed Inference Project 3
Implement batching.
Compare:
textNo batching Static batching Continuous batching
Measure:
textThroughput P50 latency P95 latency GPU utilization
82. Distributed Inference Project 4
Implement model routing:
Architecture & Data FlowSimple -> small model Complex -> large model Sensitive -> private model Vision -> multimodal model
Measure:
textQuality Cost Latency
83. Distributed Inference Project 5
Build a GPU-aware scheduler.
Input:
textmodel memory_required priority tenant latency_target
Output:
›selected_gpu_pool
84. Distributed Inference Project 6
Build an educational AI inference platform.
Support:
textTutor Vision homework helper Voice tutor Teacher assistant
Track:
textGPU usage Token usage Latency Cost Tenant usage
85. Advanced Exercise: GPU Capacity Model
Create a spreadsheet or Python model with:
textTraffic Prompt tokens Output tokens Concurrency Model size GPU memory Tokens/sec Replica count
Estimate:
›Required GPU count
Then add:
›30% capacity headroom
86. Advanced Exercise: Batch Scheduler
Design a scheduler that balances:
textLatency Throughput Fairness Priority
Test:
textInteractive requests + Long-running requests + Background jobs
87. Advanced Exercise: Failure Simulation
Simulate:
textGPU failure Node failure Provider failure Queue overload Model OOM
Design:
textDetection Recovery Fallback User experience
88. Advanced Exercise: Multimodal Serving
Design a system for:
textText Image Audio Video
Define:
textModel routing GPU pools Preprocessing Caching Queues Latency targets
89. Common Mistakes
Mistake 1: Assuming model weight size equals runtime memory#
KV cache and runtime overhead matter.
Mistake 2: Adding GPUs without measuring communication#
More GPUs do not guarantee linear speedup.
Mistake 3: Optimizing GPU utilization alone#
User-facing latency and throughput also matter.
Mistake 4: Ignoring queue time#
A fast GPU cannot compensate for a large waiting queue.
Mistake 5: Using static batching for every workload#
Interactive generation often benefits from continuous batching.
Mistake 6: Keeping every model loaded#
This can waste expensive GPU memory.
Mistake 7: Scaling from average traffic#
Peak traffic often determines capacity.
Mistake 8: Ignoring cold starts#
Large model loading can cause severe latency spikes.
Mistake 9: No backpressure#
Overload can turn into cascading failure.
Mistake 10: No graceful draining#
Deployments can unnecessarily interrupt active requests.
90. Final Mental Model
Think about distributed inference in four layers:
Architecture & Data FlowDISTRIBUTED INFERENCE | +----------------+----------------+ | | | v v v MEMORY COMPUTE SCHEDULING | | | Weights GPU kernels Batching KV cache Parallelism Queues Quantization Multi-GPU Priorities | | | +----------------+----------------+ | v SERVING | +-----------+-----------+ | | v v Scaling Reliability | | v v Replicas Fallbacks Autoscaling Health checks GPU pools Backpressure
The goal is not simply:
›Use more GPUs
The goal is:
textDeliver the required quality at the required latency for the required traffic within the required cost and reliability constraints.
91. Key Takeaways
- LLM inference is constrained by compute, memory, scheduling, and communication.
- Model weight memory is only part of total GPU memory.
- KV cache can become a major memory consumer.
- Prefill and decode have different performance characteristics.
- TTFT is important for interactive applications.
- Throughput and latency are different optimization objectives.
- Dynamic and continuous batching can improve GPU utilization.
- Scheduling must account for fairness and priority.
- Tensor parallelism splits computation across GPUs.
- Pipeline parallelism splits model layers.
- Data parallelism replicates models for higher throughput.
- Expert parallelism distributes MoE experts.
- Distributed inference introduces communication overhead.
- Scaling is rarely perfectly linear.
- Quantization can reduce memory and cost but requires evaluation.
- Efficient serving requires specialized inference runtimes.
- KV-cache management is a central serving concern.
- Prefix caching can reduce repeated computation.
- GPU utilization should be interpreted alongside latency and throughput.
- Profiling should happen before major optimization work.
- Speculative decoding can reduce generation latency in suitable workloads.
- Multimodal serving requires specialized preprocessing and model routing.
- Kubernetes can provide orchestration for GPU workloads.
- Autoscaling should use AI-specific signals such as queue depth and active sequences.
- Large models often benefit from warm replicas.
- Capacity planning should account for peak traffic.
- Backpressure prevents overload from becoming cascading failure.
- Graceful degradation can preserve availability during capacity pressure.
- Model pools can simplify multi-model GPU management.
- Sovereign AI deployments may require private GPU infrastructure.
- Educational AI platforms need to plan for predictable traffic spikes.
- Distributed inference engineering is a balance of quality, latency, throughput, cost, and reliability.
92. Knowledge Check
Question 1#
Why is model weight memory not equal to total inference memory?
Question 2#
What is the KV cache?
Question 3#
What is the difference between prefill and decode?
Question 4#
What does TTFT measure?
Question 5#
Why is continuous batching useful?
Question 6#
What is tensor parallelism?
Question 7#
What is the difference between tensor and pipeline parallelism?
Question 8#
Why does adding more GPUs sometimes produce diminishing returns?
Question 9#
What is data parallelism?
Question 10#
Why can quantization reduce infrastructure cost?
Question 11#
What is prefix caching?
Question 12#
Why is GPU utilization alone not enough to evaluate a serving system?
Question 13#
What signals can be used for autoscaling an LLM inference service?
Question 14#
Why is backpressure important?
Question 15#
How would you design a GPU architecture for a sovereign educational AI platform?
93. Course Progression
The Generative AI engineering track now progresses through:
Architecture & Data FlowGenerative AI Foundations | v Transformers & LLM Architecture | v RAG, Embeddings & Vector Databases | v LangChain, LangGraph & Agents | v LLM Evaluation, Safety & Guardrails | v Multimodal Generative AI | v Fine-Tuning, LoRA, QLoRA & PEFT | v Open-Source, Open-Weight & Sovereign AI | v LLMOps, Inference Optimization & Production | v End-to-End GenAI Application Projects | v Security, Privacy, Governance & Responsible AI | v Advanced RAG & Agent Architectures | v AI Platform Architecture & Engineering | v Distributed LLM Inference & GPU Engineering
The next stage should focus on production AI data engineering and evaluation infrastructure, including data ingestion at scale, multimodal data pipelines, dataset/version management, synthetic data, data quality, feature pipelines, evaluation datasets, automated benchmarking, feedback loops, and continuous improvement.
Distributed Inference & GPU Engineering Checkpoint
Finished studying this notebook?
Mark this guide as completed to update your course progress roadmap.