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

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

登录AWS Global账号后,选择服务->Machine Learning->Amazon Bedrock

2024-04-23-10-09-37-image.png

在Amazon Bedrock页面,点击入门

2024-04-23-10-42-48-image.png

在左侧导航栏中,选择模型访问权限

 O"P  UOZetUV

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

2024-04-23-10-57-20-image.png

选择需要使用的模型,点击保存更改

2024-04-23-11-04-12-image.png

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

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

2024-04-23-11-07-05-image.png

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

Amazon Bedrock页面,点击图像

2024-04-23-11-12-15-image.png

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

2024-04-23-11-17-16-image.png

在提示词中输入:

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

其他配置如下图:

2024-04-23-15-10-05-image.png

操作解释:参考

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

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

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

部署一个EC2,参考

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

2024-04-24-09-39-05-image.png

输入相应权限AKSK

2024-04-24-09-56-09-image.png

创建一个目录

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 

会有以下输出:

2024-04-24-09-53-07-image.png

在浏览器中打开

2024-04-24-09-44-57-image.png

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

2024-04-24-09-52-13-image.png

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

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

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