当前位置: 首页 > news >正文

如何构建一个可扩展、全球可访问的 GenAI 架构?

你有没有尝试过使用人工智能生成图像?

如果你尝试过,你就会知道,一张好的图像的关键在于一个详细具体的提示。

我不擅长这种详细的视觉提示,所以我依赖大型语言模型来生成详细的提示,然后使用这些提示来生成出色的图像。以下是我能够生成的一些提示和图像的例子:

Prompt: Create a stunning aerial view of Bengaluru, India with the city name written in bold, golden font across the top of the image, with the city skyline and Nandi Hills visible in the background.

Prompt: Design an image of the iconic Vidhana Soudha building in Bengaluru, India, with the city name written in a modern, sans-serif font at the bottom of the image, in a sleek and minimalist style.

为了实现这些结果,我们使用了Flux.1-schnell模型进行图像生成,以及Llamma 3.1 - 8B - Instruct模型来生成提示。这两个模型都托管在一台配备了MIG(多实例 GPU)的单卡 H100 机器上。

这篇博客不是图像生成教程,我们以前已经分享过 Flux 的教程了。这次,我们的目标是创建一个可扩展、安全、全球可访问(且价格合理)的 GenAI 架构。同时,你还将在本文中了解,如何在同一块 H100 GPU 上同时运行 Flux 和 Llamma3 两个模型。

现在中国很多企业都在做大语言模型,就我们接触过的一些公司来讲,哪怕是一些小公司都在利用开源的模型定制自己内部使用的文生图和视频 AI 工具。

想象一下,一个全球化的平台需要为用户快速定制生成图像,或者一个内容平台需要跨地区提供用 AI 生成的文本。

对于开发者来说,想实现这样的架构存在许多挑战。例如:

  • GPU 昂贵的价格
  • GenAI 工具是尖端技术,每个工具都有特定的配置要求
  • 安全地将后端服务器与GenAI服务器连接
  • 将全球分布的用户路由到最近的服务器等

这次分享应该能给你提供一个参考和启发,逐一解决这些问题。

架构设计

实现方案

为了实现这一目标,我们设计了一个基于 DigitalOcean 云基础设施的分布式架构。后面我们会解释为什么会选择 DigitalOcean 服务器。以下是这个架构的具体工作原理:

  • 我们首先使用全球负载均衡器(GLB)来管理来自不同地区的请求,确保所有用户都能体验到最小的延迟。
  • 我们在关键地区(伦敦、纽约和悉尼)部署了轻量级的图像生成应用,每个应用都有自己的缓存,并且可以根据需要连接到 GPU 资源。这些应用通过 VPC 对等连接(有免费的1200 GiB的数据传输流量)安全地通信,将复杂的任务回传到多伦多的 H100 GPU Droplet 服务器上,这些服务器负责处理提Prompt和图像生成的核心任务。

组件详解

在这个架构中,有两个重要的组件 ,一个是轻量级图像生成应用,另一个是 MIG GPU 组件,我们需要解释一下这两个组件。

轻量级图像生成应用

图像生成应用是一个简单的 Python Flask 应用,主要包含三个部分:

1、位置检测模块:这个模块通过浏览器向服务器发送一个虚拟请求,以确定用户的地理位置(城市和国家),并识别哪个服务器区域正在处理该请求。这些信息会显示给用户,并帮助优化提示和图像生成的过程。

2、提示下拉模块:确定用户位置后,应用首先检查缓存中是否有与该位置相关的预存提示。如果找到合适的提示,它们会立即显示在下拉菜单中,供用户选择用于图像生成。如果没有缓存的提示,应用会向大型语言模型(LLM)发送请求生成新的提示,这些提示会被缓存起来以供将来使用,并填充到下拉菜单中供用户选择。

3、生成图像模块:当用户选择一个提示后,应用首先检查是否有从该特定提示生成的图像已缓存。如果有缓存的图像,会直接从磁盘加载,确保更快的响应时间。如果没有缓存的图像,应用会调用 API 生成新的图像,并将其缓存以供未来的请求使用,最后展示给用户。

MIG GPU 组件

MIG(多实例 GPU)是 NVIDIA GPU(如 H100)官方提供的一项功能,它允许将单个物理 GPU 划分为多个独立的实例。每个实例称为一个 MIG 片段,具有独立的计算、内存和带宽资源。

例如,我们可以为每个 H100 GPU 获得两个 H100 MIG 模型,每个模型的计算能力约为完整 GPU 的一半。在一项基准测试中,每个实例通常能在仅需 A100 GPU 80%成本的情况下提供相同甚至超过 A100 GPU 的性能。

这种设计不仅优化了 GPU 的利用率,还使我们能够在同一个 GPU 上并行部署图像生成和提示生成模型。

多实例 GPU (MIG) 如何工作

MIG 是 NVIDIA 在 Ampere 架构中引入的一项技术,同时也支持 Hopper 和 Blackwell 架构。MIG 可以将单个 GPU 划分为多个小的 GPU 实例,每个实例都可以独立运行一个模型服务器。

MIG 的组成

MIG 实例是由 GPU 的物理计算和内存切片组装而成的:

  • 7 个计算切片:这些切片均匀划分了芯片上的流式多处理器(SMs。H100 GPU 拥有 140 个 SMs,这些 SMs 被均匀分配到 7 个切片中,每个切片包含 20 个 SMs。此外,H100 GPU 还有 7 个 NVDEC 和 JPEG 图像解码器,每个切片分配一个。
  • 8 个内存切片:这些切片均匀划分了芯片上的显存(VRAM)。每个内存切片有 10 GB 的 VRAM 和 GPU 总内存带宽的八分之一。

7 个计算切片看起来可能有些奇怪,但这并不是因为预留了一部分计算资源用于开销,而是因为 H100 GPU 恰好有 140 个 SMs,这些 SMs 被均匀分成 7 个切片,每个切片包含 20 个 SMs。

实现该架构

在这里我们要开始做一个演示,基于 DigitalOcean 的 GPU Droplet 服务器。DigitalOcean的 H100 GPU 在2024 年底之前仅需 2.5 美元/月/GPU,从成本上来讲非常合算。而且 DigitalOcean 也已经推出了裸金属 GPU 服务器,以供对性能要求更苛刻的 AI 工作任务,比如大型模型的训练和 GenAI 应用。

在进行 Demo 之前,你需要做以下准备:

  • DigitalOcean 账户:你需要有一个DigitalOcean 账户,新用户可以获得 200 美元的免费额度,如果你正在做服务器选型,可以用这些额度来做充分的测试。(具体服务器价格可参考官方文档)
  • 基本知识:你需要了解 GPU、云网络、VPC(虚拟私有云)和负载均衡的基本概念。
  • 基本技能:熟悉 Bash、Docker 和 Python。
  • HuggingFace 访问权限
    • 已获得对 Image Generation with Flux.1 模型的访问权限。
    • 已获得对 Llama 3.1-8b-Instruct 模型的访问权限。
  • vLLM 库:vLLM 是一个快速且易于使用的大型语言模型(LLM)推理和服务库。

Step-by-Step Setup

1. 创建 GPU Droplet

首先,在 DigitalOcean 上创建一个带有单个 H100 GPU 的 GPU Droplet,并选择预装了机器学习开发所需的操作系统镜像。

2. 启用 MIG 模式

GPU Droplet 启动并运行后,启用 MIG(多实例 GPU)模式。MIG 可以将 GPU 划分为多个独立的 GPU 实例,每个实例都是相互隔离的,这对于并行运行不同模型非常重要。

sudo nvidia-smi -i 0 -mig 1

3. 选择 MIG 配置文件并创建实例

启用 MIG 后,选择一个符合你模型需求的配置文件。

nvidia-smi mig -lgip # 列出所有配置文件

例如,创建两个 MIG 实例,每个实例提供 40GB 内存,这应该足够运行两个模型。

sudo nvidia-smi mig -cgi 9,9 -C

查看所有 MIG 实例 ID:

nvidia-smi -L

4. 在每个 MIG 实例上设置 Docker 容器

对于每个 MIG 实例,运行一个单独的 Docker 容器,分别用于图像生成和提示生成模型。

部署 Flux.1-schnell 用于图像生成

我们使用 metatonic 的图像和代码来部署 Flux.1 的 Docker 镜像。

# 克隆仓库
git clone https://github.com/matatonic/openedai-images-flux
cd openedai-images-flux# 复制配置文件
cp config.default.json config/config.json# 运行 Docker 镜像
sudo docker run -d \-e HUGGING_FACE_HUB_TOKEN="<HF_READ_TOKEN>" \--runtime=nvidia -e NVIDIA_VISIBLE_DEVICES=<MIG_INSTANCE_ID> \-v ./config:/app/config \-v ./models:/app/models \-v ./lora:/app/lora \-v ./models/hf_home:/root/.cache/huggingface \-p 5005:5005 \
ghcr.io/matatonic/openedai-images-flux

使用 vLLM 部署 Llama 3.1 用于提示生成

下载并运行用于提示生成模型的 Docker 容器。

sudo docker run -d --runtime=nvidia \
-e NVIDIA_VISIBLE_DEVICES=<MIG_INSTANCE_ID> \
-v ~/.cache/huggingface:/root/.cache/huggingface \
-e HUGGING_FACE_HUB_TOKEN="<HF_READ_TOKEN>" \
-p 8000:8000 \
--ipc=host \
vllm/vllm-openai:latest \
--model meta-llama/Meta-Llama-3.1-8B-Instruct

5. 模型访问和通信

每个容器通过指定的端口访问,允许图像生成应用实例连接并发送请求到图像生成模型(Flux.1-schnell)或提示生成模型(Llama 3.1)。MIG 分区确保两个模型高效并发运行,互不干扰。

6. 设置区域应用实例

在伦敦、纽约和悉尼等区域位置设置轻量级应用实例,以本地处理用户请求,缓存频繁访问的提示和图像,加快响应速度。

  1. 通过 DigitalOcean 控制台的 Droplets 部分在某个区域创建 Droplet。
  2. SSH 登录并设置代码。为了加快速度,我已经创建了一个容器,只需要确保有 DigitalOcean 容器注册表的访问权限并拉取镜像。

# 登录到 Docker 注册表
sudo docker login registry.digitalocean.com# 拉取容器
sudo docker pull registry.digitalocean.com/<cr_name>/city-image-generator:v2

  1. 创建快照并将 Droplet 部署到其他区域。

# 运行容器
sudo docker run -d -p 80:80 registry.digitalocean.com/<cr_name>/city-image-generator:v2

  1. 在其他区域创建其他 Droplet 并运行容器。

7. 设置 VPC Peering

VPC Peering 确保区域应用实例与多伦多的 GPU 服务器之间通过私有网络进行安全、低延迟的通信。

  1. 进入 DigitalOcean 控制台的 Networking 部分。
  2. 查看每个区域的默认 VPC(例如伦敦、纽约、悉尼和多伦多)。
  3. 使用 VPC Peering 功能建立多伦多 VPC 与其他区域 VPC 的连接。
  4. 使用简单的网络工具(如 pingcurl)验证连接。

8. 设置全局负载均衡器 (GLB)

全局负载均衡器 (GLB) 将用户请求分发到最近的区域应用实例,优化延迟并提升用户体验。

  1. 进入 DigitalOcean 控制台的 Networking 部分的 Load Balancers 部分。
  2. 创建一个新的全局负载均衡器。
  3. 将区域应用实例添加为后端目标。
  4. 配置健康检查、超时和其他高级设置。
  5. 创建负载均衡器。

写在最后

这个示例适用于探索分布式 GenAI 解决方案的企业和开发者,例如生成个性化内容的广告平台、社交平台、电商平台,或服务于全球受众的 AI 内容平台。通过利用 DigitalOcean 的产品,我们展示了如何在部署前沿 AI 服务时平衡可扩展性、安全性和成本效益。

如果你需要了解 DigitalOcean 的 GPU Droplet或裸金属 GPU 服务器,可与 DigitalOcean 中国区独家战略合作伙伴卓普云联系。

如果需要了解更多关于 AI、云架构的开发,可关注我们的博客。

相关文章:

如何构建一个可扩展、全球可访问的 GenAI 架构?

你有没有尝试过使用人工智能生成图像&#xff1f; 如果你尝试过&#xff0c;你就会知道&#xff0c;一张好的图像的关键在于一个详细具体的提示。 我不擅长这种详细的视觉提示&#xff0c;所以我依赖大型语言模型来生成详细的提示&#xff0c;然后使用这些提示来生成出色的图像…...

QT实战--qt各种按钮实现

本篇介绍qt一些按钮的实现&#xff0c;包括正常按钮&#xff1b;带有下拉箭头的按钮的各种实现&#xff1b;按钮和箭头两部分分别响应&#xff1b;图片和按钮大小一致&#xff1b;图片和按钮大小不一致的处理&#xff1b;文字和图片位置的按钮 效果图如下&#xff1a; 详细实现…...

RNN And CNN通识

CNN And RNN RNN And CNN通识一、卷积神经网络&#xff08;Convolutional Neural Networks&#xff0c;CNN&#xff09;1. 诞生背景2. 核心思想和原理&#xff08;1&#xff09;基本结构&#xff1a;&#xff08;2&#xff09;核心公式&#xff1a;&#xff08;3&#xff09;关…...

生产环境中:Flume 与 Prometheus 集成

在生产环境中&#xff0c;将 Apache Flume 与 Prometheus 集成的过程&#xff0c;需要借助 JMX Exporter 或 HTTP Exporter 来将 Flume 的监控数据转换为 Prometheus 格式。以下是详细的实现方法&#xff0c;连同原理和原因进行逐步解释&#xff0c;让刚接触的初学者也能完成集…...

求平均年龄

求平均年龄 C语言代码C 代码Java代码Python代码 &#x1f490;The Begin&#x1f490;点点关注&#xff0c;收藏不迷路&#x1f490; 班上有学生若干名&#xff0c;给出每名学生的年龄&#xff08;整数&#xff09;&#xff0c;求班上所有学生的平均年龄&#xff0c;保留到小数…...

Ardusub源码剖析(1)——AP_Arming_Sub

代码 AP_Arming_Sub.h #pragma once#include <AP_Arming/AP_Arming.h>class AP_Arming_Sub : public AP_Arming { public:AP_Arming_Sub() : AP_Arming() { }/* Do not allow copies */CLASS_NO_COPY(AP_Arming_Sub);bool rc_calibration_checks(bool display_failure)…...

【NLP 2、机器学习简介】

人生的苦难不过伏尔加河上的纤夫 —— 24.11.27 一、机器学习起源 机器学习的本质 —— 找规律 通过一定量的训练样本找到这些数据样本中所蕴含的规律 规律愈发复杂&#xff0c;机器学习就是在其中找到这些的规律&#xff0c;挖掘规律建立一个公式&#xff0c;导致对陌生的数…...

数据结构与算法——N叉树(自学笔记)

本文参考 N 叉树 - LeetBook - 力扣&#xff08;LeetCode&#xff09;全球极客挚爱的技术成长平台 遍历 前序遍历&#xff1a;A->B->C->E->F->D->G后序遍历&#xff1a;B->E->F->C->G->D->A层序遍历&#xff1a;A->B->C->D->…...

【趣味升级版】斗破苍穹修炼文字游戏HTML,CSS,JS

目录 图片展示 开始游戏 手动升级&#xff08;满100%即可升级&#xff09; 升级完成&#xff0c;即可解锁打怪模式 新增功能说明&#xff1a; 如何操作&#xff1a; 完整代码 实现一个简单的斗破苍穹修炼文字游戏&#xff0c;你可以使用HTML、CSS和JavaScript结合来构建…...

【Oracle】个人收集整理的Oracle常用SQL及命令

【建表】 create table emp( id number(12), name nvarchar2(20), primary key(id) ); 【充值一】 insert into emp select rownum,dbms_random.string(*,dbms_random.value(6,20)) from dual connect by level<101; 【充值二】 begin for i in 1..100 loop inser…...

Linux内核4.14版本——ccf时钟子系统(5)——通用API

1. clk_get 1.1 __of_clk_get_by_name 1.2 clk_get_sys 2. clk_prepare_enable 2.1 clk_prepare 2.2 clk_enable 3. clk_set_rate 1. clk_get clock get是通过clock名称获取struct clk指针的过程&#xff0c;由clk_get、devm_clk_get、clk_get_sys、of_clk_get、of_clk_g…...

安装MySQL 5.7 亲测有效

前言&#xff1a;本文是笔者在安装MySQL5.7时根据另一位博主大大的安装教程基础上做了一些修改而成 首先在这里表示对博主大大的感谢 下面附博主大大地址 下面的步骤言简意赅 跟着做就不会出错 希望各位读者耐下心来 慢慢解决安装中出现的问题~MySQL 5.7 安装教程&#xff08;全…...

《Django 5 By Example》阅读笔记:p455-p492

《Django 5 By Example》学习第 16 天&#xff0c;p455-p492 总结&#xff0c;总计 38 页。 一、技术总结 1.myshop (1)打折功能 使用折扣码实现&#xff0c;但是折扣码是手动生成的&#xff0c;感觉实际业务中应该不是这样的。 (2)推荐功能 使用 Redis 做缓存&#xff0…...

Element-UI 官网的主题切换动画

文章目录 实现圆形扩散过渡动画 实现一下 Element-UI 官网的主题切换动画加粗样式 实现 首先我们起一个 html 文件&#xff0c;写一个按钮&#xff0c;以及简单的背景颜色切换&#xff0c;来模拟主题的切换 想要实现过渡效果&#xff0c;需要先用到一个 JavaScript 的原生方…...

Golang 构建学习

Golang 构建学习 如何搭建Golang开发环境 1. 下载GOlang包 https://golang.google.cn/dl/ 在地址上下载Golang 2. 配置包环境 修改全局环境变量&#xff0c;GOPROXY&#xff0c;GOPATH&#xff0c;GOROOT GOPROXYhttps://goproxy.cn,direct GOROOT"" // go二进…...

VM Virutal Box的Ubuntu虚拟机与windows宿主机之间设置共享文件夹(自动挂载,永久有效)

本文参考如下链接 How to access a shared folder in VirtualBox? - Ask Ubuntu &#xff08;1&#xff09;安装增强功能&#xff08;Guest Additions&#xff09; 首先&#xff0c;在网上下载VBoxGuestAdditions光盘映像文件 下载地址&#xff1a;Index of http://…...

分析 系统滴答时钟(tickClock),设置72MHz系统周期,如何实现1毫秒的系统时间?

一、CubeMX相关配置 1.1 相关引脚配置 1.2 相关时钟数配置 1.3 打开程序源码 二、相关函数分析...

C++优选算法十七 多源BFS

1.单源最短路问题 一个起点一个终点。 定义&#xff1a;在给定加权图中&#xff0c;选择一个顶点作为源点&#xff0c;计算该源点到图中所有其他顶点的最短路径长度。 2.多源最短路问题 定义&#xff1a;多源最短路问题指的是在图中存在多个起点&#xff0c;需要求出从这些…...

Mongodb入门到放弃

Mongodb分片概括 分片在多台服务器上分布数据的方法&#xff0c; Mongodb使用分片来支持具有非常大的数据集和高吞吐量的操作的部署 具有大数据集和高吞吐量应用程序的数据库系统&#xff0c;可以挑战单台服务器的容量。 例如&#xff0c;高查询率可以耗尽服务器的cpu容量&…...

青藤云安全携手财信证券,入选金融科技创新应用优秀案例

11月29日&#xff0c;由中国信息通信研究院主办的第四届“金信通”金融科技创新应用案例评选结果正式发布。财信证券与青藤云安全联合提交的“基于RASP技术的API及数据链路安全治理项目”以其卓越的创新性和先进性&#xff0c;成功入选金融科技创新应用优秀案例。 据悉&#x…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容

基于 ​UniApp + WebSocket​实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配​微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八

现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet&#xff0c;点击确认后如下提示 最终上报fail 解决方法 内核升级导致&#xff0c;需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)

服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...

Java面试专项一-准备篇

一、企业简历筛选规则 一般企业的简历筛选流程&#xff1a;首先由HR先筛选一部分简历后&#xff0c;在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如&#xff1a;Boss直聘&#xff08;招聘方平台&#xff09; 直接按照条件进行筛选 例如&#xff1a…...

html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码

目录 一、&#x1f468;‍&#x1f393;网站题目 二、✍️网站描述 三、&#x1f4da;网站介绍 四、&#x1f310;网站效果 五、&#x1fa93; 代码实现 &#x1f9f1;HTML 六、&#x1f947; 如何让学习不再盲目 七、&#x1f381;更多干货 一、&#x1f468;‍&#x1f…...

【生成模型】视频生成论文调研

工作清单 上游应用方向&#xff1a;控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...

Web中间件--tomcat学习

Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机&#xff0c;它可以执行Java字节码。Java虚拟机是Java平台的一部分&#xff0c;Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...

基于Java+VUE+MariaDB实现(Web)仿小米商城

仿小米商城 环境安装 nodejs maven JDK11 运行 mvn clean install -DskipTestscd adminmvn spring-boot:runcd ../webmvn spring-boot:runcd ../xiaomi-store-admin-vuenpm installnpm run servecd ../xiaomi-store-vuenpm installnpm run serve 注意&#xff1a;运行前…...

深入理解 React 样式方案

React 的样式方案较多,在应用开发初期,开发者需要根据项目业务具体情况选择对应样式方案。React 样式方案主要有: 1. 内联样式 2. module css 3. css in js 4. tailwind css 这些方案中,均有各自的优势和缺点。 1. 方案优劣势 1. 内联样式: 简单直观,适合动态样式和…...

JavaScript 标签加载

目录 JavaScript 标签加载script 标签的 async 和 defer 属性&#xff0c;分别代表什么&#xff0c;有什么区别1. 普通 script 标签2. async 属性3. defer 属性4. type"module"5. 各种加载方式的对比6. 使用建议 JavaScript 标签加载 script 标签的 async 和 defer …...