
模型推理服務(wù)人工智能后端大模型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 數(shù)量甚至指定 GPU 型號再配合正確的 CUDA 依賴安裝與容器/云平臺運行時設(shè)置即可將模型推理服務(wù)跑在 GPU 上。讀完本文你將掌握單卡與多卡場景下的 Service 編寫方式、BentoCloud 與 Docker 兩種部署形態(tài)的 GPU 分配方法以及用CUDA_VISIBLE_DEVICES精確控制 GPU 可見性的實戰(zhàn)技巧。聲明 GPU 資源Service 層的資源規(guī)格在使用 GPU 跑推理之前第一步是讓 BentoML 知道你的 Service 需要多少 GPU。這一步通過bentoml.service(resources{...})完成resources 是聲明在 Service 上的“資源需求單”在本地運行時它會約束進(jìn)程可用的設(shè)備在云平臺部署時它會作為實例選型的依據(jù)。單卡場景把模型放到 cuda:0當(dāng)機(jī)器上只有一張 GPU 時PyTorch、TensorFlow 等框架默認(rèn)使用cuda:0也可直接寫作cuda。以 PyTorch 為例加載完權(quán)重后調(diào)用.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 # 指定權(quán)重文件的精確路徑 weights_file os.path.join(self.model_path, weight.pt) self.model torch.load(weights_file).to(cuda:0)這里有兩個值得注意的細(xì)節(jié)bentoml.models.HuggingFaceModel(org_name/model_id)與bentoml.models.BentoModel(model_name:latest)都返回模型引用Service 內(nèi)通過os.path.join(self.model_path, ...)拿到權(quán)重文件在本地/容器內(nèi)的真實路徑。二者在源碼中均屬于Model抽象基類見 src/_bentoml_sdk/models/base.py區(qū)別在于前者從 Hugging Face Hub 解析模型后者從 BentoML Model Store 或 BentoCloud 解析已注冊模型。resources{gpu: 1}聲明了 1 個 GPU 需求是后續(xù)一切 GPU 分配邏輯的起點。多卡場景指定設(shè)備或跨卡分布多 GPU 機(jī)器上每張 GPU 都有從 0 開始的索引cuda:0、cuda:1、cuda:2…。你可以把不同模型放到不同 GPU 上實現(xiàn)“一卡一模型”的隔離調(diào)度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 # 指定權(quán)重文件的精確路徑 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如果目標(biāo)是“同一個 worker 使用多張 GPU 做分布式推理”則需借助框架自身的分布式原語PyTorch 提供torch.nn.DataParallel與torch.nn.parallel.DistributedDataParallelTensorFlow 則對應(yīng)其分布式訓(xùn)練/推理 API。這類場景通常還要求結(jié)合 BentoML 的 workers 機(jī)制詳見下文。resources 的源碼定義gpu 與 gpu_type 字段resources并不是一個“魔法字典”它由 BentoML 的ResourceSchema嚴(yán)格校驗。查看 src/_bentoml_sdk/service/config.py 可以發(fā)現(xiàn)它包含以下字段字段取值類型說明cpuint/float/str數(shù)字按核數(shù)解釋1 1 核0.5 半核字符串可帶單位如100m表示 100 毫核memoryint/float/str數(shù)字按 Gi 解釋1 1 GiB字符串可帶單位如512Mi、2Gigpu正浮點數(shù)申請的 GPU 數(shù)量文檔示例中通常為整數(shù)1、2gpu_type枚舉字面量GPU 型號標(biāo)注如nvidia-l4、nvidia-tesla-a100主要作為部署到 BentoCloud 時的實例類型推薦依據(jù)tpu_type枚舉字面量TPU 型號如v4-2x2x1、v5p-2x2x2其中g(shù)pu_type的合法值被定義為GpuLiteralType字面量聯(lián)合當(dāng)前倉庫中覆蓋了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 部署從本地開發(fā)到容器與云平臺聲明好資源后還需要保證運行時環(huán)境里真的裝有帶 CUDA 能力的深度學(xué)習(xí)框架以及 GPU 能被容器/平臺正確透傳。BentoML 的部署路徑主要有三條本地 pip 安裝、BentoCloud 托管、自管 Docker。用 pip 安裝帶 CUDA 的 PyTorch / TensorFlowBentoML 官方推薦直接通過pip安裝 PyTorch 或 TensorFlow 及其 CUDA 依賴?yán)碛捎袃牲c包體積最小只安裝真正需要的組件不額外引入無關(guān)驅(qū)動文件兼容性更好框架發(fā)布版會自動匹配正確的 CUDA 版本避免手工對齊 CUDA 版本號。本地開發(fā)環(huán)境的安裝命令pip install torch pip install tensorflow[and-cuda]構(gòu)建 Bento 時把框架依賴寫進(jìn)Image的python_packages或放進(jìn)獨立的requirements.txt再通過requirements_file()引入?yún)⒁?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如果默認(rèn)鏡像無法滿足需求還可以通過base_image參數(shù)指定自定義 Docker 基礎(chǔ)鏡像用system_packages安裝系統(tǒng)級依賴、用run執(zhí)行自定義命令——這三者正是“定義運行時規(guī)格”的核心手段完整方法清單見 runtime-environment.rst。也就是說CUDA 驅(qū)動與庫的安裝方式完全可控既可以直接信任pip安裝的框架自帶 CUDA 運行時也可以在自定義基礎(chǔ)鏡像層面定制驅(qū)動版本。部署到 BentoCloud按 GPU 型號選實例在 BentoCloud 上部署時把gpu和gpu_type一起寫進(jìn)resources平臺便會據(jù)此分配對應(yīng)規(guī)格的 GPU 實例bentoml.service( resources{ gpu: 1, # 分配的 GPU 數(shù)量 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對應(yīng) CLI 實現(xiàn)中的list_instance_types函數(shù)見 src/bentoml_cli/deployment.py它會調(diào)用云客戶端查詢實例類型列表——這也是上面gpu_type取值要“對號入座”的原因。Service 就緒后一條命令即可完成部署bentoml deploy .更完整的部署步驟參見 create-deployments.rst。自管 DockerNVIDIA Container Toolkit 與 GPU 透傳自管部署時需要先安裝NVIDIA Container Toolkit含 Docker CE 與nvidia-docker的配套安裝容器才能訪問宿主機(jī)的 NVIDIA GPU。先用bentoml containerize構(gòu)建鏡像然后運行在所有可用 GPU 上docker run --gpus all -p 3000:3000 bento_image:latest也可以用device選項精確指定要掛載的設(shè)備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并每秒刷新可以確認(rèn) BentoML Service 是否正在占用 GPU# 每秒刷新一次輸出 watch -n 1 nvidia-smi示例輸出關(guān)鍵信息進(jìn)程列表里能看到你的 BentoML Python 進(jìn)程以及它占用的顯存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| ---------------------------------------------------------------------------------------當(dāng) Service 正在處理推理請求時你會看到 Python 進(jìn)程對應(yīng)的行出現(xiàn)顯著的 GPU 內(nèi)存占用如上例的3328MiBGPU-Util也會隨負(fù)載波動。限制 GPU 可見性CUDA_VISIBLE_DEVICES如果不想讓 Service 使用機(jī)器上的全部 GPU可以設(shè)置環(huán)境變量CUDA_VISIBLE_DEVICES用 GPU 的 ID通常從 0 開始編號限定可見設(shè)備CUDA_VISIBLE_DEVICES0—— 只暴露第一張 GPUCUDA_VISIBLE_DEVICES1,2—— 暴露第二、第三張 GPU。設(shè)置后框架與 BentoML Service 都只能“看見”列表中的設(shè)備設(shè)備索引也會按可見列表重新編號例如只暴露1,2時應(yīng)用內(nèi)訪問cuda:0實際對應(yīng)物理 GPU 1。這一機(jī)制適合在同一臺機(jī)器上隔離多個推理服務(wù)或配合 Kubernetes 等編排系統(tǒng)按需注入可見設(shè)備。進(jìn)階workers × GPU 的多進(jìn)程并行BentoML Service 默認(rèn)只有一個 worker 進(jìn)程但可以通過workers參數(shù)啟動多個。每個 worker 有唯一的worker_index從 1 開始計數(shù)結(jié)合bentoml.server_context.worker_index - 1即可把不同 GPU 分配給不同 worker實現(xiàn)“每個 worker 獨占一張卡”的經(jīng)典多卡推理布局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 起始的進(jìn)程編號而硬件設(shè)備索引是 0 起始的兩者相差 1。這個“一卡一進(jìn)程”的模式能最大化并行度、提升吞吐并降低單次推理耗時更多關(guān)于 workers、cpu_count取值與 GPU 分配組合的細(xì)節(jié)參見 parallelize-requests.rst。小結(jié)與最佳實踐清單把 GPU 推理跑通 BentoML核心是“聲明 → 安裝 → 透傳 → 驗證”四步聲明bentoml.service(resources{gpu: N})寫明 GPU 數(shù)量云部署時追加gpu_type指定型號合法值見GpuLiteralType安裝pip install torch或pip install tensorflow[and-cuda]或通過Image.python_packages(...)在 Bento 構(gòu)建期裝入依賴特殊驅(qū)動需求用base_image/system_packages/run定制透傳BentoCloud 部署按resources自動分配實例自管 Docker 需安裝 NVIDIA Container Toolkit 并用--gpus all或--device掛載 GPU驗證watch -n 1 nvidia-smi觀察進(jìn)程顯存占用多卡隔離用CUDA_VISIBLE_DEVICES多 worker 場景用worker_index - 1逐卡分配。按這套流程無論是單卡快速驗證、多卡多模型隔離還是分布式推理、云上按型號選實例都能在 BentoML 的聲明式框架內(nèi)穩(wěn)定落地。贊分享模型推理服務(wù)人工智能后端大模型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點擊查看免費下載相關(guān)推薦gh_mirrors/all/allsky樹莓派無線天文相機(jī)系統(tǒng)的終極入門指南gh_mirrors/all/allsky樹莓派無線天文相機(jī)系統(tǒng)的終極入門指南 allsky是一個開源的樹莓派無線天文相機(jī)系統(tǒng)它能幫助天文愛好者輕松構(gòu)建屬于FLUX.1-dev-Controlnet-Union環(huán)境配置指南從CUDA到Python依賴安裝FLUX.1 dev Controlnet Union環(huán)境配置指南從CUDA到Python依賴安裝 你還在為環(huán)境配置焦頭爛額 深度學(xué)習(xí)環(huán)境配置往往成為開發(fā)者30倍加速FlagEmbedding Faiss GPU實戰(zhàn)指南從安裝到多卡部署30倍加速FlagEmbedding Faiss GPU實戰(zhàn)指南從安裝到多卡部署 你是否還在為百萬級向量檢索速度慢而困擾當(dāng)CPU索引需要10秒返回結(jié)果人工智能RAG大模型NLP模型評測上一篇解決OpenInterpreter本地模型執(zhí)行難題從報錯到流暢運行的完整指南下一篇如何永久保存微信聊天記錄WeChatMsg為你打造個人專屬的數(shù)字記憶寶庫創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考