From cf12eb0875e02dbb8f8a806c0215f82741066a57 Mon Sep 17 00:00:00 2001 From: Fatima Shah Date: Mon, 16 Sep 2024 20:11:13 -0400 Subject: [PATCH 01/13] REVISED All chapters complete --- contents/ai_for_good/ai_for_good.qmd | 2 +- contents/benchmarking/benchmarking.qmd | 4 ++-- contents/data_engineering/data_engineering.qmd | 2 +- contents/dl_primer/dl_primer.qmd | 6 +++--- contents/efficient_ai/efficient_ai.qmd | 3 ++- contents/frameworks/frameworks.qmd | 12 +++++------- contents/hw_acceleration/hw_acceleration.qmd | 6 +++--- contents/introduction/introduction.qmd | 6 +++--- contents/ml_systems/ml_systems.qmd | 2 +- contents/ops/ops.qmd | 3 +-- .../optimizations/images/png/kdistillation.png | Bin 142407 -> 0 bytes contents/privacy_security/privacy_security.qmd | 10 +++++++--- contents/sustainable_ai/sustainable_ai.qmd | 2 +- contents/workflow/workflow.qmd | 5 +++-- 14 files changed, 33 insertions(+), 30 deletions(-) delete mode 100644 contents/optimizations/images/png/kdistillation.png diff --git a/contents/ai_for_good/ai_for_good.qmd b/contents/ai_for_good/ai_for_good.qmd index d94e93ff..7db4cda9 100644 --- a/contents/ai_for_good/ai_for_good.qmd +++ b/contents/ai_for_good/ai_for_good.qmd @@ -76,7 +76,7 @@ Widespread TinyML applications can help digitize smallholder farms to increase p With greater investment and integration into rural advisory services, TinyML could transform small-scale agriculture and improve farmers' livelihoods worldwide. The technology effectively brings the benefits of precision agriculture to disconnected regions most in need. -![Microsoft Farmbeats.](contents/ai_for_good/images/png/msfarmbeats.png){#farmbeats} +![Microsoft Farmbeats. Source: [MOLD](https://thisismold.com/space/farm-systems/does-farmbeats-really-march-to-a-different-tune)](images/png/msfarmbeats.png){#farmbeats} :::{#exr-agri .callout-caution collapse="true"} diff --git a/contents/benchmarking/benchmarking.qmd b/contents/benchmarking/benchmarking.qmd index 25d55825..1fcf62a7 100644 --- a/contents/benchmarking/benchmarking.qmd +++ b/contents/benchmarking/benchmarking.qmd @@ -242,7 +242,7 @@ Benchmarking the training phase provides insights into how different model archi On the other hand, benchmarking inference evaluates model performance in real-world conditions after deployment. Key metrics include latency, throughput, memory footprint, and power consumption. This type of benchmarking determines if a model meets the requirements of its target application regarding response time and device constraints. However, we will discuss these broadly to ensure a general understanding. -![Deep learning: training vs. inference.](contents/benchmarking/images/png/trainingvsinference.png){#training-vs-inference} +![Deep learning: training and inference. Source: [NVIDIA](https://blogs.nvidia.com/blog/difference-deep-learning-training-inference-ai/)](images/png/trainingvsinference.png){#training-vs-inference} ### Training Benchmarks @@ -752,7 +752,7 @@ Additionally, a data-centric approach can often lead to simpler models that are The shift towards data-centric AI represents a significant paradigm shift. By prioritizing the quality of the input data, this approach tries to model performance and generalization capabilities, ultimately leading to more robust and reliable AI systems. As we continue to advance in our understanding and application of AI, the data-centric approach is likely to play an important role in shaping the future of this field. -![Model-centric ML development vs. Data-centric ML development.](contents/benchmarking/images/png/datavsmodelai.png){#data-vs-model} +![Model-centric vs. Data-centric ML development. Source: [NVIDIA](https://blogs.nvidia.com/blog/difference-deep-learning-training-inference-ai/)](images/png/datavsmodelai.png){#data-vs-model} ### Benchmarking Data diff --git a/contents/data_engineering/data_engineering.qmd b/contents/data_engineering/data_engineering.qmd index f561792d..8ebda5e7 100644 --- a/contents/data_engineering/data_engineering.qmd +++ b/contents/data_engineering/data_engineering.qmd @@ -249,7 +249,7 @@ Data sourcing and data storage go hand in hand, and data must be stored in a for The stored data is often accompanied by metadata, defined as 'data about data .'It provides detailed contextual information about the data, such as means of data creation, time of creation, attached data use license, etc. For example, [Hugging Face](https://huggingface.co/) has [Dataset Cards](https://huggingface.co/docs/hub/datasets-cards). To promote responsible data use, dataset creators should disclose potential biases through the dataset cards. These cards can educate users about a dataset's contents and limitations. The cards also give vital context on appropriate dataset usage by highlighting biases and other important details. Having this type of metadata can also allow fast retrieval if structured properly. Once the model is developed and deployed to edge devices, the storage systems can continue to store incoming data, model updates, or analytical results. @data-collection showcases the pillars of data collection and their collection methods. -![Pillars of data collection.](contents/data_engineering/images/png/datacollection.png){#data-collection} +![Pillars of data collection. Source: [Alexsoft](https://www.altexsoft.com/blog/data-collection-machine-learning/)](images/png/datacollection.png){#data-collection} **Data Governance:** With a large amount of data storage, it is also imperative to have policies and practices (i.e., data governance) that help manage data during its life cycle, from acquisition to disposal. Data governance outlines how data is managed and includes making key decisions about data access and control. @fig-governance illustrates the different domains involved in data governance. It involves exercising authority and making decisions concerning data to uphold its quality, ensure compliance, maintain security, and derive value. Data governance is operationalized by developing policies, incentives, and penalties, cultivating a culture that perceives data as a valuable asset. Specific procedures and assigned authorities are implemented to safeguard data quality and monitor its utilization and related risks. diff --git a/contents/dl_primer/dl_primer.qmd b/contents/dl_primer/dl_primer.qmd index b64cd610..177cfbc5 100644 --- a/contents/dl_primer/dl_primer.qmd +++ b/contents/dl_primer/dl_primer.qmd @@ -58,7 +58,7 @@ Deep learning is extensively used across numerous industries today, and its tran Deep learning enhances everyday products, such as strengthening Netflix's recommender systems to provide users with more [personalized recommendations](https://dl.acm.org/doi/abs/10.1145/3543873.3587675). At Google, deep learning models have driven significant improvements in [Google Translate](https://research.google/blog/recent-advances-in-google-translate/), enabling it to handle over [100 languages](https://cloud.google.com/translate/docs/languages). Autonomous vehicles from companies like Waymo, Cruise, and Motional have become a reality through the use of deep learning in their [perception system](https://motional.com/news/technically-speaking-improving-av-perception-through-transformative-machine-learning). Additionally, Amazon employs deep learning at the edge in their Alexa devices to perform [keyword spotting](https://towardsdatascience.com/how-amazon-alexa-works-your-guide-to-natural-language-processing-ai-7506004709d3). -![Deep learning applications, benefits and implementations.](contents/dl_primer/images/png/deeplearning.png){#deeplearning} +![Deep learning applications, benefits and implementations. Source: [Leeway Hertz](https://www.leewayhertz.com/what-is-deep-learning/)](images/png/deeplearning.png){#deeplearning} ### Relevance to Embedded AI @@ -128,7 +128,7 @@ The forward pass is the initial phase where data moves through the network from @forward-propagation explains the concept of forward pass using an illustration. -![Neural networks - forward and backward propagation.](contents/dl_primer/images/png/forwardpropagation.png){#forward-propagation} +![Neural networks - forward and backward propagation. Source: [Linkedin](https://www.linkedin.com/pulse/lecture2-unveiling-theoretical-foundations-ai-machine-underdown-phd-oqsuc/)](images/png/forwardpropagation.png){#forward-propagation} # Neural Networks @@ -251,7 +251,7 @@ Deep learning extends traditional machine learning by utilizing neural networks | Maintenance | Easier (simple to update and maintain) | Complex (requires more efforts in maintenance and updates) | +-------------------------------+-----------------------------------------------------------+--------------------------------------------------------------+ -![Comparing Machine Learning and Deep Learning.](contents/dl_primer/images/png/mlvsdl.png){#ml-vs-dl} +![Comparing Machine Learning and Deep Learning. Source: [Medium](https://aoyilmaz.medium.com/understanding-the-differences-between-deep-learning-and-machine-learning-eb41d64f1732)](images/png/mlvsdl.png){#ml-vs-dl} : Comparison of traditional machine learning and deep learning. {#tbl-mlvsdl .striped .hover} diff --git a/contents/efficient_ai/efficient_ai.qmd b/contents/efficient_ai/efficient_ai.qmd index 340db085..62bf1dad 100644 --- a/contents/efficient_ai/efficient_ai.qmd +++ b/contents/efficient_ai/efficient_ai.qmd @@ -78,7 +78,8 @@ Model compression methods are essential for bringing deep learning models to dev **Knowledge Distillation:** Knowledge distillation involves training a smaller model (student) to replicate the behavior of a larger model (teacher). The idea is to transfer the knowledge from the cumbersome model to the lightweight one. Hence, the smaller model attains performance close to its larger counterpart but with significantly fewer parameters. @knowledge-dist demonstrates the tutor-student framework for knowledge distillation. We will explore knowledge distillation in more detail in the @sec-kd. -![The tutor-student framework for knowledge distillation.](contents/efficient_ai/images/png/knowledgedistillation.png){#knowledge-dist} +![The tutor-student framework for knowledge distillation. Source: [Medium](URL:https://chukwubuikexo.medium.com/knowledge-distillation-approaches-in-machine-learning-5841a41a346a)](images/png/knowledgedistillation.png){#knowledge-dist} + ## Efficient Inference Hardware diff --git a/contents/frameworks/frameworks.qmd b/contents/frameworks/frameworks.qmd index e38d2b64..a95bd7c2 100644 --- a/contents/frameworks/frameworks.qmd +++ b/contents/frameworks/frameworks.qmd @@ -76,7 +76,7 @@ Each generation of frameworks unlocked new capabilities that powered advancement In recent years, the frameworks have converged. @fig-ml-framework shows that TensorFlow and PyTorch have become the overwhelmingly dominant ML frameworks, representing more than 95% of ML frameworks used in research and production. @tensorflow-pytorch draws a contrast between the attributes of TensorFlow and PyTorch. Keras was integrated into TensorFlow in 2019; Preferred Networks transitioned Chainer to PyTorch in 2019; and Microsoft stopped actively developing CNTK in 2022 to support PyTorch on Windows. -![PyTorch vs TensorFlow: Features and Functions](contents/frameworks/images/png/tensorflowpytorch.png){#tensorflow-pytorch} +![PyTorch vs. TensorFlow: Features and Functions. Source: [K&C](https://www.google.com/url?sa=i&url=https%3A%2F%2Fkruschecompany.com%2Fpytorch-vs-tensorflow%2F&psig=AOvVaw1-DSFxXYprQmYH7Z4Nk6Tk&ust=1722533288351000&source=images&cd=vfe&opi=89978449&ved=0CBEQjRxqFwoTCPDhst7m0YcDFQAAAAAdAAAAABAg)](images/png/tensorflowpytorch.png){#tensorflow-pytorch} ![Popularity of ML frameworks in the United States as measured by Google web searches. Source: Google.](images/png/image6.png){#fig-ml-framework} @@ -376,7 +376,7 @@ y = torch.matmul(x, weights) + biases The above example does not have separate compile/build/run phases. Ops define and execute immediately. With dynamic graphs, the definition is intertwined with execution, providing a more intuitive, interactive workflow. However, the downside is that there is less potential for optimization since the framework only sees the graph as it is built. @static-vs-dynamic demonstrates the differences between a static and dynamic computation graph. -![Comparing Static and Dynamic graphs.](contents/frameworks/images/png/staticvsdynamic.png){#static-vs-dynamic} +![Comparing Static and Dynamic graphs. Source: [Dev](https://www.google.com/url?sa=i&url=https%3A%2F%2Fdev-jm.tistory.com%2F4&psig=AOvVaw0r1cZbZa6iImYP-fesrN7H&ust=1722533107591000&source=images&cd=vfe&opi=89978449&ved=0CBQQjhxqFwoTCLC8nYHm0YcDFQAAAAAdAAAAABAY)](images/png/staticvsdynamic.png){#static-vs-dynamic} Recently, the distinction has blurred as frameworks adopt both modes. TensorFlow 2.0 defaults to dynamic graph mode while letting users work with static graphs when needed. Dynamic declaration offers flexibility and ease of use, making frameworks more user-friendly, while static graphs provide optimization benefits at the cost of interactivity. The ideal framework balances these approaches. @tbl-exec-graph compares the pros and cons of static versus dynamic execution graphs: @@ -427,7 +427,7 @@ Machine learning frameworks like TensorFlow and PyTorch provide tools to simplif By integrating augmentation tools into the data pipeline, frameworks enable these transformations to be applied on the fly during each training epoch. This approach increases the variation in the training data distribution, thereby reducing overfitting and improving model generalization. @overfitting demonstrates the cases of overfitting and underfitting. The use of performant data loaders in combination with extensive augmentation capabilities allows practitioners to efficiently feed massive, varied datasets to neural networks. -![ Overfitting vs. Underfitting ](contents/frameworks/images/png/overfittingunderfitting.png){#overfitting} +![Overfitting vs. Underfitting. Source: [Aquarium Learning](https://www.google.com/url?sa=i&url=https%3A%2F%2Fwww.aquariumlearning.com%2Fblog-posts%2Fto-make-your-model-better-first-figure-out-whats-wrong&psig=AOvVaw3FodMJATpeLeeSsuQZBD51&ust=1722534629114000&source=images&cd=vfe&opi=89978449&ved=0CBEQjRxqGAoTCNiU49br0YcDFQAAAAAdAAAAABCoAQ)](images/png/overfittingunderfitting.png){#overfitting} These hands-off data pipelines represent a significant improvement in usability and productivity. They allow developers to focus more on model architecture and less on data wrangling when training deep learning models. @@ -489,8 +489,7 @@ Visualization tools provide insight into models: * Precision-recall curves - Assess classification tradeoffs. @precision-recall shows an example of a precision-recall curve. -![Reading a precision-recall curve.](contents/frameworks/images/png/precisionrecall.png){#precision-recall} - +![Reading a precision-recall curve. Source: [AIM](https://www.google.com/url?sa=i&url=https%3A%2F%2Fwww.techtarget.com%2Fsearchcio%2Fdefinition%2Ftransfer-learning&psig=AOvVaw0Cbiewbu_6NsNVf314C9Q8&ust=1722534991962000&source=images&cd=vfe&opi=89978449&ved=0CBEQjRxqFwoTCPj5jITt0YcDFQAAAAAdAAAAABAE)](images/png/precisionrecall.png){#precision-recall} Tools like [TensorBoard](https://www.tensorflow.org/tensorboard/scalars_and_keras) for TensorFlow and [TensorWatch](https://github.com/microsoft/tensorwatch) for PyTorch enable real-time metrics and visualization during training. @@ -552,8 +551,7 @@ Transfer learning is the practice of using knowledge gained from a pre-trained m Transfer learning has challenges, such as the modified model's inability to conduct its original tasks after transfer learning. Papers such as ["Learning without Forgetting"](https://browse.arxiv.org/pdf/1606.09282.pdf) by @li2017learning try to address these challenges and have been implemented in modern machine learning platforms. @transfer-learning simplifies the concept of transfer learning through an example. -![Transfer learning.](contents/frameworks/images/png/transferlearning.png){#transfer-learning} - +![Transfer learning. Source: [Tech Target](https://www.google.com/url?sa=i&url=https%3A%2F%2Fanalyticsindiamag.com%2Fdevelopers-corner%2Fcomplete-guide-to-understanding-precision-and-recall-curves%2F&psig=AOvVaw3MosZItazJt2eermLTArjj&ust=1722534897757000&source=images&cd=vfe&opi=89978449&ved=0CBEQjRxqFwoTCIi389bs0YcDFQAAAAAdAAAAABAw)](images/png/transferlearning.png){#transfer-learning} #### Federated Learning diff --git a/contents/hw_acceleration/hw_acceleration.qmd b/contents/hw_acceleration/hw_acceleration.qmd index 70c71ebd..a2f2d929 100644 --- a/contents/hw_acceleration/hw_acceleration.qmd +++ b/contents/hw_acceleration/hw_acceleration.qmd @@ -700,7 +700,7 @@ Benchmarking suites such as MLPerf, Fathom, and AI Benchmark offer a set of stan * **Fathom:** Focuses on core operations in deep learning models, emphasizing their execution on different architectures [@adolf2016fathom]. * **AI Benchmark:** Targets mobile and consumer devices, assessing AI performance in end-user applications [@ignatov2018ai]. -![Knowledge Distillation.](contents/optimizations/images/png/kdistillation.png){#k-dist} +![MLPerf Training v3.0 and its uses. Source: [Forbes](https://www.forbes.com/sites/stevemcdowell/2023/06/27/nvidia-h100-dominates-new-mlperf-v30-benchmark-results/)](images/png/mlperf.png){#ml-perf} Benchmarks also have performance metrics that are the quantifiable measures used to evaluate the effectiveness of AI accelerators. These metrics provide a comprehensive view of an accelerator's capabilities and are used to guide the design and selection process for AI systems. Common metrics include: @@ -951,7 +951,7 @@ Quantum computers leverage unique phenomena of quantum physics, like superpositi Multiple qubits can also be entangled, leading to exponential information density but introducing probabilistic results. Superposition enables parallel computation on all possible states, while entanglement allows nonlocal correlations between qubits. @qubit simulates the structure of a qubit. -![Qubits, the building blocks of quantum computing.](contents/hw_acceleration/images/png/qubit.png){#qubit} +![Qubits, the building blocks of quantum computing. Source: [Microsoft](https://azure.microsoft.com/en-gb/resources/cloud-computing-dictionary/what-is-a-qubit)](images/png/qubit.png){#qubit} Quantum algorithms carefully manipulate these inherently quantum mechanical effects to solve problems like optimization or search more efficiently than their classical counterparts in theory. @@ -970,7 +970,7 @@ While meaningful quantum advantage for ML remains far off, active research at co Quantum techniques may first make inroads into optimization before more generalized ML adoption. Realizing quantum ML's full potential awaits major milestones in quantum hardware development and ecosystem maturity. @q-computing illustrates a comparison between quantum computing and classical computing. -![Comparing Quantum Computing with Classical Computing](contents/hw_acceleration/images/png/qcomputing.png){#q-computing} +![Comparing Quantum Computing with Classical Computing. Source: [Devopedia](​​https://devopedia.org/quantum-computing)](images/png/qcomputing.png){#q-computing} ## Future Trends diff --git a/contents/introduction/introduction.qmd b/contents/introduction/introduction.qmd index e3a46912..37d32bf7 100644 --- a/contents/introduction/introduction.qmd +++ b/contents/introduction/introduction.qmd @@ -8,7 +8,7 @@ bibliography: introduction.bib ## Overview -In the early 1990s, [Mark Weiser](https://en.wikipedia.org/wiki/Mark_Weiser), a pioneering computer scientist, introduced the world to a revolutionary concept that would forever change how we interact with technology. This was succintly captured in the paper he wrote on "The Computer for the 21st Century" (@fig-ubiqutous). He envisioned a future where computing would be seamlessly integrated into our environments, becoming an invisible, integral part of daily life. This vision, which he termed "ubiquitous computing," promised a world where technology would serve us without demanding our constant attention or interaction. Fast forward to today, and we find ourselves on the cusp of realizing Weiser's vision, thanks to the advent and proliferation of machine learning systems. +In the early 1990s, [Mark Weiser](https://en.wikipedia.org/wiki/Mark_Weiser), a pioneering computer scientist, introduced the world to a revolutionary concept that would forever change how we interact with technology. He envisioned a future where computing would be seamlessly integrated into our environments, becoming an invisible, integral part of daily life. This vision, which he termed "ubiquitous computing," promised a world where technology would serve us without demanding our constant attention or interaction. Fast forward to today, and we find ourselves on the cusp of realizing Weiser's vision, thanks to the advent and proliferation of machine learning systems. ![Ubiqutous computing.](images/png/21st_computer.png){#fig-ubiqutous width=50%} @@ -26,7 +26,7 @@ Furthermore, the varying computational capabilities and energy constraints of de As we move towards the realization of Weiser's vision of ubiquitous computing, the development and deployment of machine learning systems across the entire ecosystem will be critical. By leveraging the strengths of each layer of the computing continuum, we can create an intelligent environment that seamlessly integrates with our daily lives, anticipating our needs and enhancing our experiences in ways that were once unimaginable. As we continue to push the boundaries of what's possible with distributed machine learning, we inch closer to a future where technology becomes an invisible but integral part of our world. @applications-of-ml illustrates some common applications of AI around us. -![Common applications of Machine Learning](contents/introduction/images/cloud-edge-tiny.png){#applications-of-ml} +![Common applications of Machine Learning. Source: [EDUCBA](https://www.educba.com/applications-of-machine-learning/)](images/cloud-edge-tiny.png){#applications-of-ml} ## What's Inside the Book @@ -36,7 +36,7 @@ To improve the learning experience, we have included a variety of supplementary We begin with the fundamentals, introducing key concepts in systems and machine learning, and providing a deep learning primer. We then guide you through the AI workflow, from data engineering to selecting the right AI frameworks. The training section covers efficient AI training techniques, model optimizations, and AI acceleration using specialized hardware. Deployment is addressed next, with chapters on benchmarking AI, distributed learning, and ML operations. Advanced topics like security, privacy, responsible AI, sustainable AI, robust AI, and generative AI are then explored in depth. The book concludes by highlighting the positive impact of AI and its potential for good. @ml-project-lifecycle outlines the lifecycle of a machine leanring project. -![Machine Learning Project Life Cycle](contents/introduction/images/png/mlapplications.png){#ml-project-lifecycle} +![Machine Learning project life cycle. Source:[Medium](https://ihsanulpro.medium.com/complete-machine-learning-project-flowchart-explained-0f55e52b9381)](images/png/mlapplications.png){#ml-project-lifecycle} ## How to Navigate This Book diff --git a/contents/ml_systems/ml_systems.qmd b/contents/ml_systems/ml_systems.qmd index 1fd02d03..06364d80 100644 --- a/contents/ml_systems/ml_systems.qmd +++ b/contents/ml_systems/ml_systems.qmd @@ -301,7 +301,7 @@ In summary, TinyML serves as a trailblazer in the evolution of machine learning, Up to this point, we've explored each of the different ML variants individually. Now, let's bring them all together for a comprehensive view. @tbl-big_vs_tiny offers a comparative analysis of Cloud ML, Edge ML, and TinyML based on various features and aspects. Additionally, @venn-diagram draws a contrast using a venn diagram. This comparison provides a clear perspective on the unique advantages and distinguishing factors, aiding in making informed decisions based on the specific needs and constraints of a given application or project. -![ML Venn diagram](contents/ml_systems/images/png/venndiagram.png){#venn-diagram} +![ML Venn diagram. Source: [arXiv](https://arxiv.org/html/2403.19076v1)](images/png/venndiagram.png){#venn-diagram} +--------------------------+---------------------------------------------------------+---------------------------------------------------------+----------------------------------------------------------+ | Aspect | Cloud ML | Edge ML | TinyML | diff --git a/contents/ops/ops.qmd b/contents/ops/ops.qmd index 4f478bc2..3d791258 100644 --- a/contents/ops/ops.qmd +++ b/contents/ops/ops.qmd @@ -764,8 +764,7 @@ Despite the proliferation of new MLOps tools in response to the increase in dema With Edge Impulse, developers with limited data science expertise can develop specialized ML models that run efficiently within small computing environments. It provides a comprehensive solution for creating embedded intelligence and advancing machine learning. @edge-impulse further illustrates this concept. -![The inner workings of edge impulse.](contents/ops/images/png/impulse.png){#edge-impulse} - +![The inner workings of edge impulse. Source: [Edge Impulse](https://www.edgeimpulse.com/blog/getting-started-with-edge-impulse/)](images/png/impulse.png){#edge-impulse} ##### User Interface diff --git a/contents/optimizations/images/png/kdistillation.png b/contents/optimizations/images/png/kdistillation.png deleted file mode 100644 index 44106663c16cb12afc9ddc78c392dd1d14b0cf36..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 142407 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≈=USZD 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�?Z~%~o~Qrf8}f}3^xg%uZ!h&>hCSMIVXl~F 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 G81p|WE@{O8 diff --git a/contents/privacy_security/privacy_security.qmd b/contents/privacy_security/privacy_security.qmd index 5a140da2..9686bf29 100644 --- a/contents/privacy_security/privacy_security.qmd +++ b/contents/privacy_security/privacy_security.qmd @@ -78,7 +78,9 @@ But Stuxnet wasn't designed to steal information or spy on people. Its goal was Stuxnet was incredibly advanced malware built by national governments to cross from the digital realm into real-world infrastructure. It specifically targeted important industrial machines, where embedded machine learning is highly applicable in a way never done before. The virus provided a wake-up call about how sophisticated cyberattacks could now physically destroy equipment and facilities. -This breach was significant due to its sophistication; Stuxnet specifically targeted programmable logic controllers (PLCs) used to automate electromechanical processes such as the speed of centrifuges for uranium enrichment. The worm exploited vulnerabilities in the Windows operating system to gain access to the Siemens Step7 software controlling the PLCs. Despite not being a direct attack on ML systems, Stuxnet is relevant for all embedded systems as it showcases the potential for state-level actors to design attacks that bridge the cyber and physical worlds with devastating effects. +This breach was significant due to its sophistication; Stuxnet specifically targeted programmable logic controllers (PLCs) used to automate electromechanical processes such as the speed of centrifuges for uranium enrichment. The worm exploited vulnerabilities in the Windows operating system to gain access to the Siemens Step7 software controlling the PLCs. Despite not being a direct attack on ML systems, Stuxnet is relevant for all embedded systems as it showcases the potential for state-level actors to design attacks that bridge the cyber and physical worlds with devastating effects. @stuxnet explains Stuxnet in greater detail. + +![Stuxnet explained. Source: [IEEE Spectrum](https://spectrum.ieee.org/the-real-story-of-stuxnet)](images/png/stuxnet.png){#stuxnet} ### Jeep Cherokee Hack @@ -918,7 +920,9 @@ These examples demonstrate how federated learning provides tangible privacy bene #### Core Idea -Machine unlearning is a fairly new process that describes how the influence of a subset of training data can be removed from the model. Several methods have been used to perform machine unlearning and remove the influence of a subset of training data from the final model. A baseline approach might consist of simply fine-tuning the model for more epochs on just the data that should be remembered to decrease the influence of the data "forgotten" by the model. Since this approach doesn't explicitly remove the influence of data that should be erased, membership inference attacks are still possible, so researchers have adopted other approaches to unlearn data from a model explicitly. One type of approach that researchers have adopted includes adjusting the model loss function to treat the losses of the "forget set explicitly" (data to be unlearned) and the "retain set" (remaining data that should still be remembered) differently [@tarun2023deep; @khan2021knowledgeadaptation]. +Machine unlearning is a fairly new process that describes how the influence of a subset of training data can be removed from the model. Several methods have been used to perform machine unlearning and remove the influence of a subset of training data from the final model. A baseline approach might consist of simply fine-tuning the model for more epochs on just the data that should be remembered to decrease the influence of the data "forgotten" by the model. Since this approach doesn't explicitly remove the influence of data that should be erased, membership inference attacks are still possible, so researchers have adopted other approaches to unlearn data from a model explicitly. One type of approach that researchers have adopted includes adjusting the model loss function to treat the losses of the "forget set explicitly" (data to be unlearned) and the "retain set" (remaining data that should still be remembered) differently [@tarun2023deep; @khan2021knowledgeadaptation]. @machine-unlearning illustrates some of the applications of Machine-unlearning. + +![Applications of Machine Unlearning. Source: [BBVA OpenMind](https://www.bbvaopenmind.com/en/technology/artificial-intelligence/ai-and-machine-unlearning-forgotten-path/)](images/png/machineunlearning.png){#machine-unlearning} #### Case Study @@ -940,7 +944,7 @@ Homomorphic encryption is a form of encryption that allows computations to be ca Homomorphic encryption enables outsourced computation on encrypted data without exposing the data itself to the external party performing the operations. However, only certain computations like addition and multiplication are supported in partially homomorphic schemes. Fully homomorphic encryption (FHE) that can handle any computation is even more complex. The number of possible operations is limited before noise accumulation corrupts the ciphertext. -To use homomorphic encryption across different entities, carefully generated public keys must be exchanged for operations across separately encrypted data. This advanced encryption technique enables previously impossible secure computation paradigms but requires expertise to implement correctly for real-world systems. +To use homomorphic encryption across different entities, carefully generated public keys must be exchanged for operations across separately encrypted data. This advanced encryption technique enables previously impossible secure computation paradigms but requires expertise to implement correctly for real-world systems. #### Benefits diff --git a/contents/sustainable_ai/sustainable_ai.qmd b/contents/sustainable_ai/sustainable_ai.qmd index 4df21708..d14de640 100644 --- a/contents/sustainable_ai/sustainable_ai.qmd +++ b/contents/sustainable_ai/sustainable_ai.qmd @@ -51,7 +51,7 @@ Furthermore, more than voluntary self-regulation may be needed---governments may Through ethical principles, company policies, and public rules, AI technologists and corporations have a profound duty to our planet to ensure the responsible and sustainable advancement of technology positioned to transform modern society radically. We owe it to future generations to get this right. @ethical-ai outlines some ethical concerns and challenges facing AI. -![Ethical challenges in AI.](contents/sustainable_ai/images/png/ethicalai.png){#ethical-ai} +![Ethical challenges in AI development. Source: [COE](https://www.coe.int/en/web/bioethics/common-ethical-challenges-in-ai)](images/png/ethicalai.png){#ethical-ai} ### Long-term Sustainability {#long-term-sustainability} diff --git a/contents/workflow/workflow.qmd b/contents/workflow/workflow.qmd index 5580526e..46b2c4fa 100644 --- a/contents/workflow/workflow.qmd +++ b/contents/workflow/workflow.qmd @@ -58,11 +58,12 @@ The ML workflow is iterative, requiring ongoing monitoring and potential adjustm The ML workflow is a universal guide applicable across various platforms, including cloud-based solutions, edge computing, and TinyML. However, the workflow for Embedded AI introduces unique complexities and challenges, making it a captivating domain and paving the way for remarkable innovations. @dl-and-ml illustrates the differences between Machine Learning and Deep Learning. -![Comparing Traditional Machine Learning and Deep Learning.](contents/workflow/images/png/comparingdlandml.png){#dl-and-ml} +![Comparing Traditional Machine Learning and Deep Learning. Source: [BBN Times](https://www.bbntimes.com/technology/to-leverage-deep-learning-you-must-know-this-first)](images/png/comparingdlandml.png){#dl-and-ml} + @embedded-ai showcases the uses of embedded ai in various industries. -![Embedded AI applications](contents/workflow/images/png/embeddedai.png){#embedded-ai} +![Embedded AI applications. Source: [Rinf.tech](https://www.rinf.tech/what-is-embedded-intelligence-and-how-can-tech-leaders-embrace-it/)](images/png/embeddedai.png){#embedded-ai} ### Resource Optimization From 811b0275c49f42dbd74d921efd3dc9409b09be31 Mon Sep 17 00:00:00 2001 From: Vijay Janapa Reddi Date: Mon, 16 Sep 2024 19:46:34 -0700 Subject: [PATCH 02/13] Fig reference fixes + embedded AI removal (should have done this seperately) --- contents/introduction/introduction.qmd | 38 +++++++++++++------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/contents/introduction/introduction.qmd b/contents/introduction/introduction.qmd index 37d32bf7..a4cc8e3e 100644 --- a/contents/introduction/introduction.qmd +++ b/contents/introduction/introduction.qmd @@ -26,7 +26,7 @@ Furthermore, the varying computational capabilities and energy constraints of de As we move towards the realization of Weiser's vision of ubiquitous computing, the development and deployment of machine learning systems across the entire ecosystem will be critical. By leveraging the strengths of each layer of the computing continuum, we can create an intelligent environment that seamlessly integrates with our daily lives, anticipating our needs and enhancing our experiences in ways that were once unimaginable. As we continue to push the boundaries of what's possible with distributed machine learning, we inch closer to a future where technology becomes an invisible but integral part of our world. @applications-of-ml illustrates some common applications of AI around us. -![Common applications of Machine Learning. Source: [EDUCBA](https://www.educba.com/applications-of-machine-learning/)](images/cloud-edge-tiny.png){#applications-of-ml} +![Common applications of Machine Learning. Source: [EDUCBA](https://www.educba.com/applications-of-machine-learning/)](images/png/mlapplications.png){#applications-of-ml} ## What's Inside the Book @@ -34,15 +34,15 @@ In this book, we will explore the technical foundations of ubiquitous machine le To improve the learning experience, we have included a variety of supplementary materials. Throughout the book, you will find slides that summarize key concepts, videos that provide in-depth explanations and demonstrations, exercises that reinforce your understanding, and labs that offer hands-on experience with the tools and techniques discussed. These additional resources are designed to cater to different learning styles and help you gain a deeper, more practical understanding of the subject matter. -We begin with the fundamentals, introducing key concepts in systems and machine learning, and providing a deep learning primer. We then guide you through the AI workflow, from data engineering to selecting the right AI frameworks. The training section covers efficient AI training techniques, model optimizations, and AI acceleration using specialized hardware. Deployment is addressed next, with chapters on benchmarking AI, distributed learning, and ML operations. Advanced topics like security, privacy, responsible AI, sustainable AI, robust AI, and generative AI are then explored in depth. The book concludes by highlighting the positive impact of AI and its potential for good. @ml-project-lifecycle outlines the lifecycle of a machine leanring project. +We begin with the fundamentals, introducing key concepts in systems and machine learning, and providing a deep learning primer. We then guide you through the AI workflow, from data engineering to selecting the right AI frameworks. The training section covers efficient AI training techniques, model optimizations, and AI acceleration using specialized hardware. Deployment is addressed next, with chapters on benchmarking AI, distributed learning, and ML operations. Advanced topics like security, privacy, responsible AI, sustainable AI, robust AI, and generative AI are then explored in depth. The book concludes by highlighting the positive impact of AI and its potential for good. @fig-ml-lifecycle outlines the lifecycle of a machine learning project. -![Machine Learning project life cycle. Source:[Medium](https://ihsanulpro.medium.com/complete-machine-learning-project-flowchart-explained-0f55e52b9381)](images/png/mlapplications.png){#ml-project-lifecycle} +![Machine Learning project life cycle. Source:[Medium](https://ihsanulpro.medium.com/complete-machine-learning-project-flowchart-explained-0f55e52b9381)](images/png/mlprojectlifecycle.png){#fig-ml-lifecycle} ## How to Navigate This Book To get the most out of this book, we recommend a structured learning approach that leverages the various resources provided. Each chapter includes slides, videos, exercises, and labs to cater to different learning styles and reinforce your understanding. Additionally, an AI tutor bot (SocratiQ AI) is readily available to guide you through the content and provide personalized assistance. -1. **Fundamentals (Chapters 1-3):** Start by building a strong foundation with the initial chapters, which provide an introduction to embedded AI and cover core topics like embedded systems and deep learning. +1. **Fundamentals (Chapters 1-3):** Start by building a strong foundation with the initial chapters, which provide an introduction to AI and cover core topics like AI systems and deep learning. 2. **Workflow (Chapters 4-6):** With that foundation, move on to the chapters focused on practical aspects of the AI model building process like workflows, data engineering, and frameworks. @@ -54,21 +54,21 @@ To get the most out of this book, we recommend a structured learning approach th 6. **Social Impact (Chapter 19):** Explore the positive applications and potential of AI for societal good. -7. **Conclusion (Chapter 20):** Reflect on the key takeaways and future directions in embedded AI. +7. **Conclusion (Chapter 20):** Reflect on the key takeaways and future directions in AI systems. While the book is designed for progressive learning, we encourage an interconnected learning approach that allows you to navigate chapters based on your interests and needs. Throughout the book, you'll find case studies and hands-on exercises that help you relate theory to real-world applications. We also recommend participating in forums and groups to engage in [discussions](https://github.com/harvard-edge/cs249r_book/discussions), debate concepts, and share insights with fellow learners. Regularly revisiting chapters can help reinforce your learning and offer new perspectives on the concepts covered. By adopting this structured yet flexible approach and actively engaging with the content and the community, you'll embark on a fulfilling and enriching learning experience that maximizes your understanding. ## Chapter Breakdown -Here's a closer look at what each chapter covers. We have structured the book into six main sections: Fundamentals, Workflow, Training, Deployment, Advanced Topics, and Impact. These sections closely reflect the major components of a typical machine learning pipeline, from understanding the basic concepts to deploying and maintaining AI systems in real-world applications. By organizing the content in this manner, we aim to provide a logical progression that mirrors the actual process of developing and implementing embedded AI solutions. +Here's a closer look at what each chapter covers. We have structured the book into six main sections: Fundamentals, Workflow, Training, Deployment, Advanced Topics, and Impact. These sections closely reflect the major components of a typical machine learning pipeline, from understanding the basic concepts to deploying and maintaining AI systems in real-world applications. By organizing the content in this manner, we aim to provide a logical progression that mirrors the actual process of developing and implementing AI systems. ### Fundamentals -In the Fundamentals section, we lay the groundwork for understanding embedded AI. We introduce key concepts, provide an overview of machine learning systems, and dive into the principles and algorithms of deep learning that power AI applications in embedded systems. This section equips you with the essential knowledge needed to grasp the subsequent chapters. +In the Fundamentals section, we lay the groundwork for understanding AI. This is far from being a thorough deep dive into the algorithms, but we aim to introduce key concepts, provide an overview of machine learning systems, and dive into the principles and algorithms of deep learning that power AI applications in their associated systems. This section equips you with the essential knowledge needed to grasp the subsequent chapters. -1. **[Introduction:](../introduction/introduction.qmd)** This chapter sets the stage, providing an overview of embedded AI and laying the groundwork for the chapters that follow. +1. **[Introduction:](../introduction/introduction.qmd)** This chapter sets the stage, providing an overview of AI and laying the groundwork for the chapters that follow. 2. **[ML Systems:](../ml_systems/ml_systems.qmd)** We introduce the basics of machine learning systems, the platforms where AI algorithms are widely applied. -3. **[Deep Learning Primer:](../dl_primer/dl_primer.qmd)** This chapter offers a comprehensive introduction to the algorithms and principles that underpin AI applications in embedded systems. +3. **[Deep Learning Primer:](../dl_primer/dl_primer.qmd)** This chapter offers a brief introduction to the algorithms and principles that underpin AI applications in ML systems. ### Workflow @@ -80,26 +80,26 @@ The Workflow section guides you through the practical aspects of building AI mod ### Training -In the Training section, we explore techniques for training efficient and reliable AI models. We cover strategies for achieving efficiency, model optimizations, and the role of specialized hardware in AI acceleration. This section empowers you with the knowledge to develop high-performing models that can be seamlessly integrated into embedded systems. +In the Training section, we explore techniques for training efficient and reliable AI models. We cover strategies for achieving efficiency, model optimizations, and the role of specialized hardware in AI acceleration. This section empowers you with the knowledge to develop high-performing models that can be seamlessly integrated into AI systems. 7. **[AI Training:](../training/training.qmd)** This chapter explores model training, exploring techniques for developing efficient and reliable models. 8. **[Efficient AI:](../efficient_ai/efficient_ai.qmd)** Here, we discuss strategies for achieving efficiency in AI applications, from computational resource optimization to performance enhancement. -9. **[Model Optimizations:](../optimizations/optimizations.qmd)** We explore various avenues for optimizing AI models for seamless integration into embedded systems. -10. **[AI Acceleration:](../hw_acceleration/hw_acceleration.qmd)** We discuss the role of specialized hardware in enhancing the performance of embedded AI systems. +9. **[Model Optimizations:](../optimizations/optimizations.qmd)** We explore various avenues for optimizing AI models for seamless integration into AI systems. +10. **[AI Acceleration:](../hw_acceleration/hw_acceleration.qmd)** We discuss the role of specialized hardware in enhancing the performance of AI systems. ### Deployment -The Deployment section focuses on the challenges and solutions for deploying AI models on embedded devices. We discuss benchmarking methods to evaluate AI system performance, techniques for on-device learning to improve efficiency and privacy, and the processes involved in ML operations. This section equips you with the skills to effectively deploy and maintain AI functionalities in embedded systems. +The Deployment section focuses on the challenges and solutions for deploying AI models. We discuss benchmarking methods to evaluate AI system performance, techniques for on-device learning to improve efficiency and privacy, and the processes involved in ML operations. This section equips you with the skills to effectively deploy and maintain AI functionalities in AI systems. 11. **[Benchmarking AI:](../benchmarking/benchmarking.qmd)** This chapter focuses on how to evaluate AI systems through systematic benchmarking methods. 12. **[On-Device Learning:](../ondevice_learning/ondevice_learning.qmd)** We explore techniques for localized learning, which enhances both efficiency and privacy. -13. **[ML Operations:](../ops/ops.qmd)** This chapter looks at the processes involved in the seamless integration, monitoring, and maintenance of AI functionalities in embedded systems. +13. **[ML Operations:](../ops/ops.qmd)** This chapter looks at the processes involved in the seamless integration, monitoring, and maintenance of AI functionalities. ### Advanced Topics -In the Advanced Topics section, We will study the critical issues surrounding embedded AI. We address privacy and security concerns, explore the ethical principles of responsible AI, discuss strategies for sustainable AI development, examine techniques for building robust AI models, and introduce the exciting field of generative AI. This section broadens your understanding of the complex landscape of embedded AI and prepares you to navigate its challenges. +In the Advanced Topics section, We will study the critical issues surrounding AI. We address privacy and security concerns, explore the ethical principles of responsible AI, discuss strategies for sustainable AI development, examine techniques for building robust AI models, and introduce the exciting field of generative AI. This section broadens your understanding of the complex landscape of AI and prepares you to navigate its challenges. -14. **[Security & Privacy:](../privacy_security/privacy_security.qmd)** As AI becomes more ubiquitous, this chapter addresses the crucial aspects of privacy and security in embedded AI systems. +14. **[Security & Privacy:](../privacy_security/privacy_security.qmd)** As AI becomes more ubiquitous, this chapter addresses the crucial aspects of privacy and security in AI systems. 15. **[Responsible AI:](../responsible_ai/responsible_ai.qmd)** We discuss the ethical principles guiding the responsible use of AI, focusing on fairness, accountability, and transparency. 16. **[Sustainable AI:](../sustainable_ai/sustainable_ai.qmd)** This chapter explores practices and strategies for sustainable AI, ensuring long-term viability and reduced environmental impact. 17. **[Robust AI:](../robust_ai/robust_ai.qmd)** We discuss techniques for developing reliable and robust AI models that can perform consistently across various conditions. @@ -107,15 +107,15 @@ In the Advanced Topics section, We will study the critical issues surrounding em ### Social Impact -The Impact section highlights the transformative potential of embedded AI in various domains. We showcase real-world applications of TinyML in healthcare, agriculture, conservation, and other areas where AI is making a positive difference. This section inspires you to leverage the power of embedded AI for societal good and to contribute to the development of impactful solutions. +The Impact section highlights the transformative potential of AI in various domains. We showcase real-world applications of TinyML in healthcare, agriculture, conservation, and other areas where AI is making a positive difference. This section inspires you to leverage the power of AI for societal good and to contribute to the development of impactful solutions. 19. **[AI for Good:](../ai_for_good/ai_for_good.qmd)** We highlight positive applications of TinyML in areas like healthcare, agriculture, and conservation. ### Closing -In the Closing section, we reflect on the key learnings from the book and look ahead to the future of embedded AI. We synthesize the concepts covered, discuss emerging trends, and provide guidance on continuing your learning journey in this rapidly evolving field. This section leaves you with a comprehensive understanding of embedded AI and the excitement to apply your knowledge in innovative ways. +In the Closing section, we reflect on the key learnings from the book and look ahead to the future of AI. We synthesize the concepts covered, discuss emerging trends, and provide guidance on continuing your learning journey in this rapidly evolving field. This section leaves you with a comprehensive understanding of AI and the excitement to apply your knowledge in innovative ways. -20. **[Conclusion:](../conclusion/conclusion.qmd)** The book concludes with a reflection on the key learnings and future directions in the field of embedded AI. +20. **[Conclusion:](../conclusion/conclusion.qmd)** The book concludes with a reflection on the key learnings and future directions in the field of AI. ## Contribute Back From 96892a98bc27af54433aa943612b5079e0c8d58d Mon Sep 17 00:00:00 2001 From: Vijay Janapa Reddi Date: Mon, 16 Sep 2024 19:46:53 -0700 Subject: [PATCH 03/13] Fig ref fix --- contents/ml_systems/ml_systems.qmd | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/contents/ml_systems/ml_systems.qmd b/contents/ml_systems/ml_systems.qmd index 06364d80..bd72a1eb 100644 --- a/contents/ml_systems/ml_systems.qmd +++ b/contents/ml_systems/ml_systems.qmd @@ -96,7 +96,7 @@ Cloud ML fosters a collaborative environment that enables teams to work together **Cost-Effectiveness** -Adopting Cloud ML can be a cost-effective solution for organizations, especially compared to building and maintaining an on-premises machine learning infrastructure. Cloud service providers offer flexible pricing models, such as pay-as-you-go or subscription-based plans, allowing organizations to pay only for the resources they consume. This eliminates the need for upfront capital investments in hardware and infrastructure, reducing the overall cost of implementing machine learning projects. Additionally, the scalability of Cloud ML ensures that organizations can optimize their resource usage and avoid overprovisioning, further enhancing cost-efficiency. +Adopting Cloud ML can be a cost-effective solution for organizations, especially compared to building and maintaining an on-premises machine learning infrastructure. Cloud service providers offer flexible pricing models, such as pay-as-you-go or subscription-based plans, allowing organizations to pay only for the resources they consume. This eliminates the need for upfront capital investments in hardware and infrastructure, reducing the overall cost of implementing machine learning projects. Additionally, the scalability of Cloud ML ensures that organizations can optimize their resource usage and avoid over provisioning, further enhancing cost-efficiency. The benefits of Cloud ML, including its immense computational power, dynamic scalability, access to advanced tools and algorithms, collaborative environment, and cost-effectiveness, make it a compelling choice for organizations looking to harness the potential of machine learning. By leveraging the capabilities of the cloud, organizations can accelerate their machine learning initiatives, drive innovation, and gain a competitive edge in today's data-driven landscape. @@ -148,9 +148,9 @@ Cloud ML is deeply integrated into our online experiences, shaping the way we in **Security and Anomaly Detection** -Cloud ML plays a role in bolstering user security by powering anomaly detection systems. These systems continuously monitor user activities and system logs to identify unusual patterns or suspicious behavior. By analyzing vast amounts of data in real-time, Cloud ML algorithms can detect potential cyber threats, such as unauthorized access attempts, malware infections, or data breaches. The cloud's scalability and processing power enable these systems to handle the increasing complexity and volume of security data, providing a proactive approach to protecting users and systems from potential threats. @cloud-ml provides an overview of this section. +Cloud ML plays a role in bolstering user security by powering anomaly detection systems. These systems continuously monitor user activities and system logs to identify unusual patterns or suspicious behavior. By analyzing vast amounts of data in real-time, Cloud ML algorithms can detect potential cyber threats, such as unauthorized access attempts, malware infections, or data breaches. The cloud's scalability and processing power enable these systems to handle the increasing complexity and volume of security data, providing a proactive approach to protecting users and systems from potential threats. @fig-cloud-ml provides an overview of this section. -![Section summary - Cloud ML](contents/ml_systems/images/png/cloudml.png){#cloud-ml} +![Section summary for Cloud ML.](images/png/cloudml.png){#fig-cloud-ml} ## Edge ML @@ -215,9 +215,9 @@ Edge ML plays a crucial role in efficiently managing various systems in smart ho The Industrial IoT leverages Edge ML to monitor and control complex industrial processes. Here, machine learning models can analyze data from numerous sensors in real-time, enabling predictive maintenance, optimizing operations, and enhancing safety measures. This revolution in industrial automation and efficiency is transforming manufacturing and production across various sectors. -The applicability of Edge ML is vast and not limited to these examples. Various other sectors, including healthcare, agriculture, and urban planning, are exploring and integrating Edge ML to develop innovative solutions responsive to real-world needs and challenges, heralding a new era of smart, interconnected systems. @edge-ml provides an overview of this section. +The applicability of Edge ML is vast and not limited to these examples. Various other sectors, including healthcare, agriculture, and urban planning, are exploring and integrating Edge ML to develop innovative solutions responsive to real-world needs and challenges, heralding a new era of smart, interconnected systems. @fig-edge-ml provides an overview of this section. -![Section Summary - Edge ML](contents/ml_systems/images/png/edgeml.png){#edge-ml} +![Section summary for Edge ML.](images/png/edgeml.png){#fig-edge-ml} ## Tiny ML @@ -295,13 +295,13 @@ In environmental monitoring, TinyML enables real-time data analysis from various In summary, TinyML serves as a trailblazer in the evolution of machine learning, fostering innovation across various fields by bringing intelligence directly to the edge. Its potential to transform our interaction with technology and the world is immense, promising a future where devices are connected, intelligent, and capable of making real-time decisions and responses. @tiny-ml provides an overview of this section. -![Section Summary - Tiny ML](contents/ml_systems/images/png/tinyml.png){#tiny-ml} +![Section summary for Tiny ML.](images/png/tinyml.png){#tiny-ml} ## Comparison -Up to this point, we've explored each of the different ML variants individually. Now, let's bring them all together for a comprehensive view. @tbl-big_vs_tiny offers a comparative analysis of Cloud ML, Edge ML, and TinyML based on various features and aspects. Additionally, @venn-diagram draws a contrast using a venn diagram. This comparison provides a clear perspective on the unique advantages and distinguishing factors, aiding in making informed decisions based on the specific needs and constraints of a given application or project. +Up to this point, we've explored each of the different ML variants individually. Now, let's bring them all together for a comprehensive view. @tbl-big_vs_tiny offers a comparative analysis of Cloud ML, Edge ML, and TinyML based on various features and aspects. Additionally, @fig-venn-diagram draws a contrast using a venn diagram. This comparison provides a clear perspective on the unique advantages and distinguishing factors, aiding in making informed decisions based on the specific needs and constraints of a given application or project. -![ML Venn diagram. Source: [arXiv](https://arxiv.org/html/2403.19076v1)](images/png/venndiagram.png){#venn-diagram} +![ML Venn diagram. Source: [arXiv](https://arxiv.org/html/2403.19076v1)](images/png/venndiagram.png){#fig-venn-diagram} +--------------------------+---------------------------------------------------------+---------------------------------------------------------+----------------------------------------------------------+ | Aspect | Cloud ML | Edge ML | TinyML | From 8c4290b1d119343b3ee53fd602c50c043588293f Mon Sep 17 00:00:00 2001 From: Vijay Janapa Reddi Date: Mon, 16 Sep 2024 19:50:48 -0700 Subject: [PATCH 04/13] Fig ref fix --- contents/ml_systems/ml_systems.qmd | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contents/ml_systems/ml_systems.qmd b/contents/ml_systems/ml_systems.qmd index bd72a1eb..d677bc43 100644 --- a/contents/ml_systems/ml_systems.qmd +++ b/contents/ml_systems/ml_systems.qmd @@ -293,9 +293,9 @@ TinyML can be employed to create anomaly detection models that identify unusual In environmental monitoring, TinyML enables real-time data analysis from various field-deployed sensors. These could range from city air quality monitoring to wildlife tracking in protected areas. Through TinyML, data can be processed locally, allowing for quick responses to changing conditions and providing a nuanced understanding of environmental patterns, crucial for informed decision-making. -In summary, TinyML serves as a trailblazer in the evolution of machine learning, fostering innovation across various fields by bringing intelligence directly to the edge. Its potential to transform our interaction with technology and the world is immense, promising a future where devices are connected, intelligent, and capable of making real-time decisions and responses. @tiny-ml provides an overview of this section. +In summary, TinyML serves as a trailblazer in the evolution of machine learning, fostering innovation across various fields by bringing intelligence directly to the edge. Its potential to transform our interaction with technology and the world is immense, promising a future where devices are connected, intelligent, and capable of making real-time decisions and responses. @fig-tiny-ml provides an overview of this section. -![Section summary for Tiny ML.](images/png/tinyml.png){#tiny-ml} +![Section summary for Tiny ML.](images/png/tinyml.png){#fig-tiny-ml} ## Comparison From 96e24f45ea23978b91d2b97fb9c79076a64b95bd Mon Sep 17 00:00:00 2001 From: Vijay Janapa Reddi Date: Mon, 16 Sep 2024 19:53:12 -0700 Subject: [PATCH 05/13] fix figure ref --- contents/ai_for_good/ai_for_good.qmd | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/contents/ai_for_good/ai_for_good.qmd b/contents/ai_for_good/ai_for_good.qmd index 7db4cda9..8197a6f5 100644 --- a/contents/ai_for_good/ai_for_good.qmd +++ b/contents/ai_for_good/ai_for_good.qmd @@ -38,7 +38,7 @@ What is special about the SDGs is that they are a collection of interlinked obje A recent study [@vinuesa2020role] highlights the influence of AI on all aspects of sustainable development, particularly on the 17 Sustainable Development Goals (SDGs) and 169 targets internationally defined in the 2030 Agenda for Sustainable Development. The study shows that AI can act as an enabler for 134 targets through technological improvements, but it also highlights the challenges of AI on some targets. The study shows that AI can benefit 67 targets when considering AI and societal outcomes. Still, it also warns about the issues related to the implementation of AI in countries with different cultural values and wealth. -![United Nations Sustainable Development Goals (SDG). Source: [United Nations](https://sdgs.un.org/goals).](https://www.un.org/sustainabledevelopment/wp-content/uploads/2015/12/english_SDG_17goals_poster_all_languages_with_UN_emblem_1.png){#fig-sdg} +![United Nations Sustainable Development Goals (SDG). Source: [United Nations](https://sdgs.un.org/goals).](https://www.un.org/sustainabledevelopment/wp-content/uploads/2015/12/english_SDG_17goals_poster_all_languages_with_UN_emblem_1.png){#fig-fig-sdg} In our book's context, TinyML could help advance at least some of these SDG goals. @@ -68,7 +68,7 @@ Other sensors, such as GPS units and accelerometers, can track microclimate cond Widespread TinyML applications can help digitize smallholder farms to increase productivity, incomes, and resilience. The low cost of hardware and minimal connectivity requirements make solutions accessible. Projects across the developing world have shown the benefits: -* Microsoft's [FarmBeats](https://www.microsoft.com/en-us/research/project/farmbeats-iot-agriculture/) project is an end-to-end approach to enable data-driven farming by using low-cost sensors, drones, and vision and machine learning algorithms. The project seeks to solve the problem of limited adoption of technology in farming due to the need for more power and internet connectivity in farms and the farmers' limited technology savviness. The project strives to increase farm productivity and reduce costs by coupling data with farmers' knowledge and intuition about their farms. The project has successfully enabled actionable insights from data by building artificial intelligence (AI) or machine learning (ML) models based on fused data sets. @farmbeats illustrates the inner workings of Microsoft's FarmBeats. +* Microsoft's [FarmBeats](https://www.microsoft.com/en-us/research/project/farmbeats-iot-agriculture/) project is an end-to-end approach to enable data-driven farming by using low-cost sensors, drones, and vision and machine learning algorithms. The project seeks to solve the problem of limited adoption of technology in farming due to the need for more power and internet connectivity in farms and the farmers' limited technology savviness. The project strives to increase farm productivity and reduce costs by coupling data with farmers' knowledge and intuition about their farms. The project has successfully enabled actionable insights from data by building artificial intelligence (AI) or machine learning (ML) models based on fused data sets. @fig-farmbeats illustrates the inner workings of Microsoft's FarmBeats. * In Sub-Saharan Africa, off-the-shelf cameras and edge AI have cut cassava disease losses from 40% to 5%, protecting a staple crop [@ramcharan2017deep]. @@ -76,7 +76,7 @@ Widespread TinyML applications can help digitize smallholder farms to increase p With greater investment and integration into rural advisory services, TinyML could transform small-scale agriculture and improve farmers' livelihoods worldwide. The technology effectively brings the benefits of precision agriculture to disconnected regions most in need. -![Microsoft Farmbeats. Source: [MOLD](https://thisismold.com/space/farm-systems/does-farmbeats-really-march-to-a-different-tune)](images/png/msfarmbeats.png){#farmbeats} +![Microsoft Farmbeats enables data-driven decisions to improve agricultural yield, lower overall costs, and reduce the environmental impact of agricultural production. Source: [MOLD](https://thisismold.com/space/farm-systems/does-farmbeats-really-march-to-a-different-tune)](images/png/msfarmbeats.png){#fig-farmbeats} :::{#exr-agri .callout-caution collapse="true"} From 5589f713d2737977d99a5a0a0229c815094c1e2b Mon Sep 17 00:00:00 2001 From: Vijay Janapa Reddi Date: Mon, 16 Sep 2024 19:56:38 -0700 Subject: [PATCH 06/13] Char fixes --- contents/dl_primer/dl_primer.qmd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contents/dl_primer/dl_primer.qmd b/contents/dl_primer/dl_primer.qmd index 177cfbc5..b5db20f6 100644 --- a/contents/dl_primer/dl_primer.qmd +++ b/contents/dl_primer/dl_primer.qmd @@ -120,7 +120,7 @@ The training process involves several key steps, beginning with the forward pass #### Forward Pass -The forward pass is the initial phase where data moves through the network from the input to the output layer. At the start of training, the network's weights are randomly initialized, setting the initial conditions for learning. During the forward pass, each layer performs specific computations on the input data using these weights and biases, and the results are then passed to the subsequent layer. The final output of this phase is the network’s prediction. This prediction is compared to the actual target values present in the dataset to calculate the loss, which can be thought of as the difference between the predicted outputs and the target values. The loss quantifies the network’s performance at this stage, providing a crucial metric for the subsequent adjustment of weights during the backward pass. +The forward pass is the initial phase where data moves through the network from the input to the output layer. At the start of training, the network's weights are randomly initialized, setting the initial conditions for learning. During the forward pass, each layer performs specific computations on the input data using these weights and biases, and the results are then passed to the subsequent layer. The final output of this phase is the network's prediction. This prediction is compared to the actual target values present in the dataset to calculate the loss, which can be thought of as the difference between the predicted outputs and the target values. The loss quantifies the network's performance at this stage, providing a crucial metric for the subsequent adjustment of weights during the backward pass. @vid-nn below explains how neural networks work using handwritten digit recognition as an example application. It also touches on the math underlying neural nets. From bea155182f30197e5168df0e227118c87dce213a Mon Sep 17 00:00:00 2001 From: Vijay Janapa Reddi Date: Mon, 16 Sep 2024 19:56:59 -0700 Subject: [PATCH 07/13] Removed unnecessary figures --- contents/benchmarking/benchmarking.qmd | 2 -- 1 file changed, 2 deletions(-) diff --git a/contents/benchmarking/benchmarking.qmd b/contents/benchmarking/benchmarking.qmd index 1fcf62a7..bf28baa9 100644 --- a/contents/benchmarking/benchmarking.qmd +++ b/contents/benchmarking/benchmarking.qmd @@ -242,8 +242,6 @@ Benchmarking the training phase provides insights into how different model archi On the other hand, benchmarking inference evaluates model performance in real-world conditions after deployment. Key metrics include latency, throughput, memory footprint, and power consumption. This type of benchmarking determines if a model meets the requirements of its target application regarding response time and device constraints. However, we will discuss these broadly to ensure a general understanding. -![Deep learning: training and inference. Source: [NVIDIA](https://blogs.nvidia.com/blog/difference-deep-learning-training-inference-ai/)](images/png/trainingvsinference.png){#training-vs-inference} - ### Training Benchmarks Training represents the phase where the system processes and ingests raw data to adjust and refine its parameters. Therefore, it is an algorithmic activity and involves system-level considerations, including data pipelines, storage, computing resources, and orchestration mechanisms. The goal is to ensure that the ML system can efficiently learn from data, optimizing both the model's performance and the system's resource utilization. From 02fe5761f934ae767fbecd633be2dd6254cb46a2 Mon Sep 17 00:00:00 2001 From: Vijay Janapa Reddi Date: Mon, 16 Sep 2024 19:59:30 -0700 Subject: [PATCH 08/13] Formatting fix + fig ref --- contents/benchmarking/benchmarking.qmd | 4 ++-- contents/data_engineering/data_engineering.qmd | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/contents/benchmarking/benchmarking.qmd b/contents/benchmarking/benchmarking.qmd index bf28baa9..4a22e161 100644 --- a/contents/benchmarking/benchmarking.qmd +++ b/contents/benchmarking/benchmarking.qmd @@ -748,9 +748,9 @@ There are several benefits to adopting a data-centric approach to AI development Additionally, a data-centric approach can often lead to simpler models that are easier to interpret and maintain. This is because the emphasis is on the data rather than the model architecture, meaning simpler models can achieve high performance when trained on high-quality data. -The shift towards data-centric AI represents a significant paradigm shift. By prioritizing the quality of the input data, this approach tries to model performance and generalization capabilities, ultimately leading to more robust and reliable AI systems. As we continue to advance in our understanding and application of AI, the data-centric approach is likely to play an important role in shaping the future of this field. +The shift towards data-centric AI represents a significant paradigm shift. By prioritizing the quality of the input data, this approach tries to model performance and generalization capabilities, ultimately leading to more robust and reliable AI systems. @fig-data-vs-model illustrates this difference. As we continue to advance in our understanding and application of AI, the data-centric approach is likely to play an important role in shaping the future of this field. -![Model-centric vs. Data-centric ML development. Source: [NVIDIA](https://blogs.nvidia.com/blog/difference-deep-learning-training-inference-ai/)](images/png/datavsmodelai.png){#data-vs-model} +![Model-centric vs. Data-centric ML development. Source: [NVIDIA](https://blogs.nvidia.com/blog/difference-deep-learning-training-inference-ai/)](images/png/datavsmodelai.png){#fig-data-vs-model} ### Benchmarking Data diff --git a/contents/data_engineering/data_engineering.qmd b/contents/data_engineering/data_engineering.qmd index 8ebda5e7..71ae6336 100644 --- a/contents/data_engineering/data_engineering.qmd +++ b/contents/data_engineering/data_engineering.qmd @@ -247,9 +247,9 @@ Data sourcing and data storage go hand in hand, and data must be stored in a for : Comparative overview of the database, data warehouse, and data lake. {#tbl-storage .striped .hover} -The stored data is often accompanied by metadata, defined as 'data about data .'It provides detailed contextual information about the data, such as means of data creation, time of creation, attached data use license, etc. For example, [Hugging Face](https://huggingface.co/) has [Dataset Cards](https://huggingface.co/docs/hub/datasets-cards). To promote responsible data use, dataset creators should disclose potential biases through the dataset cards. These cards can educate users about a dataset's contents and limitations. The cards also give vital context on appropriate dataset usage by highlighting biases and other important details. Having this type of metadata can also allow fast retrieval if structured properly. Once the model is developed and deployed to edge devices, the storage systems can continue to store incoming data, model updates, or analytical results. @data-collection showcases the pillars of data collection and their collection methods. +The stored data is often accompanied by metadata, defined as 'data about data.' It provides detailed contextual information about the data, such as means of data creation, time of creation, attached data use license, etc. For example, [Hugging Face](https://huggingface.co/) has [Dataset Cards](https://huggingface.co/docs/hub/datasets-cards). To promote responsible data use, dataset creators should disclose potential biases through the dataset cards. These cards can educate users about a dataset's contents and limitations. The cards also give vital context on appropriate dataset usage by highlighting biases and other important details. Having this type of metadata can also allow fast retrieval if structured properly. Once the model is developed and deployed to edge devices, the storage systems can continue to store incoming data, model updates, or analytical results. @fig-data-collection showcases the pillars of data collection and their collection methods. -![Pillars of data collection. Source: [Alexsoft](https://www.altexsoft.com/blog/data-collection-machine-learning/)](images/png/datacollection.png){#data-collection} +![Pillars of data collection. Source: [Alexsoft](https://www.altexsoft.com/blog/data-collection-machine-learning/)](images/png/datacollection.png){#fig-data-collection} **Data Governance:** With a large amount of data storage, it is also imperative to have policies and practices (i.e., data governance) that help manage data during its life cycle, from acquisition to disposal. Data governance outlines how data is managed and includes making key decisions about data access and control. @fig-governance illustrates the different domains involved in data governance. It involves exercising authority and making decisions concerning data to uphold its quality, ensure compliance, maintain security, and derive value. Data governance is operationalized by developing policies, incentives, and penalties, cultivating a culture that perceives data as a valuable asset. Specific procedures and assigned authorities are implemented to safeguard data quality and monitor its utilization and related risks. From a5f001173b0c357e12601d82ca77033d36d57d0b Mon Sep 17 00:00:00 2001 From: Vijay Janapa Reddi Date: Mon, 16 Sep 2024 20:11:15 -0700 Subject: [PATCH 09/13] fix fig references --- contents/dl_primer/dl_primer.qmd | 12 +++++------ contents/efficient_ai/efficient_ai.qmd | 10 ++++------ contents/frameworks/frameworks.qmd | 20 +++++++++---------- contents/hw_acceleration/hw_acceleration.qmd | 12 +++++------ contents/ops/ops.qmd | 4 ++-- .../privacy_security/privacy_security.qmd | 8 ++++---- contents/sustainable_ai/sustainable_ai.qmd | 4 ++-- contents/workflow/workflow.qmd | 4 ++-- 8 files changed, 36 insertions(+), 38 deletions(-) diff --git a/contents/dl_primer/dl_primer.qmd b/contents/dl_primer/dl_primer.qmd index b5db20f6..000337e6 100644 --- a/contents/dl_primer/dl_primer.qmd +++ b/contents/dl_primer/dl_primer.qmd @@ -54,11 +54,11 @@ Organizations worldwide recognize deep learning's transformative potential and i ### Applications of Deep Learning -Deep learning is extensively used across numerous industries today, and its transformative impact on society is evident. In finance, it powers stock market prediction, risk assessment, and fraud detection. For instance, deep learning algorithms can predict stock market trends, guide investment strategies, and improve financial decisions. In marketing, it drives customer segmentation, personalization, and content optimization. Deep learning analyzes consumer behavior and preferences to enable highly targeted advertising and personalized content delivery. In manufacturing, deep learning streamlines production processes and enhances quality control by continuously analyzing large volumes of data. This allows companies to boost productivity and minimize waste, leading to the production of higher quality goods at lower costs. In healthcare, machine learning aids in diagnosis, treatment planning, and patient monitoring. Similarly, deep learning can make medical predictions that improve patient diagnosis and save lives. The benefits are clear: machine learning predicts with greater accuracy than humans and does so much more quickly.@deeplearning further illustrates some applications of deep learning. +Deep learning is extensively used across numerous industries today, and its transformative impact on society is evident. In finance, it powers stock market prediction, risk assessment, and fraud detection. For instance, deep learning algorithms can predict stock market trends, guide investment strategies, and improve financial decisions. In marketing, it drives customer segmentation, personalization, and content optimization. Deep learning analyzes consumer behavior and preferences to enable highly targeted advertising and personalized content delivery. In manufacturing, deep learning streamlines production processes and enhances quality control by continuously analyzing large volumes of data. This allows companies to boost productivity and minimize waste, leading to the production of higher quality goods at lower costs. In healthcare, machine learning aids in diagnosis, treatment planning, and patient monitoring. Similarly, deep learning can make medical predictions that improve patient diagnosis and save lives. The benefits are clear: machine learning predicts with greater accuracy than humans and does so much more quickly. @fig-deeplearning further illustrates some applications of deep learning. Deep learning enhances everyday products, such as strengthening Netflix's recommender systems to provide users with more [personalized recommendations](https://dl.acm.org/doi/abs/10.1145/3543873.3587675). At Google, deep learning models have driven significant improvements in [Google Translate](https://research.google/blog/recent-advances-in-google-translate/), enabling it to handle over [100 languages](https://cloud.google.com/translate/docs/languages). Autonomous vehicles from companies like Waymo, Cruise, and Motional have become a reality through the use of deep learning in their [perception system](https://motional.com/news/technically-speaking-improving-av-perception-through-transformative-machine-learning). Additionally, Amazon employs deep learning at the edge in their Alexa devices to perform [keyword spotting](https://towardsdatascience.com/how-amazon-alexa-works-your-guide-to-natural-language-processing-ai-7506004709d3). -![Deep learning applications, benefits and implementations. Source: [Leeway Hertz](https://www.leewayhertz.com/what-is-deep-learning/)](images/png/deeplearning.png){#deeplearning} +![Deep learning applications, benefits and implementations. Source: [Leeway Hertz](https://www.leewayhertz.com/what-is-deep-learning/)](images/png/deeplearning.png){#fig-deeplearning} ### Relevance to Embedded AI @@ -126,9 +126,9 @@ The forward pass is the initial phase where data moves through the network from :::{#vid-nn .callout-important} -@forward-propagation explains the concept of forward pass using an illustration. +@fig-forward-propagation explains the concept of forward pass using an illustration. -![Neural networks - forward and backward propagation. Source: [Linkedin](https://www.linkedin.com/pulse/lecture2-unveiling-theoretical-foundations-ai-machine-underdown-phd-oqsuc/)](images/png/forwardpropagation.png){#forward-propagation} +![Neural networks - forward and backward propagation. Source: [Linkedin](https://www.linkedin.com/pulse/lecture2-unveiling-theoretical-foundations-ai-machine-underdown-phd-oqsuc/)](images/png/forwardpropagation.png){#fig-forward-propagation} # Neural Networks @@ -233,7 +233,7 @@ These architectures serve specific purposes and excel in different domains, offe ### Traditional ML vs Deep Learning -Deep learning extends traditional machine learning by utilizing neural networks to discern patterns in data. In contrast, traditional machine learning relies on a set of established algorithms such as decision trees, k-nearest neighbors, and support vector machines, but does not involve neural networks. To briefly highlight the differences, @tbl-mlvsdl illustrates the contrasting characteristics between traditional ML and deep learning. @ml-vs-dl further explains the differences between Machine Learning and Deep Learning. +Deep learning extends traditional machine learning by utilizing neural networks to discern patterns in data. In contrast, traditional machine learning relies on a set of established algorithms such as decision trees, k-nearest neighbors, and support vector machines, but does not involve neural networks. To briefly highlight the differences, @tbl-mlvsdl illustrates the contrasting characteristics between traditional ML and deep learning. @fig-ml-vs-dl further explains the differences between Machine Learning and Deep Learning. +-------------------------------+-----------------------------------------------------------+--------------------------------------------------------------+ | Aspect | Traditional ML | Deep Learning | @@ -251,7 +251,7 @@ Deep learning extends traditional machine learning by utilizing neural networks | Maintenance | Easier (simple to update and maintain) | Complex (requires more efforts in maintenance and updates) | +-------------------------------+-----------------------------------------------------------+--------------------------------------------------------------+ -![Comparing Machine Learning and Deep Learning. Source: [Medium](https://aoyilmaz.medium.com/understanding-the-differences-between-deep-learning-and-machine-learning-eb41d64f1732)](images/png/mlvsdl.png){#ml-vs-dl} +![Comparing Machine Learning and Deep Learning. Source: [Medium](https://aoyilmaz.medium.com/understanding-the-differences-between-deep-learning-and-machine-learning-eb41d64f1732)](images/png/mlvsdl.png){#fig-ml-vs-dl} : Comparison of traditional machine learning and deep learning. {#tbl-mlvsdl .striped .hover} diff --git a/contents/efficient_ai/efficient_ai.qmd b/contents/efficient_ai/efficient_ai.qmd index 62bf1dad..9ebd1b27 100644 --- a/contents/efficient_ai/efficient_ai.qmd +++ b/contents/efficient_ai/efficient_ai.qmd @@ -76,22 +76,20 @@ Model compression methods are essential for bringing deep learning models to dev ![Different forms of quantization.](images/jpg/quantization.jpeg){#fig-quantization} -**Knowledge Distillation:** Knowledge distillation involves training a smaller model (student) to replicate the behavior of a larger model (teacher). The idea is to transfer the knowledge from the cumbersome model to the lightweight one. Hence, the smaller model attains performance close to its larger counterpart but with significantly fewer parameters. @knowledge-dist demonstrates the tutor-student framework for knowledge distillation. We will explore knowledge distillation in more detail in the @sec-kd. +**Knowledge Distillation:** Knowledge distillation involves training a smaller model (student) to replicate the behavior of a larger model (teacher). The idea is to transfer the knowledge from the cumbersome model to the lightweight one. Hence, the smaller model attains performance close to its larger counterpart but with significantly fewer parameters. @fig-knowledge-dist demonstrates the tutor-student framework for knowledge distillation. We will explore knowledge distillation in more detail in the @sec-kd. -![The tutor-student framework for knowledge distillation. Source: [Medium](URL:https://chukwubuikexo.medium.com/knowledge-distillation-approaches-in-machine-learning-5841a41a346a)](images/png/knowledgedistillation.png){#knowledge-dist} +![The tutor-student framework for knowledge distillation. Source: [Medium](URL:https://chukwubuikexo.medium.com/knowledge-distillation-approaches-in-machine-learning-5841a41a346a)](images/png/knowledgedistillation.png){#fig-knowledge-dist} ## Efficient Inference Hardware -In the [Training](../training/training.qmd) chapter, we discussed the process of training AI models. Now, from an efficiency standpoint, it’s important to note that training is a resource and time-intensive task, often requiring powerful hardware and taking anywhere from hours to weeks to complete. Inference, on the other hand, needs to be as fast as possible, especially in real-time applications. This is where efficient inference hardware comes into play. By optimizing the hardware specifically for inference tasks, we can achieve rapid response times and power-efficient operation, which is especially crucial for edge devices and embedded systems. +In the [Training](../training/training.qmd) chapter, we discussed the process of training AI models. Now, from an efficiency standpoint, it's important to note that training is a resource and time-intensive task, often requiring powerful hardware and taking anywhere from hours to weeks to complete. Inference, on the other hand, needs to be as fast as possible, especially in real-time applications. This is where efficient inference hardware comes into play. By optimizing the hardware specifically for inference tasks, we can achieve rapid response times and power-efficient operation, which is especially crucial for edge devices and embedded systems. **TPUs (Tensor Processing Units):** [TPUs](https://cloud.google.com/tpu) are custom-built ASICs (Application-Specific Integrated Circuits) by Google to accelerate machine learning workloads [@jouppi2017datacenter]. They are optimized for tensor operations, offering high throughput for low-precision arithmetic, and are designed specifically for neural network machine learning. TPUs significantly accelerate model training and inference compared to general-purpose GPU/CPUs. This boost means faster model training and real-time or near-real-time inference capabilities, crucial for applications like voice search and augmented reality. [Edge TPUs](https://cloud.google.com/edge-tpu) are a smaller, power-efficient version of Google's TPUs tailored for edge devices. They provide fast on-device ML inferencing for TensorFlow Lite models. Edge TPUs allow for low-latency, high-efficiency inference on edge devices like smartphones, IoT devices, and embedded systems. AI capabilities can be deployed in real-time applications without communicating with a central server, thus saving bandwidth and reducing latency. Consider the table in @fig-edge-tpu-perf. It shows the performance differences between running different models on CPUs versus a Coral USB accelerator. The Coral USB accelerator is an accessory by Google's Coral AI platform that lets developers connect Edge TPUs to Linux computers. Running inference on the Edge TPUs was 70 to 100 times faster than on CPUs. -![Accelerator vs CPU performance comparison across different hardware configurations. Desktop CPU: 64-bit Intel(R) Xeon(R) E5–1650 v4 @ 3.60GHz. Embedded CPU: Quad-core Cortex-A53 @ 1.5GHz, †Dev Board: Quad-core Cortex-A53 @ 1.5GHz + Edge TPU. Source: [TensorFlow Blog.](https://blog.tensorflow.org/2019/03/build-ai-that-works-offline-with-coral.html)](images/png/tflite_edge_tpu_perf.png){#fig-edge-tpu-perf} - - +![Accelerator vs CPU performance comparison across different hardware configurations. Desktop CPU: 64-bit Intel(R) Xeon(R) E5-1650 v4 @ 3.60GHz. Embedded CPU: Quad-core Cortex-A53 @ 1.5GHz, †Dev Board: Quad-core Cortex-A53 @ 1.5GHz + Edge TPU. Source: [TensorFlow Blog.](https://blog.tensorflow.org/2019/03/build-ai-that-works-offline-with-coral.html)](images/png/tflite_edge_tpu_perf.png){#fig-edge-tpu-perf} **NN (Neural Network) Accelerators:** Fixed-function neural network accelerators are hardware accelerators designed explicitly for neural network computations. They can be standalone chips or part of a larger system-on-chip (SoC) solution. By optimizing the hardware for the specific operations that neural networks require, such as matrix multiplications and convolutions, NN accelerators can achieve faster inference times and lower power consumption than general-purpose CPUs and GPUs. They are especially beneficial in TinyML devices with power or thermal constraints, such as smartwatches, micro-drones, or robotics. diff --git a/contents/frameworks/frameworks.qmd b/contents/frameworks/frameworks.qmd index a95bd7c2..c369eb7d 100644 --- a/contents/frameworks/frameworks.qmd +++ b/contents/frameworks/frameworks.qmd @@ -74,9 +74,9 @@ Each generation of frameworks unlocked new capabilities that powered advancement * TensorFlow Graphics (2020) added 3D data structures to handle point clouds and meshes. -In recent years, the frameworks have converged. @fig-ml-framework shows that TensorFlow and PyTorch have become the overwhelmingly dominant ML frameworks, representing more than 95% of ML frameworks used in research and production. @tensorflow-pytorch draws a contrast between the attributes of TensorFlow and PyTorch. Keras was integrated into TensorFlow in 2019; Preferred Networks transitioned Chainer to PyTorch in 2019; and Microsoft stopped actively developing CNTK in 2022 to support PyTorch on Windows. +In recent years, the frameworks have converged. @fig-ml-framework shows that TensorFlow and PyTorch have become the overwhelmingly dominant ML frameworks, representing more than 95% of ML frameworks used in research and production. @fig-tensorflow-pytorch draws a contrast between the attributes of TensorFlow and PyTorch. Keras was integrated into TensorFlow in 2019; Preferred Networks transitioned Chainer to PyTorch in 2019; and Microsoft stopped actively developing CNTK in 2022 to support PyTorch on Windows. -![PyTorch vs. TensorFlow: Features and Functions. Source: [K&C](https://www.google.com/url?sa=i&url=https%3A%2F%2Fkruschecompany.com%2Fpytorch-vs-tensorflow%2F&psig=AOvVaw1-DSFxXYprQmYH7Z4Nk6Tk&ust=1722533288351000&source=images&cd=vfe&opi=89978449&ved=0CBEQjRxqFwoTCPDhst7m0YcDFQAAAAAdAAAAABAg)](images/png/tensorflowpytorch.png){#tensorflow-pytorch} +![PyTorch vs. TensorFlow: Features and Functions. Source: [K&C](https://www.google.com/url?sa=i&url=https%3A%2F%2Fkruschecompany.com%2Fpytorch-vs-tensorflow%2F&psig=AOvVaw1-DSFxXYprQmYH7Z4Nk6Tk&ust=1722533288351000&source=images&cd=vfe&opi=89978449&ved=0CBEQjRxqFwoTCPDhst7m0YcDFQAAAAAdAAAAABAg)](images/png/tensorflowpytorch.png){#fig-tensorflow-pytorch} ![Popularity of ML frameworks in the United States as measured by Google web searches. Source: Google.](images/png/image6.png){#fig-ml-framework} @@ -374,9 +374,9 @@ x = torch.randn(4,784) y = torch.matmul(x, weights) + biases ``` -The above example does not have separate compile/build/run phases. Ops define and execute immediately. With dynamic graphs, the definition is intertwined with execution, providing a more intuitive, interactive workflow. However, the downside is that there is less potential for optimization since the framework only sees the graph as it is built. @static-vs-dynamic demonstrates the differences between a static and dynamic computation graph. +The above example does not have separate compile/build/run phases. Ops define and execute immediately. With dynamic graphs, the definition is intertwined with execution, providing a more intuitive, interactive workflow. However, the downside is that there is less potential for optimization since the framework only sees the graph as it is built. @fig-static-vs-dynamic demonstrates the differences between a static and dynamic computation graph. -![Comparing Static and Dynamic graphs. Source: [Dev](https://www.google.com/url?sa=i&url=https%3A%2F%2Fdev-jm.tistory.com%2F4&psig=AOvVaw0r1cZbZa6iImYP-fesrN7H&ust=1722533107591000&source=images&cd=vfe&opi=89978449&ved=0CBQQjhxqFwoTCLC8nYHm0YcDFQAAAAAdAAAAABAY)](images/png/staticvsdynamic.png){#static-vs-dynamic} +![Comparing static and dynamic graphs. Source: [Dev](https://www.google.com/url?sa=i&url=https%3A%2F%2Fdev-jm.tistory.com%2F4&psig=AOvVaw0r1cZbZa6iImYP-fesrN7H&ust=1722533107591000&source=images&cd=vfe&opi=89978449&ved=0CBQQjhxqFwoTCLC8nYHm0YcDFQAAAAAdAAAAABAY)](images/png/staticvsdynamic.png){#fig-static-vs-dynamic} Recently, the distinction has blurred as frameworks adopt both modes. TensorFlow 2.0 defaults to dynamic graph mode while letting users work with static graphs when needed. Dynamic declaration offers flexibility and ease of use, making frameworks more user-friendly, while static graphs provide optimization benefits at the cost of interactivity. The ideal framework balances these approaches. @tbl-exec-graph compares the pros and cons of static versus dynamic execution graphs: @@ -425,9 +425,9 @@ Data loaders also support caching and prefetching strategies to optimize data de Machine learning frameworks like TensorFlow and PyTorch provide tools to simplify and streamline the process of data augmentation, enhancing the efficiency of expanding datasets synthetically. These frameworks offer integrated functionalities to apply random transformations, such as flipping, cropping, rotating, altering color, and adding noise for images. For audio data, common augmentations involve mixing clips with background noise or modulating speed, pitch, and volume. -By integrating augmentation tools into the data pipeline, frameworks enable these transformations to be applied on the fly during each training epoch. This approach increases the variation in the training data distribution, thereby reducing overfitting and improving model generalization. @overfitting demonstrates the cases of overfitting and underfitting. The use of performant data loaders in combination with extensive augmentation capabilities allows practitioners to efficiently feed massive, varied datasets to neural networks. +By integrating augmentation tools into the data pipeline, frameworks enable these transformations to be applied on the fly during each training epoch. This approach increases the variation in the training data distribution, thereby reducing overfitting and improving model generalization. @fig-overfitting demonstrates the cases of overfitting and underfitting. The use of performant data loaders in combination with extensive augmentation capabilities allows practitioners to efficiently feed massive, varied datasets to neural networks. -![Overfitting vs. Underfitting. Source: [Aquarium Learning](https://www.google.com/url?sa=i&url=https%3A%2F%2Fwww.aquariumlearning.com%2Fblog-posts%2Fto-make-your-model-better-first-figure-out-whats-wrong&psig=AOvVaw3FodMJATpeLeeSsuQZBD51&ust=1722534629114000&source=images&cd=vfe&opi=89978449&ved=0CBEQjRxqGAoTCNiU49br0YcDFQAAAAAdAAAAABCoAQ)](images/png/overfittingunderfitting.png){#overfitting} +![Overfitting versus underfitting. Source: [Aquarium Learning](https://www.google.com/url?sa=i&url=https%3A%2F%2Fwww.aquariumlearning.com%2Fblog-posts%2Fto-make-your-model-better-first-figure-out-whats-wrong&psig=AOvVaw3FodMJATpeLeeSsuQZBD51&ust=1722534629114000&source=images&cd=vfe&opi=89978449&ved=0CBEQjRxqGAoTCNiU49br0YcDFQAAAAAdAAAAABCoAQ)](images/png/overfittingunderfitting.png){#fig-overfitting} These hands-off data pipelines represent a significant improvement in usability and productivity. They allow developers to focus more on model architecture and less on data wrangling when training deep learning models. @@ -487,9 +487,9 @@ Visualization tools provide insight into models: * Projection - Reduce dimensionality for intuitive visualization. -* Precision-recall curves - Assess classification tradeoffs. @precision-recall shows an example of a precision-recall curve. +* Precision-recall curves - Assess classification tradeoffs. @fig-precision-recall shows an example of a precision-recall curve. -![Reading a precision-recall curve. Source: [AIM](https://www.google.com/url?sa=i&url=https%3A%2F%2Fwww.techtarget.com%2Fsearchcio%2Fdefinition%2Ftransfer-learning&psig=AOvVaw0Cbiewbu_6NsNVf314C9Q8&ust=1722534991962000&source=images&cd=vfe&opi=89978449&ved=0CBEQjRxqFwoTCPj5jITt0YcDFQAAAAAdAAAAABAE)](images/png/precisionrecall.png){#precision-recall} +![Reading a precision-recall curve. Source: [AIM](https://www.google.com/url?sa=i&url=https%3A%2F%2Fwww.techtarget.com%2Fsearchcio%2Fdefinition%2Ftransfer-learning&psig=AOvVaw0Cbiewbu_6NsNVf314C9Q8&ust=1722534991962000&source=images&cd=vfe&opi=89978449&ved=0CBEQjRxqFwoTCPj5jITt0YcDFQAAAAAdAAAAABAE)](images/png/precisionrecall.png){#fig-precision-recall} Tools like [TensorBoard](https://www.tensorflow.org/tensorboard/scalars_and_keras) for TensorFlow and [TensorWatch](https://github.com/microsoft/tensorwatch) for PyTorch enable real-time metrics and visualization during training. @@ -549,9 +549,9 @@ These steps to remove barriers to entry continue to democratize machine learning Transfer learning is the practice of using knowledge gained from a pre-trained model to train and improve the performance of a model for a different task. For example, models such as MobileNet and ResNet are trained on the ImageNet dataset. To do so, one may freeze the pre-trained model, utilizing it as a feature extractor to train a much smaller model built on top of the feature extraction. One can also fine-tune the entire model to fit the new task. Machine learning frameworks make it easy to load pre-trained models, freeze specific layers, and train custom layers on top. They simplify this process by providing intuitive APIs and easy access to large repositories of [pre-trained models](https://keras.io/api/applications/). -Transfer learning has challenges, such as the modified model's inability to conduct its original tasks after transfer learning. Papers such as ["Learning without Forgetting"](https://browse.arxiv.org/pdf/1606.09282.pdf) by @li2017learning try to address these challenges and have been implemented in modern machine learning platforms. @transfer-learning simplifies the concept of transfer learning through an example. +Transfer learning has challenges, such as the modified model's inability to conduct its original tasks after transfer learning. Papers such as ["Learning without Forgetting"](https://browse.arxiv.org/pdf/1606.09282.pdf) by @li2017learning try to address these challenges and have been implemented in modern machine learning platforms. @fig-transfer-learning simplifies the concept of transfer learning through an example. -![Transfer learning. Source: [Tech Target](https://www.google.com/url?sa=i&url=https%3A%2F%2Fanalyticsindiamag.com%2Fdevelopers-corner%2Fcomplete-guide-to-understanding-precision-and-recall-curves%2F&psig=AOvVaw3MosZItazJt2eermLTArjj&ust=1722534897757000&source=images&cd=vfe&opi=89978449&ved=0CBEQjRxqFwoTCIi389bs0YcDFQAAAAAdAAAAABAw)](images/png/transferlearning.png){#transfer-learning} +![Transfer learning. Source: [Tech Target](https://www.google.com/url?sa=i&url=https%3A%2F%2Fanalyticsindiamag.com%2Fdevelopers-corner%2Fcomplete-guide-to-understanding-precision-and-recall-curves%2F&psig=AOvVaw3MosZItazJt2eermLTArjj&ust=1722534897757000&source=images&cd=vfe&opi=89978449&ved=0CBEQjRxqFwoTCIi389bs0YcDFQAAAAAdAAAAABAw)](images/png/transferlearning.png){#fig-transfer-learning} #### Federated Learning diff --git a/contents/hw_acceleration/hw_acceleration.qmd b/contents/hw_acceleration/hw_acceleration.qmd index a2f2d929..d86f1c17 100644 --- a/contents/hw_acceleration/hw_acceleration.qmd +++ b/contents/hw_acceleration/hw_acceleration.qmd @@ -696,11 +696,11 @@ The [benchmarking chapter](../benchmarking/benchmarking.qmd) explores this topic Benchmarking suites such as MLPerf, Fathom, and AI Benchmark offer a set of standardized tests that can be used across different hardware platforms. These suites measure AI accelerator performance across various neural networks and machine learning tasks, from basic image classification to complex language processing. Providing a common ground for Comparison, they help ensure that performance claims are consistent and verifiable. These "tools" are applied not only to guide the development of hardware but also to ensure that the software stack leverages the full potential of the underlying architecture. -* **MLPerf:** Includes a broad set of benchmarks covering both training [@mattson2020mlperf] and inference [@reddi2020mlperf] for a range of machine learning tasks. @ml-perf showcases the uses of MLperf. +* **MLPerf:** Includes a broad set of benchmarks covering both training [@mattson2020mlperf] and inference [@reddi2020mlperf] for a range of machine learning tasks. @fig-ml-perf showcases the uses of MLperf. * **Fathom:** Focuses on core operations in deep learning models, emphasizing their execution on different architectures [@adolf2016fathom]. * **AI Benchmark:** Targets mobile and consumer devices, assessing AI performance in end-user applications [@ignatov2018ai]. -![MLPerf Training v3.0 and its uses. Source: [Forbes](https://www.forbes.com/sites/stevemcdowell/2023/06/27/nvidia-h100-dominates-new-mlperf-v30-benchmark-results/)](images/png/mlperf.png){#ml-perf} +![MLPerf Training v3.0 and its uses. Source: [Forbes](https://www.forbes.com/sites/stevemcdowell/2023/06/27/nvidia-h100-dominates-new-mlperf-v30-benchmark-results/)](images/png/mlperf.png){#fig-ml-perf} Benchmarks also have performance metrics that are the quantifiable measures used to evaluate the effectiveness of AI accelerators. These metrics provide a comprehensive view of an accelerator's capabilities and are used to guide the design and selection process for AI systems. Common metrics include: @@ -949,9 +949,9 @@ As a result, optical computing is still in the very early research stage despite Quantum computers leverage unique phenomena of quantum physics, like superposition and entanglement, to represent and process information in ways not possible classically. Instead of binary bits, the fundamental unit is the quantum bit or qubit. Unlike classical bits, which are limited to 0 or 1, qubits can exist simultaneously in a superposition of both states due to quantum effects. -Multiple qubits can also be entangled, leading to exponential information density but introducing probabilistic results. Superposition enables parallel computation on all possible states, while entanglement allows nonlocal correlations between qubits. @qubit simulates the structure of a qubit. +Multiple qubits can also be entangled, leading to exponential information density but introducing probabilistic results. Superposition enables parallel computation on all possible states, while entanglement allows nonlocal correlations between qubits. @fig-qubit simulates the structure of a qubit. -![Qubits, the building blocks of quantum computing. Source: [Microsoft](https://azure.microsoft.com/en-gb/resources/cloud-computing-dictionary/what-is-a-qubit)](images/png/qubit.png){#qubit} +![Qubits, the building blocks of quantum computing. Source: [Microsoft](https://azure.microsoft.com/en-gb/resources/cloud-computing-dictionary/what-is-a-qubit)](images/png/qubit.png){#fig-qubit} Quantum algorithms carefully manipulate these inherently quantum mechanical effects to solve problems like optimization or search more efficiently than their classical counterparts in theory. @@ -968,9 +968,9 @@ However, quantum states are fragile and prone to errors that require error-corre While meaningful quantum advantage for ML remains far off, active research at companies like [D-Wave](https://www.dwavesys.com/company/about-d-wave/), [Rigetti](https://www.rigetti.com/), and [IonQ](https://ionq.com/) is advancing quantum computer engineering and quantum algorithms. Major technology companies like Google, [IBM](https://www.ibm.com/quantum?utm_content=SRCWW&p1=Search&p4C700050385964705&p5=e&gclid=Cj0KCQjw-pyqBhDmARIsAKd9XIPD9U1Sjez_S0z5jeDDE4nRyd6X_gtVDUKJ-HIolx2vOc599KgW8gAaAv8gEALw_wcB&gclsrc=aw.ds), and Microsoft are actively exploring quantum computing. Google recently announced a 72-qubit quantum processor called [Bristlecone](https://blog.research.google/2018/03/a-preview-of-bristlecone-googles-new.html) and plans to build a 49-qubit commercial quantum system. Microsoft also has an active research program in topological quantum computing and collaborates with quantum startup [IonQ](https://ionq.com/) -Quantum techniques may first make inroads into optimization before more generalized ML adoption. Realizing quantum ML's full potential awaits major milestones in quantum hardware development and ecosystem maturity. @q-computing illustrates a comparison between quantum computing and classical computing. +Quantum techniques may first make inroads into optimization before more generalized ML adoption. Realizing quantum ML's full potential awaits major milestones in quantum hardware development and ecosystem maturity. @fig-q-computing illustrates a comparison between quantum computing and classical computing. -![Comparing Quantum Computing with Classical Computing. Source: [Devopedia](​​https://devopedia.org/quantum-computing)](images/png/qcomputing.png){#q-computing} +![Comparing quantum computing with classical computing. Source: [Devopedia](​​https://devopedia.org/quantum-computing)](images/png/qcomputing.png){#fig-q-computing} ## Future Trends diff --git a/contents/ops/ops.qmd b/contents/ops/ops.qmd index 3d791258..46da88e6 100644 --- a/contents/ops/ops.qmd +++ b/contents/ops/ops.qmd @@ -762,9 +762,9 @@ Despite the proliferation of new MLOps tools in response to the increase in dema * Seamless deployment onto edge devices through compilation, SDKs, and benchmarks * Collaboration features for teams and integration with other platforms -With Edge Impulse, developers with limited data science expertise can develop specialized ML models that run efficiently within small computing environments. It provides a comprehensive solution for creating embedded intelligence and advancing machine learning. @edge-impulse further illustrates this concept. +With Edge Impulse, developers with limited data science expertise can develop specialized ML models that run efficiently within small computing environments. It provides a comprehensive solution for creating embedded intelligence and advancing machine learning. @fig-edge-impulse further illustrates this concept. -![The inner workings of edge impulse. Source: [Edge Impulse](https://www.edgeimpulse.com/blog/getting-started-with-edge-impulse/)](images/png/impulse.png){#edge-impulse} +![The inner workings of edge impulse. Source: [Edge Impulse](https://www.edgeimpulse.com/blog/getting-started-with-edge-impulse/)](images/png/impulse.png){#fig-edge-impulse} ##### User Interface diff --git a/contents/privacy_security/privacy_security.qmd b/contents/privacy_security/privacy_security.qmd index 9686bf29..134f4073 100644 --- a/contents/privacy_security/privacy_security.qmd +++ b/contents/privacy_security/privacy_security.qmd @@ -78,9 +78,9 @@ But Stuxnet wasn't designed to steal information or spy on people. Its goal was Stuxnet was incredibly advanced malware built by national governments to cross from the digital realm into real-world infrastructure. It specifically targeted important industrial machines, where embedded machine learning is highly applicable in a way never done before. The virus provided a wake-up call about how sophisticated cyberattacks could now physically destroy equipment and facilities. -This breach was significant due to its sophistication; Stuxnet specifically targeted programmable logic controllers (PLCs) used to automate electromechanical processes such as the speed of centrifuges for uranium enrichment. The worm exploited vulnerabilities in the Windows operating system to gain access to the Siemens Step7 software controlling the PLCs. Despite not being a direct attack on ML systems, Stuxnet is relevant for all embedded systems as it showcases the potential for state-level actors to design attacks that bridge the cyber and physical worlds with devastating effects. @stuxnet explains Stuxnet in greater detail. +This breach was significant due to its sophistication; Stuxnet specifically targeted programmable logic controllers (PLCs) used to automate electromechanical processes such as the speed of centrifuges for uranium enrichment. The worm exploited vulnerabilities in the Windows operating system to gain access to the Siemens Step7 software controlling the PLCs. Despite not being a direct attack on ML systems, Stuxnet is relevant for all embedded systems as it showcases the potential for state-level actors to design attacks that bridge the cyber and physical worlds with devastating effects. @fig-stuxnet explains Stuxnet in greater detail. -![Stuxnet explained. Source: [IEEE Spectrum](https://spectrum.ieee.org/the-real-story-of-stuxnet)](images/png/stuxnet.png){#stuxnet} +![Stuxnet explained. Source: [IEEE Spectrum](https://spectrum.ieee.org/the-real-story-of-stuxnet)](images/png/stuxnet.png){#fig-stuxnet} ### Jeep Cherokee Hack @@ -920,9 +920,9 @@ These examples demonstrate how federated learning provides tangible privacy bene #### Core Idea -Machine unlearning is a fairly new process that describes how the influence of a subset of training data can be removed from the model. Several methods have been used to perform machine unlearning and remove the influence of a subset of training data from the final model. A baseline approach might consist of simply fine-tuning the model for more epochs on just the data that should be remembered to decrease the influence of the data "forgotten" by the model. Since this approach doesn't explicitly remove the influence of data that should be erased, membership inference attacks are still possible, so researchers have adopted other approaches to unlearn data from a model explicitly. One type of approach that researchers have adopted includes adjusting the model loss function to treat the losses of the "forget set explicitly" (data to be unlearned) and the "retain set" (remaining data that should still be remembered) differently [@tarun2023deep; @khan2021knowledgeadaptation]. @machine-unlearning illustrates some of the applications of Machine-unlearning. +Machine unlearning is a fairly new process that describes how the influence of a subset of training data can be removed from the model. Several methods have been used to perform machine unlearning and remove the influence of a subset of training data from the final model. A baseline approach might consist of simply fine-tuning the model for more epochs on just the data that should be remembered to decrease the influence of the data "forgotten" by the model. Since this approach doesn't explicitly remove the influence of data that should be erased, membership inference attacks are still possible, so researchers have adopted other approaches to unlearn data from a model explicitly. One type of approach that researchers have adopted includes adjusting the model loss function to treat the losses of the "forget set explicitly" (data to be unlearned) and the "retain set" (remaining data that should still be remembered) differently [@tarun2023deep; @khan2021knowledgeadaptation]. @fig-machine-unlearning illustrates some of the applications of Machine-unlearning. -![Applications of Machine Unlearning. Source: [BBVA OpenMind](https://www.bbvaopenmind.com/en/technology/artificial-intelligence/ai-and-machine-unlearning-forgotten-path/)](images/png/machineunlearning.png){#machine-unlearning} +![Applications of Machine Unlearning. Source: [BBVA OpenMind](https://www.bbvaopenmind.com/en/technology/artificial-intelligence/ai-and-machine-unlearning-forgotten-path/)](images/png/machineunlearning.png){#fig-machine-unlearning} #### Case Study diff --git a/contents/sustainable_ai/sustainable_ai.qmd b/contents/sustainable_ai/sustainable_ai.qmd index d14de640..5a721446 100644 --- a/contents/sustainable_ai/sustainable_ai.qmd +++ b/contents/sustainable_ai/sustainable_ai.qmd @@ -49,9 +49,9 @@ Additionally, there is an increasing need for AI companies to scrutinize their c Furthermore, more than voluntary self-regulation may be needed---governments may need to introduce new regulations aimed at sustainable AI standards and practices if we hope to curb the projected energy explosion of ever-larger models. Reported metrics like computing usage, carbon footprint, and efficiency benchmarks could hold organizations accountable. -Through ethical principles, company policies, and public rules, AI technologists and corporations have a profound duty to our planet to ensure the responsible and sustainable advancement of technology positioned to transform modern society radically. We owe it to future generations to get this right. @ethical-ai outlines some ethical concerns and challenges facing AI. +Through ethical principles, company policies, and public rules, AI technologists and corporations have a profound duty to our planet to ensure the responsible and sustainable advancement of technology positioned to transform modern society radically. We owe it to future generations to get this right. @fig-ethical-ai outlines some ethical concerns and challenges facing AI. -![Ethical challenges in AI development. Source: [COE](https://www.coe.int/en/web/bioethics/common-ethical-challenges-in-ai)](images/png/ethicalai.png){#ethical-ai} +![Ethical challenges in AI development. Source: [COE](https://www.coe.int/en/web/bioethics/common-ethical-challenges-in-ai)](images/png/ethicalai.png){#fig-ethical-ai} ### Long-term Sustainability {#long-term-sustainability} diff --git a/contents/workflow/workflow.qmd b/contents/workflow/workflow.qmd index 46b2c4fa..65b90f58 100644 --- a/contents/workflow/workflow.qmd +++ b/contents/workflow/workflow.qmd @@ -56,9 +56,9 @@ The ML workflow is iterative, requiring ongoing monitoring and potential adjustm ## Traditional vs. Embedded AI -The ML workflow is a universal guide applicable across various platforms, including cloud-based solutions, edge computing, and TinyML. However, the workflow for Embedded AI introduces unique complexities and challenges, making it a captivating domain and paving the way for remarkable innovations. @dl-and-ml illustrates the differences between Machine Learning and Deep Learning. +The ML workflow is a universal guide applicable across various platforms, including cloud-based solutions, edge computing, and TinyML. However, the workflow for Embedded AI introduces unique complexities and challenges, making it a captivating domain and paving the way for remarkable innovations. @fig-dl-and-ml illustrates the differences between Machine Learning and Deep Learning. -![Comparing Traditional Machine Learning and Deep Learning. Source: [BBN Times](https://www.bbntimes.com/technology/to-leverage-deep-learning-you-must-know-this-first)](images/png/comparingdlandml.png){#dl-and-ml} +![Comparing traditional Machine Learning and Deep Learning. Source: [BBN Times](https://www.bbntimes.com/technology/to-leverage-deep-learning-you-must-know-this-first)](images/png/comparingdlandml.png){#fig-dl-and-ml} @embedded-ai showcases the uses of embedded ai in various industries. From d157a23ac3f7b2bcb525a3dc4dd8999d59039406 Mon Sep 17 00:00:00 2001 From: Vijay Janapa Reddi Date: Mon, 16 Sep 2024 20:17:13 -0700 Subject: [PATCH 10/13] Fix broken figure references --- contents/introduction/introduction.qmd | 4 +- contents/workflow/workflow.html | 1515 ++++++++++++++++++++++++ 2 files changed, 1517 insertions(+), 2 deletions(-) create mode 100644 contents/workflow/workflow.html diff --git a/contents/introduction/introduction.qmd b/contents/introduction/introduction.qmd index a4cc8e3e..7a621dc7 100644 --- a/contents/introduction/introduction.qmd +++ b/contents/introduction/introduction.qmd @@ -24,9 +24,9 @@ However, deploying machine learning systems across the computing continuum prese Furthermore, the varying computational capabilities and energy constraints of devices at different layers of the computing continuum necessitate the development of efficient and adaptable machine learning models. Techniques such as model compression, federated learning, and transfer learning can help address these challenges, enabling the deployment of intelligence across a wide range of devices. -As we move towards the realization of Weiser's vision of ubiquitous computing, the development and deployment of machine learning systems across the entire ecosystem will be critical. By leveraging the strengths of each layer of the computing continuum, we can create an intelligent environment that seamlessly integrates with our daily lives, anticipating our needs and enhancing our experiences in ways that were once unimaginable. As we continue to push the boundaries of what's possible with distributed machine learning, we inch closer to a future where technology becomes an invisible but integral part of our world. @applications-of-ml illustrates some common applications of AI around us. +As we move towards the realization of Weiser's vision of ubiquitous computing, the development and deployment of machine learning systems across the entire ecosystem will be critical. By leveraging the strengths of each layer of the computing continuum, we can create an intelligent environment that seamlessly integrates with our daily lives, anticipating our needs and enhancing our experiences in ways that were once unimaginable. As we continue to push the boundaries of what's possible with distributed machine learning, we inch closer to a future where technology becomes an invisible but integral part of our world. @fig-applications-of-ml illustrates some common applications of AI around us. -![Common applications of Machine Learning. Source: [EDUCBA](https://www.educba.com/applications-of-machine-learning/)](images/png/mlapplications.png){#applications-of-ml} +![Common applications of Machine Learning. Source: [EDUCBA](https://www.educba.com/applications-of-machine-learning/)](images/png/mlapplications.png){#fig-applications-of-ml} ## What's Inside the Book diff --git a/contents/workflow/workflow.html b/contents/workflow/workflow.html new file mode 100644 index 00000000..38415726 --- /dev/null +++ b/contents/workflow/workflow.html @@ -0,0 +1,1515 @@ + + + + + + + + + +4  AI Workflow – Machine Learning Systems + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ + +
+ + + +
+ +
+
+

4  AI Workflow

+
+ + + +
+ + + + +
+ + + +
+ + +

Resources: Slides, Videos, Exercises, Labs

+
+
+

+
DALL·E 3 Prompt: Create a rectangular illustration of a stylized flowchart representing the AI workflow/pipeline. From left to right, depict the stages as follows: ‘Data Collection’ with a database icon, ‘Data Preprocessing’ with a filter icon, ‘Model Design’ with a brain icon, ‘Training’ with a weight icon, ‘Evaluation’ with a checkmark, and ‘Deployment’ with a rocket. Connect each stage with arrows to guide the viewer horizontally through the AI processes, emphasizing these steps’ sequential and interconnected nature.
+
+
+

In this chapter, we’ll explore the machine learning (ML) workflow, setting the stage for subsequent chapters that go deeper into the specifics. To ensure we see the bigger picture, this chapter offers a high-level overview of the steps involved in the ML workflow.

+

The ML workflow is a structured approach that guides professionals and researchers through developing, deploying, and maintaining ML models. This workflow is generally divided into several crucial stages, each contributing to the effective development of intelligent systems.

+
+
+
+ +
+
+Learning Objectives +
+
+
+
    +
  • Understand the ML workflow and gain insights into the structured approach and stages of developing, deploying, and maintaining machine learning models.

  • +
  • Learn about the unique challenges and distinctions between workflows for Traditional machine learning and embedded AI.

  • +
  • Appreciate the roles in ML projects and understand their responsibilities and significance.

  • +
  • Understanding the importance, applications, and considerations for implementing ML models in resource-constrained environments.

  • +
  • Gain awareness about the ethical and legal aspects that must be considered and adhered to in ML and embedded AI projects.

  • +
  • Establish a basic understanding of ML workflows and roles to be well-prepared for deeper exploration in the following chapters.

  • +
+
+
+
+

4.1 Overview

+
+
+
+ +
+
+Figure 4.1: Multi-step design methodology for the development of a machine learning model. Commonly referred to as the machine learning lifecycle +
+
+
+

Developing a successful machine learning model requires a systematic workflow. This end-to-end process enables you to build, deploy, and maintain models effectively. As shown in Figure fig-ml-life-cycle, It typically involves the following key steps:

+
    +
  1. Problem Definition - Start by clearly articulating the specific problem you want to solve. This focuses on your efforts during data collection and model building.
  2. +
  3. Data Collection and Preparation: Gather relevant, high-quality training data that captures all aspects of the problem. Clean and preprocess the data to prepare it for modeling.
  4. +
  5. Model Selection and Training: Choose a machine learning algorithm suited to your problem type and data. Consider the pros and cons of different approaches. Feed the prepared data into the model to train it. Training time varies based on data size and model complexity.
  6. +
  7. Model Evaluation: Test the trained model on new unseen data to measure its predictive accuracy. Identify any limitations.
  8. +
  9. Model Deployment: Integrate the validated model into applications or systems to start operationalization.
  10. +
  11. Monitor and Maintain: Track model performance in production. Retrain periodically on new data to keep it current.
  12. +
+

Following this structured ML workflow helps guide you through the key phases of development. It ensures you build effective and robust models ready for real-world deployment, resulting in higher-quality models that solve your business needs.

+

The ML workflow is iterative, requiring ongoing monitoring and potential adjustments. Additional considerations include:

+
    +
  • Version Control: Track code and data changes to reproduce results and revert to earlier versions if needed.
  • +
  • Documentation: Maintain detailed documentation for workflow understanding and reproduction.
  • +
  • Testing: Rigorously test the workflow to ensure its functionality.
  • +
  • Security: Safeguard your workflow and data when deploying models in production settings.
  • +
+
+
+

4.2 Traditional vs. Embedded AI

+

The ML workflow is a universal guide applicable across various platforms, including cloud-based solutions, edge computing, and TinyML. However, the workflow for Embedded AI introduces unique complexities and challenges, making it a captivating domain and paving the way for remarkable innovations. Figure fig-dl-and-ml illustrates the differences between Machine Learning and Deep Learning.

+
+
+
+ +
+
+Figure 4.2: Comparing traditional Machine Learning and Deep Learning. Source: BBN Times +
+
+
+

Figure fig-embedded-ai showcases the uses of embedded ai in various industries.

+
+
+
+ +
+
+Figure 4.3: Embedded AI applications. Source: Rinf.tech +
+
+
+
+

4.2.1 Resource Optimization

+
    +
  • Traditional ML Workflow: This workflow prioritizes model accuracy and performance, often leveraging abundant computational resources in cloud or data center environments.
  • +
  • Embedded AI Workflow: Given embedded systems’ resource constraints, this workflow requires careful planning to optimize model size and computational demands. Techniques like model quantization and pruning are crucial.
  • +
+
+
+

4.2.2 Real-time Processing

+
    +
  • Traditional ML Workflow: Less emphasis on real-time processing, often relying on batch data processing.
  • +
  • Embedded AI Workflow: Prioritizes real-time data processing, making low latency and quick execution essential, especially in applications like autonomous vehicles and industrial automation.
  • +
+
+
+

4.2.3 Data Management and Privacy

+
    +
  • Traditional ML Workflow: Processes data in centralized locations, often necessitating extensive data transfer and focusing on data security during transit and storage.
  • +
  • Embedded AI Workflow: This workflow leverages edge computing to process data closer to its source, reducing data transmission and enhancing privacy through data localization.
  • +
+
+
+

4.2.4 Hardware-Software Integration

+
    +
  • Traditional ML Workflow: Typically operates on general-purpose hardware, with software development occurring independently.
  • +
  • Embedded AI Workflow: This workflow involves a more integrated approach to hardware and software development, often incorporating custom chips or hardware accelerators to achieve optimal performance.
  • +
+
+
+
+

4.3 Roles & Responsibilities

+

Creating an ML solution, especially for embedded AI, is a multidisciplinary effort involving various specialists. Unlike traditional software development, building an ML solution demands a multidisciplinary approach due to the experimental nature of model development and the resource-intensive requirements of training and deploying these models.

+

There is a pronounced need for roles focusing on data for the success of machine learning pipelines. Data scientists and data engineers handle data collection, build data pipelines, and ensure data quality. Since the nature of machine learning models depends on the data they consume, the models are unique and vary with different applications, necessitating extensive experimentation. Machine learning researchers and engineers drive this experimental phase through continuous testing, validation, and iteration to achieve optimal performance.

+

The deployment phase often requires specialized hardware and infrastructure, as machine learning models can be resource-intensive, demanding high computational power and efficient resource management. This necessitates collaboration with hardware engineers to ensure that the infrastructure can support the computational demands of model training and inference.

+

As models make decisions that can impact individuals and society, ethical and legal aspects of machine learning are becoming increasingly important. Ethicists and legal advisors are needed to ensure compliance with ethical standards and legal regulations.

+

Table tbl-mlops_roles shows a rundown of the typical roles involved. While the lines between these roles can sometimes blur, the table below provides a general overview.

+
+
+
+Table 4.1: Roles and responsibilities of people involved in MLOps. +
+
+ ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
RoleResponsibilities
Project ManagerOversees the project, ensuring timelines and milestones are met.
Domain ExpertsOffer domain-specific insights to define project requirements.
Data ScientistsSpecialize in data analysis and model development.
Machine Learning EngineersFocus on model development and deployment.
Data EngineersManage data pipelines.
Embedded Systems EngineersIntegrate ML models into embedded systems.
Software DevelopersDevelop software components for AI system integration.
Hardware EngineersDesign and optimize hardware for the embedded AI system.
UI/UX DesignersFocus on user-centric design.
QA EngineersEnsure the system meets quality standards.
Ethicists and Legal AdvisorsConsult on ethical and legal compliance.
Operations and Maintenance PersonnelMonitor and maintain the deployed system.
Security SpecialistsEnsure system security.
+
+
+
+

Understanding these roles is crucial for completing an ML project. As we proceed through the upcoming chapters, we’ll explore each role’s essence and expertise, fostering a comprehensive understanding of the complexities involved in embedded AI projects. This holistic view facilitates seamless collaboration and nurtures an environment ripe for innovation and breakthroughs.

+
+
+

4.4 Conclusion

+

This chapter has laid the foundation for understanding the machine learning workflow, a structured approach crucial for the development, deployment, and maintenance of ML models. By exploring the distinct stages of the ML lifecycle, we have gained insights into the unique challenges faced by traditional ML and embedded AI workflows, particularly in terms of resource optimization, real-time processing, data management, and hardware-software integration. These distinctions underscore the importance of tailoring workflows to meet the specific demands of the application environment.

+

The chapter emphasized the significance of multidisciplinary collaboration in ML projects. Understanding the diverse roles provides a comprehensive view of the teamwork necessary to navigate the experimental and resource-intensive nature of ML development. As we move forward to more detailed discussions in the subsequent chapters, this high-level overview equips us with a holistic perspective on the ML workflow and the various roles involved.

+
+
+

4.5 Resources

+

Here is a curated list of resources to support students and instructors in their learning and teaching journeys. We are continuously working on expanding this collection and will add new exercises soon.

+
+
+
+ +
+
+Slides +
+
+
+
+
+

These slides are a valuable tool for instructors to deliver lectures and for students to review the material at their own pace. We encourage students and instructors to leverage these slides to improve their understanding and facilitate effective knowledge transfer.

+ +
+
+
+
+
+
+ +
+
+Videos +
+
+
+
+
+
    +
  • Coming soon.
  • +
+
+
+
+
+
+
+ +
+
+Exercises +
+
+
+
+
+

To reinforce the concepts covered in this chapter, we have curated a set of exercises that challenge students to apply their knowledge and deepen their understanding.

+
    +
  • Coming soon.
  • +
+
+
+
+
+
+
+ +
+
+Labs +
+
+
+
+
+

In addition to exercises, we offer a series of hands-on labs allowing students to gain practical experience with embedded AI technologies. These labs provide step-by-step guidance, enabling students to develop their skills in a structured and supportive environment. We are excited to announce that new labs will be available soon, further enriching the learning experience.

+
    +
  • Coming soon.
  • +
+
+
+
+ + +
+ +
+ + + + + +
+ + + + + + \ No newline at end of file From a28d5be34d8bed33b00d2d91134c392827294148 Mon Sep 17 00:00:00 2001 From: Vijay Janapa Reddi Date: Mon, 16 Sep 2024 20:18:31 -0700 Subject: [PATCH 11/13] Fix broken references --- contents/ondevice_learning/ondevice_learning.qmd | 8 ++++---- contents/workflow/workflow.qmd | 5 ++--- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/contents/ondevice_learning/ondevice_learning.qmd b/contents/ondevice_learning/ondevice_learning.qmd index 077a5a0e..1ec4ace2 100644 --- a/contents/ondevice_learning/ondevice_learning.qmd +++ b/contents/ondevice_learning/ondevice_learning.qmd @@ -239,9 +239,9 @@ Transfer learning is an ML technique in which a model developed for a particular Let's take the example of a smart sensor application that uses on-device AI to recognize objects in images captured by the device. Traditionally, this would require sending the image data to a server, where a large neural network model processes the data and sends back the results. With on-device AI, the model is stored and runs directly on-device, eliminating the need to send data to a server. -If we want to customize the model for the on-device characteristics, training a neural network model from scratch on the device would be impractical due to the limited computational resources and battery life. This is where transfer learning comes in. Instead of training a model from scratch, we can take a pre-trained model, such as a convolutional neural network (CNN) or a transformer network trained on a large dataset of images, and finetune it for our specific object recognition task. This finetuning can be done directly on the device using a smaller dataset of images relevant to the task. By leveraging the pre-trained model, we can reduce the computational resources and time required for training while still achieving high accuracy for the object recognition task. @t-learning further illustrates the benefits of transfer learning over training from scratch. +If we want to customize the model for the on-device characteristics, training a neural network model from scratch on the device would be impractical due to the limited computational resources and battery life. This is where transfer learning comes in. Instead of training a model from scratch, we can take a pre-trained model, such as a convolutional neural network (CNN) or a transformer network trained on a large dataset of images, and finetune it for our specific object recognition task. This finetuning can be done directly on the device using a smaller dataset of images relevant to the task. By leveraging the pre-trained model, we can reduce the computational resources and time required for training while still achieving high accuracy for the object recognition task. @fig-t-learning further illustrates the benefits of transfer learning over training from scratch. -![Training from scratch vs. transfer learning.](contents/ondevice_learning/images/png/transfer_learning.png){#t-learning} +![Training from scratch vs. transfer learning.](contents/ondevice_learning/images/png/transfer_learning.png){#fig-t-learning} Transfer learning is important in making on-device AI practical by allowing us to leverage pre-trained models and finetune them for specific tasks, thereby reducing the computational resources and time required for training. The combination of on-device AI and transfer learning opens up new possibilities for AI applications that are more privacy-conscious and responsive to user needs. @@ -443,9 +443,9 @@ With this proposed structure, there are a few key vectors for further optimizing ::: -@federated-learning outlines the transformative impact of federated learning on on-device learning. +@fig-federated-learning outlines the transformative impact of federated learning on on-device learning. -![Federated learning is revolutionizing on-device learning.](contents/ondevice_learning/images/png/federatedvsoil.png){#federated-learning} +![Federated learning is revolutionizing on-device learning.](contents/ondevice_learning/images/png/federatedvsoil.png){#fig-federated-learning} ### Communication Efficiency diff --git a/contents/workflow/workflow.qmd b/contents/workflow/workflow.qmd index 65b90f58..fab73039 100644 --- a/contents/workflow/workflow.qmd +++ b/contents/workflow/workflow.qmd @@ -60,10 +60,9 @@ The ML workflow is a universal guide applicable across various platforms, includ ![Comparing traditional Machine Learning and Deep Learning. Source: [BBN Times](https://www.bbntimes.com/technology/to-leverage-deep-learning-you-must-know-this-first)](images/png/comparingdlandml.png){#fig-dl-and-ml} +@fig-embedded-ai showcases the uses of embedded ai in various industries. -@embedded-ai showcases the uses of embedded ai in various industries. - -![Embedded AI applications. Source: [Rinf.tech](https://www.rinf.tech/what-is-embedded-intelligence-and-how-can-tech-leaders-embrace-it/)](images/png/embeddedai.png){#embedded-ai} +![Embedded AI applications. Source: [Rinf.tech](https://www.rinf.tech/what-is-embedded-intelligence-and-how-can-tech-leaders-embrace-it/)](images/png/embeddedai.png){#fig-embedded-ai} ### Resource Optimization From 27ac2d2b9a8ea3cc0f04503e98f37eafce9b66d6 Mon Sep 17 00:00:00 2001 From: Vijay Janapa Reddi Date: Mon, 16 Sep 2024 20:33:43 -0700 Subject: [PATCH 12/13] fix path --- contents/ondevice_learning/ondevice_learning.qmd | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/contents/ondevice_learning/ondevice_learning.qmd b/contents/ondevice_learning/ondevice_learning.qmd index 1ec4ace2..ce104179 100644 --- a/contents/ondevice_learning/ondevice_learning.qmd +++ b/contents/ondevice_learning/ondevice_learning.qmd @@ -241,7 +241,7 @@ Let's take the example of a smart sensor application that uses on-device AI to r If we want to customize the model for the on-device characteristics, training a neural network model from scratch on the device would be impractical due to the limited computational resources and battery life. This is where transfer learning comes in. Instead of training a model from scratch, we can take a pre-trained model, such as a convolutional neural network (CNN) or a transformer network trained on a large dataset of images, and finetune it for our specific object recognition task. This finetuning can be done directly on the device using a smaller dataset of images relevant to the task. By leveraging the pre-trained model, we can reduce the computational resources and time required for training while still achieving high accuracy for the object recognition task. @fig-t-learning further illustrates the benefits of transfer learning over training from scratch. -![Training from scratch vs. transfer learning.](contents/ondevice_learning/images/png/transfer_learning.png){#fig-t-learning} +![Training from scratch vs. transfer learning.](images/png/transfer_learning.png){#fig-t-learning} Transfer learning is important in making on-device AI practical by allowing us to leverage pre-trained models and finetune them for specific tasks, thereby reducing the computational resources and time required for training. The combination of on-device AI and transfer learning opens up new possibilities for AI applications that are more privacy-conscious and responsive to user needs. @@ -249,7 +249,7 @@ Transfer learning has revolutionized the way models are developed and deployed, Implementation in production scenarios can be broadly categorized into two stages: pre-deployment and post-deployment. -![Training from scratch vs. transfer learning.](contents/ondevice_learning/images/png/transfer_learning.jpeg){#transfer} +![Training from scratch vs. transfer learning.](images/png/transfer_learning.jpeg){#transfer} ### Pre-Deployment Specialization @@ -445,7 +445,7 @@ With this proposed structure, there are a few key vectors for further optimizing @fig-federated-learning outlines the transformative impact of federated learning on on-device learning. -![Federated learning is revolutionizing on-device learning.](contents/ondevice_learning/images/png/federatedvsoil.png){#fig-federated-learning} +![Federated learning is revolutionizing on-device learning.](images/png/federatedvsoil.png){#fig-federated-learning} ### Communication Efficiency From 28781e5494e59f0de174793d8898f6e83f9bb9cb Mon Sep 17 00:00:00 2001 From: Vijay Janapa Reddi Date: Mon, 16 Sep 2024 20:48:41 -0700 Subject: [PATCH 13/13] Fix references --- contents/dl_primer/dl_primer.qmd | 4 ++-- contents/ondevice_learning/ondevice_learning.qmd | 3 --- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/contents/dl_primer/dl_primer.qmd b/contents/dl_primer/dl_primer.qmd index 000337e6..98c8ad1d 100644 --- a/contents/dl_primer/dl_primer.qmd +++ b/contents/dl_primer/dl_primer.qmd @@ -233,7 +233,7 @@ These architectures serve specific purposes and excel in different domains, offe ### Traditional ML vs Deep Learning -Deep learning extends traditional machine learning by utilizing neural networks to discern patterns in data. In contrast, traditional machine learning relies on a set of established algorithms such as decision trees, k-nearest neighbors, and support vector machines, but does not involve neural networks. To briefly highlight the differences, @tbl-mlvsdl illustrates the contrasting characteristics between traditional ML and deep learning. @fig-ml-vs-dl further explains the differences between Machine Learning and Deep Learning. +Deep learning extends traditional machine learning by utilizing neural networks to discern patterns in data. In contrast, traditional machine learning relies on a set of established algorithms such as decision trees, k-nearest neighbors, and support vector machines, but does not involve neural networks. To briefly highlight the differences, @tbl-mlvsdl illustrates the contrasting characteristics between traditional ML and deep learning. @fig-ml-dl further explains the differences between Machine Learning and Deep Learning. +-------------------------------+-----------------------------------------------------------+--------------------------------------------------------------+ | Aspect | Traditional ML | Deep Learning | @@ -251,7 +251,7 @@ Deep learning extends traditional machine learning by utilizing neural networks | Maintenance | Easier (simple to update and maintain) | Complex (requires more efforts in maintenance and updates) | +-------------------------------+-----------------------------------------------------------+--------------------------------------------------------------+ -![Comparing Machine Learning and Deep Learning. Source: [Medium](https://aoyilmaz.medium.com/understanding-the-differences-between-deep-learning-and-machine-learning-eb41d64f1732)](images/png/mlvsdl.png){#fig-ml-vs-dl} +![Comparing Machine Learning and Deep Learning. Source: [Medium](https://aoyilmaz.medium.com/understanding-the-differences-between-deep-learning-and-machine-learning-eb41d64f1732)](images/png/mlvsdl.png){#fig-ml-dl} : Comparison of traditional machine learning and deep learning. {#tbl-mlvsdl .striped .hover} diff --git a/contents/ondevice_learning/ondevice_learning.qmd b/contents/ondevice_learning/ondevice_learning.qmd index ce104179..71ebd194 100644 --- a/contents/ondevice_learning/ondevice_learning.qmd +++ b/contents/ondevice_learning/ondevice_learning.qmd @@ -249,9 +249,6 @@ Transfer learning has revolutionized the way models are developed and deployed, Implementation in production scenarios can be broadly categorized into two stages: pre-deployment and post-deployment. -![Training from scratch vs. transfer learning.](images/png/transfer_learning.jpeg){#transfer} - - ### Pre-Deployment Specialization In the pre-deployment stage, transfer learning acts as a catalyst to expedite the development process. Here's how it typically works: Imagine we are creating a system to recognize different breeds of dogs. Rather than starting from scratch, we can use a pre-trained model that has already mastered the broader task of recognizing animals in images.
+ + + +