diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md index e97b127ed2..57fef3461b 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -3,7 +3,7 @@ name: Feature request about: Suggest an idea for this project title: "[FEATURE]" labels: "i: enhancement, i: needs triage" -assignees: "" +assignees: '' --- diff --git a/.gitignore b/.gitignore index 981cd731ff..d0eb7fca83 100644 --- a/.gitignore +++ b/.gitignore @@ -185,4 +185,8 @@ logs/ .creds/ .idea/ waymo/ -output/ \ No newline at end of file +output/ +cov.xml +hub/api/cov.xml +hub/api/nested_seq +nested_seq \ No newline at end of file diff --git a/README.md b/README.md index 20d534ae2c..d664534ba2 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@


- +

@@ -164,9 +164,17 @@ As always, thanks to our amazing contributors!
## Examples -Activeloop’s Hub format lets you achieve faster inference at a lower cost. Test out the datasets we’ve converted into Hub format - see for yourself! -- [Waymo Open Dataset](https://medium.com/snarkhub/extending-snark-hub-capabilities-to-handle-waymo-open-dataset-4dc7b7d8ab35) -- [Aptiv nuScenes](https://medium.com/snarkhub/snark-hub-is-hosting-nuscenes-dataset-for-autonomous-driving-1470ae3e1923) +Activeloop’s Hub format lets you achieve faster inference at a lower cost. We have 30+ popular datasets already on our platform. These include:- +- COCO +- CIFAR-10 +- PASCAL VOC +- Cars196 +- KITTI +- EuroSAT +- Caltech-UCSD Birds 200 +- Food101 + +Check these and many more popular datasets on our [visualizer web app](https://app.activeloop.ai/datasets/popular) and load them directly for model training! ## Disclaimers diff --git a/benchmarks/benchmark_to_pytorch.py b/benchmarks/benchmark_to_pytorch.py new file mode 100644 index 0000000000..b26851f490 --- /dev/null +++ b/benchmarks/benchmark_to_pytorch.py @@ -0,0 +1,53 @@ +import torchvision +import torch +import numpy as np + +import hub +from hub.utils import Timer + + +class HubAdapter2(torch.utils.data.Dataset): + def __init__(self, ods): + self.ds = ods + + def __len__(self): + return min(len(self.ds), 1000 * 1000) + + @property + def shape(self): + return (self.ds.__len__(), None, None, None) + + def __iter__(self): + for i in range(len(self)): + yield self[i] + + def __getitem__(self, index): + x, y = self.ds.__getitem__(index) + res = {"image": np.array(x), "label": y} + return res + + +def test(): + tv_cifar_ds = torchvision.datasets.CIFAR10(".", download=True) + + hub_cifar = HubAdapter2(tv_cifar_ds) + + pt2hb_ds = hub.Dataset.from_pytorch(hub_cifar, scheduler="threaded", workers=8) + res_ds = pt2hb_ds.store("./data/test/cifar/train") + hub_s3_ds = hub.Dataset( + url="./data/test/cifar/train", cache=False, storage_cache=False + ) + print(hub_s3_ds._tensors["/image"].chunks) + hub_s3_ds = hub_s3_ds.to_pytorch() + dl = torch.utils.data.DataLoader(hub_s3_ds, batch_size=100, num_workers=8) + with Timer("Time"): + counter = 0 + for i, b in enumerate(dl): + with Timer("Batch Time"): + x, y = b["image"], b["image"] + counter += 100 + print(counter) + + +if __name__ == "__main__": + test() diff --git a/docs/logo/logo-explainer-bg.png b/docs/logo/logo-explainer-bg.png new file mode 100644 index 0000000000..1005cae755 Binary files /dev/null and b/docs/logo/logo-explainer-bg.png differ diff --git a/docs/requirements.txt b/docs/requirements.txt index 1c2758ad7e..35f722f839 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -1,4 +1,4 @@ sphinx==3.1.2 sphinx_markdown_tables==0.0.15 -recommonmark==0.6.0 +recommonmark==0.7.1 sphinx_rtd_theme==0.5.0 \ No newline at end of file diff --git a/examples/mpii_data_upload_example.py b/examples/mpii_data_upload_example.py new file mode 100644 index 0000000000..a4a6bd1fc5 --- /dev/null +++ b/examples/mpii_data_upload_example.py @@ -0,0 +1,99 @@ +import json +import time +import numpy as np +from PIL import Image +from tqdm import tqdm + +import hub +from hub import Dataset, schema +from hub.schema import Tensor, Text + +""" +Below we will define a schema for our dataset. Schema is kind of +a container to specify structure, shape, dtype and meta information +of our dataset. We have different types of schemas for different +types of data like image, tensor, text. More info. on docs. +""" +mpii_schema = { + """ + we specify 'shape' as None for variable image size, and we + give 'max_shape' arguement a maximum possible size of image. + """ + "image": schema.Image( + shape=(None, None, 3), max_shape=(1920, 1920, 3), dtype="uint8" + ), + "isValidation": "float64", + "img_paths": Text(shape=(None,), max_shape=(15,)), + "img_width": "int32", + "img_height": "int32", + "objpos": Tensor(max_shape=(100,), dtype="float64"), + """ + 'joint_self' has nested list structure + """ + "joint_self": Tensor(shape=(None, None), max_shape=(100, 100), dtype="float64"), + "scale_provided": "float64", + "annolist_index": "int32", + "people_index": "int32", + "numOtherPeople": "int32", +} + + +""" +Below function takes JSON file and gives annotations in the +form of dictionary inside list. +""" + + +def get_anno(jsonfile): + + with open(jsonfile) as f: + instances = json.load(f) + + annotations = [] + for i in range(len(instances)): + annotations.append(instances[i]) + return annotations + + +""" +Hub Transform is optimized to give efficient processing and +storing of dataset. Below function takes a dataset and applies +transform on every sample(instance) of dataset, and outputs a +dataset with specified schema. More info. on docs. +""" + + +@hub.transform(schema=mpii_schema, workers=8) +def mpii_transform(annotation): + return { + "image": np.array(Image.open(img_path + annotation["img_paths"])), + "isValidation": np.array(annotation["isValidation"]), + "img_paths": annotation["img_paths"], + "img_width": np.array(annotation["img_width"]), + "img_height": np.array(annotation["img_height"]), + "objpos": np.array(annotation["objpos"]), + "joint_self": np.array(annotation["joint_self"]), + "scale_provided": np.array(annotation["scale_provided"]), + "annolist_index": np.array(annotation["annolist_index"]), + "people_index": np.array(annotation["people_index"]), + "numOtherPeople": np.array(annotation["numOtherPeople"]), + } + + +if __name__ == "__main__": + + tag = input("Enter tag(username/dataset_name):") + jsonfile = input("Enter json file path:") + img_path = input("Enter path to images:") + + annotations = get_anno(jsonfile) + + t1 = time.time() + ds = mpii_transform(annotations) + ds = ds.store(tag) + print("Time taken to upload:", (time.time() - t1), "sec") + +""" +Dataset uploaded using AWS EC2. Pipeline took 8931.26 sec to +finish. Dataset is visible on app and tested working fine. +""" diff --git a/examples/tutorial/README.md b/examples/tutorial/README.md new file mode 100644 index 0000000000..ebddfe2328 --- /dev/null +++ b/examples/tutorial/README.md @@ -0,0 +1,2 @@ +# A Gentle Introduction to Hub +A collection of tutorials for [Hub](https://github.com/activeloopai/hub). It starts off by working with [different types](https://docs.activeloop.ai/en/latest/concepts/features.html#available-schemas) of data (eg images, audio), and then moves on to more complicated concepts like dynamic tensors. \ No newline at end of file diff --git a/examples/tutorial/Tutorial 1a - Uploading Images.ipynb b/examples/tutorial/Tutorial 1a - Uploading Images.ipynb new file mode 100644 index 0000000000..6e1e87dad0 --- /dev/null +++ b/examples/tutorial/Tutorial 1a - Uploading Images.ipynb @@ -0,0 +1,273 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Uploading [Images](https://docs.activeloop.ai/en/latest/concepts/features.html#image)\n", + "\n", + "In this notebook, we will see how to upload and store images on Hub." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "from hub.schema import ClassLabel, Image\n", + "from hub import transform, schema\n", + "\n", + "from skimage.io import imread\n", + "from skimage import img_as_ubyte\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "from tqdm import tqdm\n", + "\n", + "from glob import glob\n", + "from time import time\n", + "\n", + "%matplotlib inline" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(['./Data/Images/00164.00000.jpg',\n", + " './Data/Images/00132.00001.jpg',\n", + " './Data/Images/00088.00001.jpg',\n", + " './Data/Images/00148.00000.jpg',\n", + " './Data/Images/00176.00000.jpg'],\n", + " 27)" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# a list of image filepaths\n", + "fnames = glob(\"./Data/Images/*\")\n", + "fnames[:5], len(fnames)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# each image filepath corresponds to an unique image\n", + "img = imread(fnames[0])\n", + "plt.imshow(img)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Defining a Schema\n", + "A schema is a python `dicts` that contains metadata about our dataset. \n", + "\n", + "In this example, we tell Hub that our images have the shape 380x380x3 and are `uint8`. Furthermore, these images belong to one of two classes." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "my_schema = {\n", + " \"image\": Image(shape=(380, 380, 3), dtype=\"uint8\"),\n", + " \"label\": ClassLabel(num_classes=2),\n", + "}" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Defining Transforms\n", + "First, we define a method `load_transform` and decorate it with `@transform`. This is the function that will applied to **each instance/sample** of our dataset. \n", + "\n", + "In our example, for each element in the list `fnames`, we want to read the image into memory (with `imread`) and label it (by pulling its class from its filename). If we wanted to, we include arbitrary operations too, perhaps resizing or reshaping each image.\n", + "\n", + "Then, we return a `dict` with the same key-values as the ones defined in `my_schema`." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "@transform(schema=my_schema)\n", + "def load_transform(sample):\n", + " image = imread(sample)\n", + " label = int(sample.split('.')[-2])\n", + " \n", + " return {\n", + " \"image\" : image,\n", + " \"label\" : label\n", + " }" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "hub.compute.transform.Transform" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "ds = load_transform(fnames) # returns a transform object\n", + "type(ds)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Finally, Execution!\n", + "Hub lazily executes, so nothing happens until we invoke `store`." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Computing the transormation: 100%|██████████| 27.0/27.0 [00:02<00:00, 9.08 items/s]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Elapsed time: 5.092390775680542\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n" + ] + } + ], + "source": [ + "start = time()\n", + "\n", + "tag = \"mynameisvinn/faces\"\n", + "ds2 = ds.store(tag)\n", + "type(ds2)\n", + "\n", + "end = time()\n", + "print(\"Elapsed time:\", end - start)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.imshow(ds2['image', 0].compute())" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.3" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/examples/tutorial/Tutorial 1b - Uploading Dataframes.ipynb b/examples/tutorial/Tutorial 1b - Uploading Dataframes.ipynb new file mode 100644 index 0000000000..42667c45d1 --- /dev/null +++ b/examples/tutorial/Tutorial 1b - Uploading Dataframes.ipynb @@ -0,0 +1,222 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Working with DataFrames" + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "metadata": {}, + "outputs": [], + "source": [ + "import hub\n", + "from hub.schema import Primitive\n", + "from tqdm import tqdm\n", + "from hub import Dataset, transform, schema\n", + "from time import time\n", + "import pandas as pd" + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Unnamed: 0contestwinnerlosertime
00799509201282959064612020-08-21 19:15:34.342
11517964535596342154592020-08-21 20:10:45.923
22318699052673769064592020-08-21 22:19:37.525
33636948901240274470622020-08-21 22:19:37.525
44309110647086389871622020-08-21 22:19:37.525
\n", + "
" + ], + "text/plain": [ + " Unnamed: 0 contest winner loser time\n", + "0 0 7995092012829590 64 61 2020-08-21 19:15:34.342\n", + "1 1 5179645355963421 54 59 2020-08-21 20:10:45.923\n", + "2 2 3186990526737690 64 59 2020-08-21 22:19:37.525\n", + "3 3 6369489012402744 70 62 2020-08-21 22:19:37.525\n", + "4 4 3091106470863898 71 62 2020-08-21 22:19:37.525" + ] + }, + "execution_count": 51, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# tabular data\n", + "df = pd.read_csv(\"ps4-madden21.csv\")\n", + "df.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 53, + "metadata": {}, + "outputs": [], + "source": [ + "# i want to keep 'contest' column\n", + "my_schema = {\n", + " \"contest\": Primitive(dtype=\"float32\") # Primitive handles numpy arrays\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": 54, + "metadata": {}, + "outputs": [], + "source": [ + "@transform(schema=my_schema)\n", + "def load_transform(sample):\n", + " return {\n", + " \"contest\": sample\n", + " }" + ] + }, + { + "cell_type": "code", + "execution_count": 55, + "metadata": {}, + "outputs": [], + "source": [ + "ds = load_transform((df['contest'])) # pass the dataframe column" + ] + }, + { + "cell_type": "code", + "execution_count": 56, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Computing the transormation: 154k items [00:36, 4.23k items/s] " + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "elapsed time: 39.528635025024414\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n" + ] + } + ], + "source": [ + "start = time()\n", + "\n", + "tag = \"mynameisvinn/pandas\" # use your own tag/url\n", + "ds2 = ds.store(tag)\n", + "\n", + "end = time()\n", + "print(\"elapsed time:\", end - start)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.3" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/examples/tutorial/Tutorial 1c - Uploading Audio.ipynb b/examples/tutorial/Tutorial 1c - Uploading Audio.ipynb new file mode 100644 index 0000000000..ceb35f1116 --- /dev/null +++ b/examples/tutorial/Tutorial 1c - Uploading Audio.ipynb @@ -0,0 +1,219 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Working with [Audio](https://docs.activeloop.ai/en/latest/concepts/features.html#audio)\n", + "\n", + "In this notebook, we will see how to handle audio data." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "from hub.schema import Primitive, Audio, ClassLabel\n", + "from hub import transform, schema\n", + "\n", + "import librosa\n", + "from librosa import display\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "from tqdm import tqdm\n", + "\n", + "from glob import glob\n", + "from time import time\n", + "\n", + "plt.style.use(\"ggplot\")\n", + "%matplotlib inline" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Text(0.5, 0, 'Amplitude')" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "fnames = glob(\"./Data/audio/*\")\n", + "\n", + "# lets look at an audio file\n", + "audio, sr = librosa.load(fnames[0])\n", + "librosa.display.waveplot(audio, sr=sr)\n", + "plt.ylabel(\"Time\")\n", + "plt.xlabel(\"Amplitude\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## (A) Defining a Schema for Audio Files\n", + "A schema is a python `dict` that contains metadata about our dataset. \n", + "\n", + "For this example, we tell Hub that our audio files have variable shape, perhaps as long as 192,000 samples. " + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "my_schema = {\n", + " \"wav\": Audio(shape=(None,), max_shape=(192000,), file_format=\"wav\"),\n", + " \"sampling_rate\": Primitive(dtype=int), \n", + "}" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## (B) Defining Transforms\n", + "First, we define a method `load_transform` and decorate it with `@transform`. This is the function that will applied to **each instance/sample** of our dataset. \n", + "\n", + "In our example, for each element in the list `fnames`, we want to read the wav file into memory (with `librosa.load`)." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "@transform(schema=my_schema)\n", + "def load_transform(sample):\n", + " \n", + " audio, sr = librosa.load(sample, sr=None)\n", + " \n", + " return {\n", + " \"wav\": audio,\n", + " \"sampling_rate\": sr\n", + " }" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "hub.compute.transform.Transform" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "ds = load_transform(fnames) # returns a transform object\n", + "type(ds)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## (C) Finally, Execution!\n", + "Hub lazily executes, so nothing happens until we invoke `store`. By invoking `store`, we apply `load_transform` to our dataset and push everything." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/mynameisvinn/anaconda3/lib/python3.8/site-packages/zarr/creation.py:210: UserWarning: ignoring keyword argument 'mode'\n", + " warn('ignoring keyword argument %r' % k)\n", + "Computing the transormation: 100%|██████████| 14.0/14.0 [00:01<00:00, 13.5 items/s]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Elapsed time: 5.174474000930786\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n" + ] + } + ], + "source": [ + "start = time()\n", + "\n", + "tag = \"mynameisvinn/vibrations\"\n", + "ds2 = ds.store(tag)\n", + "type(ds2)\n", + "\n", + "end = time()\n", + "print(\"Elapsed time:\", end - start)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.3" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/examples/tutorial/Tutorial 2 - Retrieving Remote Data.ipynb b/examples/tutorial/Tutorial 2 - Retrieving Remote Data.ipynb new file mode 100644 index 0000000000..9226298cb8 --- /dev/null +++ b/examples/tutorial/Tutorial 2 - Retrieving Remote Data.ipynb @@ -0,0 +1,96 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Retrieving Data\n", + "We will retrieve the dataset that was created in the previous [tutorial](https://github.com/activeloopai/Hub/blob/master/examples/tutorial/Tutorial%201a%20-%20Uploading%20Images.ipynb)." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "import hub\n", + "\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "%matplotlib inline" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "tag = \"mynameisvinn/faces\"\n", + "ds = hub.load(tag)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "img = ds[\"image\", 5].compute()\n", + "plt.imshow(img)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.3" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/examples/tutorial/Tutorial 3 - Transforming Data.ipynb b/examples/tutorial/Tutorial 3 - Transforming Data.ipynb new file mode 100644 index 0000000000..3fcb95f26f --- /dev/null +++ b/examples/tutorial/Tutorial 3 - Transforming Data.ipynb @@ -0,0 +1,203 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# [Transforming Data](https://docs.activeloop.ai/en/latest/concepts/transform.html#transform)\n", + "This notebook shows how we can transform `hub.Dataset`'s. " + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "import hub\n", + "from hub.schema import ClassLabel, Image, Tensor\n", + "from hub import Dataset, transform, schema\n", + "from skimage.transform import resize\n", + "from skimage import img_as_ubyte\n", + "\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "%matplotlib inline" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# lets fetch our original hub.Dataset\n", + "tag = \"mynameisvinn/faces\"\n", + "ds = hub.Dataset(tag)\n", + "plt.imshow(ds['image', 0].compute())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Transform\n", + "Let's say we want to resize the images (from `224x224x3` to `24x24x3`) in our dataset, a common operation in computer vision pipelines.\n", + "\n", + "Without Hub, we would have to read every image into memory (possibly from a remote data store like s3), apply a resizing operation, and then save it. This simple sequence could potentially take lots of wall time, mostly with read/writes.\n", + "\n", + "With Hub, we could appy this transformation without moving bytes back and forth." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "new_schema = {\n", + " \"resized_image\": Image(shape=(24, 24, 3), dtype=\"uint8\"),\n", + " \"label\": ClassLabel(num_classes=2)\n", + "}\n", + "\n", + "@transform(schema=new_schema)\n", + "def resize_transform(sample):\n", + " \n", + " image = resize(sample['image'].compute(), (24, 24, 3), anti_aliasing=True)\n", + " image = img_as_ubyte(image) # recast from float to uint8\n", + " label = int(sample['label'].compute())\n", + " \n", + " return {\n", + " \"resized_image\": image,\n", + " \"label\": label\n", + " }" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "ds2 = resize_transform(ds) # transform object" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Computing the transormation: 100%|██████████| 27.0/27.0 [00:01<00:00, 15.3 items/s]\n" + ] + } + ], + "source": [ + "tag = \"mynameisvinn/resized_faces\"\n", + "ds3 = ds2.store(tag)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Verify\n", + "We can verify results by fetching an instance from the resized dataset." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPsAAAD4CAYAAAAq5pAIAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAUu0lEQVR4nO3dW2zc5ZkG8Oed8Zw8PjsHHJOWQ9MsQduGlYXYZbVLVRWF7gVU2krlYpWLSuECpFbqDepNe7NSb9ruTVUpFYhcUKpKhYUL1C1Ku6UrsS0ujSCQhUAIiXOw48TxcTzHdy88SG7wzPNhj2cGvucnRbYnr///zzPz+O/D6/czd4eIfPolOr0AEWkPhV0kEgq7SCQUdpFIKOwikehp58ks1euWHWJV9DgJXoKRviytGe5L0ZpqqUBryqUiXxBCPjIgkWjR51+v0ZKQ9YRUOUJ+o8OPYyEfe4I/ZsUaP8715VV+LgCFMv/Y3Pj5gn7nFfCbMfNq80MUF+DlwoZ3dnvDnh1Cz8QjTWuSSNLj9Bp/4vzrP+/nNffuoTXz59+gNTNnT9MaAEgHPJezuRytCQlptcifzOmAcFnA2crVgCdpD3+qJdL8Y/f8blrzQTFPa57937DH7K3pEq0pWobW8E+9AGoVWpIoLTX9//LrTzd+35A1NGJmh8zsbTN718we38qxRGR7bTrsZpYE8BMADwA4AOBhMzvQqoWJSGtt5cp+N4B33f2Mu5cA/ALAg61Zloi02lbCPg7g/Lq3p+q3/RUzO2Jmk2Y26eWVLZxORLZiK2Hf6Cc3H/lJjbsfdfcJd5+wVO8WTiciW7GVsE8B2Lvu7ZsBXNzackRku2wl7K8C2Gdmt5pZGsA3ALzQmmWJSKtt+vfs7l4xs8cA/BeAJIAn3f3Npu9kBiSbnzLh/PPPcJov+4v7b6Y1uSxvhvGAxptl3hoAAEhWmjdEAEBvjf/OOpPlDUPJDP+WKWTZpSJvKloqLbbkOPkU//14vr+P1qQG+2nNv9z7BVoDALO/fZ3WXFgKaZnh93ZIcw7LD5r0oGypqcbdXwTw4laOISLtod54kUgo7CKRUNhFIqGwi0RCYReJhMIuEgmFXSQSbR1eARhAGgcSAcMSRvJpWnPz2CCt6e/nzSCJ5YBGjwxfDwAka3wQQm+KD3AYGhylNemAxpsayrSmUOB/vJQIaHJanGs+dAEAchneDLN7z2f4cUL2QhjmJQDwuambaM3U67xL3KsBUQtpqqE1jfOjK7tIJBR2kUgo7CKRUNhFIqGwi0RCYReJhMIuEgmFXSQSbW6qAeh+JgG7vQwN8+aL4QHeDNObD9jtJKA5JRE4qSYRsG9VNst3F+nt4x9bOmBnmVqCN/n05PhTxAL2O6kW+JSeXIZPBcrn+OOR7wvYVWeV774CAPtu5U01vz85xQ8UsGtO0FZbAfloRFd2kUgo7CKRUNhFIqGwi0RCYReJhMIuEgmFXSQSCrtIJNraVOPYYJvXG9QCGguqCb7sVEBzSjLFm0HSOb7dkKXCJtV4kjeWJAOmviR6Aj5HB9RYyP0YcKpMQKNLLs8fD0vwxpNyeZXWjAzsoDWrKd5QBAA3jfAGrlRAowt/5Hk2AMBCptk0oCu7SCQUdpFIKOwikVDYRSKhsItEQmEXiYTCLhIJhV0kEm2eVOOoWvP2gkrA55+5Rb5t0XKJN8z4EG+G6R0c4sdJ84YRAKiiwI8VMPWl5vzjr4JPfTELePhDxvCk+MefDpgeU6nwj6uyWqQ1PQHNQpls2MSXgQxvGMom+H1dDHheuwW01bDHo0mDj67sIpHY0pXdzM4CWMRaN2DF3SdasSgRab1WfBn/JXefbcFxRGQb6ct4kUhsNewO4Ddm9mczO7JRgZkdMbNJM5tEeXmLpxORzdrql/H3uvtFM9sF4CUz+z93f3l9gbsfBXAUAGxgPOSv+ERkG2zpyu7uF+svZwA8B+DuVixKRFpv02E3s7yZ9X/4OoD7AZxs1cJEpLW28mX8bgDP2dov8XsA/Nzdf83eyb35V/LVgHkdC8u8seLytQVaM75zgNb05vhWS4PDO2kNAMzNL9Kamgc01dT43JOE8xoLabxJ8OtBKs0bT0op/vOacjlgzQH3TzWgOScdsGYA2DE8TGuyAce6HrTdVEhTTcBhGth02N39DIAvbv7UItJO+tWbSCQUdpFIKOwikVDYRSKhsItEQmEXiYTCLhIJhV0kEm0eSwWwLiEL2OutWOT7dF2d5R10yQMjtCab6qU1g6P8OABQmL1Ca4pl3v01v7xEazIBnWaZTMAOZDXe1bW6ssJrCrzrsVTmay6X+XGqJd6tlujh5wKA0YA96gZyfHTX9AJ/XD3guR82TGtjurKLREJhF4mEwi4SCYVdJBIKu0gkFHaRSCjsIpFQ2EUi0XVNNUjwJg5PB4xKSvB93FLOjxMyJqsSsB0aAFiWj4GavjRDa4oXL9KaXIZ//HvH99Ca1cIqrZm9co3WLK3w4/T1DdKa/mF+rtIibzoK2lcNwFgvb+L5+9v46Kr3Zi/RmmqVt8x4QE0jurKLREJhF4mEwi4SCYVdJBIKu0gkFHaRSCjsIpFQ2EUi0famGvPmTQG1gJ6BakBDxGqBT0+pBUyFKTuferK4Erbv/HsfnKU1U6d5TTbFm3PGd+2iNZURPvGnJ+ABWQjYV+/987wRqFTh93WhyCfMDOwaozX9+bDrXLrIm3j25vnEn1SSr7tY5d1Z9b0VG2qWDF3ZRSKhsItEQmEXiYTCLhIJhV0kEgq7SCQUdpFIKOwikWh7U02CTIfxgCaOQok3g7z11tu05o6dBV7zN7xBo7jKp5kAQLXCmy/2fW4frenLZmlNosobjwor/H7sy/fRmt27+cSbXeO30JpKlTeepAIailYCJtX0V0dpDQBcm56mNbmAJq9MwGV1KeA4AcOVGqLvamZPmtmMmZ1cd9uImb1kZqfrL/lcHhHpqJDPE08BOHTDbY8DOO7u+wAcr78tIl2Mht3dXwZwY4PwgwCO1V8/BuChFq9LRFpss98B7Hb3SwBQf9nwry7M7IiZTZrZJEphfzAiIq237T+Nd/ej7j7h7hNI57f7dCLSwGbDPm1mYwBQf8mHnYtIR2027C8AOFx//TCA51uzHBHZLiG/ensGwCsA9pvZlJl9E8APAHzFzE4D+Er9bRHpYrSpxt0fbvBfX/64JzMHErXmjSW1BO/zqdT4FySnp/iEkT/8lk9PGev/B1ozOhDWZpDdfyetGc7005pMD//4L104T2tmZmZpzeiOm2hNf41PWMkPDNCaTDZDazxk1yYyzQUAKkthjVBLM/O0Zm6O/+C5FvBFdMjGTkaP0/goapcViYTCLhIJhV0kEgq7SCQUdpFIKOwikVDYRSKhsItEos2Tahwg2ymZBzTVOG/iuHCdT4Wp7RmkNddn+dZGI8Nhf+CzEjCFJxUwiiQXMK2lVuVTaFZWV/l60jla0xuw5lKRb8fV39/Lj1MOeFxJ4xYAIOA4ADDQy5uBCsYnHpUCGo8soGOINdU0e4bpyi4SCYVdJBIKu0gkFHaRSCjsIpFQ2EUiobCLREJhF4lEW5tqHA5H86Ya94CmiYBpJQtFXrQK3jBSCDhOKsObQQCgVC3TmvmFOVqzWuANGlevXqU15YBttBYXeVNRTw9v8pm7xicH5QK2tarW+BZRZeMf1+DOEVoDAJbhH5v18ulCXguZjMObrtyaP/auSTUiorCLREJhF4mEwi4SCYVdJBIKu0gkFHaRSCjsIpFo86QaAGjeFJEI2QQnoGSJ917gT+9foTV7dvOGmR038S2SAKBa4Z9br13lG+Jm0/xhW1xYojXvvH2G1pw7d5nW5HL8Ptr7mXFaMxCwRVSxxKfCFEq8MSsVcC4AmCrxpqozV/iaqlW+JguYwATb/PVZV3aRSCjsIpFQ2EUiobCLREJhF4mEwi4SCYVdJBIKu0gk2tpUY3AkvHm3iyNgDA1pzAGAYoJ/Hjs1xyfH2J94U0mqJ2z7p/1Z3sixUjnHDxTQfDE4wCex/O2dfN1Ly3zbpsFBfq7R0VFas7LCzwXwKTQpMs0FAOaX+HEA4KV35mnNq+9fpzW1gC2yWtFPpu2fRISH3cyeNLMZMzu57rbvm9kFMztR//fV7V2miGxVyJX9KQCHNrj9x+5+sP7vxdYuS0RajYbd3V8GwEeDikhX28r37I+Z2ev1L/OHGxWZ2REzmzSzSS/zvw4Ske2x2bD/FMDtAA4CuATgh40K3f2ou0+4+4Sl+Jx2Edkemwq7u0+7e9XdawB+BuDu1i5LRFptU2E3s7F1b34NwMlGtSLSHWhTjZk9A+A+ADvMbArA9wDcZ2YHATiAswAeCT1h0ps3zVRJ0w0A1IxP/fCABoVF8K193pptvl0VAPx6coqfDMDt999Ka3pH+fScwhyvmZmdpTXZgG2rhgYHaU0iwZtYpqenaU2pyn+ms2OUr2fXjj20Zjlg6y8AODfHt9FaKIU0zPD7KOApC7CmsyYHoWF394c3uPkJ9n4i0l3UQScSCYVdJBIKu0gkFHaRSCjsIpFQ2EUiobCLRKLNk2oAI001tGkAgAe0H1hATdV4zVKSN96cvFqkNQDwlwu87u6du2hNz/ICrcnnedNIX55PzhkYHKI1IQ0jhcIyrVkt8/u6WguYUlTmU2iWinx7LAC4dn2R1tScr7sWdF3lz30LmuS0MV3ZRSKhsItEQmEXiYTCLhIJhV0kEgq7SCQUdpFIKOwikWhrU427o+LNp8x4QKOLBX2OCtlLhx+nHNAwcrUa1ugw+Q6faHNgqI/WFFb5Nkl9A/w42QxvvClVArbIAq/pSfJmmKF8P61ZKfGGmZl5PqWnkEjTGgBYLfAGJvgOWmLgzyO3gOdRjUxpanIIXdlFIqGwi0RCYReJhMIuEgmFXSQSCrtIJBR2kUgo7CKRUNhFItHWDjoAMDTvpPItjN356/OE7JzF94zrAR9flDfeQQYAtYCyogd0tQV8aKOjw7Qm4fzh94BN85IBXY/VCr+uJNK8y6wvl6U1pet8z7i+vhFaAwC7hvheb2eXAkZXGd9XrxzQ0emJ5vd1s4dLV3aRSCjsIpFQ2EUiobCLREJhF4mEwi4SCYVdJBIKu0gk2tpUkzBDNtX8lMWQvd6MjziygEaPRHme1iRX+CipHPioJADI79pDazz9WVozt8qbgcrTV2hNbw/foyzp/HqwWuBjspLkcQeAZIavpyfDx0kVShlaM5QK2MMOwBdu43Vnzp2kNfOreVpTSPKaUqp501XNG2eDPpJmttfMfmdmp8zsTTP7Vv32ETN7ycxO11/yli0R6ZiQL+MrAL7j7ncAuAfAo2Z2AMDjAI67+z4Ax+tvi0iXomF390vu/lr99UUApwCMA3gQwLF62TEAD23XIkVk6z7W9+xmdguAuwD8EcBud78ErH1CMLMNNxY3syMAjgCAZfioYBHZHsE/jTezPgC/AvBtdw8Ypr3G3Y+6+4S7TyRS/C9/RGR7BIXdzFJYC/rT7v5s/eZpMxur//8YgJntWaKItELIT+MNwBMATrn7j9b91wsADtdfPwzg+dYvT0RaJeR79nsB/BuAN8zsRP227wL4AYBfmtk3AZwD8PXtWaKItAINu7v/DxpvnPblj3OyTDqN/Tff2rRmOWAySi3Nmy9KpQqtKVw4QWsWzv2e1iSzG/5s8qPHGuWjaq4sfJ7WJPrHaM2J116hNX1k3z0A6AuYHlMzfpxCwJ5x1YDHPhewP531jtOauw7w4wDAcJ5/pztYPU9rqou88Whlnk/Y6ck0b/KplBpPzVG7rEgkFHaRSCjsIpFQ2EUiobCLREJhF4mEwi4SCYVdJBJtn1STJtNRxsZ30OMMj/Gayck3aU06x5s4lgOm2VTAG08A4PwU/9z6369M0poHDn2V1lTf440ely68Q2v6C0Vak0rypppKjdcAfMLM/BK/DwdyfbTGsnwqDABcucon/izOnaM1uYCJP6mly7Smskies5XGjTm6sotEQmEXiYTCLhIJhV0kEgq7SCQUdpFIKOwikVDYRSLR1qaamjtWi82bNKo1vrVTIqBmdHiA1sxd5dNKepJ8u6FikTfeAMDly3x6ztXlv9Caz995D60ZueVOWlMs8ekply+c5ufq5U1FSePXldIq3/qrlObjyG8Z30drlkr8XABw5gO+/dfc3BytyST4dCV3viZz9hxqfAxd2UUiobCLREJhF4mEwi4SCYVdJBIKu0gkFHaRSCjsIpGwkF/kt+xkZlcAfLDuph0AZtu2gNb5JK5ba26fTq77s+6+c6P/aGvYP3Jys0l3n+jYAjbpk7hurbl9unXd+jJeJBIKu0gkOh32ox0+/2Z9EtetNbdPV667o9+zi0j7dPrKLiJtorCLRKJjYTezQ2b2tpm9a2aPd2odH4eZnTWzN8zshJnxrVs6xMyeNLMZMzu57rYRM3vJzE7XXw53co03arDm75vZhfr9fcLM+FY4bWRme83sd2Z2yszeNLNv1W/vyvu6I2E3sySAnwB4AMABAA+b2YFOrGUTvuTuB7vx96jrPAXg0A23PQ7guLvvA3C8/nY3eQofXTMA/Lh+fx909xfbvCamAuA77n4HgHsAPFp/Hnflfd2pK/vdAN519zPuXgLwCwAPdmgtnzru/jKAazfc/CCAY/XXjwF4qK2LIhqsuau5+yV3f63++iKAUwDG0aX3dafCPg5g/c6DU/Xbup0D+I2Z/dnMjnR6MR/Tbne/BKw9SQHs6vB6Qj1mZq/Xv8zvii+HN2JmtwC4C8Af0aX3dafCvtFWlJ+E3wHe6+5/h7VvPx41s3/q9II+5X4K4HYABwFcAvDDzi5nY2bWB+BXAL7t7gudXk8jnQr7FIC9696+GcDFDq0lmLtfrL+cAfAc1r4d+aSYNrMxAKi/nOnweih3n3b3qrvXAPwMXXh/m1kKa0F/2t2frd/clfd1p8L+KoB9ZnarmaUBfAPACx1aSxAzy5tZ/4evA7gfwMnm79VVXgBwuP76YQDPd3AtQT4MTN3X0GX3t5kZgCcAnHL3H637r668rzvWQVf/Ncp/AEgCeNLd/70jCwlkZrdh7WoOrM3b/3m3rtnMngFwH9b+1HIawPcA/CeAXwL4DIBzAL7u7l3zA7EGa74Pa1/CO4CzAB758HvhbmBm/wjgDwDeAPDhZgbfxdr37V13X6tdViQS6qATiYTCLhIJhV0kEgq7SCQUdpFIKOwikVDYRSLx/w/WeyzQaPguAAAAAElFTkSuQmCC\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "img = ds3[\"resized_image\", 3].compute()\n", + "plt.imshow(img)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.3" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/examples/tutorial/Tutorial 4 - What are Dynamic Tensors.ipynb b/examples/tutorial/Tutorial 4 - What are Dynamic Tensors.ipynb new file mode 100644 index 0000000000..9b52d24708 --- /dev/null +++ b/examples/tutorial/Tutorial 4 - What are Dynamic Tensors.ipynb @@ -0,0 +1,213 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Dynamic Tensors\n", + "\n", + "In this notebook, we will see how to handle data of variable shape and sizes." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "from hub.schema import Primitive, Audio, ClassLabel\n", + "from hub import transform, schema\n", + "\n", + "import librosa\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "from tqdm import tqdm\n", + "\n", + "from glob import glob\n", + "from time import time" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## What if our dataset contains data with varying sizes?" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "n_samples: 32000\n", + "n_samples: 115542\n", + "n_samples: 176400\n", + "n_samples: 176400\n", + "n_samples: 176400\n", + "n_samples: 176400\n", + "n_samples: 176400\n", + "n_samples: 176400\n", + "n_samples: 192000\n", + "n_samples: 176400\n", + "n_samples: 176400\n", + "n_samples: 176400\n", + "n_samples: 64589\n", + "n_samples: 23373\n" + ] + } + ], + "source": [ + "fnames = glob(\"./Data/audio/*\")\n", + "\n", + "for fname in fnames:\n", + " print(\"n_samples:\", librosa.load(fname, sr=None)[0].shape[0])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## (A) Defining a \"Dynamic\" Schema\n", + "A schema is a python `dicts` that contains metadata about our dataset. \n", + "\n", + "In this example, we tell Hub that our files are variable in duration by passing in `shape=(None,)`. In return, we tell Hub that our files could be as large as 192,000 samples with `max_shape=(192000,)`" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "my_schema = {\n", + " \"wav\": Audio(shape=(None,), max_shape=(192000,), file_format=\"wav\")\n", + "}" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## (B) Defining Transforms\n", + "Transforms for dynamic tensors look the seame as transforms for static tensors." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "@transform(schema=my_schema)\n", + "def load_transform(sample):\n", + " \n", + " audio = librosa.load(sample, sr=None)[0]\n", + " \n", + " return {\n", + " \"wav\": audio\n", + " }" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "hub.compute.transform.Transform" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "ds = load_transform(fnames) # returns a transform object\n", + "type(ds)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## (C) Finally, Execution!\n", + "Hub lazily executes, so nothing happens until we invoke `store`. By invoking `store`, we apply `load_transform` to our dataset and push everything." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/mynameisvinn/anaconda3/lib/python3.8/site-packages/zarr/creation.py:210: UserWarning: ignoring keyword argument 'mode'\n", + " warn('ignoring keyword argument %r' % k)\n", + "Computing the transormation: 100%|██████████| 14.0/14.0 [00:00<00:00, 20.9 items/s]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Elapsed time: 3.316145896911621\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n" + ] + } + ], + "source": [ + "start = time()\n", + "\n", + "tag = \"mynameisvinn/vibrations\"\n", + "ds2 = ds.store(tag)\n", + "type(ds2)\n", + "\n", + "end = time()\n", + "print(\"Elapsed time:\", end - start)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.3" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/hub/__init__.py b/hub/__init__.py index c88e962012..463336094f 100644 --- a/hub/__init__.py +++ b/hub/__init__.py @@ -11,7 +11,7 @@ from hub.compute import transform from hub.log import logger import traceback -from hub.exceptions import DaskModuleNotInstalledException +from hub.exceptions import DaskModuleNotInstalledException, HubDatasetNotFoundException def local_mode(): @@ -47,6 +47,8 @@ def load(tag): return ds except ImportError: raise DaskModuleNotInstalledException + except HubDatasetNotFoundException: + raise except Exception as e: pass # logger.warning(traceback.format_exc() + str(e)) diff --git a/hub/api/dataset.py b/hub/api/dataset.py index ff51b68094..35031a708f 100644 --- a/hub/api/dataset.py +++ b/hub/api/dataset.py @@ -4,11 +4,13 @@ import json import sys import traceback +from collections import defaultdict import fsspec import numcodecs import numcodecs.lz4 import numcodecs.zstd +import numpy as np from hub.schema.features import ( Primitive, @@ -18,9 +20,18 @@ featurify, ) from hub.log import logger + +# from hub.api.tensorview import TensorView +# from hub.api.datasetview import DatasetView +from hub.api.objectview import ObjectView, DatasetView from hub.api.tensorview import TensorView -from hub.api.datasetview import DatasetView -from hub.api.dataset_utils import slice_extract_info, slice_split, str_to_int +from hub.api.dataset_utils import ( + create_numpy_dict, + get_value, + slice_extract_info, + slice_split, + str_to_int, +) import hub.schema.serialize import hub.schema.deserialize @@ -43,7 +54,9 @@ from hub.client.hub_control import HubControlClient from hub.schema import Audio, BBox, ClassLabel, Image, Sequence, Text, Video from hub.numcodecs import PngCodec -from collections import defaultdict + +from hub.utils import norm_cache, norm_shape +from hub import defaults def get_file_count(fs: fsspec.AbstractFileSystem, path): @@ -55,16 +68,18 @@ def __init__( self, url: str, mode: str = "a", - safe_mode: bool = False, shape=None, schema=None, token=None, fs=None, fs_map=None, - cache: int = 2 ** 26, - storage_cache: int = 2 ** 28, + meta_information=dict(), + cache: int = defaults.DEFAULT_MEMORY_CACHE_SIZE, + storage_cache: int = defaults.DEFAULT_STORAGE_CACHE_SIZE, lock_cache=True, tokenizer=None, + lazy: bool = True, + public: bool = True, ): """| Open a new or existing dataset for read/write @@ -72,10 +87,8 @@ def __init__( ---------- url: str The url where dataset is located/should be created - mode: str, optional (default to "w") + mode: str, optional (default to "a") Python way to tell whether dataset is for read or write (ex. "r", "w", "a") - safe_mode: bool, optional - if dataset exists it cannot be rewritten in safe mode, otherwise it lets to write the first time shape: tuple, optional Tuple with (num_samples,) format, where num_samples is number of samples schema: optional @@ -86,6 +99,7 @@ def __init__( token is the parameter to pass the credentials, it can be filepath or dict fs: optional fs_map: optional + meta_information: optional ,give information about dataset in a dictionary. cache: int, optional Size of the memory cache. Default is 64MB (2**26) if 0, False or None, then cache is not used @@ -94,29 +108,32 @@ def __init__( if 0, False or None, then storage cache is not used lock_cache: bool, optional Lock the cache for avoiding multiprocessing errors + lazy: bool, optional + Setting this to False will stop lazy computation and will allow items to be accessed without .compute() + public: bool, optional + only applicable if using hub storage, ignored otherwise + setting this to False allows only the user who created it to access the dataset and + the dataset won't be visible in the visualizer to the public """ - shape = shape or (None,) - if isinstance(shape, int): - shape = [shape] - if shape is not None: - if len(tuple(shape)) != 1: - raise ShapeLengthException - if mode is None: - raise NoneValueException("mode") - - if not cache: - storage_cache = False - - self.url = url - self.token = token - self.mode = mode + shape = norm_shape(shape) + if len(shape) != 1: + raise ShapeLengthException() + mode = mode or "a" + storage_cache = norm_cache(storage_cache) if cache else 0 + cache = norm_cache(cache) + schema: SchemaDict = featurify(schema) if schema else None + + self._url = url + self._token = token + self._mode = mode self.tokenizer = tokenizer + self.lazy = lazy self._fs, self._path = ( - (fs, url) if fs else get_fs_and_path(self.url, token=token) + (fs, url) if fs else get_fs_and_path(self._url, token=token, public=public) ) - self.cache = cache + self._cache = cache self._storage_cache = storage_cache self.lock_cache = lock_cache self.verison = "1.x" @@ -126,17 +143,27 @@ def __init__( self._fs, self._path, cache, lock=lock_cache, storage_cache=storage_cache ) self._fs_map = fs_map - - if safe_mode and not needcreate: - mode = "r" + self._meta_information = meta_information self.username = None self.dataset_name = None if not needcreate: self.meta = json.loads(fs_map["meta.json"].decode("utf-8")) - self.shape = tuple(self.meta["shape"]) - self.schema = hub.schema.deserialize.deserialize(self.meta["schema"]) - self._flat_tensors = tuple(flatten(self.schema)) + self._shape = tuple(self.meta["shape"]) + self._schema = hub.schema.deserialize.deserialize(self.meta["schema"]) + self._meta_information = self.meta.get("meta_info") or dict() + self._flat_tensors = tuple(flatten(self._schema)) self._tensors = dict(self._open_storage_tensors()) + if shape != (None,) and shape != self._shape: + raise TypeError( + f"Shape in metafile [{self._shape}] and shape in arguments [{shape}] are !=, use mode='w' to overwrite dataset" + ) + if schema is not None and sorted(schema.dict_.keys()) != sorted( + self._schema.dict_.keys() + ): + raise TypeError( + "Schema in metafile and schema in arguments do not match, use mode='w' to overwrite dataset" + ) + else: if shape[0] is None: raise ShapeArgumentNotFoundException() @@ -147,9 +174,10 @@ def __init__( raise ShapeArgumentNotFoundException() if schema is None: raise SchemaArgumentNotFoundException() - self.schema: HubSchema = featurify(schema) - self.shape = tuple(shape) + self._schema = schema + self._shape = tuple(shape) self.meta = self._store_meta() + self._meta_information = meta_information self._flat_tensors = tuple(flatten(self.schema)) self._tensors = dict(self._generate_storage_tensors()) self.flush() @@ -173,15 +201,52 @@ def __init__( self.username = spl[-2] self.dataset_name = spl[-1] HubControlClient().create_dataset_entry( - self.username, self.dataset_name, self.meta + self.username, self.dataset_name, self.meta, public=public ) + @property + def mode(self): + return self._mode + + @property + def url(self): + return self._url + + @property + def shape(self): + return self._shape + + @property + def token(self): + return self._token + + @property + def cache(self): + return self._cache + + @property + def storage_cache(self): + return self._storage_cache + + @property + def schema(self): + return self._schema + + @property + def meta_information(self): + return self._meta_information + def _store_meta(self) -> dict: + meta = { - "shape": self.shape, - "schema": hub.schema.serialize.serialize(self.schema), + "shape": self._shape, + "schema": hub.schema.serialize.serialize(self._schema), "version": 1, } + + if self._meta_information != None: + meta["meta_info"] = self._meta_information + self._fs_map["meta.json"] = bytes(json.dumps(meta), "utf-8") return meta @@ -191,7 +256,7 @@ def _check_and_prepare_dir(self): Creates or overwrites dataset folder. Returns True dataset needs to be created opposed to read. """ - fs, path, mode = self._fs, self._path, self.mode + fs, path, mode = self._fs, self._path, self._mode if path.startswith("s3://"): with open(posixpath.expanduser("~/.activeloop/store"), "rb") as f: stored_username = json.load(f)["_id"] @@ -254,15 +319,15 @@ def _generate_storage_tensors(self): get_storage_map( self._fs, path, - self.cache, + self._cache, self.lock_cache, storage_cache=self._storage_cache, ), self._fs_map, ), - mode=self.mode, - shape=self.shape + t_dtype.shape, - max_shape=self.shape + t_dtype.max_shape, + mode=self._mode, + shape=self._shape + t_dtype.shape, + max_shape=self._shape + t_dtype.max_shape, dtype=self._get_dynamic_tensor_dtype(t_dtype), chunks=t_dtype.chunks, compressor=self._get_compressor(t_dtype.compressor), @@ -278,26 +343,26 @@ def _open_storage_tensors(self): get_storage_map( self._fs, path, - self.cache, + self._cache, self.lock_cache, storage_cache=self._storage_cache, ), self._fs_map, ), - mode=self.mode, + mode=self._mode, # FIXME We don't need argument below here - shape=self.shape + t_dtype.shape, + shape=self._shape + t_dtype.shape, ) def __getitem__(self, slice_): """| Gets a slice or slices from dataset | Usage: - >>> return ds["image", 5, 0:1920, 0:1080, 0:3].numpy() # returns numpy array + >>> return ds["image", 5, 0:1920, 0:1080, 0:3].compute() # returns numpy array >>> images = ds["image"] - >>> return images[5].numpy() # returns numpy array + >>> return images[5].compute() # returns numpy array >>> images = ds["image"] >>> image = images[5] - >>> return image[0:1920, 0:1080, 0:3].numpy() + >>> return image[0:1920, 0:1080, 0:3].compute() """ if not isinstance(slice_, abc.Iterable) or isinstance(slice_, str): slice_ = [slice_] @@ -308,23 +373,61 @@ def __getitem__(self, slice_): raise ValueError( "Can't slice a dataset with multiple slices without subpath" ) - num, ofs = slice_extract_info(slice_list[0], self.shape[0]) + num, ofs = slice_extract_info(slice_list[0], self._shape[0]) return DatasetView( dataset=self, num_samples=num, offset=ofs, squeeze_dim=isinstance(slice_list[0], int), + lazy=self.lazy, ) elif not slice_list: if subpath in self._tensors.keys(): - return TensorView( - dataset=self, subpath=subpath, slice_=slice(0, self.shape[0]) + tensorview = TensorView( + dataset=self, + subpath=subpath, + slice_=slice(0, self._shape[0]), + lazy=self.lazy, ) + if self.lazy: + return tensorview + else: + return tensorview.compute() + for key in self._tensors.keys(): + if subpath.startswith(key): + objectview = ObjectView( + dataset=self, subpath=subpath, lazy=self.lazy + ) + if self.lazy: + return objectview + else: + return objectview.compute() return self._get_dictionary(subpath) else: num, ofs = slice_extract_info(slice_list[0], self.shape[0]) - if subpath in self._tensors.keys(): - return TensorView(dataset=self, subpath=subpath, slice_=slice_list) + schema_obj = self.schema.dict_[subpath.split("/")[1]] + if subpath in self._tensors.keys() and ( + not isinstance(schema_obj, Sequence) or len(slice_list) <= 1 + ): + tensorview = TensorView( + dataset=self, subpath=subpath, slice_=slice_list, lazy=self.lazy + ) + if self.lazy: + return tensorview + else: + return tensorview.compute() + for key in self._tensors.keys(): + if subpath.startswith(key): + objectview = ObjectView( + dataset=self, + subpath=subpath, + slice_list=slice_list, + lazy=self.lazy, + ) + if self.lazy: + return objectview + else: + return objectview.compute() if len(slice_list) > 1: raise ValueError("You can't slice a dictionary of Tensors") return self._get_dictionary(subpath, slice_list[0]) @@ -337,8 +440,8 @@ def __setitem__(self, slice_, value): >>> image = images[5] >>> image[0:1920, 0:1080, 0:3] = np.zeros((1920, 1080, 3), "uint8") """ + assign_value = get_value(value) # handling strings and bytes - assign_value = value assign_value = str_to_int(assign_value, self.tokenizer) if not isinstance(slice_, abc.Iterable) or isinstance(slice_, str): @@ -349,16 +452,24 @@ def __setitem__(self, slice_, value): if not subpath: raise ValueError("Can't assign to dataset sliced without subpath") elif not slice_list: - self._tensors[subpath][:] = assign_value # Add path check + if subpath in self._tensors.keys(): + self._tensors[subpath][:] = assign_value # Add path check + else: + ObjectView(dataset=self, subpath=subpath)[:] = assign_value else: - self._tensors[subpath][slice_list] = assign_value + if subpath in self._tensors.keys(): + self._tensors[subpath][slice_list] = assign_value + else: + ObjectView(dataset=self, subpath=subpath, slice_list=slice_list)[ + : + ] = assign_value def resize_shape(self, size: int) -> None: """ Resize the shape of the dataset by resizing each tensor first dimension """ - if size == self.shape[0]: + if size == self._shape[0]: return - self.shape = (int(size),) + self._shape = (int(size),) self.meta = self._store_meta() for t in self._tensors.values(): t.resize_shape(int(size)) @@ -367,7 +478,7 @@ def resize_shape(self, size: int) -> None: def append_shape(self, size: int): """ Append the shape: Heavy Operation """ - size += self.shape[0] + size += self._shape[0] self.resize_shape(size) def delete(self): @@ -385,7 +496,7 @@ def delete(self): def to_pytorch( self, - Transform=None, + transform=None, inplace=True, output_type=dict, offset=None, @@ -395,7 +506,7 @@ def to_pytorch( Parameters ---------- - Transform: function that transforms data in a dict format + transform: function that transforms data in a dict format inplace: bool, optional Defines if data should be converted to torch.Tensor before or after Transforms applied (depends on what data type you need for Transforms). Default is True. @@ -408,15 +519,14 @@ def to_pytorch( """ if "torch" not in sys.modules: raise ModuleNotInstalledException("torch") - else: - import torch + import torch - global torch + global torch self.flush() # FIXME Without this some tests in test_converters.py fails, not clear why return TorchDataset( self, - Transform, + transform, inplace=inplace, output_type=output_type, offset=offset, @@ -441,7 +551,7 @@ def to_tensorflow(self, offset=None, num_samples=None): global tf offset = 0 if offset is None else offset - num_samples = self.shape[0] if num_samples is None else num_samples + num_samples = self._shape[0] if num_samples is None else num_samples def tf_gen(): for index in range(offset, offset + num_samples): @@ -491,8 +601,8 @@ def output_shapes_from_dict(my_dtype): d[k] = get_output_shapes(v) return d - output_types = dtype_to_tf(self.schema) - output_shapes = get_output_shapes(self.schema) + output_types = dtype_to_tf(self._schema) + output_shapes = get_output_shapes(self._schema) return tf.data.Dataset.from_generator( tf_gen, output_types=output_types, output_shapes=output_shapes @@ -511,11 +621,12 @@ def _get_dictionary(self, subpath, slice_=None): if split_key[i] not in cur.keys(): cur[split_key[i]] = {} cur = cur[split_key[i]] - slice_ = slice_ if slice_ else slice(0, self.shape[0]) - cur[split_key[-1]] = TensorView( - dataset=self, subpath=key, slice_=slice_ + slice_ = slice_ or slice(0, self._shape[0]) + tensorview = TensorView( + dataset=self, subpath=key, slice_=slice_, lazy=self.lazy ) - if len(tensor_dict) == 0: + cur[split_key[-1]] = tensorview if self.lazy else tensorview.compute() + if not tensor_dict: raise KeyError(f"Key {subpath} was not found in dataset") return tensor_dict @@ -526,7 +637,13 @@ def __iter__(self): def __len__(self): """ Number of samples in the dataset """ - return self.shape[0] + return self._shape[0] + + def disable_lazy(self): + self.lazy = False + + def enable_lazy(self): + self.lazy = True def flush(self): """Save changes from cache to dataset final storage. @@ -556,22 +673,27 @@ def _update_dataset_state(self): self.username, self.dataset_name, "UPLOADED" ) + def numpy(self): + return [create_numpy_dict(self, i) for i in range(self._shape[0])] + + def compute(self): + return self.numpy() + def __str__(self): - out = ( + return ( "Dataset(schema=" - + str(self.schema) + + str(self._schema) + "url=" + "'" - + self.url + + self._url + "'" + ", shape=" - + str(self.shape) + + str(self._shape) + ", mode=" + "'" - + self.mode + + self._mode + "')" ) - return out def __repr__(self): return self.__str__() @@ -637,7 +759,7 @@ def tf_to_hub(tf_dt): def TensorSpec_to_hub(tf_dt): dt = tf_dt.dtype.name if tf_dt.dtype.name != "string" else "object" - shape = tf_dt.shape if tf_dt.shape.rank is not None else (None,) + shape = tuple(tf_dt.shape) if tf_dt.shape.rank is not None else (None,) return Tensor(shape=shape, dtype=dt) def dict_to_hub(tf_dt): @@ -653,7 +775,7 @@ def transform_numpy(sample): for k, v in sample.items(): k = k.replace("/", "_") if not isinstance(v, dict): - if isinstance(v, tuple) or isinstance(v, list): + if isinstance(v, (tuple, list)): new_v = list(v) for i in range(len(new_v)): new_v[i] = new_v[i].numpy() @@ -759,8 +881,7 @@ def dict_sampling(d, path=""): def generate_schema(ds): tf_schema = ds[1].features - schema = to_hub(tf_schema).dict_ - return schema + return to_hub(tf_schema).dict_ def to_hub(tf_dt, max_shape=None, path=""): if isinstance(tf_dt, tfds.features.FeaturesDict): @@ -872,10 +993,7 @@ def transform_numpy(sample): d = {} for k, v in sample.items(): k = k.replace("/", "_") - if not isinstance(v, dict): - d[k] = v.numpy() - else: - d[k] = transform_numpy(v) + d[k] = transform_numpy(v) if isinstance(v, dict) else v.numpy() return d @hub.transform(schema=my_schema, scheduler=scheduler, workers=workers) @@ -947,9 +1065,9 @@ def dict_to_hub(dic, path=""): value_shape = v.shape if hasattr(v, "shape") else () if isinstance(v, torch.Tensor): v = v.numpy() - shape = tuple([None for it in value_shape]) + shape = tuple(None for it in value_shape) max_shape = ( - max_dict[cur_path] or tuple([10000 for it in value_shape]) + max_dict[cur_path] or tuple(10000 for it in value_shape) if not isinstance(v, str) else (10000,) ) @@ -968,10 +1086,7 @@ def transform_numpy(sample): d = {} for k, v in sample.items(): k = k.replace("/", "_") - if not isinstance(v, dict): - d[k] = v - else: - d[k] = transform_numpy(v) + d[k] = transform_numpy(v) if isinstance(v, dict) else v return d @hub.transform(schema=my_schema, scheduler=scheduler, workers=workers) @@ -1022,11 +1137,9 @@ def __getitem__(self, index): split_key = key.split("/") cur = d for i in range(1, len(split_key) - 1): - if split_key[i] in cur.keys(): - cur = cur[split_key[i]] - else: + if split_key[i] not in cur.keys(): cur[split_key[i]] = {} - cur = cur[split_key[i]] + cur = cur[split_key[i]] if not isinstance(self._ds._tensors[key][index], bytes) and not isinstance( self._ds._tensors[key][index], str ): @@ -1041,23 +1154,5 @@ def __getitem__(self, index): def __iter__(self): self._init_ds() - start = self.offset if self.offset is not None else 0 - for index in range(start, start + self.__len__()): - d = {} - for key in self._ds._tensors.keys(): - split_key = key.split("/") - cur = d - for i in range(1, len(split_key) - 1): - if split_key[i] in cur.keys(): - cur = cur[split_key[i]] - else: - cur[split_key[i]] = {} - cur = cur[split_key[i]] - t = self._ds._tensors[key][index] - if self.inplace: - t = torch.tensor(t) - cur[split_key[-1]] = t - d = self._do_transform(d) - if self.inplace & (self.output_type != dict) & (type(d) == dict): - d = self.output_type(d.values()) - yield (d) + for i in range(len(self)): + yield self[i] diff --git a/hub/api/dataset_utils.py b/hub/api/dataset_utils.py index 209d682fbb..a1d188f9c3 100644 --- a/hub/api/dataset_utils.py +++ b/hub/api/dataset_utils.py @@ -10,7 +10,7 @@ def slice_split(slice_): for sl in slice_: if isinstance(sl, str): path += sl if sl.startswith("/") else "/" + sl - elif isinstance(sl, int) or isinstance(sl, slice): + elif isinstance(sl, (int, slice)): list_slice.append(sl) else: raise TypeError( @@ -22,8 +22,8 @@ def slice_split(slice_): def slice_extract_info(slice_, num): """Extracts number of samples and offset from slice""" if isinstance(slice_, int): - slice_ = slice_ + num if slice_ < 0 else slice_ - if slice_ >= num or slice_ < 0: + slice_ = slice_ + num if num and slice_ < 0 else slice_ + if num and (slice_ >= num or slice_ < 0): raise IndexError( "index out of bounds for dimension with length {}".format(num) ) @@ -36,7 +36,7 @@ def slice_extract_info(slice_, num): slice_ = ( slice(slice_.start + num, slice_.stop) if slice_.start < 0 else slice_ ) # make indices positive if possible - if slice_.start < 0 or slice_.start >= num: + if num and (slice_.start < 0 or slice_.start >= num): raise IndexError( "index out of bounds for dimension with length {}".format(num) ) @@ -45,19 +45,54 @@ def slice_extract_info(slice_, num): slice_ = ( slice(slice_.start, slice_.stop + num) if slice_.stop < 0 else slice_ ) # make indices positive if possible - if slice_.stop < 0 or slice_.stop > num: + if num and (slice_.stop < 0 or slice_.stop > num): raise IndexError( "index out of bounds for dimension with length {}".format(num) ) if slice_.start is not None and slice_.stop is not None: - num = 0 if slice_.stop < slice_.start else slice_.stop - slice_.start + if ( + slice_.start < 0 + and slice_.stop < 0 + or slice_.start >= 0 + and slice_.stop >= 0 + ): + # If same signs, bound checking can be done + if abs(slice_.start) > abs(slice_.stop): + raise IndexError("start index is greater than stop index") + num = abs(slice_.stop) - abs(slice_.start) + else: + num = 0 + # num = 0 if slice_.stop < slice_.start else slice_.stop - slice_.start elif slice_.start is None and slice_.stop is not None: num = slice_.stop elif slice_.start is not None and slice_.stop is None: - num = num - slice_.start + num = num - slice_.start if num else 0 return num, offset +def create_numpy_dict(dataset, index): + numpy_dict = {} + for path in dataset._tensors.keys(): + d = numpy_dict + split = path.split("/") + for subpath in split[1:-1]: + if subpath not in d: + d[subpath] = {} + d = d[subpath] + d[split[-1]] = dataset[path, index].numpy() + return numpy_dict + + +def get_value(value): + if isinstance(value, np.ndarray) and value.shape == (): + value = value.item() + elif isinstance(value, list): + for i in range(len(value)): + if isinstance(value[i], np.ndarray) and value[i].shape == (): + value[i] = value[i].item() + return value + + def str_to_int(assign_value, tokenizer): if isinstance(assign_value, bytes): try: @@ -73,10 +108,9 @@ def str_to_int(assign_value, tokenizer): if tokenizer is not None: if "transformers" not in sys.modules: raise ModuleNotInstalledException("transformers") - else: - import transformers + import transformers - global transformers + global transformers tokenizer = transformers.AutoTokenizer.from_pretrained("bert-base-cased") assign_value = ( np.array(tokenizer(assign_value, add_special_tokens=False)["input_ids"]) diff --git a/hub/api/datasetview.py b/hub/api/datasetview.py index 8e91663e71..bbeb0bf144 100644 --- a/hub/api/datasetview.py +++ b/hub/api/datasetview.py @@ -1,16 +1,24 @@ from hub.api.tensorview import TensorView -from hub.api.dataset_utils import slice_extract_info, slice_split, str_to_int +from hub.api.dataset_utils import ( + create_numpy_dict, + get_value, + slice_extract_info, + slice_split, + str_to_int, +) from hub.exceptions import NoneValueException import collections.abc as abc +import hub.api.objectview as objv class DatasetView: def __init__( self, dataset=None, - num_samples=None, - offset=None, - squeeze_dim=False, + num_samples: int = None, + offset: int = None, + squeeze_dim: bool = False, + lazy: bool = True, ): """Creates a DatasetView object for a subset of the Dataset. @@ -22,8 +30,10 @@ def __init__( The number of samples in this DatasetView offset: int The offset from which the DatasetView starts - squeeze_dim: bool + squeeze_dim: bool, optional For slicing with integers we would love to remove the first dimension to make it nicer + lazy: bool, optional + Setting this to False will stop lazy computation and will allow items to be accessed without .compute() """ if dataset is None: raise NoneValueException("dataset") @@ -36,6 +46,7 @@ def __init__( self.num_samples = num_samples self.offset = offset self.squeeze_dim = squeeze_dim + self.lazy = lazy def __getitem__(self, slice_): """| Gets a slice or slices from DatasetView @@ -63,31 +74,59 @@ def __getitem__(self, slice_): num_samples=num, offset=ofs + self.offset, squeeze_dim=isinstance(slice_list[0], int), + lazy=self.lazy, ) elif not slice_list: - slice_ = slice(self.offset, self.offset + self.num_samples) + slice_ = ( + slice(self.offset, self.offset + self.num_samples) + if not self.squeeze_dim + else self.offset + ) if subpath in self.dataset._tensors.keys(): - return TensorView( + tensorview = TensorView( dataset=self.dataset, subpath=subpath, slice_=slice_, - squeeze_dims=[True] if self.squeeze_dim else [], + lazy=self.lazy, ) + return tensorview if self.lazy else tensorview.compute() + for key in self.dataset._tensors.keys(): + if subpath.startswith(key): + objectview = objv.ObjectView( + dataset=self.dataset, + subpath=subpath, + slice_list=[slice_], + lazy=self.lazy, + ) + return objectview if self.lazy else objectview.compute() return self._get_dictionary(self.dataset, subpath, slice=slice_) else: num, ofs = slice_extract_info(slice_list[0], self.num_samples) slice_list[0] = ( ofs + self.offset - if num == 1 + if isinstance(slice_list[0], int) else slice(ofs + self.offset, ofs + self.offset + num) ) - if subpath in self.dataset._tensors.keys(): - return TensorView( + schema_obj = self.dataset.schema.dict_[subpath.split("/")[1]] + if subpath in self.dataset._tensors.keys() and ( + not isinstance(schema_obj, objv.Sequence) or len(slice_list) <= 1 + ): + tensorview = TensorView( dataset=self.dataset, subpath=subpath, slice_=slice_list, - squeeze_dims=[True] if self.squeeze_dim else [], + lazy=self.lazy, ) + return tensorview if self.lazy else tensorview.compute() + for key in self.dataset._tensors.keys(): + if subpath.startswith(key): + objectview = objv.ObjectView( + dataset=self.dataset, + subpath=subpath, + slice_list=slice_list, + lazy=self.lazy, + ) + return objectview if self.lazy else objectview.compute() if len(slice_list) > 1: raise ValueError("You can't slice a dictionary of Tensors") return self._get_dictionary(subpath, slice_list[0]) @@ -99,8 +138,8 @@ def __setitem__(self, slice_, value): >>> ds_view = ds[5:15] >>> ds_view["image", 3, 0:1920, 0:1080, 0:3] = np.zeros((1920, 1080, 3), "uint8") # sets the 8th image """ + assign_value = get_value(value) # handling strings and bytes - assign_value = value assign_value = str_to_int(assign_value, self.dataset.tokenizer) if not isinstance(slice_, abc.Iterable) or isinstance(slice_, str): @@ -113,10 +152,18 @@ def __setitem__(self, slice_, value): elif not slice_list: slice_ = ( self.offset - if self.num_samples == 1 + # if self.num_samples == 1 + if self.squeeze_dim else slice(self.offset, self.offset + self.num_samples) ) - self.dataset._tensors[subpath][slice_] = assign_value # Add path check + if subpath in self.dataset._tensors.keys(): + self.dataset._tensors[subpath][slice_] = assign_value # Add path check + for key in self.dataset._tensors.keys(): + if subpath.startswith(key): + objv.ObjectView( + dataset=self.dataset, subpath=subpath, slice_list=[slice_] + )[:] = assign_value + # raise error else: num, ofs = ( slice_extract_info(slice_list[0], self.num_samples) @@ -125,10 +172,20 @@ def __setitem__(self, slice_, value): ) slice_list[0] = ( slice(ofs + self.offset, ofs + self.offset + num) - if num > 1 + if isinstance(slice_list[0], slice) else ofs + self.offset ) - self.dataset._tensors[subpath][slice_list] = assign_value + # self.dataset._tensors[subpath][slice_list] = assign_value + if subpath in self.dataset._tensors.keys(): + self.dataset._tensors[subpath][ + slice_list + ] = assign_value # Add path check + return + for key in self.dataset._tensors.keys(): + if subpath.startswith(key): + objv.ObjectView( + dataset=self.dataset, subpath=subpath, slice_list=slice_list + )[:] = assign_value @property def keys(self): @@ -137,7 +194,7 @@ def keys(self): """ return self.dataset._tensors.keys() - def _get_dictionary(self, subpath, slice_=None): + def _get_dictionary(self, subpath, slice_): """Gets dictionary from dataset given incomplete subpath""" tensor_dict = {} subpath = subpath if subpath.endswith("/") else subpath + "/" @@ -146,18 +203,18 @@ def _get_dictionary(self, subpath, slice_=None): suffix_key = key[len(subpath) :] split_key = suffix_key.split("/") cur = tensor_dict - for i in range(len(split_key) - 1): - if split_key[i] not in cur.keys(): - cur[split_key[i]] = {} - cur = cur[split_key[i]] - slice_ = slice_ if slice_ else slice(0, self.dataset.shape[0]) - cur[split_key[-1]] = TensorView( + for sub_key in split_key[:-1]: + if sub_key not in cur.keys(): + cur[sub_key] = {} + cur = cur[sub_key] + tensorview = TensorView( dataset=self.dataset, subpath=key, slice_=slice_, - squeeze_dims=[True] if self.squeeze_dim else [], + lazy=self.lazy, ) - if len(tensor_dict) == 0: + cur[split_key[-1]] = tensorview if self.lazy else tensorview.compute() + if not tensor_dict: raise KeyError(f"Key {subpath} was not found in dataset") return tensor_dict @@ -193,10 +250,19 @@ def to_tensorflow(self): num_samples=self.num_samples, offset=self.offset ) - def to_pytorch(self, Transform=None): + def to_pytorch( + self, + transform=None, + inplace=True, + output_type=dict, + ): """Converts the dataset into a pytorch compatible format""" return self.dataset.to_pytorch( - Transform=Transform, num_samples=self.num_samples, offset=self.offset + transform=transform, + num_samples=self.num_samples, + offset=self.offset, + inplace=inplace, + output_type=output_type, ) def resize_shape(self, size: int) -> None: @@ -206,3 +272,21 @@ def resize_shape(self, size: int) -> None: def commit(self) -> None: """Commit dataset""" self.dataset.commit() + + def numpy(self): + if self.num_samples == 1 and self.squeeze_dim: + return create_numpy_dict(self.dataset, self.offset) + else: + return [ + create_numpy_dict(self.dataset, self.offset + i) + for i in range(self.num_samples) + ] + + def disable_lazy(self): + self.lazy = False + + def enable_lazy(self): + self.lazy = True + + def compute(self): + return self.numpy() diff --git a/hub/api/objectview.py b/hub/api/objectview.py new file mode 100644 index 0000000000..66d0f22021 --- /dev/null +++ b/hub/api/objectview.py @@ -0,0 +1,327 @@ +from hub.api.datasetview import DatasetView +from hub.schema import Sequence, Tensor, SchemaDict, Primitive +from hub.api.dataset_utils import get_value, slice_extract_info, slice_split, str_to_int + +# from hub.exceptions import NoneValueException +import collections.abc as abc +import hub.api as api + + +class ObjectView: + def __init__( + self, + dataset, + subpath=None, + slice_list=None, + nums=[], + offsets=[], + squeeze_dims=[], + inner_schema_obj=None, + lazy=True, + new=True, + ): + """Creates an ObjectView object for dataset from a Dataset, DatasetView or TensorView + object, or creates a different ObjectView from an existing one + + Parameters + ---------- + These parameters are used to create a new ObjectView. + dataset: hub.api.dataset.Dataset object + The dataset whose ObjectView is being created, or its DatasetView + subpath: str (optional) + A potentially incomplete path to any element in the Dataset + slice_list: optional + The `slice_` of this Tensor that needs to be accessed + lazy: bool, optional + Setting this to False will stop lazy computation and will allow items to be accessed without .compute() + + These parameters are also needed to create an ObjectView from an existing one. + nums: List[int] + Number of elements in each dimension of the ObjectView to be created + offsets: List[int] + Starting element in each dimension of the ObjectView to be created + squeeze_dims: List[bool] + Whether each dimension can be squeezed or not + inner_schema_obj: Child of hub.schema.Tensor or hub.schema.SchemaDict + The deepest element in the schema upto which the previous ObjectView had been processed + + new: bool + Whether to create a new ObjectView object from a Dataset, DatasetView or TensorView + or create a different ObjectView from an existing one + """ + self.dataset = dataset + self.schema = ( + dataset.schema.dict_ + if not isinstance(dataset, DatasetView) + else dataset.dataset.schema.dict_ + ) + self.subpath = subpath + + self.nums = nums + self.offsets = offsets + self.squeeze_dims = squeeze_dims + + self.inner_schema_obj = inner_schema_obj + self.lazy = lazy + + if new: + # Creating new obj + if self.subpath: + ( + self.inner_schema_obj, + self.nums, + self.offsets, + self.squeeze_dims, + ) = self.process_path( + self.subpath, + self.inner_schema_obj, + self.nums.copy(), + self.offsets.copy(), + self.squeeze_dims.copy(), + ) + # Check if dataset view needs to be made + if slice_list and len(slice_list) >= 1: + num, ofs = slice_extract_info(slice_list[0], dataset.shape[0]) + self.dataset = DatasetView( + dataset, num, ofs, isinstance(slice_list[0], int) + ) + + if slice_list and len(slice_list) > 1: + slice_list = slice_list[1:] + if len(slice_list) > len(self.nums): + raise IndexError("Too many indices") + for i, it in enumerate(slice_list): + num, ofs = slice_extract_info(it, self.nums[i]) + self.nums[i] = num + self.offsets[i] += ofs + self.squeeze_dims[i] = num == 1 + + def num_process(self, schema_obj, nums, offsets, squeeze_dims): + """Determines the maximum number of elements in each discovered dimension""" + if isinstance(schema_obj, SchemaDict): + return + elif isinstance(schema_obj, Sequence): + nums.append(0) + offsets.append(0) + squeeze_dims.append(False) + if isinstance(schema_obj.dtype, Tensor): + self.num_process(schema_obj.dtype, nums, offsets, squeeze_dims) + else: + for dim in schema_obj.max_shape: + nums.append(dim) + offsets.append(0) + squeeze_dims.append(False) + if not isinstance(schema_obj.dtype, Primitive) and not isinstance( + schema_obj, Sequence + ): + raise ValueError("Only sequences can be nested") + + def process_path(self, subpath, inner_schema_obj, nums, offsets, squeeze_dims): + """Checks if a subpath is valid or not. Does not repeat computation done in a + previous ObjectView object""" + paths = subpath.split("/")[1:] + try: + # If key is invalid raises KeyError + # If schema object is not subscriptable raises AttributeError + if inner_schema_obj: + if isinstance(inner_schema_obj, Sequence): + schema_obj = inner_schema_obj.dtype.dict_[paths[0]] + elif isinstance(inner_schema_obj, SchemaDict): + schema_obj = inner_schema_obj.dict_[paths[0]] + else: + raise KeyError() + else: + schema_obj = self.schema[paths[0]] + except (KeyError, AttributeError): + raise KeyError(f"{paths[0]} is an invalid key") + self.num_process(schema_obj, nums, offsets, squeeze_dims) + for path in paths[1:]: + try: + if isinstance(schema_obj, Sequence): + schema_obj = schema_obj.dtype.dict_[path] + elif isinstance(schema_obj, SchemaDict): + schema_obj = schema_obj.dict_[path] + else: + raise KeyError() + self.num_process(schema_obj, nums, offsets, squeeze_dims) + except (KeyError, AttributeError): + raise KeyError(f"{path} is an invalid key") + return schema_obj, nums, offsets, squeeze_dims + + def __getitem__(self, slice_): + """| Gets a slice from an objectview""" + if not isinstance(slice_, abc.Iterable) or isinstance(slice_, str): + slice_ = [slice_] + slice_ = list(slice_) + subpath, slice_list = slice_split(slice_) + + dataset = self.dataset + nums, offsets, squeeze_dims, inner_schema_obj = ( + self.nums.copy(), + self.offsets.copy(), + self.squeeze_dims.copy(), + self.inner_schema_obj, + ) + + if subpath: + inner_schema_obj, nums, offsets, squeeze_dims = self.process_path( + subpath, inner_schema_obj, nums, offsets, squeeze_dims + ) + subpath = self.subpath + subpath + if len(slice_list) >= 1: + # Slice first dim + if isinstance(self.dataset, DatasetView) and not self.dataset.squeeze_dim: + dataset = self.dataset[slice_list[0]] + slice_list = slice_list[1:] + elif not isinstance(self.dataset, DatasetView): + num, ofs = slice_extract_info(slice_list[0], self.dataset.shape[0]) + dataset = DatasetView( + self.dataset, num, ofs, isinstance(slice_list[0], int) + ) + slice_list = slice_list[1:] + + # Expand slice list for rest of dims + if len(slice_list) >= 1: + exp_slice_list = [] + for squeeze in squeeze_dims: + if squeeze: + exp_slice_list += [None] + else: + if len(slice_list) > 0: + exp_slice_list += [slice_list.pop(0)] + else: + # slice list smaller than max + exp_slice_list += [None] + if len(slice_list) > 0: + # slice list longer than max + raise IndexError("Too many indices") + for i, it in enumerate(exp_slice_list): + if it is not None: + num, ofs = slice_extract_info(it, nums[i]) + nums[i] = num + offsets[i] += ofs + squeeze_dims[i] = num == 1 + objectview = ObjectView( + dataset=dataset, + subpath=subpath, + slice_list=None, + nums=nums, + offsets=offsets, + squeeze_dims=squeeze_dims, + inner_schema_obj=inner_schema_obj, + lazy=self.lazy, + new=False, + ) + return objectview if self.lazy else objectview.compute() + + def numpy(self): + """Gets the value from the objectview""" + if not isinstance(self.dataset, DatasetView): + # subpath present but no slice done + if len(self.subpath.split("/")[1:]) > 1: + raise IndexError("Can only go deeper on single datapoint") + if not self.dataset.squeeze_dim: + # return a combined tensor for multiple datapoints + # only possible if the field has a fixed size + paths = self.subpath.split("/")[1:] + if len(paths) > 1: + raise IndexError("Can only go deeper on single datapoint") + else: + # single datapoint + paths = self.subpath.split("/")[1:] + schema = self.schema[paths[0]] + slice_ = [ + ofs if sq else slice(ofs, ofs + num) if num else slice(None, None) + for ofs, num, sq in zip(self.offsets, self.nums, self.squeeze_dims) + ] + if isinstance(schema, Sequence): + if isinstance(schema.dtype, SchemaDict): + # if sequence of dict, have to fetch everything + value = self.dataset[paths[0]].compute() + for path in paths[1:]: + value = value[path] + try: + return value[tuple(slice_)] + except TypeError: + # raise error + return value + except KeyError: + raise KeyError("Invalid slice") + else: + # sequence of tensors + return self.dataset[paths[0]].compute()[tuple(slice_)] + + def compute(self): + return self.numpy() + + def __setitem__(self, slice_, value): + """| Sets a slice of the objectview with a value""" + if isinstance(slice_, slice) and (slice_.start is None and slice_.stop is None): + objview = self + else: + objview = self.__getitem__(slice_) + assign_value = get_value(value) + + if not isinstance(objview.dataset, DatasetView): + # subpath present but no slice done + assign_value = str_to_int(assign_value, objview.dataset.tokenizer) + if len(objview.subpath.split("/")[1:]) > 1: + raise IndexError("Can only go deeper on single datapoint") + if not objview.dataset.squeeze_dim: + # assign a combined tensor for multiple datapoints + # only possible if the field has a fixed size + assign_value = str_to_int(assign_value, objview.dataset.dataset.tokenizer) + paths = objview.subpath.split("/")[1:] + if len(paths) > 1: + raise IndexError("Can only go deeper on single datapoint") + else: + # single datapoint + def assign(paths, value): + # helper function for recursive assign + if len(paths) > 0: + path = paths.pop(0) + value[path] = assign(paths, value[path]) + return value + try: + value[tuple(slice_)] = assign_value + except TypeError: + value = assign_value + return value + + assign_value = str_to_int(assign_value, objview.dataset.dataset.tokenizer) + paths = objview.subpath.split("/")[1:] + schema = objview.schema[paths[0]] + slice_ = [ + of if sq else slice(of, of + num) if num else slice(None, None) + for num, of, sq in zip( + objview.nums, objview.offsets, objview.squeeze_dims + ) + ] + if isinstance(schema, Sequence): + if isinstance(schema.dtype, SchemaDict): + # if sequence of dict, have to fetch everything + value = objview.dataset[paths[0]].compute() + value = assign(paths[1:], value) + objview.dataset[paths[0]] = value + else: + # sequence of tensors + value = objview.dataset[paths[0]].compute() + value[tuple(slice_)] = assign_value + objview.dataset[paths[0]] = value + + def __str__(self): + if isinstance(self.dataset, DatasetView): + slice_ = [ + self.dataset.offset + if self.dataset.squeeze_dim + else slice( + self.dataset.offset, self.dataset.offset + self.dataset.num_samples + ) + ] + else: + slice_ = [slice(None, None)] + slice_ += [ + ofs if sq else slice(ofs, ofs + num) if num else slice(None, None) + for ofs, num, sq in zip(self.offsets, self.nums, self.squeeze_dims) + ] + return f"ObjectView(subpath='{self.subpath}', slice={str(slice_)})" diff --git a/hub/api/tensorview.py b/hub/api/tensorview.py index 3a13b7dae8..6f2fa55cd2 100644 --- a/hub/api/tensorview.py +++ b/hub/api/tensorview.py @@ -1,7 +1,8 @@ import hub import collections.abc as abc -from hub.api.dataset_utils import slice_split, str_to_int +from hub.api.dataset_utils import get_value, slice_split, str_to_int from hub.exceptions import NoneValueException +import hub.api.objectview as objv class TensorView: @@ -10,7 +11,7 @@ def __init__( dataset=None, subpath=None, slice_=None, - squeeze_dims=[], + lazy: bool = True, ): """Creates a TensorView object for a particular tensor in the dataset @@ -22,6 +23,8 @@ def __init__( The full path to the particular Tensor in the Dataset slice_: optional The `slice_` of this Tensor that needs to be accessed + lazy: bool, optional + Setting this to False will stop lazy computation and will allow items to be accessed without .compute() """ if dataset is None: @@ -31,10 +34,11 @@ def __init__( self.dataset = dataset self.subpath = subpath + self.lazy = lazy - if isinstance(slice_, int) or isinstance(slice_, slice): + if isinstance(slice_, (int, slice)): self.slice_ = [slice_] - elif isinstance(slice_, tuple) or isinstance(slice_, list): + elif isinstance(slice_, (tuple, list)): self.slice_ = list(slice_) self.nums = [] self.offsets = [] @@ -46,7 +50,7 @@ def __init__( self.offsets.append(it) self.squeeze_dims.append(True) elif isinstance(it, slice): - ofs = it.start if it.start else 0 + ofs = it.start or 0 num = it.stop - ofs if it.stop else None self.nums.append(num) self.offsets.append(ofs) @@ -69,9 +73,9 @@ def numpy(self): tokenizer = AutoTokenizer.from_pretrained("bert-base-cased") if value.ndim == 1: return tokenizer.decode(value.tolist()) - else: - if value.ndim == 1: - return "".join(chr(it) for it in value.tolist()) + elif value.ndim == 1: + return "".join(chr(it) for it in value.tolist()) + raise ValueError("Can only access Text with integer index") return self.dataset._tensors[self.subpath][self.slice_] def compute(self): @@ -91,28 +95,38 @@ def __getitem__(self, slice_): slice_ = self.slice_fill(slice_) subpath, slice_list = slice_split(slice_) - if subpath: - raise ValueError("Can't slice a Tensor with string") + new_nums = self.nums.copy() + new_offsets = self.offsets.copy() + if len(new_nums) < len(slice_list): + new_nums.extend([None] * (len(slice_list) - len(new_nums))) + new_offsets.extend([0] * (len(slice_list) - len(new_offsets))) + for i in range(len(slice_list)): + slice_list[i] = self._combine(slice_list[i], new_nums[i], new_offsets[i]) + for i in range(len(slice_list), len(new_nums)): + cur_slice = ( + slice(new_offsets[i], new_offsets[i] + new_nums[i]) + if new_nums[i] > 1 + else new_offsets[i] + ) + slice_list.append(cur_slice) + if subpath or ( + len(slice_list) > len(self.nums) and isinstance(self.dtype, objv.Sequence) + ): + objectview = objv.ObjectView( + dataset=self.dataset, + subpath=self.subpath + subpath, + slice_list=slice_list, + lazy=self.lazy, + ) + return objectview if self.lazy else objectview.compute() else: - new_nums = self.nums.copy() - new_offsets = self.offsets.copy() - if len(new_nums) < len(slice_list): - new_nums.extend([None] * (len(slice_list) - len(new_nums))) - new_offsets.extend([0] * (len(slice_list) - len(new_offsets))) - for i in range(len(slice_list)): - slice_list[i] = self._combine( - slice_list[i], new_nums[i], new_offsets[i] - ) - for i in range(len(slice_list), len(new_nums)): - cur_slice = ( - slice(new_offsets[i], new_offsets[i] + new_nums[i]) - if new_nums[i] > 1 - else new_offsets[i] - ) - slice_list.append(cur_slice) - return TensorView( - dataset=self.dataset, subpath=self.subpath, slice_=slice_list + tensorview = TensorView( + dataset=self.dataset, + subpath=self.subpath, + slice_=slice_list, + lazy=self.lazy, ) + return tensorview if self.lazy else tensorview.compute() def __setitem__(self, slice_, value): """| Sets a slice or slices with a value @@ -121,8 +135,8 @@ def __setitem__(self, slice_, value): >>> images_tensorview = ds["image"] >>> images_tensorview[7, 0:1920, 0:1080, 0:3] = np.zeros((1920, 1080, 3), "uint8") # sets 7th image """ + assign_value = get_value(value) # handling strings and bytes - assign_value = value assign_value = str_to_int(assign_value, self.dataset.tokenizer) if not isinstance(slice_, abc.Iterable) or isinstance(slice_, str): @@ -130,26 +144,29 @@ def __setitem__(self, slice_, value): slice_ = list(slice_) slice_ = self.slice_fill(slice_) subpath, slice_list = slice_split(slice_) - - if subpath: - raise ValueError( - "Can't slice a Tensor with multiple slices without subpath" + new_nums = self.nums.copy() + new_offsets = self.offsets.copy() + if len(new_nums) < len(slice_list): + new_nums.extend([None] * (len(slice_list) - len(new_nums))) + new_offsets.extend([0] * (len(slice_list) - len(new_offsets))) + for i in range(len(slice_list)): + slice_list[i] = self._combine(slice_list[i], new_nums[i], new_offsets[i]) + for i in range(len(slice_list), len(new_nums)): + cur_slice = ( + slice(new_offsets[i], new_offsets[i] + new_nums[i]) + if new_nums[i] > 1 + else new_offsets[i] ) + slice_list.append(cur_slice) + if subpath or ( + len(slice_list) > len(self.nums) and isinstance(self.dtype, objv.Sequence) + ): + objv.ObjectView( + dataset=self.dataset, + subpath=self.subpath + subpath, + slice_list=slice_list, + )[:] = assign_value else: - new_nums = self.nums.copy() - new_offsets = self.offsets.copy() - if len(new_nums) < len(slice_list): - new_nums.extend([None] * (len(slice_list) - len(new_nums))) - new_offsets.extend([0] * (len(slice_list) - len(new_offsets))) - for i in range(len(slice_list)): - slice_list[i] = self._combine(slice_[i], new_nums[i], new_offsets[i]) - for i in range(len(slice_list), len(new_nums)): - cur_slice = ( - slice(new_offsets[i], new_offsets[i] + new_nums[i]) - if new_nums[i] > 1 - else new_offsets[i] - ) - slice_list.append(cur_slice) self.dataset._tensors[self.subpath][slice_list] = assign_value def _combine(self, slice_, num=None, ofs=0): @@ -163,13 +180,13 @@ def _combine(self, slice_, num=None, ofs=0): ) if slice_.start is None and slice_.stop is None: return slice(ofs, None) if num is None else slice(ofs, ofs + num) - elif slice_.start is not None and slice_.stop is None: + elif slice_.stop is None: return ( slice(ofs + slice_.start, None) if num is None else slice(ofs + slice_.start, ofs + num) ) - elif slice_.start is None and slice_.stop is not None: + elif slice_.start is None: return slice(ofs, ofs + slice_.stop) else: return slice(ofs + slice_.start, ofs + slice_.stop) @@ -208,7 +225,7 @@ def slice_fill(self, slice_): elif offset < len(slice_): new_slice_.append(slice_[offset]) offset += 1 - new_slice_ = new_slice_ + slice_[offset:] + new_slice_ += slice_[offset:] return new_slice_ def __repr__(self): @@ -249,3 +266,9 @@ def chunksize(self): @property def is_dynamic(self): return self.dataset._tensors[self.subpath].is_dynamic + + def disable_lazy(self): + self.lazy = False + + def enable_lazy(self): + self.lazy = True diff --git a/hub/api/tests/test_converters.py b/hub/api/tests/test_converters.py index a4f1441931..9dde363ce8 100644 --- a/hub/api/tests/test_converters.py +++ b/hub/api/tests/test_converters.py @@ -83,6 +83,35 @@ def test_to_from_tensorflow(): assert (res_ds["label", "d", "e", i].numpy() == i * np.ones((5, 3))).all() +@pytest.mark.skipif(not tensorflow_loaded(), reason="requires tensorflow to be loaded") +def test_to_from_tensorflow_datasetview(): + my_schema = { + "image": Tensor((10, 1920, 1080, 3), "uint8"), + "label": { + "a": Tensor((100, 200), "int32"), + "b": Tensor((100, 400), "int64"), + "c": Tensor((5, 3), "uint8"), + "d": {"e": Tensor((5, 3), "uint8")}, + "f": "float", + }, + } + + ds = hub.Dataset( + schema=my_schema, shape=(10,), url="./data/test_from_tf/ds4", mode="w" + ) + for i in range(10): + ds["label", "d", "e", i] = i * np.ones((5, 3)) + dsv = ds[5:] + tds = dsv.to_tensorflow() + out_ds = hub.Dataset.from_tensorflow(tds) + res_ds = out_ds.store( + "./data/test_from_tf/ds6", length=5 + ) # generator has no length, argument needed + + for i in range(5): + assert (res_ds["label", "d", "e", i].numpy() == (5 + i) * np.ones((5, 3))).all() + + @pytest.mark.skipif(not pytorch_loaded(), reason="requires pytorch to be loaded") def test_to_pytorch(): import torch @@ -126,7 +155,7 @@ def transform(data): label = recursive_torch_tensor(label) return (image, label) - dst = ds.to_pytorch(Transform=transform, inplace=False) + dst = ds.to_pytorch(transform=transform, inplace=False) dl = torch.utils.data.DataLoader( dst, batch_size=1, @@ -145,6 +174,69 @@ def transform(data): assert type(d) == tuple +@pytest.mark.skipif(not pytorch_loaded(), reason="requires pytorch to be loaded") +def test_to_pytorch_datasetview(): + import torch + + my_schema = { + "image": Tensor((10, 1920, 1080, 3), "uint8"), + "label": { + "a": Tensor((100, 200), "int32"), + "b": Tensor((100, 400), "int64"), + "c": Tensor((5, 3), "uint8"), + "d": {"e": Tensor((5, 3), "uint8")}, + "f": "float", + }, + } + ds = hub.Dataset( + schema=my_schema, shape=(10,), url="./data/test_from_tf/ds5", mode="w" + ) + for i in range(10): + ds["label", "d", "e", i] = i * np.ones((5, 3)) + # pure conversion + dsv = ds[3:] + ptds = dsv.to_pytorch() + dl = torch.utils.data.DataLoader( + ptds, + batch_size=1, + ) + for i, batch in enumerate(dl): + assert (batch["label"]["d"]["e"].numpy() == (3 + i) * np.ones((5, 3))).all() + + # with transforms and inplace=False + def recursive_torch_tensor(label): + for key, value in label.items(): + if type(value) is dict: + label[key] = recursive_torch_tensor(value) + else: + label[key] = torch.tensor(value) + return label + + def transform(data): + image = torch.tensor(data["image"]) + label = data["label"] + label = recursive_torch_tensor(label) + return (image, label) + + dst = dsv.to_pytorch(transform=transform, inplace=False) + dl = torch.utils.data.DataLoader( + dst, + batch_size=1, + ) + for i, batch in enumerate(dl): + assert (batch[1]["d"]["e"].numpy() == (3 + i) * np.ones((5, 3))).all() + + # output_type = list + dst = ds.to_pytorch(output_type=list) + for i, d in enumerate(dst): + assert type(d) == list + + # output_type = tuple + dst = ds.to_pytorch(output_type=tuple) + for i, d in enumerate(dst): + assert type(d) == tuple + + @pytest.mark.skipif(not pytorch_loaded(), reason="requires pytorch to be loaded") def test_from_pytorch(): from torch.utils.data import Dataset @@ -215,7 +307,6 @@ def test_to_from_pytorch(): if __name__ == "__main__": - with Timer("Test Converters"): with Timer("from MNIST"): test_from_tfds_mnist() diff --git a/hub/api/tests/test_dataset.py b/hub/api/tests/test_dataset.py index a5b8b05c60..d6106b09cd 100644 --- a/hub/api/tests/test_dataset.py +++ b/hub/api/tests/test_dataset.py @@ -1,11 +1,14 @@ +import os +from hub.cli.auth import login_fn from hub.exceptions import HubException import numpy as np import pytest - +from hub import transform import hub.api.dataset as dataset from hub.schema import Tensor, Text, Image from hub.utils import ( gcp_creds_exist, + hub_creds_exist, s3_creds_exist, azure_creds_exist, transformers_loaded, @@ -27,13 +30,24 @@ def test_dataset2(): dt = {"first": "float", "second": "float"} ds = Dataset(schema=dt, shape=(2,), url="./data/test/test_dataset2", mode="w") + ds.meta_information["description"] = "This is my description" ds["first"][0] = 2.3 + assert ds.meta_information["description"] == "This is my description" assert ds["second"][0].numpy() != 2.3 def test_dataset_append_and_read(): dt = {"first": "float", "second": "float"} + ds = Dataset( + schema=dt, + shape=(2,), + url="./data/test/test_dataset_append_and_read", + mode="w", + ) + + ds.delete() + ds = Dataset( schema=dt, shape=(2,), @@ -42,6 +56,7 @@ def test_dataset_append_and_read(): ) ds["first"][0] = 2.3 + assert ds.meta_information["description"] == "This is my description" assert ds["second"][0].numpy() != 2.3 ds.close() @@ -49,14 +64,18 @@ def test_dataset_append_and_read(): url="./data/test/test_dataset_append_and_read", mode="r", ) + assert ds.meta_information["description"] == "This is my description" + ds.meta_information["hello"] = 5 ds.delete() ds.close() # TODO Add case when non existing dataset is opened in read mode -def test_dataset(url="./data/test/dataset", token=None): - ds = Dataset(url, token=token, shape=(10000,), mode="w", schema=my_schema) +def test_dataset(url="./data/test/dataset", token=None, public=True): + ds = Dataset( + url, token=token, shape=(10000,), mode="w", schema=my_schema, public=public + ) sds = ds[5] sds["label/a", 50, 50] = 2 @@ -226,10 +245,37 @@ def test_dataset_bug_2(url="./data/test/dataset", token=None): ds["image", 0:1] = [np.zeros((100, 100))] +def test_dataset_bug_3(url="./data/test/dataset", token=None): + my_schema = { + "image": Tensor((100, 100), "uint8"), + } + ds = Dataset(url, token=token, shape=(10000,), mode="w", schema=my_schema) + ds.close() + ds = Dataset(url) + ds["image", 0:1] = [np.zeros((100, 100))] + + +def test_dataset_wrong_append(url="./data/test/dataset", token=None): + my_schema = { + "image": Tensor((100, 100), "uint8"), + } + ds = Dataset(url, token=token, shape=(10000,), mode="w", schema=my_schema) + ds.close() + try: + ds = Dataset(url, shape=100) + except Exception as ex: + assert isinstance(ex, TypeError) + + try: + ds = Dataset(url, schema={"hello": "uint8"}) + except Exception as ex: + assert isinstance(ex, TypeError) + + def test_dataset_no_shape(url="./data/test/dataset", token=None): try: Tensor(shape=(120, 120, 3), max_shape=(120, 120, 4)) - except HubException: + except ValueError: pass @@ -257,6 +303,14 @@ def test_dataset_batch_write_2(): ds["image", 0:14] = [np.ones((640 - i, 640, 3)) for i in range(14)] +@pytest.mark.skipif(not hub_creds_exist(), reason="requires hub credentials") +def test_dataset_hub(): + password = os.getenv("ACTIVELOOP_HUB_PASSWORD") + login_fn("testingacc", password) + test_dataset("testingacc/test_dataset_private", public=False) + test_dataset("testingacc/test_dataset_public") + + @pytest.mark.skipif(not gcp_creds_exist(), reason="requires gcp credentials") def test_dataset_gcs(): test_dataset("gcs://snark-test/test_dataset_gcs") @@ -280,17 +334,33 @@ def test_dataset_azure(): def test_datasetview_slicing(): dt = {"first": Tensor((100, 100))} - ds = Dataset(schema=dt, shape=(20,), url="./data/test/model", mode="w") - + ds = Dataset( + schema=dt, shape=(20,), url="./data/test/datasetview_slicing", mode="w" + ) assert ds["first", 0].numpy().shape == (100, 100) assert ds["first", 0:1].numpy().shape == (1, 100, 100) assert ds[0]["first"].numpy().shape == (100, 100) assert ds[0:1]["first"].numpy().shape == (1, 100, 100) +def test_datasetview_get_dictionary(): + ds = Dataset( + schema=my_schema, + shape=(20,), + url="./data/test/datasetview_get_dictionary", + mode="w", + ) + ds["label", 5, "a"] = 5 * np.ones((100, 200)) + ds["label", 5, "d", "e"] = 3 * np.ones((5, 3)) + dsv = ds[2:10] + dic = dsv[3, "label"] + assert (dic["a"].compute() == 5 * np.ones((100, 200))).all() + assert (dic["d"]["e"].compute() == 3 * np.ones((5, 3))).all() + + def test_tensorview_slicing(): dt = {"first": Tensor(shape=(None, None), max_shape=(250, 300))} - ds = Dataset(schema=dt, shape=(20,), url="./data/test/model", mode="w") + ds = Dataset(schema=dt, shape=(20,), url="./data/test/tensorivew_slicing", mode="w") tv = ds["first", 5:6, 7:10, 9:10] assert tv.numpy().shape == tuple(tv.shape) == (1, 3, 1) tv2 = ds["first", 5:6, 7:10, 9] @@ -355,12 +425,213 @@ def test_append_dataset(): assert ds["second"].shape[0] == 120 +def test_meta_information(): + description = {"author": "testing", "description": "here goes the testing text"} + + description_changed = { + "author": "changed author", + "description": "now it's changed", + } + + schema = {"text": Text((None,), max_shape=(1000,))} + + ds = Dataset( + "./data/test_meta", + shape=(10,), + schema=schema, + meta_information=description, + mode="w", + ) + + some_text = ["hello world", "hello penguin", "hi penguin"] + + for i, text in enumerate(some_text): + ds["text", i] = text + + assert type(ds.meta["meta_info"]) == dict + assert ds.meta["meta_info"]["author"] == "testing" + assert ds.meta["meta_info"]["description"] == "here goes the testing text" + + ds.close() + + +def test_dataset_compute(): + dt = { + "first": Tensor(shape=(2,)), + "second": "float", + "text": Text(shape=(None,), max_shape=(12,)), + } + url = "./data/test/ds_compute" + ds = Dataset(schema=dt, shape=(2,), url=url, mode="w") + ds["text", 1] = "hello world" + ds["second", 0] = 3.14 + ds["first", 0] = np.array([5, 6]) + comp = ds.compute() + comp0 = comp[0] + assert (comp0["first"] == np.array([5, 6])).all() + assert comp0["second"] == 3.14 + assert comp0["text"] == "" + comp1 = comp[1] + assert (comp1["first"] == np.array([0, 0])).all() + assert comp1["second"] == 0 + assert comp1["text"] == "hello world" + + +def test_dataset_view_compute(): + dt = { + "first": Tensor(shape=(2,)), + "second": "float", + "text": Text(shape=(None,), max_shape=(12,)), + } + url = "./data/test/dsv_compute" + ds = Dataset(schema=dt, shape=(4,), url=url, mode="w") + ds["text", 3] = "hello world" + ds["second", 2] = 3.14 + ds["first", 2] = np.array([5, 6]) + dsv = ds[2:] + comp = dsv.compute() + comp0 = comp[0] + assert (comp0["first"] == np.array([5, 6])).all() + assert comp0["second"] == 3.14 + assert comp0["text"] == "" + comp1 = comp[1] + assert (comp1["first"] == np.array([0, 0])).all() + assert comp1["second"] == 0 + assert comp1["text"] == "hello world" + + +def test_dataset_lazy(): + dt = { + "first": Tensor(shape=(2,)), + "second": "float", + "text": Text(shape=(None,), max_shape=(12,)), + } + url = "./data/test/ds_lazy" + ds = Dataset(schema=dt, shape=(2,), url=url, mode="w", lazy=False) + ds["text", 1] = "hello world" + ds["second", 0] = 3.14 + ds["first", 0] = np.array([5, 6]) + assert ds["text", 1] == "hello world" + assert ds["second", 0] == 3.14 + assert (ds["first", 0] == np.array([5, 6])).all() + + +def test_dataset_view_lazy(): + dt = { + "first": Tensor(shape=(2,)), + "second": "float", + "text": Text(shape=(None,), max_shape=(12,)), + } + url = "./data/test/dsv_lazy" + ds = Dataset(schema=dt, shape=(4,), url=url, mode="w", lazy=False) + ds["text", 3] = "hello world" + ds["second", 2] = 3.14 + ds["first", 2] = np.array([5, 6]) + dsv = ds[2:] + assert dsv["text", 1] == "hello world" + assert dsv["second", 0] == 3.14 + assert (dsv["first", 0] == np.array([5, 6])).all() + + +def test_datasetview_repr(): + dt = { + "first": Tensor(shape=(2,)), + "second": "float", + "text": Text(shape=(None,), max_shape=(12,)), + } + url = "./data/test/dsv_repr" + ds = Dataset(schema=dt, shape=(9,), url=url, mode="w", lazy=False) + dsv = ds[2:] + print_text = "DatasetView(Dataset(schema=SchemaDict({'first': Tensor(shape=(2,), dtype='float64'), 'second': 'float64', 'text': Text(shape=(None,), dtype='int64', max_shape=(12,))})url='./data/test/dsv_repr', shape=(9,), mode='w'), slice=slice(2, 9, None))" + assert dsv.__repr__() == print_text + + +def test_dataset_casting(): + my_schema = { + "a": Tensor(shape=(1,), dtype="float64"), + } + + @transform(schema=my_schema) + def my_transform(annotation): + return { + "a": 2.4, + } + + out_ds = my_transform(range(100)) + res_ds = out_ds.store("./data/casting") + assert res_ds["a", 30].compute() == np.array([2.4]) + + ds = Dataset(schema=my_schema, url="./data/casting2", shape=(100,)) + for i in range(100): + ds["a", i] = 0.2 + assert ds["a", 30].compute() == np.array([0.2]) + + ds2 = Dataset(schema=my_schema, url="./data/casting3", shape=(100,)) + ds2["a", 0:100] = np.ones( + 100, + ) + assert ds2["a", 30].compute() == np.array([1]) + + +def test_dataset_setting_shape(): + schema = {"text": Text(shape=(None,), dtype="int64", max_shape=(10,))} + + url = "./data/test/text_data" + ds = Dataset(schema=schema, shape=(5,), url=url, mode="w") + slice_ = slice(0, 5, None) + key = "text" + batch = [ + np.array("THTMLY2F9"), + np.array("QUUVEU2IU"), + np.array("8ZUFCYWKD"), + "H9EDFAGHB", + "WDLDYN6XG", + ] + shape = ds._tensors[f"/{key}"].get_shape_from_value([slice_], batch) + assert shape[0][0] == [1] + + +def test_dataset_assign_value(): + schema = {"text": Text(shape=(None,), dtype="int64", max_shape=(10,))} + url = "./data/test/text_data" + ds = Dataset(schema=schema, shape=(7,), url=url, mode="w") + slice_ = slice(0, 5, None) + key = "text" + batch = [ + np.array("THTMLY2F9"), + np.array("QUUVEU2IU"), + np.array("8ZUFCYWKD"), + "H9EDFAGHB", + "WDLDYN6XG", + ] + ds[key, slice_] = batch + ds[key][5] = np.array("GHLSGBFF8") + ds[key][6] = "YGFJN75NF" + assert ds["text", 0].compute() == "THTMLY2F9" + assert ds["text", 1].compute() == "QUUVEU2IU" + assert ds["text", 2].compute() == "8ZUFCYWKD" + assert ds["text", 3].compute() == "H9EDFAGHB" + assert ds["text", 4].compute() == "WDLDYN6XG" + assert ds["text", 5].compute() == "GHLSGBFF8" + assert ds["text", 6].compute() == "YGFJN75NF" + + if __name__ == "__main__": - # test_tensorview_slicing() - # test_datasetview_slicing() - # test_dataset() + test_dataset_assign_value() + test_dataset_setting_shape() + test_datasetview_repr() + test_datasetview_get_dictionary() + test_tensorview_slicing() + test_datasetview_slicing() + test_dataset() test_dataset_batch_write_2() test_append_dataset() test_dataset2() test_text_dataset() test_text_dataset_tokenizer() + test_dataset_compute() + test_dataset_view_compute() + test_dataset_lazy() + test_dataset_view_lazy() + test_dataset_hub() + test_meta_information() diff --git a/hub/api/tests/test_objectview.py b/hub/api/tests/test_objectview.py new file mode 100644 index 0000000000..53197f3267 --- /dev/null +++ b/hub/api/tests/test_objectview.py @@ -0,0 +1,122 @@ +import numpy as np +import hub +from hub.schema import Tensor, Image, Text, Sequence, SchemaDict, BBox +import pytest + + +def test_objectview(): + schema = SchemaDict( + { + "a": Tensor((20, 20), dtype=int, max_shape=(20, 20)), + "b": Sequence(dtype=BBox(dtype=float)), + "c": Sequence( + dtype=SchemaDict({"d": Sequence((), dtype=Tensor((5, 5), dtype=float))}) + ), + "e": Sequence( + dtype={"f": {"g": Tensor(5, dtype=int), "h": Tensor((), dtype=int)}} + ), + } + ) + ds = hub.Dataset("./nested_seq", shape=(5,), mode="w", schema=schema) + + # dataset view to objectview + dv = ds[3:5] + dv["c", 0] = {"d": 5 * np.ones((2, 2, 5, 5))} + assert (dv[0, "c", 0, "d", 0].compute() == 5 * np.ones((5, 5))).all() + + # dataset view unsqueezed + with pytest.raises(IndexError): + dv["c", "d"].compute() + with pytest.raises(IndexError): + dv["c", "d"] = np.ones((2, 3, 3, 5, 5)) + + # dataset unsqueezed + with pytest.raises(IndexError): + ds["c", "d"].compute() + with pytest.raises(IndexError): + ds["c", "d"] = np.ones((5, 3, 3, 5, 5)) + + # tensorview to object view + # sequence of tensor + ds["b", 0] = 0.5 * np.ones((5, 4)) + tv = ds["b", 0] + tv[0] = 0.3 * np.ones((4,)) + assert (tv[0].compute() == 0.3 * np.ones((4,))).all() + + # ds to object view + assert (ds[3, "c", "d"].compute() == 5 * np.ones((2, 2, 5, 5))).all() + + # Sequence of schemadicts + ds[0, "e"] = {"f": {"g": np.ones((3, 5)), "h": np.ones(3)}} + ds[0, "e", 0, "f", "h"] = 42 + # The first slice is unstable but the complete slice is valid + ds[0, "e", 1]["f", "h"] = 25 + with pytest.raises(KeyError): + ds[0, "e", 1].compute() + ds[0, "e"][2]["f"]["h"] = 15 + assert (ds[0, "e", "f", "h"].compute() == np.array([42, 25, 15])).all() + # With dataset view + dv[0, "e"] = {"f": {"g": np.ones((3, 5)), "h": np.ones(3)}} + dv[0, "e", 1]["f", "h"] = 25 + assert (dv[0, "e", "f", "h"].compute() == np.array([1, 25, 1])).all() + # if not lazy mode all slices should be stable + ds.lazy = False + assert ds[0, "e", 0, "f", "h"] == 42 + with pytest.raises(KeyError): + ds[0, "e", 1]["f", "h"] == 25 + ds.lazy = True + + # make an objectview + ov = ds["c", "d"] + with pytest.raises(IndexError): + ov.compute() + assert (ov[3].compute() == 5 * np.ones((2, 2, 5, 5))).all() + ov[3, 1] = 2 * np.ones((2, 5, 5)) + assert (ov[3][0, 0].compute() == 5 * np.ones((5, 5))).all() + assert (ov[3][1].compute() == 2 * np.ones((2, 5, 5))).all() + + +def test_errors(): + schema = SchemaDict( + { + "a": Tensor((None, None), dtype=int, max_shape=(20, 20)), + "b": Sequence( + dtype=SchemaDict( + {"e": Tensor((None,), max_shape=(10,), dtype=BBox(dtype=float))} + ) + ), + "c": Sequence( + dtype=SchemaDict({"d": Sequence((), dtype=Tensor((5, 5), dtype=float))}) + ), + } + ) + ds = hub.Dataset("./nested_seq", shape=(5,), mode="w", schema=schema) + + # Invalid schema + with pytest.raises(ValueError): + ds["b", 0, "e", 1] + + # Too many indices + with pytest.raises(IndexError): + ds["c", 0, "d", 1, 1, 0, 0, 0] + with pytest.raises(IndexError): + ds["c", :2, "d"][0, 1, 1, 0, 0, 0] + ob = ds["c", :2, "d"][0, 2:5, 1, 0, 0] + assert str(ob[1]) == "ObjectView(subpath='/c/d', slice=[0, 3, 1, 0, 0])" + with pytest.raises(IndexError): + ob[1, 0] + + # Key Errors + # wrong key + with pytest.raises(KeyError): + ds["b", "c"] + # too many keys + with pytest.raises(KeyError): + ds["c", "d", "e"] + with pytest.raises(KeyError): + ds["c", "d"]["e"] + + +if __name__ == "__main__": + test_objectview() + test_errors() diff --git a/hub/api/tests/test_tensorview.py b/hub/api/tests/test_tensorview.py index 40e01f64a4..f111637d6f 100644 --- a/hub/api/tests/test_tensorview.py +++ b/hub/api/tests/test_tensorview.py @@ -24,13 +24,13 @@ def test_tensorview_init(): def test_tensorview_getitem(): images_tensorview = ds["image"] - with pytest.raises(ValueError): + with pytest.raises(IndexError): images_tensorview["7", 0:1920, 0:1080, 0:3].compute() def test_tensorview_setitem(): images_tensorview = ds["image"] - with pytest.raises(ValueError): + with pytest.raises(IndexError): images_tensorview["7", 0:1920, 0:1080, 0:3] = np.zeros((1920, 1080, 3), "uint8") diff --git a/hub/cli/auth.py b/hub/cli/auth.py index b0bfe692c4..2461a9e973 100644 --- a/hub/cli/auth.py +++ b/hub/cli/auth.py @@ -13,33 +13,7 @@ @click.option("--password", "-p", default=None, help="Your Snark AI password") def login(username, password): """ Logs in to Snark AI""" - token = "" - if token: - logger.info("Token login.") - logger.degug("Getting the token...") - token = click.prompt( - "Please paste the authentication token from {}".format( - config.GET_TOKEN_REST_SUFFIX, type=str, hide_input=True - ) - ) - token = token.strip() - AuthClient.check_token(token) - else: - logger.info( - "Please log in using Snark AI credentials. You can register at https://app.activeloop.ai " - ) - if not username: - logger.debug("Prompting for username.") - username = click.prompt("Username", type=str) - username = username.strip() - if not password: - logger.debug("Prompting for password.") - password = click.prompt("Password", type=str, hide_input=True) - password = password.strip() - token = AuthClient().get_access_token(username, password) - TokenManager.set_token(token) - HubControlClient().get_credentials() - logger.info("Login Successful.") + login_fn(username, password) @click.command() @@ -69,3 +43,34 @@ def register(username, email, password): AuthClient().register(username, email, password) token = AuthClient().get_access_token(username, password) TokenManager.set_token(token) + + +def login_fn(username, password): + """ Logs in to Snark AI""" + token = "" + if token: + logger.info("Token login.") + logger.degug("Getting the token...") + token = click.prompt( + "Please paste the authentication token from {}".format( + config.GET_TOKEN_REST_SUFFIX, type=str, hide_input=True + ) + ) + token = token.strip() + AuthClient.check_token(token) + else: + logger.info( + "Please log in using Activeloop credentials. You can register at https://app.activeloop.ai " + ) + if not username: + logger.debug("Prompting for username.") + username = click.prompt("Username", type=str) + username = username.strip() + if not password: + logger.debug("Prompting for password.") + password = click.prompt("Password", type=str, hide_input=True) + password = password.strip() + token = AuthClient().get_access_token(username, password) + TokenManager.set_token(token) + HubControlClient().get_credentials() + logger.info("Login Successful.") diff --git a/hub/cli/utils.py b/hub/cli/utils.py index a1c181fad5..72296ee1c2 100644 --- a/hub/cli/utils.py +++ b/hub/cli/utils.py @@ -10,47 +10,3 @@ def get_cli_version(): return "1.0.0" - - -def verify_cli_version(): - os.environ["OUTDATED_IGNORE"] = 1 - try: - - version = pkg_resources.get_distribution(hub.__name__).version - is_outdated, latest_version = check_outdated(hub.__name__, version) - if is_outdated: - print( - "\033[93m" - + "Hub is out of date. Please upgrade the package by running `pip3 install --upgrade snark`" - + "\033[0m" - ) - except Exception as e: - logger.error(str(e)) - - -def check_program_exists(command): - try: - subprocess.call([command]) - except OSError as e: - if e.errno == os.errno.ENOENT: - return False - else: - # Something else went wrong while trying to run `wget` - return True - return True - - -def get_proxy_command(proxy): - ssh_proxy = "" - if proxy and proxy != " " and proxy != "None" and proxy != "": - if check_program_exists("ncat"): - ssh_proxy = ( - '-o "ProxyCommand=ncat --proxy-type socks5 --proxy {} %h %p"'.format( - proxy - ) - ) - else: - raise HubException( - message="This pod is behind the firewall. You need one more thing. Please install nmap by running `sudo apt-get install nmap` on Ubuntu or `brew install nmap` for Mac" - ) - return ssh_proxy diff --git a/hub/collections/dataset/core.py b/hub/collections/dataset/core.py index 3224e4ea07..ebae7fe09b 100644 --- a/hub/collections/dataset/core.py +++ b/hub/collections/dataset/core.py @@ -690,7 +690,7 @@ def load(tag, creds=None, session_creds=True) -> Dataset: fs, path = _load_fs_and_path(tag, creds, session_creds=session_creds) fs: fsspec.AbstractFileSystem = fs path_2 = f"{path}/meta.json" - if not fs.exists(path): + if not fs.exists(path_2): raise HubDatasetNotFoundException(tag) with fs.open(path_2, "r") as f: diff --git a/hub/compute/ray.py b/hub/compute/ray.py index 1951415d7b..1d5cfb23f3 100644 --- a/hub/compute/ray.py +++ b/hub/compute/ray.py @@ -3,13 +3,14 @@ from hub.api.datasetview import DatasetView from hub.utils import batchify from hub.compute import Transform -from typing import Iterable +from typing import Iterable, Iterator from hub.exceptions import ModuleNotInstalledException from hub.api.sharded_datasetview import ShardedDatasetView import hub +from hub.api.dataset_utils import get_value, str_to_int -def remote(template, **kwargs): +def empty_remote(template, **kwargs): """ remote template """ @@ -28,7 +29,7 @@ def inner(**kwargs): remote = ray.remote except Exception: - pass + remote = empty_remote class RayTransform(Transform): @@ -36,24 +37,29 @@ def __init__(self, func, schema, ds, scheduler="ray", workers=1, **kwargs): super(RayTransform, self).__init__( func, schema, ds, scheduler="single", workers=workers, **kwargs ) + self.workers = workers if "ray" not in sys.modules: raise ModuleNotInstalledException("ray") if not ray.is_initialized(): - ray.init() + ray.init(local_mode=True) @remote - def _func_argd(_func, index, _ds, schema, **kwargs): + def _func_argd(_func, index, _ds, schema, kwargs): """ Remote wrapper for user defined function """ + if isinstance(_ds, Dataset) or isinstance(_ds, DatasetView): _ds.squeeze_dim = False item = _ds[index] - item = _func(item, **kwargs) - # item = Transform._flatten(item, schema) + if isinstance(item, DatasetView) or isinstance(item, Dataset): + item = item.compute() + + item = _func(0, item) item = Transform._flatten_dict(item, schema=schema) + return list(item.values()) def store( @@ -63,6 +69,7 @@ def store( length: int = None, ds: Iterable = None, progressbar: bool = True, + public: bool = True, ): """ The function to apply the transformation for each element in batchified manner @@ -79,50 +86,84 @@ def store( ds: Iterable progressbar: bool Show progress bar + public: bool, optional + only applicable if using hub storage, ignored otherwise + setting this to False allows only the user who created it to access the dataset and + the dataset won't be visible in the visualizer to the public + Returns ---------- ds: hub.Dataset uploaded dataset """ - - _ds = ds or self._ds - if isinstance(_ds, Transform): - _ds = _ds.store( - "{}_{}".format(url, _ds._func.__name__), - token=token, - progressbar=progressbar, - ) + _ds = ds or self.base_ds num_returns = len(self._flatten_dict(self.schema, schema=self.schema).keys()) results = [ self._func_argd.options(num_returns=num_returns).remote( - self._func, el, _ds, schema=self.schema, **self.kwargs + self.call_func, el, _ds, schema=self.schema, kwargs=self.kwargs ) for el in range(len(_ds)) ] + if num_returns == 1: + results = [[r] for r in results] + results = self._split_list_to_dicts(results) - ds = self.upload(results, url=url, token=token, progressbar=progressbar) + + ds = self.upload( + results, url=url, token=token, progressbar=progressbar, public=public + ) return ds @remote def upload_chunk(i_batch, key, ds): """ Remote function to upload a chunk + Returns the shape of dynamic tensor to upload all in once after upload is completed + + Parameters + ---------- + i_batch: Tuple + Tuple composed of (index, batch) + key: str + Key of the tensor + ds: + Dataset to set to upload + Returns + ---------- + (key, slice_, shape) to set the shape later + """ i, batch = i_batch - length = len(batch) - if not isinstance(batch, dict) and isinstance(batch[0], ray.ObjectRef): batch = ray.get(batch) + # FIXME an ugly hack to unwrap elements with a schema that has one tensor + num_returns = len( + Transform._flatten_dict(ds.schema.dict_, schema=ds.schema.dict_).keys() + ) + if num_returns == 1: + batch = [item for sublist in batch for item in sublist] - # TODO some sort of syncronizer across nodes - if length != 1: - ds[key, i * length : (i + 1) * length] = batch - else: - ds[key, i * length] = batch[0] + shape = None + length = len(batch) + + slice_ = slice(i * length, (i + 1) * length) + if ds[key].is_dynamic: + # Sometimes ds._tensor slice_ gets out of the shape value + shape = ds._tensors[f"/{key}"].get_shape_from_value([slice_], batch) + ds[key, slice_] = batch - def upload(self, results, url: str, token: dict, progressbar: bool = True): + return (key, [slice_], shape) + + def upload( + self, + results, + url: str, + token: dict, + progressbar: bool = True, + public: bool = True, + ): """Batchified upload of results. For each tensor batchify based on its chunk and upload. If tensor is dynamic then still upload element by element. @@ -134,41 +175,85 @@ def upload(self, results, url: str, token: dict, progressbar: bool = True): results: Output of transform function progressbar: bool + public: bool, optional + only applicable if using hub storage, ignored otherwise + setting this to False allows only the user who created it to access the dataset and + the dataset won't be visible in the visualizer to the public Returns ---------- ds: hub.Dataset Uploaded dataset """ - shape = (len(list(results.values())[0]),) + if len(list(results.values())) == 0: + shape = (0,) + else: + shape = (len(list(results.values())[0]),) + ds = Dataset( url, mode="w", - shape=shape, # unkownn + shape=shape, schema=self.schema, token=token, cache=False, + public=public, ) tasks = [] for key, value in results.items(): + length = ds[key].chunksize[0] + value = get_value(value) + value = str_to_int(value, ds.tokenizer) batched_values = batchify(value, length) - chunk_id = list(range(len(batched_values))) index_batched_values = list(zip(chunk_id, batched_values)) + + ds._tensors[f"/{key}"].disable_dynamicness() + results = [ self.upload_chunk.remote(el, key=key, ds=ds) for el in index_batched_values ] tasks.extend(results) - ray.get(tasks) + results = ray.get(tasks) + self.set_dynamic_shapes(results, ds) ds.commit() return ds + def set_dynamic_shapes(self, results, ds): + """ + Sets shapes for dynamic tensors after the dataset is uploaded + + Parameters + ---------- + results: Tuple + results from uploading each chunk which includes (key, slice, shape) tuple + ds: + Dataset to set the shapes to + Returns + ---------- + """ + + shapes = {} + for (key, slice_, value) in results: + if not ds[key].is_dynamic: + continue + + if key not in shapes: + shapes[key] = [] + shapes[key].append((slice_, value)) + + for key, value in shapes.items(): + ds._tensors[f"/{key}"].enable_dynamicness() + + for (slice_, shape) in shapes[key]: + ds._tensors[f"/{key}"].set_dynamic_shape(slice_, shape) + class TransformShard: - def __init__(self, ds, func, schema, **kwargs): + def __init__(self, ds, func, schema, kwargs): if isinstance(ds, Dataset) or isinstance(ds, DatasetView): ds.squeeze_dim = False @@ -185,9 +270,14 @@ def __call__(self, ids): """ for index in ids: item = self._ds[index] - item = self._func(item, **self.kwargs) + if isinstance(item, DatasetView) or isinstance(item, Dataset): + item = item.compute() - for item in Transform._unwrap(item): + items = self._func(0, item) + if not isinstance(items, list): + items = [items] + + for item in items: yield Transform._flatten_dict(item, schema=self.schema) @@ -199,6 +289,7 @@ def store( length: int = None, ds: Iterable = None, progressbar: bool = True, + public: bool = True, ): """ The function to apply the transformation for each element by sharding the dataset @@ -215,21 +306,21 @@ def store( ds: Iterable progressbar: bool Show progress bar + public: bool, optional + only applicable if using hub storage, ignored otherwise + setting this to False allows only the user who created it to access the dataset and + the dataset won't be visible in the visualizer to the public Returns ---------- ds: hub.Dataset uploaded dataset """ - _ds = ds or self._ds - if isinstance(_ds, Transform): - _ds = _ds.store( - "{}_{}".format(url, _ds._func.__name__), - token=token, - progressbar=progressbar, - ) + _ds = ds or self.base_ds - results = ray.util.iter.from_range(len(_ds), num_shards=4).transform( - TransformShard(ds=_ds, func=self._func, schema=self.schema, **self.kwargs) + results = ray.util.iter.from_range(len(_ds), num_shards=self.workers).transform( + TransformShard( + ds=_ds, func=self.call_func, schema=self.schema, kwargs=self.kwargs + ) ) @remote @@ -239,7 +330,7 @@ def upload_shard(i, shard_results): """ shard_results = self._split_list_to_dicts(shard_results) - if len(shard_results) == 0: + if len(shard_results) == 0 or len(list(shard_results.values())[0]) == 0: return None ds = self.upload( @@ -247,6 +338,7 @@ def upload_shard(i, shard_results): url=f"{url}_shard_{i}", token=token, progressbar=progressbar, + public=public, ) return ds @@ -270,19 +362,9 @@ def merge_sharded_dataset( """ sharded_ds = ShardedDatasetView(datasets) - def identity(sample): - d = {} - for k in sample.keys: - v = sample[k] - if not isinstance(v, dict): - d[k] = v.compute() - else: - d[k] = identity(v) - return d - @hub.transform(schema=self.schema, scheduler="ray") def transform_identity(sample): - return identity(sample) + return sample ds = transform_identity(sharded_ds).store( url, diff --git a/hub/compute/tests/test_ray.py b/hub/compute/tests/test_ray.py index 767fc0df12..e649b8deb7 100644 --- a/hub/compute/tests/test_ray.py +++ b/hub/compute/tests/test_ray.py @@ -2,6 +2,7 @@ from hub.utils import ray_loaded from hub.schema import Tensor, Text import pytest +from hub.compute.ray import empty_remote import numpy as np @@ -18,6 +19,79 @@ } +def test_wrapper(): + @empty_remote + def a(x): + return x + + assert a(5)() == 5 + + +@pytest.mark.skipif( + not ray_loaded(), + reason="requires ray to be loaded", +) +def test_ray_simple(): + schema = {"var": "float"} + + @hub.transform(schema=schema, scheduler="ray") + def process(item): + return {"var": 1} + + ds = process([1, 2, 3]).store("./data/somedataset") + assert ds["var", 0].compute() == 1 + + +@pytest.mark.skipif( + not ray_loaded(), + reason="requires ray to be loaded", +) +def test_ray_non_dynamic(): + schema = { + "var": Tensor(shape=(2, 2), dtype="uint8"), + "var2": Tensor(shape=(2, 2), dtype="uint8"), + } + + @hub.transform(schema=schema, scheduler="ray_generator") + def process(item): + return [{"var": np.ones((2, 2)), "var2": np.ones((2, 2))} for i in range(2)] + + ds = process([1, 2, 3]).store("./data/somedataset") + assert ds["var", 0].compute().shape[0] == 2 + + +@pytest.mark.skipif( + not ray_loaded(), + reason="requires ray to be loaded", +) +def test_ray_dynamic(): + schema = {"var": Tensor(shape=(None, None), max_shape=(2, 2), dtype="uint8")} + + @hub.transform(schema=schema, scheduler="ray_generator") + def process(item): + return {"var": np.ones((1, 2))} + + ds = process([1, 2, 3]).store("./data/somedataset") + assert ds["var", 0].compute().shape[0] == 1 + + +@pytest.mark.skipif( + not ray_loaded(), + reason="requires ray to be loaded", +) +def test_ray_simple_generator(): + schema = {"var": "float"} + + @hub.transform(schema=schema, scheduler="ray_generator") + def process(item): + items = [{"var": item} for i in range(item)] + return items + + ds = process([0, 1, 2, 3]).store("./data/somegeneratordataset") + assert ds["var", 0].compute() == 1 + assert ds.shape[0] == 6 + + @pytest.mark.skipif( not ray_loaded(), reason="requires ray to be loaded", @@ -39,10 +113,10 @@ def test_pipeline_ray(): @hub.transform(schema=my_schema, scheduler="ray") def my_transform(sample, multiplier: int = 2): return { - "image": sample["image"].compute() * multiplier, - "label": sample["label"].compute(), + "image": sample["image"] * multiplier, + "label": sample["label"], "confidence": { - "confidence": sample["confidence/confidence"].compute() * multiplier + "confidence": sample["confidence"]["confidence"] * multiplier }, } @@ -72,8 +146,8 @@ def test_ray_pipeline_multiple(): def dynamic_transform(sample, multiplier: int = 2): return [ { - "image": sample["image"].compute() * multiplier, - "label": sample["label"].compute(), + "image": sample["image"] * multiplier, + "label": sample["label"], } for _ in range(4) ] @@ -87,5 +161,42 @@ def dynamic_transform(sample, multiplier: int = 2): ).all() +@pytest.mark.skipif( + not ray_loaded(), + reason="requires ray to be loaded", +) +def test_stacked_transform(): + schema = {"test": Tensor((2, 2), dtype="uint8")} + + @hub.transform(schema=schema) + def multiply_transform(sample, multiplier=1, times=1): + if times == 1: + return {"test": multiplier * sample["test"]} + else: + return [{"test": multiplier * sample["test"]} for i in range(times)] + + @hub.transform(schema=schema, scheduler="ray_generator") + def multiply_transform_2(sample, multiplier=1, times=1): + if times == 1: + return {"test": multiplier * sample["test"]} + else: + return [{"test": multiplier * sample["test"]} for i in range(times)] + + ds = hub.Dataset("./data/stacked_transform", mode="w", shape=(5,), schema=schema) + for i in range(5): + ds["test", i] = np.ones((2, 2)) + ds1 = multiply_transform(ds, multiplier=2, times=5) + ds2 = multiply_transform(ds1, multiplier=3, times=2) + ds3 = multiply_transform_2(ds2, multiplier=5, times=3) + ds4 = ds3.store("./data/stacked_transform_2") + assert len(ds4) == 150 + assert (ds4["test", 0].compute() == 30 * np.ones((2, 2))).all() + + if __name__ == "__main__": - test_ray_pipeline_multiple() + # test_ray_simple() + # test_ray_non_dynamic() + test_ray_dynamic() + # test_ray_simple_generator() + # test_pipeline_ray() + # test_ray_pipeline_multiple() diff --git a/hub/compute/tests/test_transform.py b/hub/compute/tests/test_transform.py index 8610cdf116..fff4fbb7fb 100644 --- a/hub/compute/tests/test_transform.py +++ b/hub/compute/tests/test_transform.py @@ -30,9 +30,9 @@ def test_pipeline_basic(): @hub.transform(schema=my_schema) def my_transform(sample, multiplier: int = 2): return { - "image": sample["image"].compute() * multiplier, - "label": sample["label"].compute(), - "confidence": sample["confidence"].compute() * multiplier, + "image": sample["image"] * multiplier, + "label": sample["label"], + "confidence": sample["confidence"] * multiplier, } out_ds = my_transform(ds, multiplier=2) @@ -77,7 +77,7 @@ def test_threaded(): @hub.transform(schema=schema, scheduler="threaded", workers=2) def create_classification_dataset(sample): - ts = sample["image"].numpy() + ts = sample["image"] return [ { "image": ts, @@ -109,8 +109,8 @@ def test_pipeline_dynamic(): @hub.transform(schema=dynamic_schema) def dynamic_transform(sample, multiplier: int = 2): return { - "image": sample["image"].compute() * multiplier, - "label": sample["label"].compute(), + "image": sample["image"] * multiplier, + "label": sample["label"], } out_ds = dynamic_transform(ds, multiplier=4).store( @@ -137,8 +137,8 @@ def test_pipeline_multiple(): def dynamic_transform(sample, multiplier: int = 2): return [ { - "image": sample["image"].compute() * multiplier, - "label": sample["label"].compute(), + "image": sample["image"] * multiplier, + "label": sample["label"], } for i in range(4) ] @@ -206,9 +206,9 @@ def test_pipeline(): @hub.transform(schema=my_schema) def my_transform(sample, multiplier: int = 2): return { - "image": sample["image"].compute() * multiplier, - "label": sample["label"].compute(), - "confidence": sample["confidence"].compute() * multiplier, + "image": sample["image"] * multiplier, + "label": sample["label"], + "confidence": sample["confidence"] * multiplier, } out_ds = my_transform(ds, multiplier=2) @@ -218,6 +218,79 @@ def my_transform(sample, multiplier: int = 2): assert (out_ds["image", 0].compute() == 4).all() +def test_stacked_transform(): + schema = {"test": Tensor((2, 2), dtype="uint8")} + + @hub.transform(schema=schema) + def multiply_transform(sample, multiplier=1, times=1): + if times == 1: + return {"test": multiplier * sample["test"]} + else: + return [{"test": multiplier * sample["test"]} for i in range(times)] + + @hub.transform(schema=schema) + def multiply_transform_2(sample, multiplier=1, times=1): + if times == 1: + return {"test": multiplier * sample["test"]} + else: + return [{"test": multiplier * sample["test"]} for i in range(times)] + + ds = hub.Dataset("./data/stacked_transform", mode="w", shape=(5,), schema=schema) + for i in range(5): + ds["test", i] = np.ones((2, 2)) + ds1 = multiply_transform(ds, multiplier=2, times=5) + ds2 = multiply_transform(ds1, multiplier=3, times=2) + ds3 = multiply_transform_2(ds2, multiplier=5, times=3) + ds4 = ds3.store("./data/stacked_transform_2") + assert len(ds4) == 150 + assert (ds4["test", 0].compute() == 30 * np.ones((2, 2))).all() + + +def test_text(): + my_schema = {"text": Text((None,), max_shape=(10,))} + + @hub.transform(schema=my_schema) + def my_transform(sample): + return {"text": np.array("abc")} + + ds = my_transform([i for i in range(10)]) + ds2 = ds.store("./data/test/transform_text") + for i in range(10): + assert ds2["text", i].compute() == "abc" + + +def test_zero_sample_transform(): + schema = {"test": Tensor((None, None), dtype="uint8", max_shape=(10, 10))} + + @hub.transform(schema=schema) + def my_transform(sample): + if sample % 5 == 0: + return [] + else: + return {"test": (sample % 5) * np.ones((5, 5))} + + ds = my_transform([i for i in range(30)]) + ds2 = ds.store("./data/transform_zero_sample", sample_per_shard=5) + assert len(ds2) == 24 + for i, item in enumerate(ds2): + assert (item["test"].compute() == (((i % 4) + 1) * np.ones((5, 5)))).all() + + +def test_mutli_sample_transform(): + schema = {"test": Tensor((None, None), dtype="uint8", max_shape=(10, 10))} + + @hub.transform(schema=schema) + def my_transform(sample): + d = {"test": sample * np.ones((5, 5))} + return [d, d] + + ds = my_transform([i for i in range(32)]) + ds2 = ds.store("./data/transform_zero_sample", sample_per_shard=5) + assert len(ds2) == 64 + for i, item in enumerate(ds2): + assert (item["test"].compute() == (i // 2) * np.ones((5, 5))).all() + + def benchmark(sample_size=100, width=1000, channels=4, dtype="int8"): numpy_arr = np.zeros((sample_size, width, width, channels), dtype=dtype) zarr_fs = zarr.zeros( diff --git a/hub/compute/transform.py b/hub/compute/transform.py index c08830b46f..95604252d0 100644 --- a/hub/compute/transform.py +++ b/hub/compute/transform.py @@ -1,13 +1,12 @@ import zarr import numpy as np import math -from psutil import virtual_memory from typing import Dict, Iterable from hub.api.dataset import Dataset from tqdm import tqdm from collections.abc import MutableMapping from hub.utils import batchify -from hub.api.dataset_utils import slice_extract_info, slice_split, str_to_int +from hub.api.dataset_utils import get_value, slice_extract_info, slice_split, str_to_int import collections.abc as abc from hub.api.datasetview import DatasetView from pathos.pools import ProcessPool, ThreadPool @@ -38,6 +37,7 @@ def prod(shp): return res samples = min(samples, (16 * 1024 * 1024 * 8) // (prod(shp) * sz)) + samples = max(samples, 1) return samples * workers @@ -68,6 +68,17 @@ def __init__( self.kwargs = kwargs self.workers = workers + if isinstance(self._ds, Transform): + self.base_ds = self._ds.base_ds + self._func = self._ds._func[:] + self._func.append(func) + self.kwargs = self._ds.kwargs[:] + self.kwargs.append(kwargs) + else: + self.base_ds = ds + self._func = [func] + self.kwargs = [kwargs] + if scheduler == "threaded" or (scheduler == "single" and workers > 1): self.map = ThreadPool(nodes=workers).map elif scheduler == "processed": @@ -85,6 +96,48 @@ def __init__( f"Scheduler {scheduler} not understood, please use 'single', 'threaded', 'processed'" ) + def __len__(self): + return self.shape[0] + + def __getitem__(self, slice_): + """| Get an item to be computed without iterating on the whole dataset. + | Creates a dataset view, then a temporary dataset to apply the transform. + Parameters: + ---------- + slice_: slice + Gets a slice or slices from dataset + """ + if not isinstance(slice_, abc.Iterable) or isinstance(slice_, str): + slice_ = [slice_] + + slice_ = list(slice_) + subpath, slice_list = slice_split(slice_) + + if len(slice_list) == 0: + slice_list = [slice(None, None, None)] + + num, ofs = slice_extract_info(slice_list[0], self.shape[0]) + + ds_view = DatasetView( + dataset=self._ds, + num_samples=num, + offset=ofs, + squeeze_dim=isinstance(slice_list[0], int), + ) + + path = posixpath.expanduser("~/.activeloop/tmparray") + new_ds = self.store(path, length=num, ds=ds_view, progressbar=False) + + index = 1 if len(slice_) > 1 else 0 + slice_[index] = ( + slice(None, None, None) if not isinstance(slice_list[0], int) else 0 + ) # Get all shape dimension since we already sliced + return new_ds[slice_] + + def __iter__(self): + for index in range(len(self)): + yield self[index] + @classmethod def _flatten_dict(self, d: Dict, parent_key="", schema=None): """| Helper function to flatten dictionary of a recursive tensor @@ -136,6 +189,19 @@ def dtype_from_path(cls, path, schema): cur_type = cur_type.dict_ return cur_type[path[-1]] + @classmethod + def _unwrap(cls, results): + """ + If there is any list then unwrap it into its elements + """ + items = [] + for r in results: + if isinstance(r, dict): + items.append(r) + else: + items.extend(r) + return items + def _split_list_to_dicts(self, xs): """| Helper function that transform list of dicts into dicts of lists @@ -160,7 +226,20 @@ def _split_list_to_dicts(self, xs): xs_new[key] = [value] return xs_new - def create_dataset(self, url, length=None, token=None): + def _pbar(self, show: bool = True): + """ + Returns a progress bar, if empty then it function does nothing + """ + + def _empty_pbar(xs, **kwargs): + return xs + + single_threaded = self.map == map + return tqdm if show and single_threaded else _empty_pbar + + def create_dataset( + self, url: str, length: int = None, token: dict = None, public: bool = True + ): """Helper function to creat a dataset""" shape = (length,) ds = Dataset( @@ -171,6 +250,7 @@ def create_dataset(self, url, length=None, token=None): token=token, fs=zarr.storage.MemoryStore() if "tmp" in url else None, cache=False, + public=public, ) return ds @@ -197,18 +277,18 @@ def upload(self, results, ds: Dataset, token: dict, progressbar: bool = True): chunk = ds[key].chunksize[0] chunk = 1 if chunk == 0 else chunk + value = get_value(value) value = str_to_int(value, ds.dataset.tokenizer) + num_chunks = math.ceil(len(value) / (chunk * self.workers)) length = num_chunks * chunk if self.workers != 1 else len(value) batched_values = batchify(value, length) def upload_chunk(i_batch): i, batch = i_batch - batch_length = len(batch) - if batch_length != 1: - ds[key, i * length : i * length + batch_length] = batch - else: - ds[key, i * length] = batch[0] + length = len(batch) + slice_ = slice(i * length, (i + 1) * length) + ds[key, slice_] = batch index_batched_values = list( zip(list(range(len(batched_values))), batched_values) @@ -228,29 +308,32 @@ def upload_chunk(i_batch): ds.commit() return ds - def _pbar(self, show: bool = True): - """ - Returns a progress bar, if empty then it function does nothing - """ - - def _empty_pbar(xs, **kwargs): - return xs + def call_func(self, fn_index, item, as_list=False): + """Calls all the functions one after the other - single_threaded = self.map == map - return tqdm if show and single_threaded else _empty_pbar + Parameters + ---------- + fn_index: int + The index starting from which the functions need to be called + item: + The item on which functions need to be applied + as_list: bool, optional + If true then treats the item as a list. - @classmethod - def _unwrap(cls, results): - """ - If there is any list then unwrap it into its elements + Returns + ---------- + result: + The final output obtained after all transforms """ - items = [] - for r in results: - if isinstance(r, dict): - items.append(r) + result = item + if fn_index < len(self._func): + if as_list: + result = [self.call_func(fn_index, it) for it in result] else: - items.extend(r) - return items + result = self._func[fn_index](result, **self.kwargs[fn_index]) + result = self.call_func(fn_index + 1, result, isinstance(result, list)) + result = self._unwrap(result) if isinstance(result, list) else result + return result def store_shard(self, ds_in: Iterable, ds_out: Dataset, offset: int, token=None): """ @@ -258,7 +341,12 @@ def store_shard(self, ds_in: Iterable, ds_out: Dataset, offset: int, token=None) """ def _func_argd(item): - return self._func(item, **self.kwargs) + if isinstance(item, DatasetView) or isinstance(item, Dataset): + item = item.numpy() + result = self.call_func( + 0, item + ) # If the iterable obtained from iterating ds_in is a list, it is not treated as list + return result ds_in = list(ds_in) results = self.map( @@ -297,7 +385,8 @@ def store( length: int = None, ds: Iterable = None, progressbar: bool = True, - sample_per_shard=None, + sample_per_shard: int = None, + public: bool = True, ): """| The function to apply the transformation for each element in batchified manner @@ -315,19 +404,17 @@ def store( Show progress bar sample_per_shard: int How to split the iterator not to overfill RAM + public: bool, optional + only applicable if using hub storage, ignored otherwise + setting this to False allows only the user who created it to access the dataset and + the dataset won't be visible in the visualizer to the public Returns ---------- ds: hub.Dataset uploaded dataset """ - ds_in = ds or self._ds - if isinstance(ds_in, Transform): - ds_in = ds_in.store( - "{}_{}".format(url, ds_in._func.__name__), - token=token, - progressbar=progressbar, - ) + ds_in = ds or self.base_ds # compute shard length if sample_per_shard is None: @@ -342,7 +429,7 @@ def store( if length < n_samples: n_samples = length - ds_out = self.create_dataset(url, length=length, token=token) + ds_out = self.create_dataset(url, length=length, token=token, public=public) def batchify_generator(iterator: Iterable, size: int): batch = [] @@ -365,57 +452,13 @@ def batchify_generator(iterator: Iterable, size: int): for ds_in_shard in batchify_generator(ds_in, n_samples): n_results = self.store_shard(ds_in_shard, ds_out, start, token=token) total += n_results - pbar.update(n_results) - if n_results < n_samples or n_results == 0: - break - start += n_samples + pbar.update(len(ds_in_shard)) + start += n_results ds_out.resize_shape(total) ds_out.commit() return ds_out - def __len__(self): - return self.shape[0] - - def __getitem__(self, slice_): - """| Get an item to be computed without iterating on the whole dataset. - | Creates a dataset view, then a temporary dataset to apply the transform. - Parameters: - ---------- - slice_: slice - Gets a slice or slices from dataset - """ - if not isinstance(slice_, abc.Iterable) or isinstance(slice_, str): - slice_ = [slice_] - - slice_ = list(slice_) - subpath, slice_list = slice_split(slice_) - - if len(slice_list) == 0: - slice_list = [slice(None, None, None)] - - num, ofs = slice_extract_info(slice_list[0], self.shape[0]) - - ds_view = DatasetView( - dataset=self._ds, - num_samples=num, - offset=ofs, - squeeze_dim=isinstance(slice_list[0], int), - ) - - path = posixpath.expanduser("~/.activeloop/tmparray") - new_ds = self.store(path, length=num, ds=ds_view, progressbar=False) - - index = 1 if len(slice_) > 1 else 0 - slice_[index] = ( - slice(None, None, None) if not isinstance(slice_list[0], int) else 0 - ) # Get all shape dimension since we already sliced - return new_ds[slice_] - - def __iter__(self): - for index in range(len(self)): - yield self[index] - @property def shape(self): return self._ds.shape diff --git a/hub/defaults.py b/hub/defaults.py index ca20ca319f..ebaf4c49d9 100644 --- a/hub/defaults.py +++ b/hub/defaults.py @@ -1,3 +1,5 @@ CHUNK_DEFAULT_SIZE = 2 ** 24 OBJECT_CHUNK = 128 DEFAULT_COMPRESSOR = "default" +DEFAULT_MEMORY_CACHE_SIZE = 2 ** 26 +DEFAULT_STORAGE_CACHE_SIZE = 2 ** 28 diff --git a/hub/exceptions.py b/hub/exceptions.py index 836c2f9c7b..dcef6e6280 100644 --- a/hub/exceptions.py +++ b/hub/exceptions.py @@ -207,7 +207,10 @@ class NotHubDatasetToOverwriteException(HubException): def __init__(self): message = ( "Unable to overwrite the dataset. " - "The provided directory is not empty and doesn't contain information about any Hub Dataset " + "The provided directory is not empty and doesn't contain information about any Hub Dataset. " + "This is a safety check so it won't be possible to overwrite (delete) any folder other than Dataset folder. " + "If this error persists in case of Dataset folder then it means your Dataset data is corrupted. " + "In that case feel free to create an issue in here https://github.com/activeloopai/Hub" ) super(HubException, self).__init__(message=message) diff --git a/hub/schema/features.py b/hub/schema/features.py index 150c304a9c..4c7ce06ef9 100644 --- a/hub/schema/features.py +++ b/hub/schema/features.py @@ -1,5 +1,4 @@ from typing import Tuple, Dict, Iterable - import hub Shape = Tuple[int, ...] @@ -126,15 +125,39 @@ def __init__( Sample Count is also in the list of tensor's dimensions (first dimension) If default value is chosen, automatically detects how to split into chunks """ - if shape is None or shape == (None,) and max_shape is None: - raise TypeError("both shape and max_shape cannot be None at the same time") + if shape is None: + raise TypeError("shape cannot be None") + if isinstance(shape, Iterable) and None in shape and max_shape is None: + raise ValueError( + "while specifying shape containing None dimensions, max_shape argument needs to be provided" + ) + if not isinstance(shape, (tuple, int, list)): + raise TypeError(f"shape of {type(shape)} is not supported") + shape = (shape,) if isinstance(shape, int) else tuple(shape) - chunks = _normalize_chunks(chunks) - max_shape = max_shape or shape + for dim in shape: + if not isinstance(dim, int) and dim is not None: + raise TypeError(f"shape can't have {type(dim)} in its dimension") + max_shape = shape if max_shape is None else max_shape + if not isinstance(max_shape, (tuple, int, list)): + raise TypeError(f"max_shape of {type(max_shape)} is not supported") + max_shape = (max_shape,) if isinstance(max_shape, int) else tuple(max_shape) + for dim in max_shape: + if dim is None: + raise TypeError("max_shape can't have None in it's dimension") + elif not isinstance(dim, int): + raise TypeError(f"max_shape can't have {type(dim)} in its dimension") + if len(shape) != len(max_shape): raise ValueError( - f"Length of shape ({len(shape)}) and max_shape ({len(max_shape)}) does not match" + f"shape {shape} and max_shape {max_shape} have different lengths" ) + for dim, max_dim in zip(shape, max_shape): + if dim is not None and dim != max_dim: + raise ValueError(f"shape and max_shape mismatch, {dim} != {max_dim}") + + chunks = _normalize_chunks(chunks) + # TODO add errors if shape and max_shape have wrong values self.shape = tuple(shape) self.dtype = featurify(dtype) diff --git a/hub/schema/tests/test_tensor.py b/hub/schema/tests/test_tensor.py index 0a9fef9670..e609a61c68 100644 --- a/hub/schema/tests/test_tensor.py +++ b/hub/schema/tests/test_tensor.py @@ -8,7 +8,34 @@ def test_tensor_error(): try: Tensor(None, max_shape=None) except TypeError as ex: - assert "both shape and max_shape cannot be None at the same time" in str(ex) + assert "shape cannot be None" in str(ex) + + +def test_tensor_error_2(): + with pytest.raises(TypeError): + t1 = Tensor(shape=(5.1)) + with pytest.raises(TypeError): + t2 = Tensor(shape=(5.1,)) + with pytest.raises(TypeError): + t3 = Tensor(shape=(5, 6), max_shape=(7.2, 8)) + with pytest.raises(ValueError): + t4 = Tensor(shape=(5, 6), max_shape=(7, 8, 9)) + with pytest.raises(TypeError): + t5 = Tensor(shape=(5, None), max_shape=(5, None)) + with pytest.raises(TypeError): + t6 = Tensor(shape=(5, 6), max_shape=(7.2, 8)) + with pytest.raises(ValueError): + t7 = Tensor(max_shape=(10, 15)) + with pytest.raises(TypeError): + t8 = Tensor(None) + with pytest.raises(ValueError): + t9 = Tensor((5, 6, None)) + with pytest.raises(TypeError): + t10 = Tensor(max_shape="abc") + with pytest.raises(TypeError): + t11 = Tensor(max_shape=(7.4, 2)) + with pytest.raises(ValueError): + t12 = Tensor(max_shape=[]) def test_tensor_flattening(): @@ -66,3 +93,4 @@ def test_tensor_repr(): test_tensor_init() test_tensor_str() test_tensor_repr() + test_tensor_error_2() diff --git a/hub/store/dynamic_tensor.py b/hub/store/dynamic_tensor.py index 731fc6661c..b940233e13 100644 --- a/hub/store/dynamic_tensor.py +++ b/hub/store/dynamic_tensor.py @@ -189,7 +189,7 @@ def __setitem__(self, slice_, value): elif self._dynamic_tensor and isinstance(slice_[0], slice): max_shape = value[0].shape for item in value: - max_shape = tuple([max(value) for value in zip(max_shape, item.shape)]) + max_shape = tuple(max(value) for value in zip(max_shape, item.shape)) for i in range(len(value)): pad = [ (0, max_shape[dim] - value[i].shape[dim]) @@ -234,12 +234,12 @@ def check_value_shape(self, value, slice_): if isinstance(value, list): value = np.array(value) if isinstance(value, np.ndarray): - if value.shape[0] == 1 and expected_value_shape[0] != 1: - value = np.squeeze(value, axis=0) - if value.shape[-1] == 1 and expected_value_shape[-1] != 1: - value = np.squeeze(value, axis=-1) - if value.shape != expected_value_shape: + value_shape = [dim for dim in value.shape if dim != 1] + expected_shape = [dim for dim in expected_value_shape if dim != 1] + if value_shape != expected_shape: raise ValueShapeError(expected_value_shape, value.shape) + else: + value = value.reshape(expected_value_shape) else: expected_value_shape = (1,) if isinstance(value, list): @@ -343,14 +343,28 @@ def get_shape(self, slice_): return final_shapes # returns 2D np array def set_shape(self, slice_, value): - """Sets the shape of the slice of tensor""" + """ + Set shape of the dynamic tensor given value + """ if not self._enabled_dynamicness: return + + new_shape = self.get_shape_from_value(slice_, value) + self.set_dynamic_shape(slice_, new_shape) + + def set_dynamic_shape(self, slice_, shape): + """ + Set shape from the shape directly + """ + self._dynamic_tensor[slice_[0]] = shape + + def get_shape_from_value(self, slice_, value): + """ + create shape for multiple elements + """ if isinstance(slice_[0], int): - new_shape = self.create_shape(slice_, value) - self._dynamic_tensor[slice_[0]] = new_shape = np.maximum( - self._dynamic_tensor[slice_[0]], new_shape - ) + new_shapes = self.create_shape(slice_, value) + new_shapes = np.maximum(self._dynamic_tensor[slice_[0]], new_shapes) else: start = slice_[0].start if slice_[0].start is not None else 0 stop = ( @@ -362,14 +376,21 @@ def set_shape(self, slice_, value): new_shape = self.create_shape([i] + slice_[1:], value[i - start]) new_shape = np.maximum(dt[i - start], new_shape) new_shapes.append(new_shape) - self._dynamic_tensor[slice_[0]] = new_shapes + return new_shapes def create_shape(self, slice_, value): assert isinstance(slice_[0], int) new_shape = [] shape_offset = 0 - value_shape = list(value.shape) if hasattr(value, "shape") else [1] + + value_shape = ( + list(value.shape) + if hasattr(value, "shape") and len(list(value.shape)) > 0 + else [1] + ) + for i in range(1, len(self.shape)): + if self.shape[i] is None: if i < len(slice_): if isinstance(slice_[i], slice): diff --git a/hub/store/store.py b/hub/store/store.py index c5f7bda243..223421c224 100644 --- a/hub/store/store.py +++ b/hub/store/store.py @@ -1,21 +1,22 @@ +from typing import MutableMapping, Tuple import posixpath import shutil -from hub.store.cache import Cache -from hub.store.lru_cache import LRUCache - -from hub.client.hub_control import HubControlClient import configparser -from typing import MutableMapping, Tuple +import os +from time import sleep +import re import fsspec import gcsfs import zarr + +from hub.store.cache import Cache +from hub.store.lru_cache import LRUCache +from hub.client.hub_control import HubControlClient from hub.store.azure_fs import AzureBlobFileSystem -import os -import re -def _connect(tag): +def _connect(tag, public=True): """Connects to the backend and receives credentials""" creds = HubControlClient().get_config() @@ -28,12 +29,15 @@ def _connect(tag): else: sub_tags = tag.split("/") # Get repository path from the cred location - path = "/".join(creds["bucket"].split("/")[:-1]) + path = "/".join(creds["bucket"].split("/")[:-2]) + path = path + "/public" if public else path + "/private" path = f"{path}/{sub_tags[0]}/{sub_tags[-1]}" return path, creds -def get_fs_and_path(url: str, token=None) -> Tuple[fsspec.AbstractFileSystem, str]: +def get_fs_and_path( + url: str, token=None, public=True +) -> Tuple[fsspec.AbstractFileSystem, str]: if url.startswith("s3://"): token = token or dict() token = read_aws_creds(token) if isinstance(token, str) else token @@ -72,7 +76,7 @@ def get_fs_and_path(url: str, token=None) -> Tuple[fsspec.AbstractFileSystem, st return fsspec.filesystem("file"), url else: # TOOD check if url is username/dataset:version - url, creds = _connect(url) + url, creds = _connect(url, public=public) fs = fsspec.filesystem( "s3", key=creds["access_key"], @@ -118,12 +122,6 @@ def get_cache_path(path, cache_folder="~/.activeloop/cache/"): def get_storage_map(fs, path, memcache=2 ** 26, lock=True, storage_cache=2 ** 28): store = _get_storage_map(fs, path) - cache_path = get_cache_path(path) - if storage_cache and storage_cache > 0: - os.makedirs(cache_path, exist_ok=True) - store = LRUCache( - zarr.LMDBStore(cache_path, buffers=True, lock=lock), store, storage_cache - ) if memcache and memcache > 0: store = LRUCache(zarr.MemoryStore(), store, memcache) return store diff --git a/hub/test_numcodecs.py b/hub/test_numcodecs.py new file mode 100644 index 0000000000..611542deb9 --- /dev/null +++ b/hub/test_numcodecs.py @@ -0,0 +1,11 @@ +import numpy as np + +from .numcodecs import PngCodec + + +def test_png_codec(): + codec = PngCodec() + arr = np.ones((1000, 1000, 3), dtype="uint8") + bytes_ = codec.encode(arr) + arr_ = codec.decode(bytes_) + assert (arr == arr_).all() diff --git a/hub/tests/test_hub_init.py b/hub/tests/test_hub_init.py index 963d45ceed..8594ca20f0 100644 --- a/hub/tests/test_hub_init.py +++ b/hub/tests/test_hub_init.py @@ -1,3 +1,6 @@ +from hub.exceptions import HubDatasetNotFoundException +import pytest + import hub import hub.config from hub.utils import dask_loaded @@ -22,6 +25,13 @@ def test_load(caplog): assert isinstance(obj, hub.Dataset) == True +def test_load_wrong_dataset(): + try: + obj = hub.load("./data/dataset_that_does_not_exist") + except Exception as ex: + assert isinstance(ex, HubDatasetNotFoundException) + + if __name__ == "__main__": test_local_mode() test_dev_mode() diff --git a/hub/utils.py b/hub/utils.py index e5023d0892..4a93488344 100644 --- a/hub/utils.py +++ b/hub/utils.py @@ -1,5 +1,11 @@ from math import gcd import time +from collections import abc + +from numpy.lib.arraysetops import isin + +from hub.exceptions import ShapeLengthException +from hub import defaults def _flatten(list_): @@ -48,6 +54,17 @@ def azure_creds_exist(): return False +def hub_creds_exist(): + """Checks if credentials exists""" + + import os + + env = os.getenv("ACTIVELOOP_HUB_PASSWORD") + if env is not None: + return True + return False + + def pytorch_loaded(): try: import torch @@ -150,3 +167,24 @@ def __enter__(self): def __exit__(self, *args): print(f"{self._text}: {time.time() - self._start}s") + + +def norm_shape(shape): + shape = shape or (None,) + if isinstance(shape, int): + shape = (shape,) + if not isinstance(shape, abc.Iterable): + raise TypeError( + f"shape is not None, int or Iterable, type(shape): {type(shape)}" + ) + shape = tuple(shape) + if not all([isinstance(s, int) or s is None for s in shape]): + raise TypeError(f"Shape elements can be either int or None | shape: {shape}") + return shape + + +def norm_cache(cache): + cache = cache or 0 + if not isinstance(cache, int): + raise TypeError("Cache should be None or int") + return cache diff --git a/requirements-dev.txt b/requirements-dev.txt index dbac4d3d08..524d2d3e71 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -1,4 +1,4 @@ -pytest==6.1.2 +pytest==6.2.1 pytest-cov==2.10.1 flake8==3.8.4 black==20.8b1 diff --git a/requirements.txt b/requirements.txt index 602fab3ac2..ab232f79f7 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,16 +2,16 @@ click>=6.7,<8 numpy>=1.13.0,<2 requests>=2,<3 cachey==0.2.1 -fsspec==0.8.4 +fsspec==0.8.5 s3fs==0.4.2 gcsfs==0.6.2 outdated==0.2.0 lz4>=3,<4 -zarr==2.5 +zarr==2.6.1 lmdb==1.0.0 -boto3==1.16.10 -azure-storage-blob==12.5.0 -tqdm==4.51 +boto3==1.16.39 +tqdm==4.54.1 +azure-storage-blob==12.6.0 pathos>=0.2.2 psutil>=5.7.3 Pillow>=8.0.1 diff --git a/setup.py b/setup.py index afcc0018e7..40e5866093 100644 --- a/setup.py +++ b/setup.py @@ -3,7 +3,7 @@ from setuptools import find_packages, setup project = "hub" -VERSION = "1.0.6" +VERSION = "1.0.7" this_directory = os.path.abspath(os.path.dirname(__file__)) with open(os.path.join(this_directory, "README.md")) as f: