Skip to main content

Build multimodal AI services via cloud native technologies · Neural Search · Generative AI · MLOps

Project description

Jina logo: Build multimodal AI services via cloud native technologies · Neural Search · Generative AI · Cloud Native


Build multimodal AI services with cloud native technologies

PyPI Codecov branch PyPI - Downloads from official pypistats Github CD status

Jina is an MLOps framework to build multimodal AI microservice-based applications written in Python that can communicate via gRPC, HTTP and WebSocket protocols. It allows developers to build and serve services and pipelines while scaling and deploying them to a production while removing the complexity, letting them focus on the logic/algorithmic part, saving valuable time and resources for engineering teams.

Jina aims to provide a smooth Pythonic experience transitioning from local deployment to deploying to advanced orchestration frameworks such as Docker-Compose, Kubernetes, or Jina AI Cloud. It handles the infrastructure complexity, making advanced solution engineering and cloud-native technologies accessible to every developer.

Build and deploy a gRPC microserviceBuild and deploy a pipeline

Applications built with Jina enjoy the following features out of the box:

🌌 Universal

  • Build applications that deliver fresh insights from multiple data types such as text, image, audio, video, 3D mesh, PDF with LF's DocArray.
  • Support for all mainstream deep learning frameworks.
  • Polyglot gateway that supports gRPC, Websockets, HTTP, GraphQL protocols with TLS.

Performance

  • Intuitive design pattern for high-performance microservices.
  • Easy scaling: set replicas, sharding in one line.
  • Duplex streaming between client and server.
  • Async and non-blocking data processing over dynamic flows.

☁️ Cloud native

  • Seamless Docker container integration: sharing, exploring, sandboxing, versioning and dependency control via Executor Hub.
  • Full observability via OpenTelemetry, Prometheus and Grafana.
  • Fast deployment to Kubernetes and Docker Compose.

🍱 Ecosystem

  • Improved engineering efficiency thanks to the Jina AI ecosystem, so you can focus on innovating with the data applications you build.
  • Free CPU/GPU hosting via Jina AI Cloud.

Jina's value proposition may seem quite similar to that of FastAPI. However, there are several fundamental differences:

Data structure and communication protocols

  • FastAPI communication relies on Pydantic and Jina relies on DocArray allowing Jina to support multiple protocols to expose its services.

Advanced orchestration and scaling capabilities

  • Jina lets you deploy applications formed from multiple microservices that can be containerized and scaled independently.
  • Jina allows you to easily containerize and orchestrate your services, providing concurrency and scalability.

Journey to the cloud

  • Jina provides a smooth transition from local development (using DocArray) to local serving using (Jina's orchestration layer) to having production-ready services by using Kubernetes capacity to orchestrate the lifetime of containers.
  • By using Jina AI Cloud you have access to scalable and serverless deployments of your applications in one command.

Jina in Jina AI neural search ecosystem

Documentation

Install

pip install jina transformers sentencepiece

Find more install options on Apple Silicon/Windows.

Get Started

Basic Concepts

Jina has four fundamental concepts:

  • A Document (from DocArray) is the input/output format in Jina.
  • An Executor is a Python class that transforms and processes Documents.
  • A Deployment serves a single Executor, while a Flow serves Executors chained into a pipeline.

The full glossary is explained here.


Jina: Streamline AI & ML Product Delivery

Build AI Services

Open In Colab

Let's build a fast, reliable and scalable gRPC-based AI service. In Jina we call this an Executor. Our simple Executor will use Facebook's mBART-50 model to translate French to English. We'll then use a Deployment to serve it.

Note A Deployment serves just one Executor. To combine multiple Executors into a pipeline and serve that, use a Flow.

Note Run the code in Colab to install all dependencies.

Let's implement the service's logic:

translate_executor.py
from docarray import DocumentArray
from jina import Executor, requests
from transformers import AutoTokenizer, AutoModelForSeq2SeqLM


class Translator(Executor):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.tokenizer = AutoTokenizer.from_pretrained(
            "facebook/mbart-large-50-many-to-many-mmt", src_lang="fr_XX"
        )
        self.model = AutoModelForSeq2SeqLM.from_pretrained(
            "facebook/mbart-large-50-many-to-many-mmt"
        )

    @requests
    def translate(self, docs: DocumentArray, **kwargs):
        for doc in docs:
            doc.text = self._translate(doc.text)

    def _translate(self, text):
        encoded_en = self.tokenizer(text, return_tensors="pt")
        generated_tokens = self.model.generate(
            **encoded_en, forced_bos_token_id=self.tokenizer.lang_code_to_id["en_XX"]
        )
        return self.tokenizer.batch_decode(generated_tokens, skip_special_tokens=True)[
            0
        ]

Then we deploy it with either the Python API or YAML:

Python API: deployment.py YAML: deployment.yml
from jina import Deployment
from translate_executor import Translator

with Deployment(uses=Translator, timeout_ready=-1) as dep:
    dep.block()
jtype: Deployment
with:
  uses: Translator
  py_modules:
    - translate_executor.py # name of the module containing Translator
  timeout_ready: -1

And run the YAML Deployment with the CLI: jina deployment --uses deployment.yml

──────────────────────────────────────── 🎉 Deployment is ready to serve! ─────────────────────────────────────────
╭────────────── 🔗 Endpoint ───────────────╮
│  ⛓      Protocol                   GRPC │
│  🏠        Local          0.0.0.0:12345  │
│  🔒      Private      172.28.0.12:12345  │
│  🌍       Public    35.230.97.208:12345  │
╰──────────────────────────────────────────╯

Use Jina Client to make requests to the service:

from docarray import Document
from jina import Client

french_text = Document(
    text='un astronaut est en train de faire une promenade dans un parc'
)

client = Client(port=12345)  # use port from output above
response = client.post(on='/', inputs=[french_text])

print(response[0].text)
an astronaut is walking in a park

Note In a notebook, one cannot use deployment.block() and then make requests to the client. Please refer to the colab link above for reproducible Jupyter Notebook code snippets.

Build a pipeline

Open In Colab

Sometimes you want to chain microservices together into a pipeline. That's where a Flow comes in.

A Flow is a DAG pipeline, composed of a set of steps, It orchestrates a set of Executors and a Gateway to offer an end-to-end service.

Note If you just want to serve a single Executor, you can use a Deployment.

For instance, let's combine our French translation service with a Stable Diffusion image generation service from Jina AI's Executor Hub. Chaining these services together into a Flow will give us a multilingual image generation service.

Build the Flow with either Python or YAML:

Python API: flow.py YAML: flow.yml
from jina import Flow

flow = (
    Flow()
    .add(uses=Translator, timeout_ready=-1)
    .add(
        uses='jinaai://jina-ai/TextToImage',
        timeout_ready=-1,
        install_requirements=True,
    )
)  # use the Executor from Executor hub

with flow:
    flow.block()
jtype: Flow
executors:
  - uses: Translator
    timeout_ready: -1
    py_modules:
      - translate_executor.py
  - uses: jinaai://jina-ai/TextToImage
    timeout_ready: -1
    install_requirements: true

Then run the YAML Flow with the CLI: jina flow --uses flow.yml

─────────────────────────────────────────── 🎉 Flow is ready to serve! ────────────────────────────────────────────
╭────────────── 🔗 Endpoint ───────────────╮
│  ⛓      Protocol                   GRPC  │
│  🏠        Local          0.0.0.0:12345  │
│  🔒      Private      172.28.0.12:12345  │
│  🌍       Public    35.240.201.66:12345  │
╰──────────────────────────────────────────╯

Then, use Jina Client to make requests to the Flow:

from jina import Client, Document

client = Client(port=12345)  # use port from output above

french_text = Document(
    text='un astronaut est en train de faire une promenade dans un parc'
)

response = client.post(on='/', inputs=[french_text])

response[0].display()

stable-diffusion-output.png

You can also deploy a Flow to JCloud.

First, turn the flow.yml file into a JCloud-compatible YAML by specifying resource requirements and using containerized Hub Executors.

Then, use jina cloud deploy command to deploy to the cloud:

wget https://raw.githubusercontent.com/jina-ai/jina/master/.github/getting-started/jcloud-flow.yml
jina cloud deploy jcloud-flow.yml

⚠️ Caution: Make sure to delete/clean up the Flow once you are done with this tutorial to save resources and credits.

Read more about deploying Flows to JCloud.

Check the getting-started project source code.


Jina: No Infrastructure Complexity, High Engineering Efficiency

Why not just use standard Python to build that microservice and pipeline? Jina accelerates time to market of your application by making it more scalable and cloud-native. Jina also handles the infrastructure complexity in production and other Day-2 operations so that you can focus on the data application itself.

Jina: Scalability and concurrency with ease

Easy scalability and concurrency

Jina comes with scalability features out of the box like replicas, shards and dynamic batching. This lets you easily increase your application's throughput.

Let's scale a Stable Diffusion Executor deployment with replicas and dynamic batching:

  • Create two replicas, with a GPU assigned for each.
  • Enable dynamic batching to process incoming parallel requests together with the same model inference.
Normal Deployment Scaled Deployment
jtype: Deployment
with:
  timeout_ready: -1
  uses: jinaai://jina-ai/TextToImage
  install_requirements: true
jtype: Deployment
with:
  timeout_ready: -1
  uses: jinaai://jina-ai/TextToImage
  install_requirements: true
  env:
   CUDA_VISIBLE_DEVICES: RR
  replicas: 2
  uses_dynamic_batching: # configure dynamic batching
    /default:
      preferred_batch_size: 10
      timeout: 200

Assuming your machine has two GPUs, using the scaled deployment YAML will give better throughput compared to the normal deployment.

These features apply to both Deployment YAML and Flow YAML. Thanks to the YAML syntax, you can inject deployment configurations regardless of Executor code.


Jina: Seamless Container Integration

Seamless container integration

Use Executor Hub to share your Executors or use public/private Executors, with no need to worry about dependencies.

To create an Executor:

jina hub new 

To push it to Executor Hub:

jina hub push .

To use a Hub Executor in your Flow:

Docker container Sandbox Source
YAML uses: jinaai+docker://<username>/MyExecutor uses: jinaai+sandbox://<username>/MyExecutor uses: jinaai://<username>/MyExecutor
Python .add(uses='jinaai+docker://<username>/MyExecutor') .add(uses='jinaai+sandbox://<username>/MyExecutor') .add(uses='jinaai://<username>/MyExecutor')

Executor Hub manages everything on the backend:

  • Automated builds on the cloud
  • Store, deploy, and deliver Executors cost-efficiently;
  • Automatically resolve version conflicts and dependencies;
  • Instant delivery of any Executor via Sandbox without pulling anything to local.

Jina: Seamless Container Integration

Get on the fast lane to cloud-native

Using Kubernetes with Jina is easy:

jina export kubernetes flow.yml ./my-k8s
kubectl apply -R -f my-k8s

And so is Docker Compose:

jina export docker-compose flow.yml docker-compose.yml
docker-compose up

Note You can also export Deployment YAML to Kubernetes and Docker Compose.

Likewise, tracing and monitoring with OpenTelemetry is straightforward:

from docarray import DocumentArray
from jina import Executor, requests


class Encoder(Executor):
    @requests
    def encode(self, docs: DocumentArray, **kwargs):
        with self.tracer.start_as_current_span(
            'encode', context=tracing_context
        ) as span:
            with self.monitor(
                'preprocessing_seconds', 'Time preprocessing the requests'
            ):
                docs.tensors = preprocessing(docs)
            with self.monitor(
                'model_inference_seconds', 'Time doing inference the requests'
            ):
                docs.embedding = model_inference(docs.tensors)

You can integrate Jaeger or any other distributed tracing tools to collect and visualize request-level and application level service operation attributes. This helps you analyze request-response lifecycle, application behavior and performance.

To use Grafana, download this JSON and import it into Grafana:

Jina: Seamless Container Integration

To trace requests with Jaeger:

Jina: Seamless Container Integration

What cloud-native technology is still challenging to you? Tell us and we'll handle the complexity and make it easy for you.

Support

Join Us

Jina is backed by Jina AI and licensed under Apache-2.0.

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

jina-3.15.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (7.7 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64manylinux: glibc 2.5+ x86-64

jina-3.15.1-cp311-cp311-macosx_11_0_arm64.whl (8.7 MB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

jina-3.15.1-cp311-cp311-macosx_10_9_x86_64.whl (8.7 MB view details)

Uploaded CPython 3.11macOS 10.9+ x86-64

jina-3.15.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (7.7 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64manylinux: glibc 2.5+ x86-64

jina-3.15.1-cp310-cp310-macosx_11_0_arm64.whl (8.7 MB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

jina-3.15.1-cp310-cp310-macosx_10_9_x86_64.whl (8.7 MB view details)

Uploaded CPython 3.10macOS 10.9+ x86-64

jina-3.15.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (7.7 MB view details)

Uploaded CPython 3.9manylinux: glibc 2.17+ x86-64manylinux: glibc 2.5+ x86-64

jina-3.15.1-cp39-cp39-macosx_11_0_arm64.whl (8.7 MB view details)

Uploaded CPython 3.9macOS 11.0+ ARM64

jina-3.15.1-cp39-cp39-macosx_10_9_x86_64.whl (8.7 MB view details)

Uploaded CPython 3.9macOS 10.9+ x86-64

jina-3.15.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (7.7 MB view details)

Uploaded CPython 3.8manylinux: glibc 2.17+ x86-64manylinux: glibc 2.5+ x86-64

jina-3.15.1-cp38-cp38-macosx_11_0_arm64.whl (8.7 MB view details)

Uploaded CPython 3.8macOS 11.0+ ARM64

jina-3.15.1-cp38-cp38-macosx_10_9_x86_64.whl (8.7 MB view details)

Uploaded CPython 3.8macOS 10.9+ x86-64

jina-3.15.1-cp37-cp37m-macosx_10_9_x86_64.whl (8.7 MB view details)

Uploaded CPython 3.7mmacOS 10.9+ x86-64

File details

Details for the file jina-3.15.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for jina-3.15.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 a471c76ec0f6b534356c1bf20b52d593c063c991e5128900af5572cb485d17c5
MD5 063479141526bdcf17d8a6bc53dec956
BLAKE2b-256 2d6434f20aec914ac403e7165a5bd068c21427a2950e557afe362a5bd01ce30f

See more details on using hashes here.

File details

Details for the file jina-3.15.1-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for jina-3.15.1-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 fa3b1ce11742e6520ba8e2f61f1eb1de520c8593006f6f53f34b9895c271f415
MD5 e0813eef58fff9ac03f381eec94f4693
BLAKE2b-256 003d835e56f097eeb559a6635ffc25869d1499832e47cdedfe837a0dd9b76366

See more details on using hashes here.

File details

Details for the file jina-3.15.1-cp311-cp311-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for jina-3.15.1-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 a6a39cdac4e1e6012552a18183be98e02f05e274959694c3e782b96ceb89fcdc
MD5 5d23ebfb64698ddd0e6ab7835e043657
BLAKE2b-256 0aa4cbca5c4bfb19b07214f4161cff1c223bc92445a96eb4c84a3a57831b4c72

See more details on using hashes here.

File details

Details for the file jina-3.15.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for jina-3.15.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 128c883a2b5cc96cb00ae2e258e8d2156a2dc7f66764d860641d7b16daed703b
MD5 d9956e680bef00ac62f2c4098bba7e98
BLAKE2b-256 8afe69073e6f5b1863e115b942794e08bdf887ba07c61f2d2c9bf3840da16171

See more details on using hashes here.

File details

Details for the file jina-3.15.1-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for jina-3.15.1-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 9215a2a9082e030c0a5049f73dd1a39ee09fc9f91f8e823863e609ce3eb1141e
MD5 8bf95376e56ff0a09f17435aea69d30f
BLAKE2b-256 69e8810d3996cc4d920f98c78abc867ea4f69971ccb0731401a8cb5117b8458e

See more details on using hashes here.

File details

Details for the file jina-3.15.1-cp310-cp310-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for jina-3.15.1-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 efc4bbc5b10c5d77dafac1dcf1efd208994ef9ab741e3ac89e9340670b3a2be3
MD5 3956d9e7e7ad9ea0d5690752819c7c57
BLAKE2b-256 3bdb977112b417d17a04e7b0fa0d29d6fb4838dd1cfb0f2e6cd2af71b0ba72c5

See more details on using hashes here.

File details

Details for the file jina-3.15.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for jina-3.15.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 8107a28e395a339bc3d7de36bc53d49cbd88444de39ee1b68834437f2d0ffbf9
MD5 36f599128ea605729aadcdd9b2dd4a1e
BLAKE2b-256 9c50febbfcbaa83336e2967e6808c09da9afb0a9feef831643291ab024036144

See more details on using hashes here.

File details

Details for the file jina-3.15.1-cp39-cp39-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for jina-3.15.1-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 a8f074db2a12b07376cc4fe5e094950bf0a2337581ab61e59af87143d750797d
MD5 a0d1d895913785c30d62f6cb70bfbe26
BLAKE2b-256 fd9f7920ba5abd59a6cd0d2facc8d8910757c1444d5df3f44c6e4827b94fec1b

See more details on using hashes here.

File details

Details for the file jina-3.15.1-cp39-cp39-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for jina-3.15.1-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 42de2f4b901e9a2ef31cc6d581ff325787496b006be11ebd3aff335a625aefa1
MD5 c330f814ee374a6f401036db17dd4059
BLAKE2b-256 cab59d69ecd53a2d252dc13970ffe3db1cbc57038d39ac3380fdee206cc76db5

See more details on using hashes here.

File details

Details for the file jina-3.15.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for jina-3.15.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 8ab57e70a5ff68e6428769164d4bd3f8f842b1521c16ea5abad91fecc69f50b4
MD5 45199688efce95a8e694dfc1ac00b687
BLAKE2b-256 2a9f28bb646d327848ce1d00e88b1b673495c9ffd82a433e7922c8d5b0098cc9

See more details on using hashes here.

File details

Details for the file jina-3.15.1-cp38-cp38-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for jina-3.15.1-cp38-cp38-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 72b1c8f1b03aef65d561f1d1089af4740563d2ed27fb023062887bf14303a445
MD5 b5c0ca019f0fd4be0809063d2f2c6e5b
BLAKE2b-256 fae9a768823780e5ad7e822cccc5eaafafd12166dc78b06641c827cad3c69275

See more details on using hashes here.

File details

Details for the file jina-3.15.1-cp38-cp38-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for jina-3.15.1-cp38-cp38-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 d53a5f6fdc96a51bcd977ae2929f32620b3cbd976d32b29b23e6ff2136f5fb1c
MD5 a4be0aeda691a7d18e62a618c04aec21
BLAKE2b-256 1c17ff679eeeaeb901a6783a873a52719be7c2f7187dd4c11b84c082792aec69

See more details on using hashes here.

File details

Details for the file jina-3.15.1-cp37-cp37m-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for jina-3.15.1-cp37-cp37m-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 49f436338b7150539b945ab703820c15eb77caf4b86fbc0debd26e71baa7e31e
MD5 4573d9546724d4f8fa8cc54ccd69c485
BLAKE2b-256 018e18056c85a96112e00ed878111758bf485b178e477f4b73cac4476641e4ec

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