使用Amazon Bedrock的API进行文生图的实验

因为最近GenAI相当火爆,正好参与了Amazon Bedrock相关的项目,趁这个机会对Amazon Bedrock的学习分享一下。

1. 开通本账号下Bedrock相应模型的使用权限

登录AWS Global账号后,选择服务->Machine Learning->Amazon Bedrock
在这里插入图片描述

在Amazon Bedrock页面,点击入门

在这里插入图片描述

在左侧导航栏中,选择模型访问权限
在这里插入图片描述

模型访问权限页面,点击管理模型访问权限

在这里插入图片描述

选择需要使用的模型,点击保存更改
在这里插入图片描述

Anthropic的Claude模型需要填写应用场景描述

当相应的模型后面显示已授权访问权限后,方可使用

在这里插入图片描述

2. 在AWS portal中进行文生图的测试

Amazon Bedrock页面,点击图像

在这里插入图片描述

选择模型页面,选择Stability AI -> SDXL 1.0 -> 应用

在这里插入图片描述

在提示词中输入:

Emma Watson as a powerful mysterious sorceress, casting lightning magic, detailed clothing, digital painting, hyperrealistic, fantasy, Surrealist, full body, by Stanley Artgerm Lau and Alphonse Mucha, artstation

其他配置如下图:

在这里插入图片描述

操作解释:参考

操作内容
模式模型生成新图像(生成)或编辑(编辑)在参考图像中提供的图像
否定提示不希望模型生成的项目或概念,例如卡通或暴力
推理图像用于生成响应的图像或希望模型编辑的图像
响应图像生成图像的输出设置,例如质量、方向、大小和要生成的图像数量
方向用于生成图像的方向
大小用于生成图像的大小
高级配置要传递给模型的推理参数

具体其他配置请参考: Amazon Bedrock操场

3. 在代码中调用Bedrock API,部署文生图应用

部署一个EC2,参考

登录该虚拟机,安装python等必要环境

在这里插入图片描述

输入相应权限AKSK

在这里插入图片描述

创建一个目录

mkdir genai && cd genai

创建一个python文件

vi genai.py

粘贴下面这个代码

import streamlit as st
from PIL import Image
import base64
import boto3
import io
import json
import os

DEBUG = os.getenv("DEBUG", False)
DEFAULT_SEED = os.getenv("DEFAULT_SEED", 12345)
MAX_SEED = 4294967295
MODEL_ID = "stability.stable-diffusion-xl-v1"
NEGATIVE_PROMPTS = [
    "bad anatomy", "distorted", "blurry",
    "pixelated", "dull", "unclear",
    "poorly rendered",
    "poorly Rendered face",
    "poorly drawn face",
    "poor facial details",
    "poorly drawn hands",
    "poorly rendered hands",
    "low resolution",
    "Images cut out at the top, left, right, bottom.",
    "bad composition",
    "mutated body parts",
    "blurry image",
    "disfigured",
    "oversaturated",
    "bad anatomy",
    "deformed body features",
]
STYLES_MAP = {
    "电影感(Cinematic)": "cinematic",
    "摄影(Photographic)": "photographic",
    "漫画(Comic Book)": "comic-book",
    "折纸(Origami)": "origami",
    "模拟胶片(Analog Film)": "analog-film",
    "幻想艺术(Fantasy Art)": "fantasy-art",
    "线条艺术(Line Art)": "line-art",
    "霓虹朋克粉(Neon Punk)": "neon-punk",
    "三维模型(3D Model)": "3d-model",
    "数码艺术(Digital Art)": "digital-art",
    "增强(Enhance)": "enhance",
    "像素艺术(Pixel Art)": "pixel-art",
    "瓷砖纹理(Tile Texture)": "tile-texture",
    "无(None)": "None",
}

bedrock_runtime = boto3.client('bedrock-runtime')

@st.cache_data(show_spinner=False)
def gen_img_from_bedrock(prompt, style, seed=DEFAULT_SEED,width=512,height=512):
    body = json.dumps({
        "text_prompts": [
            {
                "text": prompt
            }
        ],
        "cfg_scale": 10,
        "seed": seed,
        "steps": 50,
        "style_preset": style,
        "negative_prompts": NEGATIVE_PROMPTS,
        "width":width,
        "height":height
    })
    accept = "application/json"
    contentType = "application/json"
    response = bedrock_runtime.invoke_model(
        body=body, modelId=MODEL_ID, accept=accept, contentType=contentType
    )
    response_body = json.loads(response.get("body").read())
    image_bytes = response_body.get("artifacts")[0].get("base64")
    image_data = base64.b64decode(image_bytes.encode())
    st.session_state['image_data'] = image_data
    return image_data

def update_slider():
    st.session_state.slider = st.session_state.numeric


def update_numin():
    st.session_state.numeric = st.session_state.slider


@st.cache_data
def get_image(image_data):
    return Image.open(io.BytesIO(image_data))
   
   
if __name__ == '__main__':
    # Create the page title
    st.set_page_config(
        page_title='Amazon Bedrock Stable Diffusion', page_icon='./bedrock.png')
    st.title('Stable Diffusion Image Generator with Amazon Bedrock')
    # Create a sidebar with text examples
    with st.sidebar:
        # Selectbox
        style_key = st.sidebar.selectbox(
            "Choose image style",
            STYLES_MAP.keys(),
            index=0)

        seed_input = st.sidebar.number_input(
            "Seed", value=DEFAULT_SEED, placeholder=DEFAULT_SEED, key="numeric", on_change=update_slider)
        seed_slider = st.sidebar.slider(
            'Seed Slider', min_value=0, value=seed_input, max_value=MAX_SEED, step=1, key="slider",
            on_change=update_numin, label_visibility="hidden")
        seed = seed_input | seed_slider
        
           # 图片宽度
        width = st.sidebar.slider(
            'Width', min_value=256, value=512, max_value=1024, step=64, key="width_slider")
        
        # 图片高度
        height = st.sidebar.slider(
            'Height', min_value=256, value=512, max_value=1024, step=64, key="height_slider")
             
    prompt = st.text_input('Input your prompt')
    if not prompt:
        st.warning("Please input a prompt")
        # Block the image generation if there is no input prompt
        st.stop()

    if st.button("Generate", type="primary"):
        if len(prompt) > 0:
            st.markdown(f"""
            This will show an image using **Stable Diffusion** with your desired prompt entered : {prompt}
            """)
            # Create a spinner to show the image is being generated
            with st.spinner('Generating image based on prompt'):
                if not DEBUG:
                    style = STYLES_MAP[style_key]
                    print("Generate image with Style:{} with Seed:{} and Width:{} and Height:{} and Prompt: {}".format(
                        style_key, seed, width , height  , prompt))
                    # Send request to Bedrock
                    
                    image_data = gen_img_from_bedrock(
                        prompt=prompt, style=style, seed=seed,width=width,height=height)
                    st.success('Generated stable diffusion image')

    if st.session_state.get("image_data", None):
        image = get_image(st.session_state.image_data)
        st.image(image)

    if DEBUG:
        st.write(st.session_state)

保存后,输入以下命令

streamlit run genai.py --server.port 8080 

会有以下输出:

在这里插入图片描述

在浏览器中打开

在这里插入图片描述

输入相应的提示词,点击Generate,会有以下输出

在这里插入图片描述

4. AWS Bedrock中基础模型的对比

以下是AWS Bedrock支持的一些模型的对比

模型名称AI21 LabsAmazon TITANAnthropicCohereMeta AIStability AI
使用场景Q&A、摘要、语言理解、内容生成、翻译、情感分析、长篇文案生成、高级信息提取等。Titan - 摘要、文本生成、分类、开放式问答和信息提取,Titan Embeddings - 个性化和搜索。能够检测并删除客户提供的不适当或有害内容各种各样的对话和文本处理任务、摘要、搜索、创意和协作写作、问答、编码,可以指导个性、语气和行为等。文本生成、内容生成、AI 文本编写、文案写作、摘要、实体提取、释义Llama 2 模型 - 准确而强大的语言模型,可以提供类似人类的响应。可用于构建聊天机器人、语言生成、研究以及构建各种 AI 驱动的工具。稳定扩散模型从文本描述生成图像。 根据文本提示生成图像,从现有图像生成新图像,同时保留原始图像中对象的形状和深度,AI图像恢复,高档低分辨率图像。
支持API类型Python SDK, Rest APIPython SDK, Rest APIChat Interface, Rest APIPython SDK, Rest APIPython SDK, Rest APIPython SDK, Rest API

5. Amazon Bedrock与Open AI Chatgpt粗略对比

5.1 Amazon Bedrock

Amazon Bedrock 提供对 AWS 上的生成式 AI 模型的访问。 它提供了来自领先人工智能公司的一系列基础模型,可以生成文本、图像、音频和数据。 主要特点包括:

  • 针对不同任务选择 Claude、Stable Diffusion 等基础模型
  • 使用 RAG 等技术通过自己的数据微调模型进行定制
  • 构建代理,通过调用 API 来自动执行任务,无需编码
  • 通过 AWS 控制台中的文本、图像和聊天平台进行实验
  • 与其他 AWS 服务集成,例如 SageMaker、Comprehend、Lex
5.2 Open AI Chatgpt

OpenAI ChatGPT 是一种对话式 AI 模型,可以根据提示和之前的对话生成类似人类的文本。 主要特点包括:

  • 通过 Web、iOS 和 Android 访问与 ChatGPT 进行对话交互
  • 能够与图像聊天并根据文本描述生成图像
  • 无需编码即可针对特定用途定制 GPT 模型
  • 访问 OpenAI 和其他用户共享的数百个专用 GPT 模型
  • 基于GPT-3.5,一种在多种数据上训练的大规模语言模型
5.3 Amazon Bedrock与Chatgpt的对比
  • OpenAI ChatGPT 专注于会话文本生成,而 Bedrock 提供更广泛的生成任务
  • ChatGPT 允许创建和共享自定义模型,而 Bedrock 则强调自定义现有模型
  • ChatGPT使用单一模型(GPT-3.5或者GTP-4.0),而Bedrock提供多个基础模型
  • ChatGPT 适合写故事等创意用途,而 Bedrock 适合客户服务等商业用途

6. 一些Lesson Learn

6.1 不用AWS区域支持的模型

参考页面按AWS地区划分的模型支持,只有us-east-1和us-west-2两个区域支持所有模型,如果打算使用Anthropic的Claude3或者Stability SDXL模型,建议选择上述2个区域。

7. 使用感受

总体感受下来,Amazon Bedrock还是比较友好的,尤其是提供界面直接调用不同模型进行文生图、聊天等服务,可以满足无需代码部署等操作就可以使用不同基础模型的需求。同时,Amazon Bedrock还提供了Rest API,满足在这些基础模型基础上二次开发应用的需求。

8. 参考文献

https://dev.amazoncloud.cn/experience/cloudlab?id=65fd7f888f852201f9704488

https://docs.aws.amazon.com/zh_cn/bedrock/latest/userguide/playgrounds.html#image-playground

https://docs.aws.amazon.com/zh_cn/bedrock/latest/userguide/models-regions.html

https://www.linkedin.com/pulse/openai-chatgpt-vs-amazon-bedrock-comparison-ai-services-hassan-shuman-gotpe/

  • 26
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值