Skip to main content

Model Serving made Efficient in the Cloud

Reason this release was yanked:

bug

Project description

MOSEC

discord invitation link PyPI version Python Version PyPi Downloads License Check status

Model Serving made Efficient in the Cloud.

Introduction

MOSEC

Mosec is a high-performance and flexible model serving framework for building ML model-enabled backend and microservices. It bridges the gap between any machine learning models you just trained and the efficient online service API.

  • Highly performant: web layer and task coordination built with Rust 🦀, which offers blazing speed in addition to efficient CPU utilization powered by async I/O
  • Ease of use: user interface purely in Python 🐍, by which users can serve their models in an ML framework-agnostic manner using the same code as they do for offline testing
  • Dynamic batching: aggregate requests from different users for batched inference and distribute results back
  • Pipelined stages: spawn multiple processes for pipelined stages to handle CPU/GPU/IO mixed workloads
  • Cloud friendly: designed to run in the cloud, with the model warmup, graceful shutdown, and Prometheus monitoring metrics, easily managed by Kubernetes or any container orchestration systems
  • Do one thing well: focus on the online serving part, users can pay attention to the model optimization and business logic

Installation

Mosec requires Python 3.7 or above. Install the latest PyPI package with:

pip install -U mosec

Usage

We demonstrate how Mosec can help you easily host a pre-trained stable diffusion model as a service. You need to install diffusers and transformers as prerequisites:

pip install --upgrade diffusers[torch] transformers

Write the server

Firstly, we import the libraries and set up a basic logger to better observe what happens.

from io import BytesIO
from typing import List

import torch  # type: ignore
from diffusers import StableDiffusionPipeline  # type: ignore

from mosec import Server, Worker, get_logger
from mosec.mixin import MsgpackMixin

logger = get_logger()

Then, we build an API for clients to query a text prompt and obtain an image based on the stable-diffusion-v1-5 model in just 3 steps.

  1. Define your service as a class which inherits mosec.Worker. Here we also inherit MsgpackMixin to employ the msgpack serialization format(a).

  2. Inside the __init__ method, initialize your model and put it onto the corresponding device. Optionally you can assign self.example with some data to warm up(b) the model. Note that the data should be compatible with your handler's input format, which we detail next.

  3. Override the forward method to write your service handler(c), with the signature forward(self, data: Any | List[Any]) -> Any | List[Any]. Receiving/returning a single item or a tuple depends on whether dynamic batching(d) is configured.

class StableDiffusion(MsgpackMixin, Worker):
    def __init__(self):
        self.pipe = StableDiffusionPipeline.from_pretrained(
            "runwayml/stable-diffusion-v1-5", torch_dtype=torch.float16
        )
        device = "cuda" if torch.cuda.is_available() else "cpu"
        self.pipe = self.pipe.to(device)
        self.example = ["useless example prompt"] * 4  # warmup (bs=4)

    def forward(self, data: List[str]) -> List[memoryview]:
        logger.debug("generate images for %s", data)
        res = self.pipe(data)
        logger.debug("NSFW: %s", res[1])
        images = []
        for img in res[0]:
            dummy_file = BytesIO()
            img.save(dummy_file, format="JPEG")
            images.append(dummy_file.getbuffer())
        return images

Note

(a) In this example we return an image in the binary format, which JSON does not support (unless encoded with base64 that makes it longer). Hence, msgpack suits our need better. If we do not inherit MsgpackMixin, JSON will be used by default. In other words, the protocol of the service request/response can either be msgpack or JSON.

(b) Warm-up usually helps to allocate GPU memory in advance. If the warm-up example is specified, the service will only be ready after the example is forwarded through the handler. However, if no example is given, the first request's latency is expected to be longer. The example should be set as a single item or a tuple depending on what forward expects to receive. Moreover, in the case where you want to warm up with multiple different examples, you may set multi_examples (demo here).

(c) This example shows a single-stage service, where the StableDiffusion worker directly takes in client's prompt request and responds the image. Thus the forward can be considered as a complete service handler. However, we can also design a multi-stage service with workers doing different jobs (e.g., downloading images, forward model, post-processing) in a pipeline. In this case, the whole pipeline is considered as the service handler, with the first worker taking in the request and the last worker sending out the response. The data flow between workers is done by inter-process communication.

(d) Since dynamic batching is enabled in this example, the forward method will wishfully receive a list of string, e.g., ['a cute cat playing with a red ball', 'a man sitting in front of a computer', ...], aggregated from different clients for batch inference, improving the system throughput.

Finally, we append the worker to the server to construct a single-stage workflow (multiple stages can be pipelined to further boost the throughput, see this example), and specify the number of processes we want it to run in parallel (num=1), and the maximum batch size (max_batch_size=4, the maximum number of requests dynamic batching will accumulate before timeout; timeout is defined with the flag --wait in milliseconds, meaning the longest time Mosec waits until sending the batch to the Worker).

if __name__ == "__main__":
    server = Server()
    # 1) `num` specifies the number of processes that will be spawned to run in parallel.
    # 2) By configuring the `max_batch_size` with the value > 1, the input data in your
    # `forward` function will be a list (batch); otherwise, it's a single item.
    server.append_worker(StableDiffusion, num=1, max_batch_size=4, max_wait_time=10)
    server.run()

Run the server

The above snippets are merged in our example file. You may directly run at the project root level. We first have a look at the command line arguments (explanations here):

python examples/stable_diffusion/server.py --help

Then let's start the server with debug logs:

python examples/stable_diffusion/server.py --debug

And in another terminal, test it:

python examples/stable_diffusion/client.py --prompt "a cute cat playing with a red ball" --output cat.jpg --port 8000

You will get an image named "cat.jpg" in the current directory.

You can check the metrics:

curl http://127.0.0.1:8000/metrics

That's it! You have just hosted your stable-diffusion model as a service! 😉

Examples

More ready-to-use examples can be found in the Example section. It includes:

Configuration

  • Dynamic batching
    • max_batch_size is configured when you append_worker (make sure inference with the max value won't cause the out-of-memory in GPU).
    • --wait (default=10ms) is configured through CLI arguments (this usually should <= one batch inference duration).
    • If enabled, it will collect a batch either when it reaches the max_batch_size or the wait time.
  • Check the arguments doc.

Deployment

  • This may require some shared memory, remember to set the --shm-size flag if you are using docker.
  • This service doesn't require Gunicorn or NGINX, but you can certainly use the ingress controller. BTW, it should be the PID 1 process in the container since it controls multiple processes.
  • Remember to collect the metrics.
    • mosec_service_batch_size_bucket shows the batch size distribution.
    • mosec_service_batch_duration_second_bucket shows the duration of dynamic batching for each connection in each stage (starts from receiving the first task).
    • mosec_service_process_duration_second_bucket shows the duration of processing for each connection in each stage (including the IPC time but excluding the mosec_service_batch_duration_second_bucket).
    • mosec_service_remaining_task shows the number of currently processing tasks.
    • mosec_service_throughput shows the service throughput.
  • Stop the service with SIGINT or SIGTERM since it has the graceful shutdown logic.

Adopters

Here are some of the companies and individual users that are using Mosec:

Citation

If you find this software useful for your research, please consider citing

@software{yang2021mosec,
  title = {{MOSEC: Model Serving made Efficient in the Cloud}},
  author = {Yang, Keming and Liu, Zichen and Cheng, Philip},
  url = {https://github.com/mosecorg/mosec},
  year = {2021}
}

Contributing

We welcome any kind of contribution. Please give us feedback by raising issues or discussing on Discord. You could also directly contribute your code and pull request!

To start develop, you can use envd to create an isolated and clean Python & Rust environment. Check the envd-docs or build.envd for more information.

Project details


Release history Release notifications | RSS feed

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

mosec-0.7.0.tar.gz (70.2 kB view details)

Uploaded Source

Built Distributions

mosec-0.7.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.1 MB view details)

Uploaded PyPy manylinux: glibc 2.17+ x86-64

mosec-0.7.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl (1.1 MB view details)

Uploaded PyPy macOS 10.9+ x86-64

mosec-0.7.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.1 MB view details)

Uploaded PyPy manylinux: glibc 2.17+ x86-64

mosec-0.7.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl (1.1 MB view details)

Uploaded PyPy macOS 10.9+ x86-64

mosec-0.7.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.1 MB view details)

Uploaded PyPy manylinux: glibc 2.17+ x86-64

mosec-0.7.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl (1.1 MB view details)

Uploaded PyPy macOS 10.9+ x86-64

mosec-0.7.0-cp311-cp311-musllinux_1_1_x86_64.whl (2.2 MB view details)

Uploaded CPython 3.11 musllinux: musl 1.1+ x86-64

mosec-0.7.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.1 MB view details)

Uploaded CPython 3.11 manylinux: glibc 2.17+ x86-64

mosec-0.7.0-cp311-cp311-macosx_10_9_x86_64.whl (1.1 MB view details)

Uploaded CPython 3.11 macOS 10.9+ x86-64

mosec-0.7.0-cp310-cp310-musllinux_1_1_x86_64.whl (2.2 MB view details)

Uploaded CPython 3.10 musllinux: musl 1.1+ x86-64

mosec-0.7.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.1 MB view details)

Uploaded CPython 3.10 manylinux: glibc 2.17+ x86-64

mosec-0.7.0-cp310-cp310-macosx_10_9_x86_64.whl (1.1 MB view details)

Uploaded CPython 3.10 macOS 10.9+ x86-64

mosec-0.7.0-cp39-cp39-musllinux_1_1_x86_64.whl (2.2 MB view details)

Uploaded CPython 3.9 musllinux: musl 1.1+ x86-64

mosec-0.7.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.1 MB view details)

Uploaded CPython 3.9 manylinux: glibc 2.17+ x86-64

mosec-0.7.0-cp39-cp39-macosx_10_9_x86_64.whl (1.1 MB view details)

Uploaded CPython 3.9 macOS 10.9+ x86-64

mosec-0.7.0-cp38-cp38-musllinux_1_1_x86_64.whl (2.2 MB view details)

Uploaded CPython 3.8 musllinux: musl 1.1+ x86-64

mosec-0.7.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.1 MB view details)

Uploaded CPython 3.8 manylinux: glibc 2.17+ x86-64

mosec-0.7.0-cp38-cp38-macosx_10_9_x86_64.whl (1.1 MB view details)

Uploaded CPython 3.8 macOS 10.9+ x86-64

mosec-0.7.0-cp37-cp37m-musllinux_1_1_x86_64.whl (2.2 MB view details)

Uploaded CPython 3.7m musllinux: musl 1.1+ x86-64

mosec-0.7.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.1 MB view details)

Uploaded CPython 3.7m manylinux: glibc 2.17+ x86-64

mosec-0.7.0-cp37-cp37m-macosx_10_9_x86_64.whl (1.1 MB view details)

Uploaded CPython 3.7m macOS 10.9+ x86-64

File details

Details for the file mosec-0.7.0.tar.gz.

File metadata

  • Download URL: mosec-0.7.0.tar.gz
  • Upload date:
  • Size: 70.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.9.16

File hashes

Hashes for mosec-0.7.0.tar.gz
Algorithm Hash digest
SHA256 cc22ede029fbffa546fbf3d9122eaa28b787e569be4bfc464db27a89a3f8de87
MD5 731a13873ce1efc44c1e77d8751aaec9
BLAKE2b-256 4d44e6db4a7df9d04d0143f941a9bd2d1e3e93cbb6b575e3998a9f2f13b46b5b

See more details on using hashes here.

File details

Details for the file mosec-0.7.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for mosec-0.7.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 5084a04d99ea55ed91367e79828d0f7a8b71d1d89b10d3bbf81c939526bbf1e5
MD5 a1d81298e2048f13ad22cefd71880cbb
BLAKE2b-256 2115c7e995a1bc3121ec244c3871bbb090458d8673114c12e704736aa7d66983

See more details on using hashes here.

File details

Details for the file mosec-0.7.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for mosec-0.7.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 f10d07f837ad1ce72a632e38f52c5d0e0c105afbb6aa2ff75e56a68fdcd1499d
MD5 260522acdb84af0ac400dc50a7494a84
BLAKE2b-256 2abece52e93d18cf63038b5304051fca3626e9802bcf25fd571286e370518289

See more details on using hashes here.

File details

Details for the file mosec-0.7.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for mosec-0.7.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 ad95746c3d1a722e25a846b4912b9d5684a2938c1d011d143debdf790ca3e23f
MD5 8e038bcf437c8f5867a530c213318014
BLAKE2b-256 6fda96da4d1d78275fc6eaa9b018802c506974d7d3c63312639846a9724a6e4c

See more details on using hashes here.

File details

Details for the file mosec-0.7.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for mosec-0.7.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 06629514a75fc2c97df437ebea859d4ee08bef6e71593260578443881d2f5c64
MD5 55d6785bc7aac42da2a0f96e641dff3b
BLAKE2b-256 0178d1ea559cf0f315c17788f392cdb27574f620d5112349fefdf4eced6a0a4c

See more details on using hashes here.

File details

Details for the file mosec-0.7.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for mosec-0.7.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 81088338a9f1d27ced9209fdcbf14ba0242a2b165f3390b18ae9b4708f8a10fe
MD5 cc8eaa4e638c7d254bb5c7f530b4fc1b
BLAKE2b-256 3a318d671bd7bb4f390c24f19fdb798952818c56999cfdddd9eb969842cc4672

See more details on using hashes here.

File details

Details for the file mosec-0.7.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for mosec-0.7.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 8f6918b1e3da140319b149e4d2d1075c3047e5c1defb08accbd5698ee69d7be4
MD5 350a5c5b9001d98bf3b300bd670fb83f
BLAKE2b-256 ad0f9b9d2b9a809177fb19588d313b51ff87f4e1c82499cbeae70bedc334e39f

See more details on using hashes here.

File details

Details for the file mosec-0.7.0-cp311-cp311-musllinux_1_1_x86_64.whl.

File metadata

File hashes

Hashes for mosec-0.7.0-cp311-cp311-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 4eedbe2b1fb5c2694117b650a78645e8c59680f7db67b16060e6bd039d524832
MD5 f66094e763e851a243801109e72659c0
BLAKE2b-256 e39097a7ae01538243ac8f923f63a4898dc0afb17a4de8d20531d6a78d84f370

See more details on using hashes here.

File details

Details for the file mosec-0.7.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for mosec-0.7.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 ea8d992051e56a0e789621c7318cba37db6f8d9ee1ffd67e02d813fb7aff38bc
MD5 12624d61c976fb55e2d8921d24853ea8
BLAKE2b-256 9749650d0855c8e9be37d7547a4c32411470036d92c1bf5b1a9ef3fbf41db586

See more details on using hashes here.

File details

Details for the file mosec-0.7.0-cp311-cp311-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for mosec-0.7.0-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 881ed1bba83508df2ea4b14f437275b3a39db1400547c46b42661a061b46f63b
MD5 20940ed8f9eef411ae764e1179fad4e3
BLAKE2b-256 80b0dcf4460677b32b4f2bd246a20631573f9c608612c40ad7e0579684a05fc3

See more details on using hashes here.

File details

Details for the file mosec-0.7.0-cp310-cp310-musllinux_1_1_x86_64.whl.

File metadata

File hashes

Hashes for mosec-0.7.0-cp310-cp310-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 7dfcf61a67e449ae54900c33603a3826bbf4e1e00943c48cb8fff548c6d151f5
MD5 227c5a4cf751edd63961c8f10eac5df3
BLAKE2b-256 772470c0f4b991bf12b49ed57a9a77723c54d0094372df98941f5d91340be864

See more details on using hashes here.

File details

Details for the file mosec-0.7.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for mosec-0.7.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 670bb14b3813217e94c7459c29ac645c1b960643af4db00abf69a9cbedf0b00d
MD5 7c5a21ad11f744622edc40e7a1f630d7
BLAKE2b-256 01b63d2861a04faf6b1ae892e62d5560439fa8b753a16a3736978ca0c316700c

See more details on using hashes here.

File details

Details for the file mosec-0.7.0-cp310-cp310-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for mosec-0.7.0-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 766a8df3e0170683c85c3f43425062c75675ab975f9c36ccb6c531d2729ace53
MD5 33b0f74afbab2d97232660cf7de5fea2
BLAKE2b-256 aaa60c049a737776ad53136094d73f1228cf5f3c49adddab5eccdbcd7d71ad92

See more details on using hashes here.

File details

Details for the file mosec-0.7.0-cp39-cp39-musllinux_1_1_x86_64.whl.

File metadata

File hashes

Hashes for mosec-0.7.0-cp39-cp39-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 6a3a4476905c2232679d888aa6f04a88754d50e9ec843ae78f0694adb6fe143d
MD5 c7b77c1e21d284a70e03aebfd6cef555
BLAKE2b-256 e0aacf608a00eb56ee1e28a57a0b1ab31fb31daa391c1187554612d3fd4f4564

See more details on using hashes here.

File details

Details for the file mosec-0.7.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for mosec-0.7.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 2aa046ac3a1de744d3f3372b5fff84a7356e3cbb0b5b8603e25bae0294d9e81e
MD5 a243112085ec12c05b5cdcccff6e8184
BLAKE2b-256 8980e32c270336f41f24bc5304b09345fab9c0962d80a35b3fcce67e726e0a91

See more details on using hashes here.

File details

Details for the file mosec-0.7.0-cp39-cp39-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for mosec-0.7.0-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 33886b34c461a1ab335c44459dac7e41ae4690d07c832dc96398f84a66d0a47f
MD5 a3ef54d4b399d434bf8af7c9bd9d851f
BLAKE2b-256 be9e3bd3ecc50d38f5b7e0e88ad97b263a868f478fb489266c2171c1718fa045

See more details on using hashes here.

File details

Details for the file mosec-0.7.0-cp38-cp38-musllinux_1_1_x86_64.whl.

File metadata

File hashes

Hashes for mosec-0.7.0-cp38-cp38-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 0cf3bb9ede62e990c2fa3c2f0e9dc8c265d6f3abc61fbfd228653f1de727dc52
MD5 1d15f50e970f7334c250f82cf7272cfb
BLAKE2b-256 06416ba7e9f3c092d16f2499a051620ee03197548a95275360cf29f6fc77a0d8

See more details on using hashes here.

File details

Details for the file mosec-0.7.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for mosec-0.7.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 9bfa4ebb270db1ab45461fe154075d4e6af1a6a0256cea857091275e90297cc5
MD5 01f4920b5e4324c4b702cccb4e1ba8f4
BLAKE2b-256 65185d7d10d427640ea24d58585b9b256cb4f984f6a9a0febd9f9de22a579196

See more details on using hashes here.

File details

Details for the file mosec-0.7.0-cp38-cp38-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for mosec-0.7.0-cp38-cp38-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 12729690a3cde9a7069c00a95b248dccc6054c4cac60793423e97097368d71b5
MD5 b65d758403a3738eb3c5d10970530b31
BLAKE2b-256 bed279ed2033d14088ac2641b43e7cd89dbbb56afd00e83338a0f780a92b3d01

See more details on using hashes here.

File details

Details for the file mosec-0.7.0-cp37-cp37m-musllinux_1_1_x86_64.whl.

File metadata

File hashes

Hashes for mosec-0.7.0-cp37-cp37m-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 29c46ed1cf561e7485bb0e10592bd11770033c31eed236af91e3ca3ce6f1f970
MD5 9747adb8fd5ac503ca111ca8bfdab302
BLAKE2b-256 82423d290b7e8ebf3846d4b627d91db52430326234c121e0ccf0f7a02c337baa

See more details on using hashes here.

File details

Details for the file mosec-0.7.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for mosec-0.7.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 425c11b07382e05994be1eb28a9645d6ae8ea550870a200d5318f761005eeb4e
MD5 076d797c442f5a7a4c2eded91af33fd7
BLAKE2b-256 9e179c3db1e64e063e625062fc9c1b4356f75e150d3b628eaac9279254c6cdca

See more details on using hashes here.

File details

Details for the file mosec-0.7.0-cp37-cp37m-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for mosec-0.7.0-cp37-cp37m-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 549b66f3ae43a55acfa423f8f91b70cb3eb819472eedd4497d34545e2da13997
MD5 2b81b39288d34b844c5f77de4515d0f3
BLAKE2b-256 8e8fc1f50cd4e8bb05df87297938431bfd2a8a6ad339e7d28c6120332a5b68b2

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page