0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何使用Jina来构建一个使用Stable Diffusion生成图像的Executor呢

深度学习自然语言处理 来源:Alex CG 2023-03-27 10:25 次阅读

什么是 Executor

Executor 是一个独立的 gRPC 微服务,它可以在 DocumentArray 上执行任务。Executor Hub 上有大量预构建的 Executor 可供选择,包含了各种常见的任务,如文本分类,图像识别、目标检测等。

ExecutorHub:cloud.jina.ai/executors

为了让你能够更轻松地部署和管理微服务,我们正将 Executor 从 Flow 中分离出来。同时,也方便你更好地利用 Jina 的其他强大功能,比如:

利用 gRPC 和 protobuf 实现高效的网络传输和序列化,更快地处理数据和模型之间的通信

使用 DocArray 更准确、灵活地表示多模态数据,以满足不同场景下的需求;

“Array-first”概念,将输入数据分批进行模型推理,可以大幅提高吞吐量,使你的模型处理更加高效;

轻松地将 ML 模型部署到生产环境中,享受云原生所带来的便利和丝滑。

此外,请密切关注即将推出的 Jina AI Cloud(cloud.jina.ai),在 Jina Cloud 上免费运行模型部署。

Jina 吉祥物

前段时间,我们在周五一起喝酒聊天的时候,突然聊到要不要给 Jina 选一个可爱的吉祥物,就像米其林轮胎人一样。

酒后头脑风暴之后,我们最终的决定是「彩虹独角兽蝴蝶小猫」,考虑到基因改造工程的复杂度,要怎么真正创造出这样一个神奇的新生物呢?我们决定先动手画张图:

但想一想,还有什么比使用 Jina 本身更好的方式来生成 Jina 的吉祥物呢?考虑到这一点,我们立马开发了一个图像生成的 Executor 和 Deployment。因此,在这篇文章中,我们将介绍如何将模型构建成 Executor、部署它、扩展它以及与全世界共享它。

构建 Executor

需要一个 GPU 才能在本地运行和部署这个 Executor。但你也可以调整代码,使用 Executor Hub Sandbox 版本,托管在 Jina AI Cloud上。

在 Jina 中部署服务时总是以 Executor 的形式进行。Executor是一个Python类,用于转换和处理 Document。可以将文本/图像编码为向量、OCR、从 PDF 中提取表格等等,不仅限于图像生成。

当然如果你只是想把它用起来,而不是从头开始构建它,可以直接跳到 Executor Hub 部分。

在本教程中,我们将重点关注 Executor 和 Deployment,而不会深入研究 Stable Diffusion 模型的复杂性。我们希望本教程适用于任何微服务或模型,而不是只适用特定用例。

以下大致就是我们希望 Executor 看起来的样子。用户传入提示词,Executor 使用该提示词生成图像,然后将该图像传回给用户:

dcc32e40-cb54-11ed-bfe3-dac502259ad0.png

先决条件

您需要安装 Hugging Face Diffusers,pip install diffusers[torch]。

现在,让我们从整体上看一下 Executor 代码,然后逐节分析:

我们将从创建开始 text_to_image.py:

from docarray import DocumentArray
from jina import Executor, requests
import numpy as np

class TextToImage(Executor):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        import torch
        from diffusers import StableDiffusionPipeline

        self.pipe = StableDiffusionPipeline.from_pretrained(
            "CompVis/stable-diffusion-v1-4", torch_dtype=torch.float16
        ).to("cuda")

    @requests
    def generate_image(self, docs: DocumentArray, **kwargs):
    # image here is in PIL format
        images = self.pipe(docs.texts).images
        
        for i, doc in enumerate(docs):
            doc.tensor = np.array(images[i])

Imports

from docarray import DocumentArray
from jina import Executor, requests
import numpy as np

注:Documents 和 DocumentArrays 是 Jina 的原生 IO 格式。

Executor 类

class TextToImage(Executor):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        import torch
        from diffusers import StableDiffusionPipeline

        self.pipe = StableDiffusionPipeline.from_pretrained(
            "CompVis/stable-diffusion-v1-4", torch_dtype=torch.float16
        ).to("cuda")

所有 Executor 都是从 Jina 的 Executor 类创建的。用户可定义的参数是方法中定义的参数__init__()。

Requests 装饰器

@requests
def generate_image(self, docs: DocumentArray, **kwargs):
    # image here is in PIL format
    images = self.pipe(docs.texts).images

    for i, doc in enumerate(docs):
        doc.tensor = np.array(images[i])

当你在一个 Executor 中定义了一个方法,并使用了@requests 装饰器,那么你就可以通过端点调用这个方法。当你没有指定端点路径时,那么这个方法会成为默认处理程序。

这里我们没有像@requests(on='/foo') 这样指定端点路径,只是使用了裸的@requests,所以当调用 Executor 时,generate_image() 方法会成为默认处理程序。

部署我们的微服务

那么,现在我们有了 Executor,下一步当然就是部署啦!通过 Deployment,你可以运行和扩展 Executor,添加 replicas(副本), shards(分片) 和 dynamic batching(动态批处理)。此外,部署到 Kubernetes 或 Docker Compose 也很容易,我们将在本文后面介绍。

1. Deploy via Python API

运行 python deployment.py

from jina import Deployment
from text_to_image import TextToImage

with Deployment(uses=TextToImage, timeout_ready=-1, install_requirements=True) as dep:
    dep.block()

2. Deploy via YAML

使用 CLI 运行 YAML 部署:jina deployment --uses deployment.yml

jtype: Deployment
with:
  port: 12345
  uses: TextToImage
  py_modules:
    - text_to_image.py # name of the module containing Executor
  timeout_ready: -1
install_requirements: True
And run the YAML Deployment with the CLI: jina deployment --uses deployment.yml

无论您运行哪种 Deployment,您都会看到以下输出:

────────────────────────────────────────  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  │
╰──────────────────────────────────────────╯

与我们的微服务通信

我们可以使用 Jina Client 通过 gRPC 向我们的服务发送请求。如前所述,我们使用 Document 作为基本的 IO 格式:

运行 client.py 获得我们的梦中精灵猫。

from docarray import Document
from jina import Client

image_text = Document(text='rainbow unicorn butterfly kitten')

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

response[0].display()

扩展我们的微服务

Jina 有开箱即用的可扩展功能,如副本、分片和动态批处理。这使您可以轻松增加应用程序的吞吐量。

让我们部署 Deployment,并使用副本和动态批处理对其进行扩展。我们将:

创建两个副本,每个副本分配一个 GPU。

启用动态批处理以并行处理传入同一模型的请求。

dda296fc-cb54-11ed-bfe3-dac502259ad0.png

这是 Deployment 的原始(未扩展)deployment.yml:

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

我们通过 CUDA_VISIBLE_DEVICES添加了 GPU 支持,使用了两个副本(每个副本分配一个 GPU)和动态批处理,可以累积并批处理请求,再发送到 Executor。

假设您的机器有两个 GPU,使用扩展后的 Deployment YAML 会比普通部署获得更高的吞吐量。

感谢 YAML 语法,你可以直接注入部署配置,不用修改 Executor 代码。当然了,所有这些也可以通过 Python API 完成。

Kubernetes, Docker Compose andOpenTelemetry

使用 Kubernetes 和 Jina 很容易

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

同样的,Docker Compose 也很容易

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

甚至,使用 OpenTelemetry 进行 tracing(跟踪) 和 monitoring (监视) 也很简单。

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)

您可以集成 Jaeger 或任何其他分布式跟踪工具,来收集和可视化请求级别和应用级别的服务操作属性。这有助于分析请求-响应生命周期、应用程序行为和性能。要使用 Grafana,你可以下载这个 JSON 文件并导入 Grafana:

ddd1681a-cb54-11ed-bfe3-dac502259ad0.png

共享你的 Executor

使用 Executor Hub 共享你的 Executors 或使用公共/私有 Executors,几乎不需要担心依赖关系。

ddf4398a-cb54-11ed-bfe3-dac502259ad0.png

创建 Hub-ready Executor:

jina hub new

将其推送到 Executor Hub:

jina hub push

您可以通过 Python 在 Deployment 中使用 Hub Executor:

Deployment(uses='jinaai://jina-ai/TextToImage', install_requirements=True)  # download and run locally
Deployment(uses='jinaai+docker://jina-ai/TextToImage')  # run in Docker container
Deployment(uses='jinaai+sandbox://jina-ai/TextToImage')  # run in hosted sandbox

或者 YAML:

uses: jinaai://jina-ai/TextToImage  # download and run locally
install_requirements: true

uses: jinaai+docker://jina-ai/TextToImage  # run in Docker container
uses: jinaai+sandbox://jina-ai/TextToImage  # run in hosted sandbox

Executor Hub 管理后端的所有内容,包括:

云端自动构建;

高效且经济地存储、部署和交付 Executor;

自动解决版本冲突和依赖;

通过 Sandbox 即时交付任何 Executor,而无需将任何内容 pull 到本地;

将微服务串联成pipeline 中

有时你可能希望将微服务串联成一个 pipeline。这就是 Flow 的用武之地。我们将在以后的博客中更深入地介绍如何构建 Flow,目前您可以查看我们的 README。

Readme: get.jina.ai

总结

正如用 Executor 和 Deployment 包装微服务或模型一样,我们也必须总结这篇文章。总结一下我们所涵盖的内容:

使用 Jina,你可以将模型包装为 Executor,通过 Deployment 可以直接部署这些 Executor,或者将他们串联成 pipeline 作为 Flow 去部署。

Jina 与 Kubernetes、Docker Compose 和 OpenTelemetry 集成轻而易举。

你可以在 Executor Hub 轻松找到和共享所有内容。

如果您想继续深入了解,请查看我们的文档以获取有关 Executors 和 Deployments 的更多信息,或者使用 Jina Flows 查看 pipeline。您还可以联系我们的 Slack 社区jina.ai/community。

多多和我们互动吧!这样我们才更加有动力分享出更多好文章,未来我们将发布更多文章深入探讨作为人人可用的多模态数据平台,如何利用 Jina 地云原生,MLOps 和 LMOps 技术,让每个企业和开发者都能享受到最好的搜索和生成技术。

Jina 吉祥物之彩虹独角兽蝴蝶小猫排行榜

像所有图像生成一样,我们花了很长时间才生成一只完美的可爱小猫。





审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • gpu
    gpu
    +关注

    关注

    28

    文章

    4740

    浏览量

    128945
  • 执行器
    +关注

    关注

    5

    文章

    377

    浏览量

    19358
  • CLI
    CLI
    +关注

    关注

    1

    文章

    79

    浏览量

    8549
  • YAML
    +关注

    关注

    0

    文章

    21

    浏览量

    2325

原文标题:如何用 Jina 部署深度学习模型

文章出处:【微信号:zenRRan,微信公众号:深度学习自然语言处理】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    如何开启Stable Diffusion WebUI模型推理部署

    如何开启Stable Diffusion WebUI模型推理部署
    的头像 发表于 12-11 20:13 104次阅读
    如何开启<b class='flag-5'>Stable</b> <b class='flag-5'>Diffusion</b> WebUI模型推理部署

    Freepik携手Magnific AI推出AI图像生成

    近日,设计资源巨头Freepik携手Magnific AI,共同推出了革命性的AI图像生成器——Freepik Mystic,这里程碑式的发布标志着AI图像创作领域迈入了
    的头像 发表于 08-30 16:23 1140次阅读

    实操: 如何在AirBox上跑Stable Diffusion 3

    StableDiffusion3Medium是种多模态扩散变换器(MMDiT)文本到图像模型,在图像质量、排版、复杂提示理解和资源效率方面具有显著提升的性能。目前瑞莎团队
    的头像 发表于 07-23 08:34 254次阅读
    实操: 如何在AirBox上跑<b class='flag-5'>Stable</b> <b class='flag-5'>Diffusion</b> 3

    微信大模型扩容并开源,推出首个中英双语文生图模型,参数规模达15亿

    基于Diffusion Transformer的混元DiT是种文本到图像生成模块,具备中英细粒度理解能力,能与用户进行多轮对话,根据上下文生成
    的头像 发表于 05-14 17:10 730次阅读

    OpenAI发布图像检测分类器,可区分AI生成图像与实拍照片

    据OpenAI介绍,初步测试结果表明,该分类器在辨别非AI生成图像与DALL·E 3生成图像时,成功率高达近98%,仅有不到0.5%的非AI图像
    的头像 发表于 05-09 09:57 468次阅读

    UL Procyon AI 发布图像生成基准测试,基于Stable Diffusion

    UL去年发布的首个Windows版Procyon AI推理基准测试,以计算机视觉工作负载评估AI推理性能。新推出的图像生成测试将提供统、精确且易于理解的工作负载,用以保证各支持硬件间公平、可比的性能表现。
    的头像 发表于 03-25 16:16 882次阅读

    Stability AI推出全新Stable Video 3D模型

    近日,Stability AI 推出了全新的 Stable Video 3D 模型,该模型以其独特的功能吸引了众多关注。此模型具备从单张图像生成多视图3D视频的能力,为视频制作领域带来了革命性的突破。
    的头像 发表于 03-22 10:30 855次阅读

    KOALA人工智能图像生成模型问世

    近日,韩国科学团队宣布研发出名为 KOALA 的新型人工智能图像生成模型,该模型在速度和质量上均实现了显著突破。KOALA 能够在短短 2 秒内生成高质量图片,同时大幅降低了对硬件的需求,为
    的头像 发表于 03-05 10:46 790次阅读

    韩国科研团队发布新型AI图像生成模型KOALA,大幅优化硬件需求

    由此模型的核心在于其运用了“知识蒸馏”(knowledge distillation)技术,这使得开源图像生成工具Stable Diffusion XL可大幅缩小其规模。原
    的头像 发表于 03-01 14:10 634次阅读

    联发科天玑又领先步!强悍AI手机芯片就看天玑!

    应用,该演示充分发挥了天玑 9300和8300芯片的独立AI处理器APU,在硬件加速引擎的加持下,可以在终端侧生成文章和摘要。 联发科还重点展出了支持SDXL Turbo(Stable Diffusion
    的头像 发表于 02-27 13:46 516次阅读
    联发科天玑又领先<b class='flag-5'>一</b>步!强悍AI手机芯片就看天玑!

    OpenAI视频模型Sora的架构及应用场景

    LDM 就是 Stable Diffusion 使用的模型架构。扩散模型的大问题是计算需求大,难以拟合高分辨率图像。为了解决这问题,实现
    发表于 02-20 15:13 647次阅读
    OpenAI视频模型Sora的架构及应用场景

    Stability AI试图通过新的图像生成人工智能模型保持领先地位

    Stability AI的最新图像生成模型Stable Cascade承诺比其业界领先的前身Stable Diffusion更快、更强大,而
    的头像 发表于 02-19 16:03 944次阅读
    Stability AI试图通过新的<b class='flag-5'>图像</b><b class='flag-5'>生成</b>人工智能模型保持领先地位

    谷歌推出图像生成新工具ImageFX,提升图像质量

    作为实验室的新兴工具,ImageFX 允许用户借助简洁的文字指令创作图像。经过前期试验,该团队认为对生成型人工智能工具来说最关键的是如何启发并鼓励用户挖掘和实践创意想法。
    的头像 发表于 02-02 14:18 679次阅读

    实现图像识别神经网络的步骤

    我们的下一个任务是使用先前标记的图像训练神经网络,以对新的测试图像进行分类。因此,我们将使用nn模块
    的头像 发表于 01-22 10:01 1025次阅读
    实现<b class='flag-5'>图像</b>识别神经网络的步骤

    种新的分割模型Stable-SAM

    SAM、HQ-SAM、Stable-SAM在提供次优提示时的性能比较,Stable-SAM明显优于其他算法。这里也推荐工坊推出的新课程《如何将深度学习模型部署到实际工程中?
    的头像 发表于 12-29 14:35 679次阅读
    <b class='flag-5'>一</b>种新的分割模型<b class='flag-5'>Stable</b>-SAM