{
  "source_file": "0930",
  "source_platform": "研究机构",
  "author": "Full Stack Deep Learning",
  "title_listed": "FSDL Lecture: Data Management",
  "keywords": "数据管理,数据标注,版本",
  "domain": "数据处理",
  "content_type": "课程讲义",
  "is_paid_flag": "否",
  "url": "https://fullstackdeeplearning.com/course/2022/lecture-4-data-management/",
  "publish_date": "2022",
  "corpus_stage": "数据处理",
  "notes": "数据管理 lecture",
  "id": "2f97956010f5",
  "collected_at": "2026-10-02T16:07:46",
  "title": "Lecture 4: Data Management - The Full Stack",
  "body_markdown": "Lecture 4: Data Management\nLecture by\nSergey Karayev\n.\nNotes by\nJames Le\nand\nVishnu Rachakonda\n.\nPublished August 29, 2022.\nDownload slides\n.\n1 - Introduction\nOne thing people don't quite get as they enter the field of ML is how\nmuch of it deals with data - putting together datasets, exploring the\ndata, wrangling the data, etc. The key points of this lecture are:\nSpend 10x as much time exploring the data as you would like to.\nFixing, adding, and augmenting the data is usually the best way to\nimprove performance.\nKeep it all simple!\n2 - Data Sources\nThere are many possibilities for the sources of data. You might have\nimages, text files, logs, or database records. In deep learning, you\nneed to get that data into a local filesystem disk next to a GPU.\nHow\nyou send data from the sources to training is different for each\nproject\n.\nWith images, you can simply download them from S3.\nWith text files, you need to process them in some distributed way,\nanalyze the data, select a subset, and put that on a local\nmachine.\nWith logs and database records, you can use a data lake to aggregate\nand process the data.\nThe basics will be the same - a filesystem, object storage, and\ndatabases.\nFilesystem\nThe\nfilesystem\nis a fundamental abstraction. Its fundamental unit is\na file - which can be text or binary, is not versioned, and is easily\noverwritten. The filesystem is usually on a disk connected to your\nmachine - physically connected on-prem, attached in the cloud, or even\ndistributed.\nThe first thing to know about discs is that their speed and bandwidth\nrange - from hard discs to solid-state discs. There are two orders of\nmagnitude differences between the slowest (SATA SSD) and the fastest\n(NVMe SSD) discs. Below are some latency numbers you should know, with\nthe human-scale numbers in parentheses:\nWhat formats should the data be stored on the local disc?\nIf you work with binary data like images and audio, just use the\nstandard formats like JPEG or MP3 that it comes in.\nIf you work with metadata (like labels), tabular data, or text data,\nthen compressed JSON or text files are just fine. Alternatively,\nParquet is a table format that is fast, compact, and widely used.\nObject Storage\nThe\nobject storage\nis an API over the filesystem. Its fundamental\nunit is an object, usually in a binary format (an image, a sound file, a\ntext file, etc.). We can build versioning or redundancy into the object\nstorage service. It is not as fast as the local filesystem, but it can be\nfast enough within the cloud.\nDatabases\nDatabases\nare persistent, fast, and scalable storage and retrieval\nof structured data systems. A helpful mental model for this is: all the\ndata that the databases hold is actually in the computer\\'s RAM, but the\ndatabase software ensures that if the computer gets turned off,\neverything is safely persisted to disk. If too much data is in the RAM,\nit scales out to disk in a performant way.\nYou should not store binary data in the database but the object-store\nURLs instead.\nPostgres\nis\nthe right choice most of the time. It is an open-source database that\nsupports unstructured JSON and queries over that JSON.\nSQLite\nis also perfectly good\nfor small projects.\nMost coding projects that deal with collections of objects that\nreference each other will eventually implement a crappy database. Using\na database from the beginning with likely save you time. In fact, most\nMLOps tools are databases at their core (e.g.,\nW&B\nis a database of experiments,\nHuggingFace Hub\nis a\ndatabase of models, and\nLabel\nStudio\nis a database of labels).\nData warehouses\nare stores for online analytical processing (OLAP),\nas opposed to databases being the data stores for online transaction\nprocessing (OLTP). You get data into the data warehouse through a\nprocess called\nETL (Extract-Transform-Load)\n: Given a number of data\nsources, you extract the data, transform it into a uniform schema, and\nload it into the data warehouse. From the warehouse, you can run\nbusiness intelligence queries. The difference between OLAP and OLTP is\nthat: OLAPs are column-oriented, while OLTPs are row-oriented.\nData lakes\nare unstructured aggregations of data from multiple\nsources. The main difference between them and data warehouses is that\ndata lakes use ELT (Extract-Load-Transform) process: dumping all the\ndata in and transforming them for specific needs later.\nThe big trend is unifying both data lake and data warehouse, so that\nstructured data and unstructured data can live together\n. The two big\nplatforms for this are\nSnowflake\nand\nDatabricks\n. If you are\nreally into this stuff, \"\nDesigning Data-Intensive\nApplications\n\" is a great book\nthat walks through it from first principles.\n3 - Data Exploration\nTo explore the data, you must speak its language, mostly SQL and,\nincreasingly, DataFrame.\nSQL\nis the standard interface for\nstructured data, which has existed for decades.\nPandas\nis the main\nDataFrame in the Python ecosystem that lets you do SQL-like things. Our\nadvice is to become fluent in both to interact with both transactional\ndatabases and analytical warehouses and lakes.\nPandas\nis the workhorse of\nPython data science. You can try\nDASK\nDataFrame\nto\nparallelize Pandas operations over cores and\nRAPIDS\nto do Pandas operations on\nGPUs.\n4 - Data Processing\nTalking about data processing, it's useful to have a motivational\nexample. Let's say we have to train a photo popularity predictor every\nnight. For each photo, the training data must include:\nMetadata (such as posting time, title, and location) that sits in\nthe database.\nSome features of the user (such as how many times they logged in\ntoday) that are needed to be computed from logs.\nOutputs of photo classifiers (such as content and style) that are\nneeded to run the classifiers.\nOur ultimate task is to train the photo predictor model, but we need to\noutput data from the database, compute the logs, and run classifiers to\noutput their predictions. As a result, we have\ntask dependencies\n.\nSome tasks can't start until others are finished, so finishing a task\nshould kick off its dependencies.\nIdeally, dependencies are not always files but also programs and\ndatabases. We should be able to spread this work over many machines and\nexecute many dependency graphs all at once.\nAirflow\nis a standard\nscheduler for Python, where it's possible to specify the DAG\n(directed acyclic graph) of tasks using Python code. The operator\nin that graph can be SQL operations or Python functions.\nTo distribute these jobs, the workflow manager has a queue for the\ntasks and manages the workers that pull from them. It will restart\njobs if they fail and ping you when the jobs are finished.\nPrefect\nand\nDagster\nare contenders to\nimprove and replace Airflow in the long run.\nThe primary advice here is not to\nover-engineer things\n. You can get\nmachines with many CPU cores and a lot of RAM nowadays. For example,\nUNIX has powerful parallelism, streaming, and highly optimized tools.\n5 - Feature Store\nLet's say your data processing generates artifacts you need for\ntraining. How do you make sure that, in production, the trained model\nsees the same processing taking place (which happened during training)?\nHow do you avoid recomputation during retraining?\nFeature stores\nare a solution to this (that you may not need!).\nThe first mention of feature stores came from\nthis Uber blog post\ndescribing their ML platform,\nMichelangelo\n.\nThey had an offline training process and an online prediction\nprocess, so they built an internal feature store for both\nprocesses to be in sync.\nTecton\nis the leading SaaS\nsolution to feature store.\nFeast\nis a common open-source\noption.\nFeatureform\nis a\nrelatively new option.\n6 - Datasets\nWhat about datasets specifically made for machine learning?\nHuggingFace\nDatasets\nis a great\nsource of machine learning-ready data. There are 8000+ datasets covering\na wide variety of tasks, like computer vision, NLP, etc. The Github-Code\ndataset on HuggingFace is a good example of how these datasets are\nwell-suited for ML applications. Github-Code can be streamed, is in the\nmodern Apache Parquet format, and doesn't require you to download 1TB+\nof data in order to properly work with it. Another sample dataset is\nRedCaps, which consists of 12M image-text pairs from Reddit.\nAnother interesting dataset solution for machine learning is\nActiveloop\n. This tool is\nparticularly well equipped to work with data and explore samples without\nneeding to download it.\n7 - Data Labeling\nNo Labeling Required\nThe first thing to talk about when it comes to labeling data\nis...\nmaybe we don\\'t have to label data?\nThere are a couple of\noptions here we will cover.\nSelf-supervised learning\nis a very important idea that allows you to\navoid painstakingly labeling all of your data. You can use parts of your\ndata to label other parts of your data. This is very common in NLP right\nnow. This is further covered in the foundation model lecture. The long\nand short of it is that models can have elements of their data masked\n(e.g., the end of a sentence can be omitted), and models can use earlier\nparts of the data to predict the masked parts (e.g., I can learn from\nthe beginning of the sentence and predict the end). This can even be\nused across modalities (e.g., computer vision\nand\ntext), as\nOpenAI\nCLIP\ndemonstrates.\nImage data augmentation\nis an almost compulsory technique to adopt,\nespecially for vision tasks. Frameworks like\ntorchvision\nhelp with\nthis. In data augmentation, samples are modified (e.g., brightened)\nwithout actually changing their core \"meaning.\" Interestingly,\naugmentation can actually replace labels.\nSimCLR\nis a model that demonstrates this - where its learning objective is to\nmaximize agreement between augmented views of the same image and\nminimize agreement between different images.\nFor other forms of data, there are a couple of augmentation tricks that\ncan be applied. You can delete some cells in tabular data to simulate\nmissing data. In text, there aren't established techniques, but ideas\ninclude changing the order of words or deleting words. In speech, you\ncould change the speed, insert pauses, etc.\nSynthetic data\nis an underrated idea. You can synthesize data based\non your knowledge of the label. For example, you can\ncreate\nreceipts\nif your need is to learn how to recognize receipts from images. This can\nget very sophisticated and deep, so tread carefully.\nYou can also get creative and ask your users to label data for you.\nGoogle Photos, as any user of the app knows, regularly gets users to\nlabel images about where people in photos are the same or different.\nThis is an example of the data flywheel. Improving the data allows the\nuser to improve the model, which in turn makes their product experience\nbetter.\nLabeling Solutions\nThese are all great options for avoiding labeling data. However,\nyou'll usually have to label some data to get started.\nLabeling has standard annotation features, like bounding boxes, that\nhelp capture information properly. Training annotators properly is more\nimportant than the particular kind of annotation. Standardizing how\nannotators approach a complex, opinable task is crucial. Labeling\nguidelines can help capture the exact right label from an annotator.\nQuality assurance is key to ensuring annotation and labeling are\nhappening properly.\nThere are a few options for sourcing labor for annotations:\nFull-service data labeling vendors offer end-to-end labeling\nsolutions.\nYou can hire and train annotators yourself.\nYou can crowdsource annotation on a platform like Mechanical Turk.\nFull-service companies offer a great solution that abstracts the need\nto build software, manage labor, and perform quality checks\n. It makes\nsense to use one. Before settling on one, make sure to dedicate time to\nvet several. Additionally, label some gold standard data yourself to\nunderstand the data yourself and to evaluate contenders. Take calls with\nseveral contenders, ask for work samples on your data, and compare them\nto your own labeling performance.\nScale AI\nis the dominant data\nlabeling solution. It offers an API that allows you to spin up\ntasks.\nAdditional contenders include\nLabelbox\nand\nSupervisely\n.\nLabelStudio\nis an open-source\nsolution for performing annotation yourself, with a companion\nenterprise version. It has a great set of features that allow you\nto design your interface and even plug-in models for active\nlearning!\nDiffgram\nis a competitor to\nLabel Studio.\nRecent offerings, like\nAquarium\nand\nScale Nucleus\n, have\nstarted to help concentrate labeling efforts on parts of the\ndataset that are most troublesome for models.\nSnorkel\nis a dataset management\nand labeling platform that uses weak supervision, which is a\nsimilar concept. You can leverage composable rules (e.g., all\nsentences that have the term \"amazing\" are positive sentiments)\nthat allow you to quickly label data faster than if you were to\ntreat every data point the same.\nIn conclusion, try to avoid labeling using techniques like\nself-supervised learning. If you can't, use labeling software and\neventually outsource the work to the right vendor. If you can't afford\nvendors, consider hiring part-time work rather than crowdsourcing the\nwork to ensure quality.\n8 - Data Versioning\nData versioning comes with a spectrum of approaches:\nLevel 0 is bad. In this case, data just lives on some file system.\nIn these cases, the issue arises because the models are\nunversioned since their data is unversioned. Models are part code,\npart data. This will lead to the consequence of being unable to\nget back to a previous level of performance if need be.\nYou can prevent this event with Level 1, where you snapshot your\ndata each time you train. This somewhat works but is far from\nideal.\nIn Level 2, data is versioned like code, as a commingled asset with\nversioned code. You can use a system like\ngit-lfs\nthat allows\nyou to store large data assets alongside code. This works really\nwell!\nLevel 3 involves specialized solutions for working with large data\nfiles, but this may not be needed unless you have a very specific\nneed (i.e., uniquely large or compliance-heavy files).\nDVC\nis a great tool for this. DVC\nhelps upload your data asset to a remote storage location every time you\ncommit changes to the data file or trigger a commit; it functions like a\nfancier git-lfs. It adds features like lineage for data and model\nartifacts, allowing you to recreate pipelines.\nSeveral techniques are associated with privacy-controlled data, like\nfederated\nlearning\n,\ndifferential privacy, and learning on encrypted data. These techniques\nare still in research, so they aren't quite ready for an FSDL\nrecommendation.\nWe are excited to share this course with you for\nfree\n.\nWe have more upcoming great content.\n      Subscribe to stay up to date as we release it.\nEnter\nWe take your privacy and attention very seriously and will never spam you.\nI am already a subscriber",
  "metadata": {
    "title": "Lecture 4: Data Management - The Full Stack",
    "description": "Sourcing, storing, exploring, processing, labeling, and versioning data for deep learning.",
    "keywords": null,
    "author": "The Full Stack",
    "og:title": "The Full Stack - Lecture 4: Data Management",
    "og:description": "Sourcing, storing, exploring, processing, labeling, and versioning data for deep learning.",
    "og:type": "website",
    "og:url": "https://fullstackdeeplearning.com/course/2022/lecture-4-data-management/",
    "og:image": "https://fullstackdeeplearning.com/images/opengraph.png",
    "og:image:alt": "Image explaining what The Full Stack covers.",
    "og:image:type": "image/jpg",
    "og:image:width": "1200",
    "og:image:height": "630",
    "twitter:card": "summary_large_image",
    "twitter:site": "full_stack_dl",
    "twitter:title": "The Full Stack - Lecture 4: Data Management",
    "twitter:description": "Sourcing, storing, exploring, processing, labeling, and versioning data for deep learning.",
    "twitter:image": "https://fullstackdeeplearning.com/images/opengraph.png",
    "twitter:image:alt": "Image explaining what The Full Stack covers."
  },
  "paywall": {
    "listed_paid": false,
    "detected": false,
    "marker": "",
    "public_only": false,
    "policy": "付费/会员内容只保留页面公开可见部分，不绕过付费墙"
  },
  "crawl": {
    "success": true,
    "status_code": 200,
    "error": ""
  },
  "code_blocks": [],
  "images": [
    {
      "status": "ok",
      "url": "https://fullstackdeeplearning.com/course/2022/lecture-4-data-management/media/image9.png",
      "bytes": 579907,
      "reused": false,
      "local_path": "attachments/2f97956010f5/images/body-1cdf8a192992ea6633cf.png",
      "src": "https://fullstackdeeplearning.com/course/2022/lecture-4-data-management/media/image9.png",
      "alt": "",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://fullstackdeeplearning.com/course/2022/lecture-4-data-management/media/image2.png",
      "bytes": 127176,
      "reused": false,
      "local_path": "attachments/2f97956010f5/images/body-55f67b4179807662c0d7.png",
      "src": "https://fullstackdeeplearning.com/course/2022/lecture-4-data-management/media/image2.png",
      "alt": "",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://fullstackdeeplearning.com/course/2022/lecture-4-data-management/media/image12.png",
      "bytes": 81643,
      "reused": false,
      "local_path": "attachments/2f97956010f5/images/body-5869a1a65297819eca11.png",
      "src": "https://fullstackdeeplearning.com/course/2022/lecture-4-data-management/media/image12.png",
      "alt": "",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://fullstackdeeplearning.com/course/2022/lecture-4-data-management/media/image11.png",
      "bytes": 288622,
      "reused": false,
      "local_path": "attachments/2f97956010f5/images/body-023170fdbca68bbe03f8.png",
      "src": "https://fullstackdeeplearning.com/course/2022/lecture-4-data-management/media/image11.png",
      "alt": "",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://fullstackdeeplearning.com/course/2022/lecture-4-data-management/media/image13.png",
      "bytes": 466183,
      "reused": false,
      "local_path": "attachments/2f97956010f5/images/body-3d20462135efa5b84daf.png",
      "src": "https://fullstackdeeplearning.com/course/2022/lecture-4-data-management/media/image13.png",
      "alt": "",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://fullstackdeeplearning.com/course/2022/lecture-4-data-management/media/image4.png",
      "bytes": 639338,
      "reused": false,
      "local_path": "attachments/2f97956010f5/images/body-04ef857a0c30f211a95e.png",
      "src": "https://fullstackdeeplearning.com/course/2022/lecture-4-data-management/media/image4.png",
      "alt": "",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://fullstackdeeplearning.com/course/2022/lecture-4-data-management/media/image8.png",
      "bytes": 577765,
      "reused": false,
      "local_path": "attachments/2f97956010f5/images/body-112f92cedc7846f43181.png",
      "src": "https://fullstackdeeplearning.com/course/2022/lecture-4-data-management/media/image8.png",
      "alt": "",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://fullstackdeeplearning.com/course/2022/lecture-4-data-management/media/image7.png",
      "bytes": 429782,
      "reused": false,
      "local_path": "attachments/2f97956010f5/images/body-74431a5c86a4bf756679.png",
      "src": "https://fullstackdeeplearning.com/course/2022/lecture-4-data-management/media/image7.png",
      "alt": "",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://fullstackdeeplearning.com/course/2022/lecture-4-data-management/media/image3.png",
      "bytes": 639190,
      "reused": false,
      "local_path": "attachments/2f97956010f5/images/body-3c7a9ab483bf1b881b7b.png",
      "src": "https://fullstackdeeplearning.com/course/2022/lecture-4-data-management/media/image3.png",
      "alt": "",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://fullstackdeeplearning.com/course/2022/lecture-4-data-management/media/image1.png",
      "bytes": 640122,
      "reused": false,
      "local_path": "attachments/2f97956010f5/images/body-247bc014e372d5002e08.png",
      "src": "https://fullstackdeeplearning.com/course/2022/lecture-4-data-management/media/image1.png",
      "alt": "",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://fullstackdeeplearning.com/course/2022/lecture-4-data-management/media/image15.png",
      "bytes": 789637,
      "reused": false,
      "local_path": "attachments/2f97956010f5/images/body-35a42b8458108826416d.png",
      "src": "https://fullstackdeeplearning.com/course/2022/lecture-4-data-management/media/image15.png",
      "alt": "",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://fullstackdeeplearning.com/course/2022/lecture-4-data-management/media/image10.png",
      "bytes": 577730,
      "reused": false,
      "local_path": "attachments/2f97956010f5/images/body-b6a037389c2ed26dc4c5.png",
      "src": "https://fullstackdeeplearning.com/course/2022/lecture-4-data-management/media/image10.png",
      "alt": "",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://fullstackdeeplearning.com/course/2022/lecture-4-data-management/media/image14.png",
      "bytes": 404736,
      "reused": false,
      "local_path": "attachments/2f97956010f5/images/body-f14e04d8bd696c025468.png",
      "src": "https://fullstackdeeplearning.com/course/2022/lecture-4-data-management/media/image14.png",
      "alt": "",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://fullstackdeeplearning.com/course/2022/lecture-4-data-management/media/image16.png",
      "bytes": 806609,
      "reused": false,
      "local_path": "attachments/2f97956010f5/images/body-cca8c2f32500cdcd36c9.png",
      "src": "https://fullstackdeeplearning.com/course/2022/lecture-4-data-management/media/image16.png",
      "alt": "",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://fullstackdeeplearning.com/course/2022/lecture-4-data-management/media/image6.png",
      "bytes": 576833,
      "reused": false,
      "local_path": "attachments/2f97956010f5/images/body-92705b0db6b0c9060666.png",
      "src": "https://fullstackdeeplearning.com/course/2022/lecture-4-data-management/media/image6.png",
      "alt": "",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://fullstackdeeplearning.com/course/2022/lecture-4-data-management/media/image5.png",
      "bytes": 288080,
      "reused": false,
      "local_path": "attachments/2f97956010f5/images/body-3fc3a0cae6d7889b4f54.png",
      "src": "https://fullstackdeeplearning.com/course/2022/lecture-4-data-management/media/image5.png",
      "alt": "",
      "downloaded": true
    }
  ],
  "audio": [],
  "videos": [
    {
      "url": "https://www.youtube.com/watch?v=Jlm4oqW41vY",
      "src": "https://www.youtube-nocookie.com/embed/Jlm4oqW41vY?list=PL1T8fO7ArWleMMI8KPJ_5D5XSlovTW_Ur",
      "status": "ok",
      "kind": "single_video",
      "local_path": "attachments/2f97956010f5/videos/repair-Jlm4oqW41vY.mp4",
      "bytes": 91405925,
      "valid": true,
      "height": 1080,
      "width": 1670,
      "duration": "2092.281000",
      "reused": false
    }
  ],
  "links": [
    {
      "href": "https://www.youtube-nocookie.com/embed/Jlm4oqW41vY?list=PL1T8fO7ArWleMMI8KPJ_5D5XSlovTW_Ur",
      "label": "",
      "type": "iframe"
    },
    {
      "href": "https://sergeykarayev.com/",
      "label": "Sergey Karayev",
      "type": "a"
    },
    {
      "href": "https://twitter.com/le_james94",
      "label": "James Le",
      "type": "a"
    },
    {
      "href": "https://www.linkedin.com/in/vrachakonda/",
      "label": "Vishnu Rachakonda",
      "type": "a"
    },
    {
      "href": "https://drive.google.com/file/d/17Ak9mxNBIAv_FHUZsneqSWSud9Dh7F3i/view?usp=sharing",
      "label": "Download slides",
      "type": "a"
    },
    {
      "href": "https://www.postgresql.org/",
      "label": "Postgres",
      "type": "a"
    },
    {
      "href": "https://www.sqlite.org/",
      "label": "SQLite",
      "type": "a"
    },
    {
      "href": "https://wandb.ai/site",
      "label": "W&B",
      "type": "a"
    },
    {
      "href": "https://huggingface.co/models",
      "label": "HuggingFace Hub",
      "type": "a"
    },
    {
      "href": "https://labelstud.io/",
      "label": "Label\nStudio",
      "type": "a"
    },
    {
      "href": "https://www.snowflake.com/",
      "label": "Snowflake",
      "type": "a"
    },
    {
      "href": "https://www.databricks.com/",
      "label": "Databricks",
      "type": "a"
    },
    {
      "href": "https://dataintensive.net/",
      "label": "Designing Data-Intensive\nApplications",
      "type": "a"
    },
    {
      "href": "https://pandas.pydata.org/",
      "label": "Pandas",
      "type": "a"
    },
    {
      "href": "https://examples.dask.org/dataframe.html",
      "label": "DASK\nDataFrame",
      "type": "a"
    },
    {
      "href": "https://rapids.ai/",
      "label": "RAPIDS",
      "type": "a"
    },
    {
      "href": "https://airflow.apache.org/",
      "label": "Airflow",
      "type": "a"
    },
    {
      "href": "https://www.prefect.io/",
      "label": "Prefect",
      "type": "a"
    },
    {
      "href": "https://dagster.io/",
      "label": "Dagster",
      "type": "a"
    },
    {
      "href": "https://eng.uber.com/michelangelo-machine-learning-platform/",
      "label": "this Uber blog post\ndescribing their ML platform,\nMichelangelo",
      "type": "a"
    },
    {
      "href": "https://www.tecton.ai/",
      "label": "Tecton",
      "type": "a"
    },
    {
      "href": "https://feast.dev/",
      "label": "Feast",
      "type": "a"
    },
    {
      "href": "https://www.featureform.com/",
      "label": "Featureform",
      "type": "a"
    },
    {
      "href": "https://huggingface.co/docs/datasets",
      "label": "HuggingFace\nDatasets",
      "type": "a"
    },
    {
      "href": "https://www.activeloop.ai/",
      "label": "Activeloop",
      "type": "a"
    },
    {
      "href": "https://github.com/openai/CLIP",
      "label": "OpenAI\nCLIP",
      "type": "a"
    },
    {
      "href": "https://github.com/pytorch/vision",
      "label": "torchvision",
      "type": "a"
    },
    {
      "href": "https://ai.googleblog.com/2020/04/advancing-self-supervised-and-semi.html",
      "label": "SimCLR",
      "type": "a"
    },
    {
      "href": "https://github.com/amoffat/metabrite-receipt-tests",
      "label": "create\nreceipts",
      "type": "a"
    },
    {
      "href": "https://scale.com/",
      "label": "Scale AI",
      "type": "a"
    },
    {
      "href": "https://labelbox.com/",
      "label": "Labelbox",
      "type": "a"
    },
    {
      "href": "https://supervise.ly/",
      "label": "Supervisely",
      "type": "a"
    },
    {
      "href": "https://diffgram.com/",
      "label": "Diffgram",
      "type": "a"
    },
    {
      "href": "https://www.aquariumlearning.com/",
      "label": "Aquarium",
      "type": "a"
    },
    {
      "href": "https://scale.com/nucleus",
      "label": "Scale Nucleus",
      "type": "a"
    },
    {
      "href": "https://snorkel.ai/",
      "label": "Snorkel",
      "type": "a"
    },
    {
      "href": "https://git-lfs.github.com/",
      "label": "git-lfs",
      "type": "a"
    },
    {
      "href": "https://dvc.org/",
      "label": "DVC",
      "type": "a"
    },
    {
      "href": "https://blog.ml.cmu.edu/2019/11/12/federated-learning-challenges-methods-and-future-directions/",
      "label": "federated\nlearning",
      "type": "a"
    }
  ],
  "repair_version": 2,
  "repaired_at": "2026-10-14T10:53:52Z",
  "source_url": "https://fullstackdeeplearning.com/course/2022/lecture-4-data-management/",
  "papers": [],
  "actual_video_files": [],
  "body_chars": 14890,
  "expected_body_images": 16,
  "discovery_status": "ok",
  "delivery_status": "ok",
  "missing_reason": "",
  "raw_html": "attachments/2f97956010f5/pages/source.html",
  "local_html": "attachments/2f97956010f5/pages/article.html",
  "body_base_path": "attachments/2f97956010f5/pages/",
  "body_markdown_path": "attachments/2f97956010f5/pages/article.md"
}