ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

BentoML GPU 推理配置指南:从资源声明、CUDA 依赖安装到多卡部署

BentoML GPU 推理配置指南:从资源声明、CUDA 依赖安装到多卡部署 模型推理服务人工智能后端大模型MLOpsLLMOps【免费下载链接】BentoMLThe easiest way to serve AI apps and models - Build Model Inference APIs, Job queues, LLM apps, Multi-model pipelines, and more!项目地址https://gitcode.com/gh_mirrors/be/BentoML点击查看免费下载BentoML 为需要 GPU 资源的推理 Service 提供了简洁的配置与部署路径只需在bentoml.service装饰器中通过resources声明 GPU 数量甚至指定 GPU 型号再配合正确的 CUDA 依赖安装与容器/云平台运行时设置即可将模型推理服务跑在 GPU 上。读完本文你将掌握单卡与多卡场景下的 Service 编写方式、BentoCloud 与 Docker 两种部署形态的 GPU 分配方法以及用CUDA_VISIBLE_DEVICES精确控制 GPU 可见性的实战技巧。声明 GPU 资源Service 层的资源规格在使用 GPU 跑推理之前第一步是让 BentoML 知道你的 Service 需要多少 GPU。这一步通过bentoml.service(resources{...})完成resources 是声明在 Service 上的“资源需求单”在本地运行时它会约束进程可用的设备在云平台部署时它会作为实例选型的依据。单卡场景把模型放到 cuda:0当机器上只有一张 GPU 时PyTorch、TensorFlow 等框架默认使用cuda:0也可直接写作cuda。以 PyTorch 为例加载完权重后调用.to(cuda:0)即可把模型搬到 GPU 上。完整的 BentoML Service 示例如下import bentoml import os bentoml.service(resources{gpu: 1}) class MyService: # 使用 Hugging Face 模型 model_path bentoml.models.HuggingFaceModel(org_name/model_id) # 使用 Model Store 或 BentoCloud 中的模型 # model_path bentoml.models.BentoModel(model_name:latest) def __init__(self): import torch # 指定权重文件的精确路径 weights_file os.path.join(self.model_path, weight.pt) self.model torch.load(weights_file).to(cuda:0)这里有两个值得注意的细节bentoml.models.HuggingFaceModel(org_name/model_id)与bentoml.models.BentoModel(model_name:latest)都返回模型引用Service 内通过os.path.join(self.model_path, ...)拿到权重文件在本地/容器内的真实路径。二者在源码中均属于Model抽象基类见 src/_bentoml_sdk/models/base.py区别在于前者从 Hugging Face Hub 解析模型后者从 BentoML Model Store 或 BentoCloud 解析已注册模型。resources{gpu: 1}声明了 1 个 GPU 需求是后续一切 GPU 分配逻辑的起点。多卡场景指定设备或跨卡分布多 GPU 机器上每张 GPU 都有从 0 开始的索引cuda:0、cuda:1、cuda:2…。你可以把不同模型放到不同 GPU 上实现“一卡一模型”的隔离调度import bentoml import os bentoml.service(resources{gpu: 2}) class MultiGPUService: # 加载 Hugging Face 模型 model1_path bentoml.models.HuggingFaceModel(org_name/model1_id) model2_path bentoml.models.HuggingFaceModel(org_name/model2_id) # 使用 Model Store 或 BentoCloud 中的模型 # model_path bentoml.models.BentoModel(model_name:latest) def __init__(self): import torch # 指定权重文件的精确路径 weights_file1 os.path.join(self.model1_path, weight1.pt) weights_file2 os.path.join(self.model2_path, weight2.pt) self.model1 torch.load(weights_file1).to(cuda:0) # 使用第一张 GPU self.model2 torch.load(weights_file2).to(cuda:1) # 使用第二张 GPU如果目标是“同一个 worker 使用多张 GPU 做分布式推理”则需借助框架自身的分布式原语PyTorch 提供torch.nn.DataParallel与torch.nn.parallel.DistributedDataParallelTensorFlow 则对应其分布式训练/推理 API。这类场景通常还要求结合 BentoML 的 workers 机制详见下文。resources 的源码定义gpu 与 gpu_type 字段resources并不是一个“魔法字典”它由 BentoML 的ResourceSchema严格校验。查看 src/_bentoml_sdk/service/config.py 可以发现它包含以下字段字段取值类型说明cpuint/float/str数字按核数解释1 1 核0.5 半核字符串可带单位如100m表示 100 毫核memoryint/float/str数字按 Gi 解释1 1 GiB字符串可带单位如512Mi、2Gigpu正浮点数申请的 GPU 数量文档示例中通常为整数1、2gpu_type枚举字面量GPU 型号标注如nvidia-l4、nvidia-tesla-a100主要作为部署到 BentoCloud 时的实例类型推荐依据tpu_type枚举字面量TPU 型号如v4-2x2x1、v5p-2x2x2其中gpu_type的合法值被定义为GpuLiteralType字面量联合当前仓库中覆盖了nvidia-b200、nvidia-gb200、nvidia-tesla-h100、nvidia-tesla-a100、nvidia-a100-80gb、nvidia-a10g、nvidia-l4、nvidia-tesla-t4、nvidia-tesla-v100等 NVIDIA 型号以及amd-mi300x、amd-mi325x、amd-mi355x等 AMD 型号。写错型号会在 Service 配置校验阶段TypeAdapter(ServiceConfig).validate_python(...)见 config.py被直接拦截。GPU 部署从本地开发到容器与云平台声明好资源后还需要保证运行时环境里真的装有带 CUDA 能力的深度学习框架以及 GPU 能被容器/平台正确透传。BentoML 的部署路径主要有三条本地 pip 安装、BentoCloud 托管、自管 Docker。用 pip 安装带 CUDA 的 PyTorch / TensorFlowBentoML 官方推荐直接通过pip安装 PyTorch 或 TensorFlow 及其 CUDA 依赖理由有两点包体积最小只安装真正需要的组件不额外引入无关驱动文件兼容性更好框架发布版会自动匹配正确的 CUDA 版本避免手工对齐 CUDA 版本号。本地开发环境的安装命令pip install torch pip install tensorflow[and-cuda]构建 Bento 时把框架依赖写进Image的python_packages或放进独立的requirements.txt再通过requirements_file()引入参见 runtime-environment.rstimport bentoml my_image bentoml.images.Image(python_version3.11) \ .python_packages(torch, tensorflow[and-cuda]) bentoml.service(imagemy_image) class MyService: # Service implementation如果默认镜像无法满足需求还可以通过base_image参数指定自定义 Docker 基础镜像用system_packages安装系统级依赖、用run执行自定义命令——这三者正是“定义运行时规格”的核心手段完整方法清单见 runtime-environment.rst。也就是说CUDA 驱动与库的安装方式完全可控既可以直接信任pip安装的框架自带 CUDA 运行时也可以在自定义基础镜像层面定制驱动版本。部署到 BentoCloud按 GPU 型号选实例在 BentoCloud 上部署时把gpu和gpu_type一起写进resources平台便会据此分配对应规格的 GPU 实例bentoml.service( resources{ gpu: 1, # 分配的 GPU 数量 gpu_type: nvidia-l4 # BentoCloud 上的具体 GPU 型号 } ) class MyService: # Service implementation查询你的 BentoCloud 账号下可用的实例类型运行$ bentoml deployment list-instance-types Name Price CPU Memory GPU GPU Type cpu.1 * 500m 2Gi cpu.2 * 1000m 2Gi cpu.4 * 2000m 8Gi cpu.8 * 4000m 16Gi gpu.t4.1 * 2000m 8Gi 1 nvidia-tesla-t4 gpu.l4.1 * 4000m 16Gi 1 nvidia-l4 gpu.a100.1 * 6000m 43Gi 1 nvidia-tesla-a100list-instance-types对应 CLI 实现中的list_instance_types函数见 src/bentoml_cli/deployment.py它会调用云客户端查询实例类型列表——这也是上面gpu_type取值要“对号入座”的原因。Service 就绪后一条命令即可完成部署bentoml deploy .更完整的部署步骤参见 create-deployments.rst。自管 DockerNVIDIA Container Toolkit 与 GPU 透传自管部署时需要先安装NVIDIA Container Toolkit含 Docker CE 与nvidia-docker的配套安装容器才能访问宿主机的 NVIDIA GPU。先用bentoml containerize构建镜像然后运行在所有可用 GPU 上docker run --gpus all -p 3000:3000 bento_image:latest也可以用device选项精确指定要挂载的设备docker run --gpus all --device /dev/nvidia0 \ --device /dev/nvidia-uvm --device /dev/nvidia-uvm-tools \ --device /dev/nvidia-modeset --device /dev/nvidiactl docker-args验证 GPU 是否真的在工作nvidia-smi在另一个终端运行nvidia-smi并每秒刷新可以确认 BentoML Service 是否正在占用 GPU# 每秒刷新一次输出 watch -n 1 nvidia-smi示例输出关键信息进程列表里能看到你的 BentoML Python 进程以及它占用的显存Every 1.0s: nvidia-smi ps49pl48tek0: Mon Jun 17 13:09:46 2024 Mon Jun 17 13:09:46 2024 --------------------------------------------------------------------------------------- | NVIDIA-SMI 535.129.03 Driver Version: 535.129.03 CUDA Version: 12.2 | |------------------------------------------------------------------------------------- | GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. | | | | MIG M. | || | 0 NVIDIA A100-SXM4-80GB On | 00000000:00:05.0 Off | 0 | | N/A 30C P0 60W / 400W | 3493MiB / 81920MiB | 0% Default | | | | Disabled | ------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------- | Processes: | | GPU GI CI PID Type Process name GPU Memory | | ID ID Usage | || | 0 N/A N/A 1813 G /usr/lib/xorg/Xorg 70MiB | | 0 N/A N/A 1946 G /usr/bin/gnome-shell 78MiB | | 0 N/A N/A 11197 C /Home/Documents/BentoML/demo/bin/python 3328MiB| ---------------------------------------------------------------------------------------当 Service 正在处理推理请求时你会看到 Python 进程对应的行出现显著的 GPU 内存占用如上例的3328MiBGPU-Util也会随负载波动。限制 GPU 可见性CUDA_VISIBLE_DEVICES如果不想让 Service 使用机器上的全部 GPU可以设置环境变量CUDA_VISIBLE_DEVICES用 GPU 的 ID通常从 0 开始编号限定可见设备CUDA_VISIBLE_DEVICES0—— 只暴露第一张 GPUCUDA_VISIBLE_DEVICES1,2—— 暴露第二、第三张 GPU。设置后框架与 BentoML Service 都只能“看见”列表中的设备设备索引也会按可见列表重新编号例如只暴露1,2时应用内访问cuda:0实际对应物理 GPU 1。这一机制适合在同一台机器上隔离多个推理服务或配合 Kubernetes 等编排系统按需注入可见设备。进阶workers × GPU 的多进程并行BentoML Service 默认只有一个 worker 进程但可以通过workers参数启动多个。每个 worker 有唯一的worker_index从 1 开始计数结合bentoml.server_context.worker_index - 1即可把不同 GPU 分配给不同 worker实现“每个 worker 独占一张卡”的经典多卡推理布局import bentoml bentoml.service( resources{gpu: 2}, workers2 ) class MyService: def __init__(self): import torch cuda torch.device(fcuda:{bentoml.server_context.worker_index-1}) model models.resnet18(pretrainedTrue) model.to(cuda)该示例中worker 1worker_index 1使用 GPU 0worker 2worker_index 2使用 GPU 1。为什么是减 1因为worker_index是 1 起始的进程编号而硬件设备索引是 0 起始的两者相差 1。这个“一卡一进程”的模式能最大化并行度、提升吞吐并降低单次推理耗时更多关于 workers、cpu_count取值与 GPU 分配组合的细节参见 parallelize-requests.rst。小结与最佳实践清单把 GPU 推理跑通 BentoML核心是“声明 → 安装 → 透传 → 验证”四步声明bentoml.service(resources{gpu: N})写明 GPU 数量云部署时追加gpu_type指定型号合法值见GpuLiteralType安装pip install torch或pip install tensorflow[and-cuda]或通过Image.python_packages(...)在 Bento 构建期装入依赖特殊驱动需求用base_image/system_packages/run定制透传BentoCloud 部署按resources自动分配实例自管 Docker 需安装 NVIDIA Container Toolkit 并用--gpus all或--device挂载 GPU验证watch -n 1 nvidia-smi观察进程显存占用多卡隔离用CUDA_VISIBLE_DEVICES多 worker 场景用worker_index - 1逐卡分配。按这套流程无论是单卡快速验证、多卡多模型隔离还是分布式推理、云上按型号选实例都能在 BentoML 的声明式框架内稳定落地。赞分享模型推理服务人工智能后端大模型MLOpsLLMOps【免费下载链接】BentoMLThe easiest way to serve AI apps and models - Build Model Inference APIs, Job queues, LLM apps, Multi-model pipelines, and more!项目地址https://gitcode.com/gh_mirrors/be/BentoML点击查看免费下载相关推荐gh_mirrors/all/allsky树莓派无线天文相机系统的终极入门指南gh_mirrors/all/allsky树莓派无线天文相机系统的终极入门指南 allsky是一个开源的树莓派无线天文相机系统它能帮助天文爱好者轻松构建属于FLUX.1-dev-Controlnet-Union环境配置指南从CUDA到Python依赖安装FLUX.1 dev Controlnet Union环境配置指南从CUDA到Python依赖安装 你还在为环境配置焦头烂额 深度学习环境配置往往成为开发者30倍加速FlagEmbedding Faiss GPU实战指南从安装到多卡部署30倍加速FlagEmbedding Faiss GPU实战指南从安装到多卡部署 你是否还在为百万级向量检索速度慢而困扰当CPU索引需要10秒返回结果人工智能RAG大模型NLP模型评测上一篇解决OpenInterpreter本地模型执行难题从报错到流畅运行的完整指南下一篇如何永久保存微信聊天记录WeChatMsg为你打造个人专属的数字记忆宝库创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表