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

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

Uploaded Source

Built Distributions

mosec-0.7.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.4 MB view details)

Uploaded PyPy manylinux: glibc 2.17+ x86-64

mosec-0.7.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl (1.4 MB view details)

Uploaded PyPy macOS 10.9+ x86-64

mosec-0.7.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.4 MB view details)

Uploaded PyPy manylinux: glibc 2.17+ x86-64

mosec-0.7.2-pp38-pypy38_pp73-macosx_10_9_x86_64.whl (1.4 MB view details)

Uploaded PyPy macOS 10.9+ x86-64

mosec-0.7.2-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.4 MB view details)

Uploaded PyPy manylinux: glibc 2.17+ x86-64

mosec-0.7.2-pp37-pypy37_pp73-macosx_10_9_x86_64.whl (1.4 MB view details)

Uploaded PyPy macOS 10.9+ x86-64

mosec-0.7.2-cp311-cp311-musllinux_1_1_x86_64.whl (2.5 MB view details)

Uploaded CPython 3.11 musllinux: musl 1.1+ x86-64

mosec-0.7.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.4 MB view details)

Uploaded CPython 3.11 manylinux: glibc 2.17+ x86-64

mosec-0.7.2-cp311-cp311-macosx_10_9_x86_64.whl (1.4 MB view details)

Uploaded CPython 3.11 macOS 10.9+ x86-64

mosec-0.7.2-cp310-cp310-musllinux_1_1_x86_64.whl (2.5 MB view details)

Uploaded CPython 3.10 musllinux: musl 1.1+ x86-64

mosec-0.7.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.4 MB view details)

Uploaded CPython 3.10 manylinux: glibc 2.17+ x86-64

mosec-0.7.2-cp310-cp310-macosx_10_9_x86_64.whl (1.4 MB view details)

Uploaded CPython 3.10 macOS 10.9+ x86-64

mosec-0.7.2-cp39-cp39-musllinux_1_1_x86_64.whl (2.5 MB view details)

Uploaded CPython 3.9 musllinux: musl 1.1+ x86-64

mosec-0.7.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.4 MB view details)

Uploaded CPython 3.9 manylinux: glibc 2.17+ x86-64

mosec-0.7.2-cp39-cp39-macosx_10_9_x86_64.whl (1.4 MB view details)

Uploaded CPython 3.9 macOS 10.9+ x86-64

mosec-0.7.2-cp38-cp38-musllinux_1_1_x86_64.whl (2.5 MB view details)

Uploaded CPython 3.8 musllinux: musl 1.1+ x86-64

mosec-0.7.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.4 MB view details)

Uploaded CPython 3.8 manylinux: glibc 2.17+ x86-64

mosec-0.7.2-cp38-cp38-macosx_10_9_x86_64.whl (1.4 MB view details)

Uploaded CPython 3.8 macOS 10.9+ x86-64

mosec-0.7.2-cp37-cp37m-musllinux_1_1_x86_64.whl (2.5 MB view details)

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

mosec-0.7.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.4 MB view details)

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

mosec-0.7.2-cp37-cp37m-macosx_10_9_x86_64.whl (1.4 MB view details)

Uploaded CPython 3.7m macOS 10.9+ x86-64

File details

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

File metadata

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

File hashes

Hashes for mosec-0.7.2.tar.gz
Algorithm Hash digest
SHA256 35460339411b620a5a2df7f89d8d10bb200d68c5f349a578e8029cba5ee8535e
MD5 b439107fe4a99d26242537caae2373bc
BLAKE2b-256 3adebe8a94d4656724b3dfac41245438e60cbd31e85c3ce6466e45a23a54936b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mosec-0.7.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 5344370e4cc0059efcc028c0273d438abdcd9d5e65a351787aa67b5a6f6f3578
MD5 ee15a4c2a858f5ae82fdc8050ce92ff7
BLAKE2b-256 d694f119f9fdc022eb613289c530fecd9d56214ccdc0f82d866cdb008704153d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mosec-0.7.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 900907610abb59b5a429b589235ace4088b710950ce32669d2397c284fd24a9c
MD5 2b59cf9a17c004f75bc71e583570155b
BLAKE2b-256 e6dd914178ed9a9169901f63ab5c1c8e1d55a876b4b8a1c35ea6f5fa861d7815

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mosec-0.7.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 393a96144b0024c9408de7910eab0156039412916c7214028d049e99e83a0ee2
MD5 f749da49a5ab0307ba04734ccd27b8e7
BLAKE2b-256 456764168915820dd0fb1be3ec0144df9fbb6b2ce9b09b2baa88eec86c3d9155

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mosec-0.7.2-pp38-pypy38_pp73-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 16e90a34030a160745eec3bcce4577a7edcecfd897d198b10b86a2fe9c9d1afb
MD5 e9c91abd595f2aa5edf9e4264beb62fe
BLAKE2b-256 1fbd39b21a4a5baaa354f5bc0fad06b99eaa1302a81aef57d05861cb434328e2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mosec-0.7.2-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 589a13c33414dbaaac56a59d3bc89ac1dffc10e0ad3637ca23669e9acec5034c
MD5 261d06a08b6a899275afa0336375fd16
BLAKE2b-256 24d28aa930818c713e11817016b2c1691a2e02b26da423adcfd30d19ea3ee881

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mosec-0.7.2-pp37-pypy37_pp73-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 0420f70a37e3867b5a9b9a4cac382eccb52d62061485e326285cd0f0a34174b1
MD5 c05dca02e95afc9d3ec55a10e51cd441
BLAKE2b-256 d3389fbd24921d6beabd5ed7340ba179d053e9e8184954b110b11db3e47ab63f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mosec-0.7.2-cp311-cp311-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 2acdbf82d7a8c4b67b988b9e057098ffa1a72a475106c57c0ef505f128209020
MD5 fc621b67cb1cef9ed5a4f2c24507d07a
BLAKE2b-256 3dc6b5ae43943668310300032d72c2a33f61fd77cf255763f49ffe53b318a9d8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mosec-0.7.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 c7e16cd44c5a5ce12f56bff48ffa35273f79e05609f3db52502fd007fa9be750
MD5 d1df09e2d859f4fc20ef3b4e777e4415
BLAKE2b-256 c454f102ed6806d5535749086b3269800607f929cbf0023246467e41a22cb946

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mosec-0.7.2-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 9b1e9ce37ad5e39140020ca8231eb90232b9f0a7e4a431e666f5138b0a8b3960
MD5 6048bdece722aebcfe675b6fa066ffa5
BLAKE2b-256 d441a8008db503ffb58ed3f6e87347826b5523784bb6afd915dc9a18f16d73b3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mosec-0.7.2-cp310-cp310-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 be49f290996e3c49f7d8d19434950b201ea9ea1db25cc8672b5833f7f7fc7ca9
MD5 6ba5a004e7364e38b76d0137e27fa97a
BLAKE2b-256 bd29e51c2af8987c109719c34facd7b01a6784f48ad81262f1c2a8150def7fef

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mosec-0.7.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 8d8eb4f3ce16c18387f1cb85cd4ba1f284db226d23fb5dfee3951d8dddda60fa
MD5 1c6dc7060795c92898f217990f7acb19
BLAKE2b-256 0d533d76861d67e9e268b5bd1c755b25fa1f76878eeb3ca0ebbfbad635e78451

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mosec-0.7.2-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 834cbd1caa13edac0df19ccce6235eab23715330c026164a065994c0800d5c54
MD5 3b45a8d7b1b3380f577ca864710be8ed
BLAKE2b-256 6f2fc13de8c82843d8fbae7dd481011ff52317278771b0c84ac092b401ad6dba

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mosec-0.7.2-cp39-cp39-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 d8d9d256321a0ea92da5b0edeea29bd966751d62ce6e0172d225b98811006b3b
MD5 daf0a01bea248747574b72000a588d0d
BLAKE2b-256 f8cec3079f69b8687a440acb1e0ec0b381eb08e2e86604163904b2d247767a5f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mosec-0.7.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 bc21fa14fc04e1312e2a0e24e2aa7bea7381e4e2c86769738da1e40fe1283d31
MD5 45ed41e40231d00783f2038f0c0dc049
BLAKE2b-256 349abb1e3fcb57250ef7f486de0ef104ff8f8b6949445f83ecac1d2fc952e153

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mosec-0.7.2-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 4126ea53fbc3d6f77935a021d52b5a5a708339f718a3e5fa5de5734fdecbe1e2
MD5 2309fd90f9cf7072ab51f825afd7ba99
BLAKE2b-256 80fb13d03b5b54379b2dc5104abed9f453faa604fb5a6712a876713513e75c2d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mosec-0.7.2-cp38-cp38-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 9a3bb6fa804acbf17d0a2aa59b9851f227c9225f5f2588e4f7c50d4eed0f4bc8
MD5 76286f11f06166ad8cc6cf6c69830d19
BLAKE2b-256 eb79d7b3d93121effaac0d4c32b2ea73a2aeba930658ed561266b46500960a4d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mosec-0.7.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 d7ccd457225d2ca565d037a808053329e7f1111418725f6bfb0af956401b7c30
MD5 a609889a3f05ac295df1dbd9156f8dbd
BLAKE2b-256 d21fc09182b71712b34c58b32576178592dc96ebc5999a115fa5d1b8fd153af0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mosec-0.7.2-cp38-cp38-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 25da309168baf94c55a14690370044f603f364cef1de00e8c0bfd5e3fdc62800
MD5 ca5a9dc4b2af0c52a630f9d17e21970a
BLAKE2b-256 b4317b56913a4abfcafcf1302a38b8628af5e0fe09913f426ed7fed718a0f7bd

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mosec-0.7.2-cp37-cp37m-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 a85aac9a81f7bfa445010eaf18aa82590d05f11c9d0973d7b6d3ffabc3809e14
MD5 352ef7487472aa760452e6b62beee245
BLAKE2b-256 ce4e6972c297a4217dab8bbd5f354af9e382aca8a8a3c8d67d8c56af716a85e6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mosec-0.7.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 d6e87b8cb5875bf2fa1c88d1dfc8ce518d5c9fec5c482730e17f76964dffc04d
MD5 59778982f3ec0a0939c1ff9e4b73375e
BLAKE2b-256 98cda1af82162935b81df1f55fc04a8bdd23b3277902e0941c3a64717ceb48df

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mosec-0.7.2-cp37-cp37m-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 0b6152341c8d1ca40fef44e2018a09b34322cbf30a5a17b03788b49ca6378ecf
MD5 98302543a2345ca6e8bc341eed137f76
BLAKE2b-256 d8b37c8fcfe61117985a249b290d3dcbe164a420b8a69c06bcf89d57b4dbe300

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