Skip to main content

Model Serving made Efficient in the Cloud

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

This version

0.7.1

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.1.tar.gz (70.2 kB view details)

Uploaded Source

Built Distributions

mosec-0.7.1-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.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl (1.1 MB view details)

Uploaded PyPy macOS 10.9+ x86-64

mosec-0.7.1-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.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl (1.1 MB view details)

Uploaded PyPy macOS 10.9+ x86-64

mosec-0.7.1-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.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl (1.1 MB view details)

Uploaded PyPy macOS 10.9+ x86-64

mosec-0.7.1-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.1-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.1-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.1-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.1-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.1-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.1-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.1-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.1-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.1-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.1-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.1-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.1-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.1-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.1-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.1.tar.gz.

File metadata

  • Download URL: mosec-0.7.1.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.1.tar.gz
Algorithm Hash digest
SHA256 0cb2bc97430ea59162f93c49d7e9cbf4dc8b2b092b5b114b164c4298d5ecd1b1
MD5 a5b602706804c3e1680acbe9a63e1218
BLAKE2b-256 f453af7e7efdcbd4f7ad9df5c5d6dc84235cf79feb1e48260dc39aef2562c1a1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mosec-0.7.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 7a05944989f33a880201faefa2111983b8673f187d58db6033bd31f403c779ad
MD5 0a6d25740a1db316f56edcaf9c678aad
BLAKE2b-256 78be1c73a42060ed47453f21cbeb993aee5fb424248fe9e42c20d7901499bbd3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mosec-0.7.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 a8e17acb58d6fa713d1f6964ea0246205c45e44b3ccad3dcf952afbb830f2abd
MD5 b7bf26cac3fab0834d6360438e0b0bb9
BLAKE2b-256 d0291adec81e1b6aa49e370b57c94a7d7b5851beae2e399382e99a9a46770410

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mosec-0.7.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 fb51979d02efa698d70df09b33517af11b7aff8ec789f52e5737b535c1fe4730
MD5 3643888b7d93bec125848fbbc446af77
BLAKE2b-256 72e54a2b3420497867664e0460463817e4e9c86e3ac76981f93587ebeeb66809

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mosec-0.7.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 5d0ffce4f62c0bf14d49670106a57834fe7603a924af2e70ceff39612af3decb
MD5 fc61062982e609a2f589479ce0d61807
BLAKE2b-256 f118bbe531760d0dfa2b12a2aa030c3ce0d8c50d9953d9e5146da8623d9e14fb

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mosec-0.7.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 f1dba0ea3e80db6a5de5f51a1631eca46bc8af0087cebefb1e8c1c257172db50
MD5 1f759fce6b49a1dedcbb9e1a75faa200
BLAKE2b-256 513e8d5f6aabb6173d031f23e89f9495d299ba053474ab2c393e82cf164f008e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mosec-0.7.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 7662e74c0d758667ee04862b078e9524c9a3dd300695d8dd16205deb57406645
MD5 8321752c98ffbd3d96fd1b1be4b835aa
BLAKE2b-256 56c91495e75ecfddc4cc3b1febc17d5cf59a350e9360d45e473d4f3a80d5170e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mosec-0.7.1-cp311-cp311-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 7a8f22fe77e1da94fae11c7a08e4eaca3698a52e4250acae89a6334cff030119
MD5 b925f849039a49edcd8e7610788ac9fb
BLAKE2b-256 716ed8c831fd120f6a91cb24a0b129e28f9b1d18613e8803cdac98987987e347

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mosec-0.7.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 8b08cec4709c04715f3c699b7c403576b068aed20612c37e2ae9dceff24ee94c
MD5 cd2679b9ad8e3b0feda7177c7c40ec91
BLAKE2b-256 e04ca762438184d1212cdc635180306c7deef7eb46303b80420208917afee24c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mosec-0.7.1-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 21fb1101d1293214716834d425f7685157db13b53a41ebd4d678457e7d30b3ba
MD5 c664cf9e11f9824de277832c6cfd238c
BLAKE2b-256 ed0232b49f10711d009059946dfcf9686c6894c87a653417e5e5db67059e7d77

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mosec-0.7.1-cp310-cp310-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 ef729fa5ddc801e7f57c3d11dc1b750b71fc62522d2281469ed2bf7c06012ece
MD5 fab38e2578a93a4c0437c2db330763ef
BLAKE2b-256 8cbb1967116ebd91f60afc83a27f22a95a4890f4b7642b0f93abe359ca3a0850

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mosec-0.7.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 a0eee18d94a37cea144efe002e0bc2b533ced006a9e49983c1dd57ab4337c9dd
MD5 df2024e026300ed8d1485281a4595d5a
BLAKE2b-256 23d97089cd615087f3f1042a37e49cbd0ca102f9cee10405f7ee852d10ab12ef

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mosec-0.7.1-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 3f5df7b121aea7717c2170864ade44f1d8ac533e1cfe0e822bb37d5d3fac8317
MD5 b73fca73e0021c221689be44d804835f
BLAKE2b-256 3ebd535b23bbf0835db2d423b8e62d5e47f22cea534416131c108b9e1287e416

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mosec-0.7.1-cp39-cp39-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 5b46dfe7c45d17bdeed09e4cceedc85cc100d6d722ab20e6f6791dd7957b85b4
MD5 805b15cebfa77df864ad3ef6e8138845
BLAKE2b-256 53ecae0e499b93c29141108c43ae475c17a6c98d6490f106fca4e60fc5cb55d8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mosec-0.7.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 006570a62c67eeec36c4be9c3d8c67223c604fd7e9075de8ae02294a136b1093
MD5 cb021560f70c405b4a7bbf6fe6d2ae9d
BLAKE2b-256 a96ea37051b9dfa74ddd74002bf74741b703e1d7ee57f5f4dacd94e27399eeb7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mosec-0.7.1-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 92821c2d6e442fd7aac5b1fe319f13ad960b60c1aa497ddfde5be88f164e2b73
MD5 311aaa693b28a777d69f771c0ba23873
BLAKE2b-256 5364de4477e569a0f60a4a42f7f1254da952a15315e0dcf723b01cb16908d4ac

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mosec-0.7.1-cp38-cp38-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 5f547527e2097cd1c37fec876f5bb9a0a501efe8a67ac90e2a38580e334f6ade
MD5 ed732e399e0ae2fd98f9cf534a8ffc64
BLAKE2b-256 c0fedfc0e6c7641ceab843ff61b1ed413d819f45787a74fde447d130961a25cd

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mosec-0.7.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 9f8ec05215dc3600e625200c2f4acaf8e4a61449a6344c2a7c9c86f0853ef058
MD5 b683f8cef350c5b86f22f38da44fbfe0
BLAKE2b-256 d112791653d11d33a2372ecfab00192014d89f662355a7ae96bc142526e14822

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mosec-0.7.1-cp38-cp38-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 a02364a4e1de76af0bd4e776a85557b73f7d250f14acac1cc1a422f4c9720e6c
MD5 7ebd3bf6bdc6f2300479581e7f05b332
BLAKE2b-256 f253a76f7f666c94ba2d2d1c380aad622d8cb59223328a43ba29f6cdea7c9f10

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mosec-0.7.1-cp37-cp37m-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 ac79e414ffb300181b35132d8fc18d5d4bbff2f63487de52c3116e5095c84d8f
MD5 21cbec73fcf55cd2d8db0c4a2b5d6c0c
BLAKE2b-256 aeb9bf9db1c68d2aa10a464b9fae78025cf46f1cf3acd603a974d8b3e1905a6f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mosec-0.7.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 aa912246b47f1190ba2b221a0d98590b691fb64fcf595116eb953b31c57bdb86
MD5 474e1c9aa57cc5e7a64456f57152bef4
BLAKE2b-256 6d97685f61a5d82a50b7a0a17fb06d68028299e390440f15ae0e4b3d1f6110a4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mosec-0.7.1-cp37-cp37m-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 90b820dfa19bb1099c4bc99a4aa25c5db977ce437c8894252c987dfecdbad6e8
MD5 8aa07fc6201e3ab9e0cc62cc974b4907
BLAKE2b-256 e787e60df142776f758ee43513397e41b6e9b350394c626fef874c1bbb353198

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