{ "info": { "author": "Yizheng Huang", "author_email": "huangyz0918@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "Intended Audience :: Education", "Intended Audience :: Financial and Insurance Industry", "Intended Audience :: Information Technology", "Intended Audience :: Science/Research", "License :: OSI Approved :: Apache Software License", "Operating System :: OS Independent", "Programming Language :: Python :: 3" ], "description": "# ALaaS: Active Learning as a Service.\n\n![PyPI](https://img.shields.io/pypi/v/alaas?color=green) [![Downloads](https://pepy.tech/badge/alaas)](https://pepy.tech/project/alaas) [![Testing](https://github.com/MLSysOps/alaas/actions/workflows/main.yml/badge.svg?branch=main)](https://github.com/MLSysOps/alaas/actions/workflows/main.yml) ![GitHub](https://img.shields.io/github/license/MLSysOps/alaas) ![Docker Pulls](https://img.shields.io/docker/pulls/huangyz0918/alaas)\n\n![](./docs/images/logo.svg)\n\nActive Learning as a Service (ALaaS) is a fast and scalable framework for automatically selecting a subset to be labeled\nfrom a full dataset so to reduce labeling cost. It provides a out-of-the-box and standalone experience for users to quickly\nutilize active learning.\n\n\nALaaS is featured for\n\n- :hatching_chick: **Easy-to-use** With <10 lines of code to start the system to employ active learning.\n- :rocket: **Fast** Use the stage-level parallellism to achieve over 10x speedup than under-optimized active learning process.\n- :collision: **Elastic** Scale up and down multiple active workers, depending on the number of GPU devices.\n\n*The project is still under the active development. Welcome to join us!*\n\n- [Demo on AWS](https://github.com/MLSysOps/Active-Learning-as-a-Service#demo-on-aws-coffee)\n- [Installation](https://github.com/MLSysOps/Active-Learning-as-a-Service#installation-construction)\n- [Quick Start](https://github.com/MLSysOps/Active-Learning-as-a-Service#quick-start-truck)\n- [ALaaS Server Customization (for Advance users)](https://github.com/MLSysOps/Active-Learning-as-a-Service#alaas-server-customization-wrench)\n- [Strategy Zoo](https://github.com/MLSysOps/Active-Learning-as-a-Service#strategy-zoo-art)\n- [Citation](https://github.com/MLSysOps/Active-Learning-as-a-Service#citation)\n\n## Demo on AWS :coffee:\n\n**Free ALaaS demo on AWS (Support HTTP & gRPC)**\n\nUse least confidence sampling with [ResNet-18](https://pytorch.org/vision/main/models/generated/torchvision.models.resnet18.html) \nto select images to be labeled for your tasks! \n\nWe have deployed ALaaS on AWS for demonstration. Try it by yourself!\n\n\n\n\n\n\n\n\n\n\n
Call ALaaS with HTTP \ud83c\udf10 Call ALaaS with gRPC \ud83d\udd10
\n\n```bash\ncurl \\\n-X POST http://13.213.29.8:8081/post \\\n-H 'Content-Type: application/json' \\\n-d '{\"data\":[{\"uri\": \"https://www.cs.toronto.edu/~kriz/cifar-10-sample/airplane1.png\"},\n {\"uri\": \"https://www.cs.toronto.edu/~kriz/cifar-10-sample/airplane2.png\"},\n {\"uri\": \"https://www.cs.toronto.edu/~kriz/cifar-10-sample/airplane3.png\"},\n {\"uri\": \"https://www.cs.toronto.edu/~kriz/cifar-10-sample/airplane4.png\"},\n {\"uri\": \"https://www.cs.toronto.edu/~kriz/cifar-10-sample/airplane5.png\"}], \n \"parameters\": {\"budget\": 3},\n \"execEndpoint\":\"/query\"}'\n```\n\n\n\n```python\n# pip install alaas\nfrom alaas.client import Client\n\nurl_list = [\n 'https://www.cs.toronto.edu/~kriz/cifar-10-sample/airplane1.png',\n 'https://www.cs.toronto.edu/~kriz/cifar-10-sample/airplane2.png',\n 'https://www.cs.toronto.edu/~kriz/cifar-10-sample/airplane3.png',\n 'https://www.cs.toronto.edu/~kriz/cifar-10-sample/airplane4.png',\n 'https://www.cs.toronto.edu/~kriz/cifar-10-sample/airplane5.png'\n]\nclient = Client('grpc://13.213.29.8:60035')\nprint(client.query_by_uri(url_list, budget=3))\n``` \n
\n\n\nThen you will see 3 data samples (the most informative) has been selected from all the 5 data points by ALaaS. \n\n## Installation :construction:\n\nYou can easily install the ALaaS by [PyPI](https://pypi.org/project/alaas/),\n\n```bash\npip install alaas\n```\n\nThe package of ALaaS contains both client and server parts. You can build an active data selection service on your own\nservers or just apply the client to perform data selection.\n\n:warning: For deep learning frameworks like [TensorFlow](https://www.tensorflow.org/) and [Pytorch](https://pytorch.org/), you may need to install manually since the version to meet your deployment can be different (as well as [transformers](https://pypi.org/project/transformers/) if you are running models from it).\n\nYou can also use [Docker](https://www.docker.com/) to run ALaaS: \n\n```bash\ndocker pull huangyz0918/alaas\n```\n\nand start a service by the following command:\n\n```bash\ndocker run -it --rm -p 8081:8081 \\\n --mount type=bind,source=,target=/server/config.yml,readonly huangyz0918/alaas:latest\n```\n\n## Quick Start :truck:\n\nAfter the installation of ALaaS, you can easily start a local server, here is the simplest example that can be executed with only 2 lines of code. \n\n```python\nfrom alaas.server import Server\n\nServer.start()\n```\n\nThe example code (by default) will start an image data selection (PyTorch ResNet-18 for image classification task) HTTP server in port `8081` for you. After this, you can try to get the selection results on your own image dataset, a client-side example is like\n\n\n```bash\ncurl \\\n-X POST http://0.0.0.0:8081/post \\\n-H 'Content-Type: application/json' \\\n-d '{\"data\":[{\"uri\": \"https://www.cs.toronto.edu/~kriz/cifar-10-sample/airplane1.png\"},\n {\"uri\": \"https://www.cs.toronto.edu/~kriz/cifar-10-sample/airplane2.png\"},\n {\"uri\": \"https://www.cs.toronto.edu/~kriz/cifar-10-sample/airplane3.png\"},\n {\"uri\": \"https://www.cs.toronto.edu/~kriz/cifar-10-sample/airplane4.png\"},\n {\"uri\": \"https://www.cs.toronto.edu/~kriz/cifar-10-sample/airplane5.png\"}], \n \"parameters\": {\"budget\": 3},\n \"execEndpoint\":\"/query\"}'\n```\n\nYou can also use `alaas.Client` to build the query request (for both `http` and `grpc` protos) like this,\n\n\n```python\nfrom alaas.client import Client\n\nurl_list = [\n 'https://www.cs.toronto.edu/~kriz/cifar-10-sample/airplane1.png',\n 'https://www.cs.toronto.edu/~kriz/cifar-10-sample/airplane2.png',\n 'https://www.cs.toronto.edu/~kriz/cifar-10-sample/airplane3.png',\n 'https://www.cs.toronto.edu/~kriz/cifar-10-sample/airplane4.png',\n 'https://www.cs.toronto.edu/~kriz/cifar-10-sample/airplane5.png'\n]\nclient = Client('http://0.0.0.0:8081')\nprint(client.query_by_uri(url_list, budget=3))\n```\n\nThe output data is a subset uris/data in your input dataset, which indicates selected results for further data labeling.\n\n\n## ALaaS Server Customization :wrench:\n\nWe support two different methods to start your server, 1. by input parameters 2. by YAML configuration\n\n\n### Input Parameters\n\nYou can modify your server by setting different input parameters, \n\n```python\nfrom alaas.server import Server\n\nServer.start(proto='http', # the server proto, can be 'grpc', 'http' and 'https'.\n port=8081, # the access port of your server.\n host='0.0.0.0', # the access IP address of your server.\n job_name='default_app', # the server name.\n model_hub='pytorch/vision:v0.10.0', # the active learning model hub, the server will automatically download it for data selection.\n model_name='resnet18', # the active learning model name (should be available in your model hub).\n device='cpu', # the deploy location/device (can be something like 'cpu', 'cuda' or 'cuda:0'). \n strategy='LeastConfidence', # the selection strategy (read the document to see what ALaaS supports).\n batch_size=1, # the batch size of data processing.\n replica=1, # the number of workers to select/query data.\n tokenizer=None, # the tokenizer name (should be available in your model hub), only for NLP tasks.\n transformers_task=None # the NLP task name (for Hugging Face [Pipelines](https://huggingface.co/docs/transformers/main_classes/pipelines)), only for NLP tasks.\n)\n```\n\n### YAML Configuration\n\nYou can also start the server by setting an input YAML configuration like this,\n\n```python\nfrom alaas import Server\n\n# start the server by an input configuration file.\nServer.start_by_config('path_to_your_configuration.yml')\n```\n\nDetails about building a configuration for your deployment scenarios can be found [here](./docs/configuration.md).\n\n\n\n## Strategy Zoo :art:\n\nCurrently we supported several active learning strategies shown in the following table,\n\n|Type|Setting|Abbr|Strategy|Year|Reference|\n|:--:|:--:|:--:|:--:|:--:|:--:|\n|Random|Pool-base|RS|Random Sampling|-|-|\n|Uncertainty|Pool|LC|Least Confidence Sampling|1994|[DD Lew et al.](https://arxiv.org/pdf/cmp-lg/9407020)|\n|Uncertainty|Pool|MC|Margin Confidence Sampling|2001|[T Scheffer et al.](https://link.springer.com/chapter/10.1007/3-540-44816-0_31)|\n|Uncertainty|Pool|RC|Ratio Confidence Sampling|2009|[B Settles et al.](https://research.cs.wisc.edu/techreports/2009/TR1648.pdf)|\n|Uncertainty|Pool|VRC|Variation Ratios Sampling|1965|[EH Johnson et al.](https://academic.oup.com/sf/article-abstract/44/3/455/2228590?redirectedFrom=fulltext)|\n|Uncertainty|Pool|ES|Entropy Sampling|2009|[B Settles et al.](https://research.cs.wisc.edu/techreports/2009/TR1648.pdf)|\n|Uncertainty|Pool|MSTD|Mean Standard Deviation|2016|[M Kampffmeyer et al.](https://ieeexplore.ieee.org/document/7789580)|\n|Uncertainty|Pool|BALD|Bayesian Active Learning Disagreement|2017|[Y Gal et al.](https://arxiv.org/abs/1703.02910)|\n|Clustering|Pool|KCG|K-Center Greedy Sampling|2017|[Ozan Sener et al.](https://www.semanticscholar.org/paper/A-Geometric-Approach-to-Active-Learning-for-Neural-Sener-Savarese/82fb7661d892a7412726de6ead14269139d0310c)|\n|Clustering|Pool|KM|K-Means Sampling|2011|[Z Bod\u00f3 et al.](http://proceedings.mlr.press/v16/bodo11a/bodo11a.pdf)|\n|Clustering|Pool|CS|Core-Set Selection Approach|2018|[Ozan Sener et al.](https://arxiv.org/abs/1708.00489?context=cs)|\n|Diversity|Pool|DBAL|Diverse Mini-batch Sampling|2019|[Fedor Zhdanov](https://arxiv.org/abs/1901.05954)|\n|Adversarial|Pool|DFAL|DeepFool Active Learning|2018|[M Ducoffe et al.](https://arxiv.org/abs/1802.09841)|\n\n\n## Citation\n\nOur tech report of ALaaS is available on [arxiv](https://arxiv.org/abs/2207.09109) and [NeurIPS 2022](https://neurips-hill.github.io/). Please cite as:\n\n```bash\n@article{huang2022active,\n title={Active-Learning-as-a-Service: An Efficient MLOps System for Data-Centric AI},\n author={Huang, Yizheng and Zhang, Huaizheng and Li, Yuanming and Lau, Chiew Tong and You, Yang},\n journal={arXiv preprint arXiv:2207.09109},\n year={2022}\n}\n```\n\n## Contributors \u2728\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n\n\n\n\n \n \n \n \n \n
\"\"/
Yizheng Huang

\ud83d\ude87 \u26a0\ufe0f \ud83d\udcbb
\"\"/
Huaizheng

\ud83d\udd8b \u26a0\ufe0f \ud83d\udcd6
\"\"/
Yuanming Li

\u26a0\ufe0f \ud83d\udcbb
\n\n\n\n\n\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n\n## Acknowledgement\n\n- [Jina](https://github.com/jina-ai/jina) - Build cross-modal and multimodal applications on the cloud.\n- [Transformers](https://github.com/huggingface/transformers) - State-of-the-art Machine Learning for Pytorch, TensorFlow, and JAX.\n\n\n## License\n\nThe theme is available as open source under the terms of the [Apache 2.0 License](./LICENSE).\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": "https://github.com/MLSysOps/alaas/archive/master.zip", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/MLSysOps/alaas", "keywords": "active learning,deep learning,MLOps,data mining,neural networks", "license": "", "maintainer": "", "maintainer_email": "", "name": "alaas", "package_url": "https://pypi.org/project/alaas/", "platform": null, "project_url": "https://pypi.org/project/alaas/", "project_urls": { "Download": "https://github.com/MLSysOps/alaas/archive/master.zip", "Homepage": "https://github.com/MLSysOps/alaas" }, "release_url": "https://pypi.org/project/alaas/0.2.1/", "requires_dist": [ "numpy", "boto3", "scikit-learn", "setuptools", "tqdm", "pydantic", "pyyaml", "requests", "opencv-python", "pillow", "jina", "transformers", "sentencepiece" ], "requires_python": "", "summary": "A Distributed MLOps System for Efficient Active Learning", "version": "0.2.1", "yanked": false, "yanked_reason": null }, "last_serial": 16254320, "releases": { "0.0.1": [ { "comment_text": "", "digests": { "md5": "6febe5640c76a311cce56658e2187f55", "sha256": "6faf8583a1864b16683d6951f7344b594c10119bcbda737f173ba763dd4e9ef0" }, "downloads": -1, "filename": "alaas-0.0.1-py3-none-any.whl", "has_sig": false, "md5_digest": "6febe5640c76a311cce56658e2187f55", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 14316, "upload_time": "2022-05-15T10:14:11", "upload_time_iso_8601": "2022-05-15T10:14:11.056321Z", "url": "https://files.pythonhosted.org/packages/d7/3b/499dfed7ab8f2b3a45fa3eccb96ee91f8cff7d36f9ce3d53f3717f9a870e/alaas-0.0.1-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "2407ef3f6f1c85c0870185a2c66929c1", "sha256": "22647291a185995daa9ef1cfbe3c33cb6633b5f5513038bdb94a21da3f83ac8f" }, "downloads": -1, "filename": "alaas-0.0.1.tar.gz", "has_sig": false, "md5_digest": "2407ef3f6f1c85c0870185a2c66929c1", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12013, "upload_time": "2022-05-15T10:14:12", "upload_time_iso_8601": "2022-05-15T10:14:12.915259Z", "url": "https://files.pythonhosted.org/packages/cc/80/4ad6340052eed85dbb30e7f953db30ea5e2ed718e649e4d1c120d85ab0b7/alaas-0.0.1.tar.gz", "yanked": false, "yanked_reason": null } ], "0.1.6": [ { "comment_text": "", "digests": { "md5": "9c0eb3fd5b21dfbbbbc7ae9364df8889", "sha256": "df57d0882071cd4c927a47ca3725b19f224c45ca2b40ec4076dd546680fd3077" }, "downloads": -1, "filename": "alaas-0.1.6-py3-none-any.whl", "has_sig": false, "md5_digest": "9c0eb3fd5b21dfbbbbc7ae9364df8889", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 25071, "upload_time": "2022-07-21T09:28:32", "upload_time_iso_8601": "2022-07-21T09:28:32.076876Z", "url": "https://files.pythonhosted.org/packages/de/09/cf0c5e0d0e04c85e3cd05fd79b22ed944a0d6c8b3d6b70f6c8a02f77d7ae/alaas-0.1.6-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "a507418d96b796838f4a0e9c0a7ef6a1", "sha256": "621c24a58f9babae142b864d7dec4c82467d268703cbfba8412f19d28fa85237" }, "downloads": -1, "filename": "alaas-0.1.6.tar.gz", "has_sig": false, "md5_digest": "a507418d96b796838f4a0e9c0a7ef6a1", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19418, "upload_time": "2022-07-21T09:28:33", "upload_time_iso_8601": "2022-07-21T09:28:33.570823Z", "url": "https://files.pythonhosted.org/packages/99/14/32e556e164a7a5cf6c8b2613957046e1ea40a36a3fb3c2a8a97212ec6784/alaas-0.1.6.tar.gz", "yanked": false, "yanked_reason": null } ], "0.1.7": [ { "comment_text": "", "digests": { "md5": "899d1c37283587437c6ae12f6beaf2a3", "sha256": "be1edd57397d44eb7d87f37bb852a6e0c3620665339f8ecaf68d7a0d60d5d8d8" }, "downloads": -1, "filename": "alaas-0.1.7-py3-none-any.whl", "has_sig": false, "md5_digest": "899d1c37283587437c6ae12f6beaf2a3", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 31500, "upload_time": "2022-08-23T01:17:25", "upload_time_iso_8601": "2022-08-23T01:17:25.106008Z", "url": "https://files.pythonhosted.org/packages/22/d2/ef77c5585ade2cb24b9fc855f58458d41d71afbe8a214a031eb1737891a1/alaas-0.1.7-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "b5b0ff504110302f1bd363a3d4002df8", "sha256": "8a713171b8b9498ce9813c523dbbd806b25f75969d3c1138339da4bd8ee6aa38" }, "downloads": -1, "filename": "alaas-0.1.7.tar.gz", "has_sig": false, "md5_digest": "b5b0ff504110302f1bd363a3d4002df8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 26153, "upload_time": "2022-08-23T01:17:26", "upload_time_iso_8601": "2022-08-23T01:17:26.721399Z", "url": "https://files.pythonhosted.org/packages/f7/02/3c078f81c77d1c19b812a5cd29222dc49fd3857b8e01ca6ece98f0604325/alaas-0.1.7.tar.gz", "yanked": false, "yanked_reason": null } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "beda2466ab056cc47044aeeb19d4b433", "sha256": "c3e5d4de080dc4d77fa2bf481fe2753a9da07cf4ca93012ea9750cc57a9d5d0e" }, "downloads": -1, "filename": "alaas-0.2.0-py3-none-any.whl", "has_sig": false, "md5_digest": "beda2466ab056cc47044aeeb19d4b433", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 32620, "upload_time": "2022-09-08T03:39:44", "upload_time_iso_8601": "2022-09-08T03:39:44.490748Z", "url": "https://files.pythonhosted.org/packages/f2/8f/b3189930006f7ec559347a7946011bbe74d3f4f42ea9e4a1379e51c3ed57/alaas-0.2.0-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "aae037a3c56eef4bafaebf1e8df50d47", "sha256": "8069d33b45ede47389e883e70ea7b3c9f68fff9cc98758b9d7ae944b08370497" }, "downloads": -1, "filename": "alaas-0.2.0.tar.gz", "has_sig": false, "md5_digest": "aae037a3c56eef4bafaebf1e8df50d47", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 27870, "upload_time": "2022-09-08T03:39:46", "upload_time_iso_8601": "2022-09-08T03:39:46.065193Z", "url": "https://files.pythonhosted.org/packages/e8/0a/34fb321455c1d2fe14f6e283eca0ebeff0b4a5316a4bfb3bf73142922060/alaas-0.2.0.tar.gz", "yanked": false, "yanked_reason": null } ], "0.2.1": [ { "comment_text": "", "digests": { "md5": "d0df00668a416dd18cb52bbfbd5943c3", "sha256": "1b22ff6f0cc0644c84be87be095e972e4b04bbc3f5816bcb22a3315d81a4b4b4" }, "downloads": -1, "filename": "alaas-0.2.1-py3-none-any.whl", "has_sig": false, "md5_digest": "d0df00668a416dd18cb52bbfbd5943c3", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 33028, "upload_time": "2022-12-30T03:56:04", "upload_time_iso_8601": "2022-12-30T03:56:04.964370Z", "url": "https://files.pythonhosted.org/packages/c0/3d/53bc4c1fb96e0b308245c46f88d122b547a5633ac5f6e0011696cc4e5c36/alaas-0.2.1-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "c1ef5a7936bd676420ace865a4cb84e5", "sha256": "7c31a32fbc06daa0f2df7e98bac5e79ed5838e6d91ac628f1269c0c0087ed035" }, "downloads": -1, "filename": "alaas-0.2.1.tar.gz", "has_sig": false, "md5_digest": "c1ef5a7936bd676420ace865a4cb84e5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 28544, "upload_time": "2022-12-30T03:56:06", "upload_time_iso_8601": "2022-12-30T03:56:06.943314Z", "url": "https://files.pythonhosted.org/packages/27/49/6391a0af2aa5325eb10d2f22c094efc3f6da919c4755a9146bb008589e60/alaas-0.2.1.tar.gz", "yanked": false, "yanked_reason": null } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "d0df00668a416dd18cb52bbfbd5943c3", "sha256": "1b22ff6f0cc0644c84be87be095e972e4b04bbc3f5816bcb22a3315d81a4b4b4" }, "downloads": -1, "filename": "alaas-0.2.1-py3-none-any.whl", "has_sig": false, "md5_digest": "d0df00668a416dd18cb52bbfbd5943c3", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 33028, "upload_time": "2022-12-30T03:56:04", "upload_time_iso_8601": "2022-12-30T03:56:04.964370Z", "url": "https://files.pythonhosted.org/packages/c0/3d/53bc4c1fb96e0b308245c46f88d122b547a5633ac5f6e0011696cc4e5c36/alaas-0.2.1-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "c1ef5a7936bd676420ace865a4cb84e5", "sha256": "7c31a32fbc06daa0f2df7e98bac5e79ed5838e6d91ac628f1269c0c0087ed035" }, "downloads": -1, "filename": "alaas-0.2.1.tar.gz", "has_sig": false, "md5_digest": "c1ef5a7936bd676420ace865a4cb84e5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 28544, "upload_time": "2022-12-30T03:56:06", "upload_time_iso_8601": "2022-12-30T03:56:06.943314Z", "url": "https://files.pythonhosted.org/packages/27/49/6391a0af2aa5325eb10d2f22c094efc3f6da919c4755a9146bb008589e60/alaas-0.2.1.tar.gz", "yanked": false, "yanked_reason": null } ], "vulnerabilities": [] }