Skip to main content

No project description provided

Project description

FastQL Inference Server

Spin up a blazing fast Rust GraphQL API to serve your ML model in one line of Python code.

Included are examples which can deploy and serve stable diffusion / runwayml / midjourney or any of the Hugging face diffusers models in seconds.

We've observed about a 2x speed up across the example schema vs a FastAPI/Ariadne Python GraphQL server with identical schema. This is because although the model code is in Python, the API is actually a Rust process running TechEmpower no.5 fastest web framework ActiX.

Please note

  • Does not include an auth mechanism, you can implement auth using an API Gateway or auth proxy, or using Apollo Federation.
  • Can only create flat / non-nested schema and currently only a single query (support for subscription and mutation coming soon).
  • Make sure you set RUST_ENV to production if you are using it on a remote machine.
  • This is currently a prototype and should not be used in production. It is perfect for prototyping and sharing your models.

Why would I need FastQL?

  • You want to be able to spin up and query your model quickly, in order to share, test or demo it.
  • FastQL encourages seperation of your API and model, allowing you to focus on your model code.
  • All the benefits of GraphQL... Fetch data with single API call, no overfetching, autogenerated API documentation, validation and type checking out-of-the-box, API evolution without versioning, subscriptions (websockets) as a first class citizen.
  • FastQL is really fast, faster than a Python GraphQL implementation, the example schema has a latency of < 20ms when tested locally.
  • FastlQL is Apollo federation compliant, which means that you can aggregate many models into a single curated API using schema stitching. This means you can maintain both fixed and dynamic schema's for params to your models, so it is easy to test new features and benefit from federation versioning. You can also use federation to curate, version and productionise a supergraph API.
  • FastQL gives you GraphQL playground for testing and demonstrating your prototype models.
  • Because ML models are typically sequential in terms of request response pattern, requests to the model are always blocking,response time is the important bottleneck FastQL is focused on reducing.
  • A Rust server is free of pythons GIL lock and doesn't suffer from Go's "buffering issues"

Installation (Linux any, Mac, Mac M1, Windows)

pip install fastqlapi

Usage

You can call any callback with each GraphQL query recieved by the server, the callback must return a dict with values for each field you wish to return. The returned type must match the type defined for the field in the fields dict given to the start method (see below).

For example:

from fastqlapi import fastql_server
def infer(**kwargs):
    print (kwargs['input'])
    return {
        'output': "test response",
    }

fastql_server.start(callback=infer, query_name="Model", args={"input": { "type": "String", "description": "this is my input field"}}, fields={"output": { "type": "String"}})

Will spin up the below GraphQL Playground ready for requests on localhost:8000/graphiql or you can make a GraphQL request to localhost:8000 like:

{
  Model(input="to send"){
    output
  }
}

Spin up an example hugging face diffusers GraphQL API using Docker on AWS EC2

NB. these examples are just toy examples not suitable for production

  • Launch an EC2 GPU powered instance (for example p3.2xlarge)
  • Search for NVIDIA GPU-Optimized PyTorch AMI in the Amazon Machine Image search bar.
  • Select this AMI and configure storage to 64GIB.
  • You will need to set a PEM key-pair, download and chmod the key on your local machine using chmod 400 {{key pair name}}.
  • Launch your instance.
  • Get your current IPV4 IP (for example from whatsmyip)
  • In the security tab for your instance select the auto-created or chosen security group and add an inbound rule setting custom TCP and port 8000 (graphql api) with source to {{Your IPV4 IP}} (or 0.0.0.0/0 to make it public) and another identical rule for port 8080 (the image server)
  • Sign up at https://huggingface.co/ to get your free ACCESS_TOKEN.
  • Create an access key in the IAM panel.
  • Setup aws configure with the command aws configure and enter access key details.
  • Run the following commands to set your public IP:
EC2_INSTANCE_ID="`wget -q -O - http://169.254.169.254/latest/meta-data/instance-id || die \"wget instance-id has failed: $?\"`"
export PUBLIC_IP=$(aws ec2 describe-instances --instance-ids $EC2_INSTANCE_ID --query 'Reservations[*].Instances[*].PublicIpAddress' --output text)
  • echo $PUBLIC_IP and make a note of this public ip you will use to connect to the API
  • Connect to your instance and use the example docker image on danfreshbc/fastqlapi-diffusers or run your published docker image similar to:
docker run -p 8000:8000 -p 8080:8080 \
    -e PUBLIC_IP=$PUBLIC_IP \
    -e MODEL_ID="stabilityai/stable-diffusion-2" \
    --gpus all danfreshbc/fastqlapi-diffusers:latest

Once Docker has finished installing...

  • Connect to {{PUBLIC IP}}:8000/graphql to visit your new GraphQL API and make sure that the URL next to the history button contains {{PUBLIC IP}}:8000
  • Try the following example query in the GraphQL Playground console:
{
  Model1(prompt: "a handsome man holding a baby goat") {
    images
  }
}
  • In the response on the right you will get back a URL you can visit to see the generated image.

You can change MODEL_ID to one of the following to try a different diffusers model for example:

"Mitsua/mitsua-diffusion-cc0"

This is recommended as it trained on totally public images, there is some controversy over the legality of the models below (be warned!)

"CompVis/stable-diffusion-v1-4"
"stabilityai/stable-diffusion-2"
"runwayml/stable-diffusion-v1-5"

The example API surfaces prompt, number_of_images, guidance_scale, number_inference_steps and seed and returns an array of images or a seed.

The example uses a ruby webserver to serve up the content of an images directory which it will deposit generated images into on port 8080.

A diffusers example implementing fine tuning using dreambooth

NB. Mutation support coming soon.

This example allows you to download a folder of images from google drive or individual gdrive image ids. It is suggested to upload 10-12 images to a Gdrive folder and make sure you set sharing to 'Anyone with the link' and copy the link. The toy API will then finetune the model on these images so you can run inference against them. This example will overwrite the model each time you upload new files.

  • Setup your instance as above but with a machine with at least 16GB ram, the smallest on AWS would be m5.2xlarge. (see Huggingface dreambooth).
  • Use the following docker command:
docker run -p 8000:8000 -p 8080:8080 \
    -e PUBLIC_IP=$PUBLIC_IP \
    -e MODEL_ID="stabilityai/stable-diffusion-2" \
    --gpus all danfreshbc/fastqlapi-diffusers:latest bash start_finetune.sh

To start finetuning use a query like below:

{
  Model(
    fine_tune_photo_description: "Photo of happymachine"
    gdrive_folder_of_images_link: "https://drive.google.com/drive/folders/17g_m3eaBA6SJQP-xppGkAHXYoKCLObZg"
  ) {
    images
  }
}

This query will take around five minutes while the model is tuned and prepared for inference.

To infer:

{
  Model(prompt: "happymachine standing in front of an F1 McLaren") {
    images
  }
}

Further info

  • FastQL currently implements Int, Float, String, ID and array and required versions of those types but not currently required subtypes (an element of a list).

  • Under the hood FastQL uses the ActiX Rust web server which is currently no.5 fastest web framework according to Tech Empower. By comparison, Python's FastAPI is at no.93. We've observed about a 2x speed up across the example schema here vs a FastAPI/Ariadne Python GraphQL server with the same schema.


Environment variables

GRAPHQL_HOST Default localhost

GRAPHQL_PORT Default 8000

ENABLE_GRAPHIQL Will enable GraphiQL | default to true unless RUST_ENV is set to production (in which case setting ENABLE_GRAPHIQL=true will still overide)

CORS_PERMISSIVE Should be used in Development/Test only, allows all headers and origins, credentials supported, maximum age 1 hour does not send wildcard | default true

ALLOW_AUTHORIZATION_HEADER default false

ALLOW_ORIGIN_HEADER default false

ALLOW_CONTENT_TYPE_HEADER default false

MAX_AGE_HEADER default 3600

RUST_ENV default 'development'

RUST_LOG Rust log level | default 'debug'

RUST_BACKTRACE Add Rust backtrace to log | default 1

RUST_QUIET No Rust logs | default false

TRACING Turn on Apollo tracing | default false


License

The code in this repo is released under the MIT license.

Thank you

The folks at Hugging Face
The team at Actix
Sunli @ Async-graphql.rs
The team at Maturin

This is a passion project, we'd love your help, please message me on Twitter @djfreshuk!

Project details


Download files

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

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

fastqlapi-0.3.8-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (5.1 MB view details)

Uploaded PyPymanylinux: glibc 2.17+ x86-64

fastqlapi-0.3.8-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (5.1 MB view details)

Uploaded PyPymanylinux: glibc 2.17+ x86-64

fastqlapi-0.3.8-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (5.1 MB view details)

Uploaded PyPymanylinux: glibc 2.17+ x86-64

fastqlapi-0.3.8-cp311-none-win_amd64.whl (3.2 MB view details)

Uploaded CPython 3.11Windows x86-64

fastqlapi-0.3.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (5.1 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

fastqlapi-0.3.8-cp311-cp311-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl (7.0 MB view details)

Uploaded CPython 3.11macOS 10.9+ universal2 (ARM64, x86-64)macOS 10.9+ x86-64macOS 11.0+ ARM64

fastqlapi-0.3.8-cp310-none-win_amd64.whl (3.2 MB view details)

Uploaded CPython 3.10Windows x86-64

fastqlapi-0.3.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (5.1 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

fastqlapi-0.3.8-cp310-cp310-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl (7.0 MB view details)

Uploaded CPython 3.10macOS 10.9+ universal2 (ARM64, x86-64)macOS 10.9+ x86-64macOS 11.0+ ARM64

fastqlapi-0.3.8-cp39-none-win_amd64.whl (3.2 MB view details)

Uploaded CPython 3.9Windows x86-64

fastqlapi-0.3.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (5.1 MB view details)

Uploaded CPython 3.9manylinux: glibc 2.17+ x86-64

fastqlapi-0.3.8-cp39-cp39-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl (7.0 MB view details)

Uploaded CPython 3.9macOS 10.9+ universal2 (ARM64, x86-64)macOS 10.9+ x86-64macOS 11.0+ ARM64

fastqlapi-0.3.8-cp38-none-win_amd64.whl (3.2 MB view details)

Uploaded CPython 3.8Windows x86-64

fastqlapi-0.3.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (5.1 MB view details)

Uploaded CPython 3.8manylinux: glibc 2.17+ x86-64

fastqlapi-0.3.8-cp38-cp38-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl (7.0 MB view details)

Uploaded CPython 3.8macOS 10.9+ universal2 (ARM64, x86-64)macOS 10.9+ x86-64macOS 11.0+ ARM64

fastqlapi-0.3.8-cp37-none-win_amd64.whl (3.2 MB view details)

Uploaded CPython 3.7Windows x86-64

fastqlapi-0.3.8-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (5.1 MB view details)

Uploaded CPython 3.7mmanylinux: glibc 2.17+ x86-64

fastqlapi-0.3.8-cp37-cp37m-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl (7.0 MB view details)

Uploaded CPython 3.7mmacOS 10.9+ universal2 (ARM64, x86-64)macOS 10.9+ x86-64macOS 11.0+ ARM64

File details

Details for the file fastqlapi-0.3.8-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for fastqlapi-0.3.8-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 781d391d616a730ba8f9ba7df0a0b824d1862439a075727799992390ea36a266
MD5 397d2d83784d7aae3d22f71cd3976bfb
BLAKE2b-256 0b48ff54c8987889827754bfa40f2b1258272663fec59afd23c22c435084da24

See more details on using hashes here.

File details

Details for the file fastqlapi-0.3.8-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for fastqlapi-0.3.8-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 813f98b12d5eee1f7cd1a7ca4a9ba9a3ccd324cb9ad5950e48f9318a0d53041e
MD5 2df3ce343ee6144debf8fe485506bc56
BLAKE2b-256 830679359fa1af0da5e7270679c50dd5314af98082148da328b63ae64d29e687

See more details on using hashes here.

File details

Details for the file fastqlapi-0.3.8-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for fastqlapi-0.3.8-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 3b1c47d62dc6b96ef80e58676b17535194717edd9417d393043f5d326deed817
MD5 3845c7464a9c67f5730735f43e01cafc
BLAKE2b-256 e8e186ecb4870b35e7146d0898405f5f2fc2eff315cc7f61ecf3273957732995

See more details on using hashes here.

File details

Details for the file fastqlapi-0.3.8-cp311-none-win_amd64.whl.

File metadata

File hashes

Hashes for fastqlapi-0.3.8-cp311-none-win_amd64.whl
Algorithm Hash digest
SHA256 1fa381266beb4c32c4017a024a062142015b0884fa4ad8ce78252c1958032373
MD5 d53302b1a3f10295312a88f12abadcc0
BLAKE2b-256 df75f7bfc958b1f998e6852d28caf7f2b64daa81601427a4c6d16886717d5ad6

See more details on using hashes here.

File details

Details for the file fastqlapi-0.3.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for fastqlapi-0.3.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 8b9ee263a3d29730be375e379908826211884db62ec2a96bdf4cf07a1e21c52a
MD5 022cb64ec72c929d1999def101d2b629
BLAKE2b-256 478a6260a83b0d677973e8d7e885ec7563a76f385d0c4c156390fd612e0db7d0

See more details on using hashes here.

File details

Details for the file fastqlapi-0.3.8-cp311-cp311-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl.

File metadata

File hashes

Hashes for fastqlapi-0.3.8-cp311-cp311-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 a37739cd13191cdcbc1562c1b952af9352084b20941ffa4798c218ec5d6e7cb8
MD5 ae2c4413a248644d535c004ae54351c1
BLAKE2b-256 853d9b6c5cb9cedaf774d65e3d58e51983fed7748a99b4f70f59bdebb13af777

See more details on using hashes here.

File details

Details for the file fastqlapi-0.3.8-cp310-none-win_amd64.whl.

File metadata

File hashes

Hashes for fastqlapi-0.3.8-cp310-none-win_amd64.whl
Algorithm Hash digest
SHA256 2455c60d45a28a5d41f8cc307120a9eb249d6bb2748131083a0a1e51e7e8585a
MD5 1b4cd6e87b7aa8bca612e47bfa78a054
BLAKE2b-256 e5c6ffa774fa4ff67965006b2395556c552566695fcb67aeb3ebe8104f5d847d

See more details on using hashes here.

File details

Details for the file fastqlapi-0.3.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for fastqlapi-0.3.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 6db9f599e43ebe6b657ca7f3104570bdcf1cf1c60b18e1519d7529d6a722ae72
MD5 bdaa5d93946af2a9418c316ff5db6f26
BLAKE2b-256 65f3a5f5babff965455485e0f6c5c8d507ae720caa7f8311ec9a54aa1dced9df

See more details on using hashes here.

File details

Details for the file fastqlapi-0.3.8-cp310-cp310-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl.

File metadata

File hashes

Hashes for fastqlapi-0.3.8-cp310-cp310-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 fb92d26bd70925813a787322005d88c62c4d358c8f36b2ee7cf5ad7809515dda
MD5 d1a2e289e57bf7258417820aeb40b917
BLAKE2b-256 15b9d1436e3d0c9325cb287879f7703612d2541b14b2d0eb70abbbc11449243f

See more details on using hashes here.

File details

Details for the file fastqlapi-0.3.8-cp39-none-win_amd64.whl.

File metadata

  • Download URL: fastqlapi-0.3.8-cp39-none-win_amd64.whl
  • Upload date:
  • Size: 3.2 MB
  • Tags: CPython 3.9, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: maturin/0.14.10

File hashes

Hashes for fastqlapi-0.3.8-cp39-none-win_amd64.whl
Algorithm Hash digest
SHA256 39409f22cbd3c444a5a543501a1e93cc59899dbbf885baa81afbf85faa0406f5
MD5 3b28c05626489e26358b64603d04c1a3
BLAKE2b-256 beac30f85bd461d3db6ee3547271a2e2c1cbe3f4738cb489c00fb3394de9b3c1

See more details on using hashes here.

File details

Details for the file fastqlapi-0.3.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for fastqlapi-0.3.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 5df1b625e31984528a04277d65a2ce681a8ca87af8f857f6757566d3b83ec31a
MD5 75f8ef06667b628ebd609638740f2a5c
BLAKE2b-256 f07d9fa8b6229c6b3708cf514128fd675c78fb4bb8e20f7518bec6d2bcc810d0

See more details on using hashes here.

File details

Details for the file fastqlapi-0.3.8-cp39-cp39-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl.

File metadata

File hashes

Hashes for fastqlapi-0.3.8-cp39-cp39-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 3c8f50fdce8547ab2533841204e391b1122cb7f4da5f051971843735a99438b7
MD5 ee2fab8e9b063f3f945e0e9b35ce9c79
BLAKE2b-256 ef38e428da8c1d87d519e7e4ab9ff7b9c6ec5b1f627e5ad9b3a83fead25a7cff

See more details on using hashes here.

File details

Details for the file fastqlapi-0.3.8-cp38-none-win_amd64.whl.

File metadata

  • Download URL: fastqlapi-0.3.8-cp38-none-win_amd64.whl
  • Upload date:
  • Size: 3.2 MB
  • Tags: CPython 3.8, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: maturin/0.14.10

File hashes

Hashes for fastqlapi-0.3.8-cp38-none-win_amd64.whl
Algorithm Hash digest
SHA256 91883248a73c813afb6a2050cc4f0bf6172130c272314bbe8d9ef60f3330c362
MD5 6389ec53305a1cd90936225c5737aeb6
BLAKE2b-256 8909aeb21e6c0fbb651d70b2220885fe32caed6b691c4f51a1b8dd137cd31b63

See more details on using hashes here.

File details

Details for the file fastqlapi-0.3.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for fastqlapi-0.3.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 221936635ad67258017b2b463b1361d21dd8c658224676729009dcd1f71ea069
MD5 894372fb3436b17b18a52c586b776793
BLAKE2b-256 cba1fbfa8f0fe3e1f49ee2c95746429f6e03a4098c91a3d938ce7fa5f5b46df2

See more details on using hashes here.

File details

Details for the file fastqlapi-0.3.8-cp38-cp38-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl.

File metadata

File hashes

Hashes for fastqlapi-0.3.8-cp38-cp38-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 c0ec680305c08732c2c18d3e55768d614a17bce77c2c3a2ba841431f80b2503d
MD5 376ef1421a0c611181b0941ea0ffc915
BLAKE2b-256 a33d720c73b3eeb73562ec52f12eca52c93529783e8c1d181bcf4464547b0514

See more details on using hashes here.

File details

Details for the file fastqlapi-0.3.8-cp37-none-win_amd64.whl.

File metadata

  • Download URL: fastqlapi-0.3.8-cp37-none-win_amd64.whl
  • Upload date:
  • Size: 3.2 MB
  • Tags: CPython 3.7, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: maturin/0.14.10

File hashes

Hashes for fastqlapi-0.3.8-cp37-none-win_amd64.whl
Algorithm Hash digest
SHA256 82374febbc1b53a0cb06437932b6b718393cecdac7e0da8d65c6d67758c614bb
MD5 ec00d6c9ce9cd8cf65abdfe6bbd06af5
BLAKE2b-256 33e811bdb115602499f3287cf878af08c587c6f23aed44988aba1c67fae943e5

See more details on using hashes here.

File details

Details for the file fastqlapi-0.3.8-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for fastqlapi-0.3.8-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 41794a6fe76d46a41ef43a6a7df8577f23cdd264760b8248c6c70680d6b9b7b3
MD5 257e6edeca8dbab1de5f0319bb467034
BLAKE2b-256 a9e151d86c6e44400a410fd84671c85790223a9dfcef66cf920fa3b34835aefe

See more details on using hashes here.

File details

Details for the file fastqlapi-0.3.8-cp37-cp37m-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl.

File metadata

File hashes

Hashes for fastqlapi-0.3.8-cp37-cp37m-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 753261b619a6bf35517a9c70674a5392b9d4506f97d2f5bd07d2467037e9bf7a
MD5 94e8fa439e74b16ecbbe3d7dc1d4ac51
BLAKE2b-256 dfc52f05a5ce9ebd60991f1f9ffa818c002924935f75df763c3c068c2bff1eac

See more details on using hashes here.

Supported by

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