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` specify 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:

  • Modelz: Serverless platform for ML inference.
  • MOSS: An open sourced conversational language model like ChatGPT.
  • TensorChord: Cloud native AI infrastructure company.

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.6.6

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

Uploaded Source

Built Distributions

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

Uploaded PyPy macOS 10.9+ x86-64

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

Uploaded PyPy macOS 10.9+ x86-64

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

Uploaded PyPy macOS 10.9+ x86-64

mosec-0.6.6-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.6.6-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.6.6-cp311-cp311-macosx_10_9_x86_64.whl (1.1 MB view details)

Uploaded CPython 3.11 macOS 10.9+ x86-64

mosec-0.6.6-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.6.6-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.6.6-cp310-cp310-macosx_10_9_x86_64.whl (1.1 MB view details)

Uploaded CPython 3.10 macOS 10.9+ x86-64

mosec-0.6.6-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.6.6-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.6.6-cp39-cp39-macosx_10_9_x86_64.whl (1.1 MB view details)

Uploaded CPython 3.9 macOS 10.9+ x86-64

mosec-0.6.6-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.6.6-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.6.6-cp38-cp38-macosx_10_9_x86_64.whl (1.1 MB view details)

Uploaded CPython 3.8 macOS 10.9+ x86-64

mosec-0.6.6-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.6.6-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.6.6-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.6.6.tar.gz.

File metadata

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

File hashes

Hashes for mosec-0.6.6.tar.gz
Algorithm Hash digest
SHA256 1700d424aa0205c05ffc5e79d1415e89bfdad4a206c3bed22865dfaf5f7c8c52
MD5 0d25ce0e8f2497a41909d17bb20f0341
BLAKE2b-256 418f856d59be5337b3b30be1217fd588f0177bdc4db5e5f0241d6c5adaea0c33

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mosec-0.6.6-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 f7b689f378b769a503932300be7db0ac5b107f3267ff9d75bd4c14310a374cb8
MD5 7f6e6736a20fc49d3e476741985f7039
BLAKE2b-256 999b9993775677f5cf646b6d2e6dfb4977aaaec4babf31bb0716283f2e2c6fce

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mosec-0.6.6-pp39-pypy39_pp73-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 9de8b725fa89476d4c174a7c3729f6342a591243971f81eaf890d80c072c5c7f
MD5 bb5d7835d14a64989d7e60d7cdcd1bc0
BLAKE2b-256 390947525ed2fa89b2aa4666290217d7d710836deb673dc5372e4b2af672446c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mosec-0.6.6-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 10efc6b1abb2e2c0a2fa7a93e59093607690ad40a510977ee576d147280d9d6a
MD5 2f2f59042e3edd1e93d660fb0d2ab931
BLAKE2b-256 e34f5da732428bebce78cb9af7bd947e4f163b1f814082578a4f39b2b4352237

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mosec-0.6.6-pp38-pypy38_pp73-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 26769e99855e76f71093fa28e0fceadd18072406e24d737f14ada49d6bbb5118
MD5 8f2473da8b528c58c00272de8962a9af
BLAKE2b-256 09d5aa1adb44b8a7b1edd25d03558dd872a88c5394aecc6857cc9503cfbd639a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mosec-0.6.6-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 f321ff4840a11ba797cafa511cfc7ac9930f6bbdf37d0fcfbb1f402fcd90a448
MD5 35a9708b72f5bc57634e75d81c5a3887
BLAKE2b-256 0656f4d1546e7355b1296924873173efb742108fb839053d398e071a59723030

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mosec-0.6.6-pp37-pypy37_pp73-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 df2b893bb3dfb3f22d630e8a3cc0b3f4686df1395fb78d4286428734b51a4f11
MD5 b9bced5f068087e8187d98942eb78a94
BLAKE2b-256 2affc2fc7e225f6da53265792be399201430d6635e2a40961dcc0608c3f279ac

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mosec-0.6.6-cp311-cp311-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 936870a836f5d9c3c0b7d1d84bf1d0d8a996aa9742332897c9d1293c27630fc6
MD5 7f2dba2324f22c05dc1a4ccc519e554e
BLAKE2b-256 15694cb11a4a29386d2988ad85ed85435cdcd07267a69b245461aa535ac89dd0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mosec-0.6.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 9306a24e7ed08ae631e63f24b7f2791d17328206c2329dc8b5ac870a2373b9e3
MD5 77cf3229248c54450506c85f1427278f
BLAKE2b-256 5d1abaf46e7c2b83e6f5ad53d37e202550a50e2cd7cd977d6675d25d39965d32

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mosec-0.6.6-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 64dba23f2b88892ae2202cba12bbc9e156877783feb7576057e0f2695fef134e
MD5 da55f306fdbdc504d918f1ce4b352b00
BLAKE2b-256 98c36be7f98c6da548cbc69fd39e03f7adf79d1fd458700b28fbb4a524d3c8b8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mosec-0.6.6-cp310-cp310-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 be3d97a56c9a0043036551780da9a5e98dd85073ba4cad8e8daf7b966eee5142
MD5 8ec32862f46a1d92800e89a53e691a38
BLAKE2b-256 57b3d4e697dd475b6e87f334e7166cc2c75527d6049a2c7a88a06fb5e21398e9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mosec-0.6.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 fae883fcc5784c5a3efec5838a9d416542d61f2e7966b344f5cc1dccc6ff51c1
MD5 b253f753594721d13c7077a4612ae0b4
BLAKE2b-256 5a1f3da6305f39836b667fd2d9c6fafd2befeccf493a8e85ba23fa3265d993f7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mosec-0.6.6-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 c290f57ea3a79d259780b95032d16b17fd58423eb21600f718e16a92880c1425
MD5 8280381b4d0742e4b99b4266bb73bb64
BLAKE2b-256 9f4248b74cf433c2c312247f5faa87e96ce74cd260eea05fa93646fe82a1db2e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mosec-0.6.6-cp39-cp39-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 be89f5ee6d78dee4c52e50d07f86e751bcff6cdd12d004f092c8d22e333b24dc
MD5 b93c2925db16ba0b3a16e03716f19dc6
BLAKE2b-256 e4973ba552c08ce1fe3069380cc67b07ddb589baecbcb3ecec3c7d4ab337fa0c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mosec-0.6.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 f789ed5cb42d7783522fcdc0d4b50858f8354929a62c766387dc269f8ae8b634
MD5 654a7c54114983def2ca6b3451f750ac
BLAKE2b-256 a74691b462a719c8dc4d9d4d7b983dc11da5df0dc8eb8751fa900226afb674f9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mosec-0.6.6-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 4e6551cd56f24c3c5dae5f1e842dde5f792a2c28c4ed8e1cfc07e20419026fe3
MD5 9f906ac53290644fcc875fb101d46697
BLAKE2b-256 4e362fd0c0b9e0cc10a6de47955e2dc23c6788583c87382bc993c136bb6fbea8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mosec-0.6.6-cp38-cp38-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 4488c851f42a06216efc85e3e1f4abc73ab6845b9f7473e40f81f906b1fdb14a
MD5 144e28ad40812c05e1c2e59c194af89a
BLAKE2b-256 8d41cc796dd34d62883af6357250f350046af844741a0913b0d598e52db06341

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mosec-0.6.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 9341fef10c30621810ee4daaac5506a33d69a209414808e0c5023ab008204cd5
MD5 c6e114a9746d761fb75cd13fcb916450
BLAKE2b-256 636ff592cfb35bc3dfc716b5252324a2d5f563076439ba147642e0fa476a79ba

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mosec-0.6.6-cp38-cp38-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 a343124111e35ab2c45ba0b17c8afa13fde4c842a63877196b0b16f87d82fa32
MD5 e683c6acd6908cdcc6b496f2f610c49c
BLAKE2b-256 d16d05395133c983e828873b913c052e5aa8bdc147fd0d3c8507ed5bafb6285a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mosec-0.6.6-cp37-cp37m-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 f4e89827560975c8a5dfdbe6a75c0f20dfe39c5a3aee14a3f18c454f22c1cf7a
MD5 f45b2239e1b4763f1cb32d21dffcd957
BLAKE2b-256 77cff9f0a73d7f79e410f4440fa61d3a93aaa2742bb00c5d863b07fa4e1c0336

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mosec-0.6.6-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 f6981b162c93d218ee8cc662aee2f311984b7fa3c14791d1f629e7417d3faa0d
MD5 3ab8339cc7f6a2be13b4bbad47edb1fc
BLAKE2b-256 1fd6a2bcc2251703531ed90eb0076a0a529e28aafeee710654eb55f76f7c8125

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mosec-0.6.6-cp37-cp37m-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 eacf769dbcec7fc34615baf4c4d6a92af4efae06352dc347d533dfcf1393b962
MD5 e94fa9a8269eaabf8ca9e1cce186dfd8
BLAKE2b-256 15d4a60974df950399fd0093675a05463db6b4d8523833cf221ce148df470b4f

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