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:

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

Uploaded Source

Built Distributions

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

Uploaded PyPy macOS 10.9+ x86-64

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

Uploaded PyPy macOS 10.9+ x86-64

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

Uploaded PyPy macOS 10.9+ x86-64

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

File metadata

  • Download URL: mosec-0.6.7.tar.gz
  • Upload date:
  • Size: 67.3 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.7.tar.gz
Algorithm Hash digest
SHA256 23f31e985e2ad576820b1022f215579b408b69df4f054f79b54ea42388740453
MD5 8e9b5b023351359e5ccf04fb21a0f04c
BLAKE2b-256 8b0172bc005eeb063e56cc95937d11776a9d397bcc68f7508abd289b04b4d4c4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mosec-0.6.7-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 11f05cc1828cd49c980cdf36a3e75854deeabcb2e008a15e15c7ff938e4f3cbb
MD5 2bf563a9e746b73180ee39f18616655b
BLAKE2b-256 7d2eccd1c3f35a17467d60494f4c3859b02625e873df0f3e46d172236c2ac686

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mosec-0.6.7-pp39-pypy39_pp73-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 f8ce9de48e4bf80da36061d707efd067fec533748c465de6bb009da2ba52bbcd
MD5 f3de6ea665a622c5a6038085a47e2697
BLAKE2b-256 09dd879e521d66c832af47b574e00f64bf300c9449838d2b3914ede876954cd3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mosec-0.6.7-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 8a7899b93f743027e99cbe72bb02944f07e745335e4ec5a08f62e30dadbbee3b
MD5 cd5e34c311aaab962db86a1e52f39165
BLAKE2b-256 617166d99ec15c5c6c1f1c16cd02f29681984d0e72ff76b20470bebafb9e6c0f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mosec-0.6.7-pp38-pypy38_pp73-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 89e0562340cde4c541d162b59708b73e54fdbe87f764ad7df262b533b33fb55d
MD5 c30cd0732066a5d9ef98e4ad1ca0d66c
BLAKE2b-256 80549f0cc31694e76f2bf773499bc8f5b72fb026834b790ce2d0be1a862b09e0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mosec-0.6.7-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 09f25d95f57aad2278a4ee9180a7bf32c52a71be72d945507c192160061ceca2
MD5 c80fb74f2621cbf23d4a96ee2c11da35
BLAKE2b-256 ee0509addd317a9a4367e39c41f68e92d13a4a010a1f590c48893a692581ff22

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mosec-0.6.7-pp37-pypy37_pp73-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 101f5b766740b7a550310a20cb33ae8c31d776f6e1ab6b867f4b0701b20de752
MD5 9cb389ff264078d48c62281725d18dcc
BLAKE2b-256 cb82ef9c3568d2a62244cfa52762be7d48799db28cfa2005af21d9c43b3a228b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mosec-0.6.7-cp311-cp311-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 0b3f296c1f07620f4cb59e60a56e3ed0930252e847a480a0a3ea4c0d4e33afd0
MD5 9cc4969ad403b7b3c2978f7912b163f3
BLAKE2b-256 acbe038565b12a5d0bcb0f6e8305329f3dab4b73c3e0a60003a783cc459d9dfa

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mosec-0.6.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 86fd0594b134ca27501f3480b30ed65b1ad8b906135c3f2699356f8598a6cde7
MD5 9da2a109facf3892c72d72343dcccccb
BLAKE2b-256 d95feef9df75c2f58e01051effe3491de2f3643f1c87e25511bf7d2864bebfd7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mosec-0.6.7-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 d7752a07e966f2ff387fd04bdc03d79576504ed972023512ea738f8af71ae443
MD5 4132a9c9ac500283834570c5df36b7b5
BLAKE2b-256 90c0a61569d56ab684deb080ae5564b60605f2744aaa8006aeb4aa308a49966f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mosec-0.6.7-cp310-cp310-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 a3a50e9c585d26421186213bcfdb40b64d98a7c460bf2a08878cdd32eca29126
MD5 42a1e019fb588b1cf3cfc1ef58b730df
BLAKE2b-256 088c69ff1a0fbebcc758ff0802411254a99a15be90856cb287ba81efe89001c0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mosec-0.6.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 4823a2e2199b1b5470629e0063aefa0c454507f2c6d465d6801a04b838d33db9
MD5 92cf4946909b082de864f074496ccd3b
BLAKE2b-256 d62f6cdcf0e7bb317fa38e01af2a2fa43ff14455d8afb8dbc580e20622120cd8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mosec-0.6.7-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 9a861af0b93d2ba29cfd1ef2284d922f20b23d86b2559477b16029a2f0e4f9e2
MD5 f4510ef5a4930fdd56733aa299455b6b
BLAKE2b-256 725bc521a9cbc8854ec5fbf7194cec142ce43be495dc6a7bccbee7879df778f2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mosec-0.6.7-cp39-cp39-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 f2a0cfd213a40b105f8cb953d73071d7e88476d11d54b20e1590aed06146f05d
MD5 189c9f3bd8473ef9fec809cdada89060
BLAKE2b-256 659c68934886e7fd3b1e77d4fb389aa4738a9d533ff5f0e2f50cd1dff1d879cd

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mosec-0.6.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 4b9c830e92e8ca472358e8c4cd92c34b447a5f212fac4f332df6f1e31f83556b
MD5 905000da88863d6c747e0a01373ece73
BLAKE2b-256 873efad90998f0e8457f262c22af813eafc42422a5b2315893933da964b9b932

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mosec-0.6.7-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 976e1b74ed5f479dfd332aab9bdf4e4048d7d159682fcee25db5c3a0cdf86386
MD5 55050d89ce031e73a122ee898171d988
BLAKE2b-256 4a063ad1b21c492d50c5ec0cccea9998fbb2ac2dd7b9b6e0eb91bb9a1865050a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mosec-0.6.7-cp38-cp38-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 6552570a837ab25e2f013c4f09c49d54bb2318a634b32752e4783671381e2b09
MD5 5eca01811888fd57b30ba4e3c1c7b853
BLAKE2b-256 e242c4a556b3557ea5650f08bf63035d6511df446f40a009e96618e3f144290a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mosec-0.6.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 c035e351d352261bda9864bad9a6d641478e9a89890e17ec99db9d6dc0b9f615
MD5 6d41a17a4eab4763fe530573b60d6513
BLAKE2b-256 a3c2e945247309146e9703a3d9a74d3b5a4c032cacaa06cdc8d0c5d8e8d8ddf7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mosec-0.6.7-cp38-cp38-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 e21176a2407b4562b1754766a88b73a6e07ed0dcc62da1dbbb2e3239db939ca9
MD5 ab0d36ceadd4b588e72357af33a8f9be
BLAKE2b-256 2c42c252278868f718a73a0b813a06163994a7bcab7a59c9dfbb4227ea6cae27

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mosec-0.6.7-cp37-cp37m-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 59d4831d58fe2567d4ed30cf65301e2b3eed17eec1d80883803ba2b423fdf050
MD5 cd726abb6814dc8f8b5c1ddb164f259d
BLAKE2b-256 d3299fde4bb17a4fd25fb3b1f98955a5c18f4a8de3be80853ffb1f8c4f0ef274

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mosec-0.6.7-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 c68ed85465015ac6ece688f3e1881f093d9ac00d8ef6c1b606189b80a76cfea1
MD5 09eed26760ebbcad4caed425a3b4bd03
BLAKE2b-256 5822e08b60405add7bd3a29b09e24023c700d7997c6a4580a886c352ce2c5d55

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mosec-0.6.7-cp37-cp37m-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 50c57b79ae5b9537f8f3297b3a3110f3a09fe308222a2a9cdca93460e566edf4
MD5 7ac2b17a08cb779bd772fe51eaa440e1
BLAKE2b-256 32f9208422580d1fee5009772b0cac76fa1a14847205a9a2cfc0070971189b22

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