如何构建一个可扩展、全球可访问的 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. 设置区域应用实例
在伦敦、纽约和悉尼等区域位置设置轻量级应用实例,以本地处理用户请求,缓存频繁访问的提示和图像,加快响应速度。
- 通过 DigitalOcean 控制台的 Droplets 部分在某个区域创建 Droplet。
- SSH 登录并设置代码。为了加快速度,我已经创建了一个容器,只需要确保有 DigitalOcean 容器注册表的访问权限并拉取镜像。
# 登录到 Docker 注册表
sudo docker login registry.digitalocean.com# 拉取容器
sudo docker pull registry.digitalocean.com/<cr_name>/city-image-generator:v2
- 创建快照并将 Droplet 部署到其他区域。
# 运行容器
sudo docker run -d -p 80:80 registry.digitalocean.com/<cr_name>/city-image-generator:v2
- 在其他区域创建其他 Droplet 并运行容器。
7. 设置 VPC Peering
VPC Peering 确保区域应用实例与多伦多的 GPU 服务器之间通过私有网络进行安全、低延迟的通信。
- 进入 DigitalOcean 控制台的 Networking 部分。
- 查看每个区域的默认 VPC(例如伦敦、纽约、悉尼和多伦多)。
- 使用 VPC Peering 功能建立多伦多 VPC 与其他区域 VPC 的连接。
- 使用简单的网络工具(如
ping
或curl
)验证连接。
8. 设置全局负载均衡器 (GLB)
全局负载均衡器 (GLB) 将用户请求分发到最近的区域应用实例,优化延迟并提升用户体验。
- 进入 DigitalOcean 控制台的 Networking 部分的 Load Balancers 部分。
- 创建一个新的全局负载均衡器。
- 将区域应用实例添加为后端目标。
- 配置健康检查、超时和其他高级设置。
- 创建负载均衡器。
写在最后
这个示例适用于探索分布式 GenAI 解决方案的企业和开发者,例如生成个性化内容的广告平台、社交平台、电商平台,或服务于全球受众的 AI 内容平台。通过利用 DigitalOcean 的产品,我们展示了如何在部署前沿 AI 服务时平衡可扩展性、安全性和成本效益。
如果你需要了解 DigitalOcean 的 GPU Droplet或裸金属 GPU 服务器,可与 DigitalOcean 中国区独家战略合作伙伴卓普云联系。
如果需要了解更多关于 AI、云架构的开发,可关注我们的博客。
相关文章:
如何构建一个可扩展、全球可访问的 GenAI 架构?
你有没有尝试过使用人工智能生成图像? 如果你尝试过,你就会知道,一张好的图像的关键在于一个详细具体的提示。 我不擅长这种详细的视觉提示,所以我依赖大型语言模型来生成详细的提示,然后使用这些提示来生成出色的图像…...
QT实战--qt各种按钮实现
本篇介绍qt一些按钮的实现,包括正常按钮;带有下拉箭头的按钮的各种实现;按钮和箭头两部分分别响应;图片和按钮大小一致;图片和按钮大小不一致的处理;文字和图片位置的按钮 效果图如下: 详细实现…...
RNN And CNN通识
CNN And RNN RNN And CNN通识一、卷积神经网络(Convolutional Neural Networks,CNN)1. 诞生背景2. 核心思想和原理(1)基本结构:(2)核心公式:(3)关…...
生产环境中:Flume 与 Prometheus 集成
在生产环境中,将 Apache Flume 与 Prometheus 集成的过程,需要借助 JMX Exporter 或 HTTP Exporter 来将 Flume 的监控数据转换为 Prometheus 格式。以下是详细的实现方法,连同原理和原因进行逐步解释,让刚接触的初学者也能完成集…...
求平均年龄
求平均年龄 C语言代码C 代码Java代码Python代码 💐The Begin💐点点关注,收藏不迷路💐 班上有学生若干名,给出每名学生的年龄(整数),求班上所有学生的平均年龄,保留到小数…...
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 一、机器学习起源 机器学习的本质 —— 找规律 通过一定量的训练样本找到这些数据样本中所蕴含的规律 规律愈发复杂,机器学习就是在其中找到这些的规律,挖掘规律建立一个公式,导致对陌生的数…...
数据结构与算法——N叉树(自学笔记)
本文参考 N 叉树 - LeetBook - 力扣(LeetCode)全球极客挚爱的技术成长平台 遍历 前序遍历:A->B->C->E->F->D->G后序遍历:B->E->F->C->G->D->A层序遍历:A->B->C->D->…...
【趣味升级版】斗破苍穹修炼文字游戏HTML,CSS,JS
目录 图片展示 开始游戏 手动升级(满100%即可升级) 升级完成,即可解锁打怪模式 新增功能说明: 如何操作: 完整代码 实现一个简单的斗破苍穹修炼文字游戏,你可以使用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指针的过程,由clk_get、devm_clk_get、clk_get_sys、of_clk_get、of_clk_g…...
安装MySQL 5.7 亲测有效
前言:本文是笔者在安装MySQL5.7时根据另一位博主大大的安装教程基础上做了一些修改而成 首先在这里表示对博主大大的感谢 下面附博主大大地址 下面的步骤言简意赅 跟着做就不会出错 希望各位读者耐下心来 慢慢解决安装中出现的问题~MySQL 5.7 安装教程(全…...
《Django 5 By Example》阅读笔记:p455-p492
《Django 5 By Example》学习第 16 天,p455-p492 总结,总计 38 页。 一、技术总结 1.myshop (1)打折功能 使用折扣码实现,但是折扣码是手动生成的,感觉实际业务中应该不是这样的。 (2)推荐功能 使用 Redis 做缓存࿰…...
Element-UI 官网的主题切换动画
文章目录 实现圆形扩散过渡动画 实现一下 Element-UI 官网的主题切换动画加粗样式 实现 首先我们起一个 html 文件,写一个按钮,以及简单的背景颜色切换,来模拟主题的切换 想要实现过渡效果,需要先用到一个 JavaScript 的原生方…...
Golang 构建学习
Golang 构建学习 如何搭建Golang开发环境 1. 下载GOlang包 https://golang.google.cn/dl/ 在地址上下载Golang 2. 配置包环境 修改全局环境变量,GOPROXY,GOPATH,GOROOT GOPROXYhttps://goproxy.cn,direct GOROOT"" // go二进…...
VM Virutal Box的Ubuntu虚拟机与windows宿主机之间设置共享文件夹(自动挂载,永久有效)
本文参考如下链接 How to access a shared folder in VirtualBox? - Ask Ubuntu (1)安装增强功能(Guest Additions) 首先,在网上下载VBoxGuestAdditions光盘映像文件 下载地址:Index of http://…...
分析 系统滴答时钟(tickClock),设置72MHz系统周期,如何实现1毫秒的系统时间?
一、CubeMX相关配置 1.1 相关引脚配置 1.2 相关时钟数配置 1.3 打开程序源码 二、相关函数分析...
C++优选算法十七 多源BFS
1.单源最短路问题 一个起点一个终点。 定义:在给定加权图中,选择一个顶点作为源点,计算该源点到图中所有其他顶点的最短路径长度。 2.多源最短路问题 定义:多源最短路问题指的是在图中存在多个起点,需要求出从这些…...
Mongodb入门到放弃
Mongodb分片概括 分片在多台服务器上分布数据的方法, Mongodb使用分片来支持具有非常大的数据集和高吞吐量的操作的部署 具有大数据集和高吞吐量应用程序的数据库系统,可以挑战单台服务器的容量。 例如,高查询率可以耗尽服务器的cpu容量&…...
青藤云安全携手财信证券,入选金融科技创新应用优秀案例
11月29日,由中国信息通信研究院主办的第四届“金信通”金融科技创新应用案例评选结果正式发布。财信证券与青藤云安全联合提交的“基于RASP技术的API及数据链路安全治理项目”以其卓越的创新性和先进性,成功入选金融科技创新应用优秀案例。 据悉&#x…...
在CentOS系统中安装工具包的时候报错的解决方法
我刚装了一个新的虚拟机,打算安装一些工具出现了错误信息 执行的命令如下: yum install -y yum-utils device-mapper-persistent-data lvm2错误信息如下 Cannot find a valid baseurl for repo: base/7/x86_64搜索了一下原因有好几种。 一是网络不通…...
cad软件打不开报错cad acbrandres dll加载失败
一切本来很顺利哒 但是,当我用快捷方式打开时,就出现了这个错误。进入文件路径,是有这个的; 在文件路径直接打开,也会提示错误 原因竟然是我改了个名字: 随便选的文件路径,空的,文件名为Acr…...
14、保存与加载PyTorch训练的模型和超参数
文章目录 1. state_dict2. 模型保存3. check_point4. 详细保存5. Docker6. 机器学习常用库 1. state_dict nn.Module 类是所有神经网络构建的基类,即自己构建一个深度神经网络也是需要继承自nn.Module类才行,并且nn.Module中的state_dict包含神经网络中…...
【前端开发】JS+Vuew3请求列表数据并分页
应用技术:原生JavaScript Vue3 $(function () {ini(); });function ini() {const { createApp, ref, onMounted } Vue;createApp({setup() {const data ref({studentList: [],page: 1,pageSize: 10,});const getStudentList async (page, key) > {window.ons…...
Trimble X12助力电力管廊数据采集,为机器人巡视系统提供精准导航支持
地下电缆是一个城市重要的基础设施,它不仅具有规模大、范围广、空间分布复杂等特点,更重要的是它还承担着信息传输、能源输送等与人们生活息息相关的重要功能,也是一个城市赖以生存和发展的物质基础。 01、项目概述 本次项目是对某区域2公里左…...
Docker 清理镜像策略详解
文章目录 前言一、删除 Docker 镜像1. 查看当前镜像2. 删除单个镜像3. 删除多个镜像4. 删除所有未使用的镜像5. 删除悬空的 Docker 镜像6. 根据模式删除镜像7. 删除所有镜像 二、删除 Docker 容器1. 查找容器2. 删除一个或多个特定容器3. 退出时删除容器4. 删除所有已退出的容器…...
【Linux】TCP网络编程
目录 V1_Echo_Server V2_Echo_Server多进程版本 V3_Echo_Server多线程版本 V3-1_多线程远程命令执行 V4_Echo_Server线程池版本 V1_Echo_Server TcpServer的上层调用如下,和UdpServer几乎一样: 而在InitServer中,大部分也和UDP那里一样&…...
排序学习整理(2)
上集回顾 排序学习整理(1)-CSDN博客 2.3 交换排序 交换排序的基本思想是:根据序列中两个记录键值的比较结果,交换这两个记录在序列中的位置。 特点: 通过比较和交换操作,将键值较大的记录逐步移动到序列…...
AI蛋白质设计与人工智能药物设计
AI蛋白质设计与人工智能药物设计 AI蛋白质设计 一、蛋白质相关的深度学习简介 1.基础概念 1.1.机器学习简介:从手写数字识别到大语言模型 1.2.蛋白质结构预测与设计回顾 1.3.Linux简介 1.4.代码环境:VS code和Jupyter notebook* 1.5.Python关键概…...
IOS ARKit进行图像识别
先讲一下基础控涧,资源的话可以留言,抽空我把它传到GitHub上,这里没写收积分,竟然充值才能下载,我下载也要充值,牛! ARSCNView 可以理解画布或者场景 1 配置 ARWorldTrackingConfiguration AR追…...
景观设计公司利润/谷歌优化是什么意思
ftp服务很重要,这里介绍ftp在linux上不连接mysql数据库的搭建方法,ftp也可以连接mysql,有时间再生成文档。先说明ftp的基本原理:FTP �File Transfer Protocol 文件传输协议。能够在网络上提供文件传输服务,…...
做按摩网站多少钱/外贸软件排行榜
Android系统启动流程(三)解析SystemServer进程启动过程 1.Zygote启动SystemServer进程 在上一篇文章中我们讲到在ZygoteInit.java的startSystemServer函数中启动了SyetemServer进程,如下所示。 frameworks/base/core/java/com/android/int…...
工商管理系统官网/win10优化大师免费版
linux 内存设置问题(2011-08-15 04:26:56)标签:杂谈linux 内存设置问题RedHat 64位物理内存32G/etc/sysctl.conf里搭配如下kernel.shmall4194304kernel.shmmax17179869184kernel.shmmni4096我想问的是,shmall*shmmni究竟代表什么?系统可用最大…...
深圳高端电商网站建设者/网页模板建站系统
第十九章 故障及问题管理670、故障是系统运行中出现的系统本身问题或任何非标准操作,已经引起或可能引起服务中断和服务质量下降的事件。671、故障处理彿发现故障时为尽快恢复系统IT服务而采取的技术上或管理上的办法。672、故障的特征:即影响度(故障影响…...
存量权益登记在哪个网站上做/手机一键优化
1 迭代器 1.1 定义迭代器是指能用next(it)函数取值的对象(实例) 1.2 说明1 用iter函数可返回一个可迭代对象的迭代器2 迭代器是访问可迭代对象的一种方式3 迭代器只能往前,不能后退 1.3 示例L [1,1,2,3,5,8] it iter…...
学做美食的视频网站/如何做一个网页
垃圾回收1 内存分配 垃圾回收 调用垃圾回收器 对象终结 调用垃圾回收器 System.gc()和Runtime.getRuntime().gc()这两个方法 不建议程序调用此方法 对象终结 Object上的方法: protected void finalize() throws Throwab…...