拓冰建站拓冰建站
首页 / 资讯中心 / 正文

AMD MI355X大模型推理实战:基于vLLM与Llama-3-70B的性能部署指南

最近在部署大模型推理服务时很多开发者都面临一个核心痛点如何在有限的预算下获得最佳的推理吞吐量和延迟尤其是在面对动辄数十亿参数的大模型时硬件选择往往决定了项目的成败。过去NVIDIA的GPU几乎是唯一选择但如今随着AMD Instinct系列加速卡的持续发力特别是MI300系列市场格局正在悄然改变。本文将深入探讨AMD MI355XInstinct MI300X OAM模组在LLM推理场景下的性能表现并与NVIDIA B200进行横向对比。更重要的是我们将结合vLLM这一当前最流行的大模型推理框架提供一套从环境搭建、驱动配置到性能测试的完整实战指南。无论你是正在评估硬件选型的架构师还是需要亲手部署服务的工程师这篇文章都能为你提供直接的参考和可复现的代码。1. 背景与核心概念为什么关注AMD MI300X与推理性能在深入实战之前我们有必要厘清几个关键概念理解这场性能竞赛背后的技术驱动力。大模型推理LLM Inference指的是将训练好的大型语言模型如Llama、Qwen、ChatGLM部署上线处理用户输入并生成文本的过程。与训练阶段不同推理阶段对硬件的需求核心在于低延迟Latency和高吞吐量Throughput。延迟影响单次请求的响应速度吞吐量决定单位时间内能处理的请求总数。vLLMVectorized Large Language Model serving是一个专为高效LLM推理和服务而设计的高吞吐量、低延迟推理引擎。它的核心创新在于PagedAttention算法和高效的内存管理机制能够显著减少KV Cache的内存浪费从而在相同硬件上支持更大的批次batch size和更长的序列长度直接提升吞吐量。目前vLLM已成为业界部署LLM服务的首选框架之一。AMD Instinct MI300X是AMD推出的专为AI和HPC工作负载设计的加速器。MI355X是其OAMOCP Accelerator Module封装形式。它基于先进的CDNA 3架构集成了高达192GB的HBM3内存内存带宽达到5.3TB/s。巨大的内存容量和带宽对于需要加载庞大参数和存储KV Cache的大模型推理至关重要。NVIDIA B200是NVIDIA基于Blackwell架构的最新旗舰GPU同样针对AI计算进行了深度优化。它和MI300X是当前AI加速器市场最顶尖的竞争对手。那么为什么MI355X的推理性能值得关注传统上NVIDIA凭借其CUDA生态建立了极高的壁垒。然而AMD通过ROCm开源软件栈正在快速追赶。对于推理场景尤其是vLLM这类高度优化的引擎硬件的内存容量、内存带宽和计算单元效率是决定性因素。MI355X在内存规格上的优势使其在处理超大规模模型如700B参数或需要极长上下文时具备了理论上的优势。本文将验证这一理论优势在实际vLLM部署中能转化为多少实际性能提升。2. 环境准备搭建AMD ROCm与vLLM测试平台性能测试的前提是一个稳定、配置正确的软件环境。本节将详细说明在Ubuntu系统上为AMD MI355X配置ROCm驱动和vLLM的完整步骤。2.1 硬件与操作系统要求加速卡AMD Instinct MI355X (MI300X OAM) 或 MI300A。本文指令主要针对MI300系列。主机系统推荐使用Ubuntu 22.04.3 LTS或Ubuntu 20.04.5 LTS。这是ROCm官方支持最完善的系统版本。系统要求CPU需支持PCIe Gen4或更高。系统内存建议不少于512GB以应对模型加载和数据处理。确保主板BIOS中已启用Above 4G Decoding和SR-IOV如果使用虚拟化。网络如需从Hugging Face下载模型需保证网络通畅。2.2 安装AMD ROCm驱动与工具链ROCm是AMD的开放软件平台相当于NVIDIA的CUDA Toolkit。以下步骤在Ubuntu 22.04上进行。添加ROCm仓库并安装内核驱动 首先添加ROCm的APT仓库并安装必要的内核模块和用户态驱动。# 1. 添加ROCm官方GPG密钥 wget -q -O - https://repo.radeon.com/rocm/rocm.gpg.key | sudo apt-key add - # 2. 添加ROCm APT仓库 (针对Ubuntu 22.04) echo deb [archamd64] https://repo.radeon.com/rocm/apt/6.1.2 jammy main | sudo tee /etc/apt/sources.list.d/rocm.list # 3. 更新软件包列表并安装 sudo apt update sudo apt install rocm-hip-sdk rocm-dkms注意6.1.2是ROCm的版本号请根据你使用的MI355X卡和vLLM兼容性要求查阅 ROCm官方文档 选择合适版本。MI300系列需要ROCm 6.0及以上版本。将用户添加到render和video组 这一步是为了让非root用户有权访问GPU设备。sudo usermod -a -G render,video $LOGNAME执行后需要注销并重新登录或重启系统使组变更生效。验证ROCm安装 安装完成后使用rocminfo和rocm-smi命令验证GPU是否被正确识别。# 查看ROCm设备信息 rocminfo # 查看GPU状态类似nvidia-smi rocm-smi如果安装成功rocm-smi会显示MI355X的设备信息、温度、功耗和内存使用情况。2.3 配置Python环境与安装vLLM为了避免系统Python环境混乱强烈建议使用Conda或venv创建独立的虚拟环境。创建并激活Conda环境# 安装Miniconda (如果未安装) # wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh # bash Miniconda3-latest-Linux-x86_64.sh # 创建名为vllm_amd的Python 3.10环境 conda create -n vllm_amd python3.10 -y conda activate vllm_amd安装PyTorch with ROCm vLLM依赖于PyTorch。必须安装与ROCm版本对应的PyTorch。# 示例为ROCm 6.1安装PyTorch。请访问 https://pytorch.org/get-started/locally/ 获取最新命令。 pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/rocm6.1安装vLLM 安装支持AMD GPU的vLLM版本。推荐从源码安装以获得最新特性和更好的兼容性。# 克隆vLLM仓库 git clone https://github.com/vllm-project/vllm.git cd vllm # 安装vLLM及其依赖 (使用--no-deps避免覆盖刚安装的PyTorch) pip install -e . --no-deps # 或者直接安装预编译的wheel包 (版本可能滞后) # pip install vllm验证vLLM能否识别AMD GPU 运行一个简单的Python脚本进行验证。# 文件test_gpu.py import torch from vllm import LLM print(fPyTorch version: {torch.__version__}) print(fPyTorch ROCm support: {torch.cuda.is_available()}) # 在ROCm上这个函数也可能返回True print(fAvailable devices: {torch.cuda.device_count()}) # 尝试初始化一个微型模型来测试vLLM try: # 使用一个非常小的模型进行测试例如tiny-random/Llama-2-7b需要先huggingface-cli login # 或者直接测试设备 llm LLM(modelfacebook/opt-125m, tokenizerfacebook/opt-125m, devicecuda) # vLLM 会自动使用ROCm print(vLLM initialization successful!) except Exception as e: print(fvLLM initialization failed: {e})执行python test_gpu.py。如果成功输出设备信息且没有报错说明环境基本配置成功。3. 核心原理与配置调优理解vLLM在AMD GPU上的工作方式要让vLLM在MI355X上发挥最佳性能需要理解其关键机制并进行针对性配置。3.1 vLLM的核心PagedAttention与内存管理vLLM性能飞跃的关键在于PagedAttention。传统Attention计算时每个序列的KV Cache需要连续内存导致内存碎片化无法充分利用GPU内存。PagedAttention借鉴操作系统虚拟内存分页的思想将KV Cache划分为固定大小的块pages这些块可以非连续地存储在物理内存中。对于MI355X这类拥有超大HBM容量192GB的加速卡PagedAttention的优势更加明显更高的内存利用率几乎可以消除内存碎片将模型参数和KV Cache几乎填满整个192GB内存从而支持更大的批处理大小batch size或更长的上下文长度。高效的共享对于提示词prompt相同的大量请求vLLM可以跨多个序列共享其KV Cache页面极大减少重复计算。3.2 vLLM关键启动参数解析通过vllm.LLM或命令行vllm serve启动服务时以下参数对性能影响巨大--tensor-parallel-size 张量并行度。对于MI355X通常设置为物理GPU卡的数量。例如单卡设为1。--block-size PagedAttention中块的大小。默认是16。对于长上下文可以适当增大如32以减少块表开销但会增加内存浪费。需要根据模型和序列长度权衡。--gpu-memory-utilization 允许vLLM使用的GPU内存比例。对于MI355X可以设置得较高如0.95以充分利用192GB内存。但需为系统和其它进程预留少量空间。--max-num-batched-tokens 调度器一次处理的最大token数。这是控制吞吐量和延迟的关键。增加此值可以提高吞吐但可能增加单个请求的延迟。需要根据实际负载测试找到平衡点。--dtype 模型加载的数据类型。auto默认会尝试使用halfFP16。为了在MI355X上获得最佳性能可以尝试使用bfloat16如果模型支持因为它在MI300系列上有更好的硬件支持。--quantization 量化方法。如awq,gptq,squeezellm。量化可以显著减少内存占用从而运行更大的模型或更大的批次但可能会轻微损失精度。MI355X的大内存使其在不量化的情况下运行70B模型成为可能这是其相对B200的一个优势场景。3.3 AMD ROCm特定优化点FlashAttention-2 vLLM支持FlashAttention-2它能大幅加速Attention计算。确保在源码编译vLLM时启用了FlashAttention-2支持。ROCm对FlashAttention-2有持续优化。HipGraphs ROCm的图形捕获功能类似于CUDA Graphs可以减少内核启动开销。vLLM在某些版本中开始实验性支持。使用HSA_OVERRIDE_GFX_VERSION 对于MI300系列可能需要设置此环境变量来确保编译器针对正确的GPU架构生成代码。export HSA_OVERRIDE_GFX_VERSION11.0.04. 完整实战部署并测试Llama-3-70B模型我们以Meta最新开源的Llama-3-70B-Instruct模型为例演示如何在MI355X单卡上部署并与假想的B200环境进行性能对比测试。4.1 准备模型权重访问Hugging Face Model Hub的 Meta-Llama-3-70B-Instruct 页面。接受许可协议。使用Hugging Face CLI登录并下载模型确保你有足够的磁盘空间约140GB。huggingface-cli login huggingface-cli download meta-llama/Meta-Llama-3-70B-Instruct --local-dir ./models/Meta-Llama-3-70B-Instruct --local-dir-use-symlinks False4.2 启动vLLM离线推理API服务器我们将使用vLLM内置的高性能API服务器它兼容OpenAI API协议。# 在vllm虚拟环境中执行 conda activate vllm_amd # 启动服务器关键参数针对MI355X优化 python -m vllm.entrypoints.openai.api_server \ --model ./models/Meta-Llama-3-70B-Instruct \ --tensor-parallel-size 1 \ --gpu-memory-utilization 0.93 \ --max-num-batched-tokens 16384 \ --block-size 32 \ --dtype bfloat16 \ --served-model-name llama-3-70b \ --port 8000参数解释--model: 指定本地模型路径。--tensor-parallel-size 1: 单卡运行。--gpu-memory-utilization 0.93: 使用约179GB的GPU内存为系统预留空间。--max-num-batched-tokens 16384: 调度器每轮处理最多16384个token平衡吞吐与延迟。--block-size 32: 针对70B大模型和可能的长上下文使用稍大的块大小。--dtype bfloat16: 使用BF16精度在MI355X上性能更好且内存占用仅为FP16的一半。服务器启动后会加载模型至GPU内存。对于70B模型加载时间可能较长。4.3 编写性能测试脚本我们编写一个Python客户端脚本模拟并发请求测试吞吐量Tokens/Second和延迟Time to First Token, TTFT。# 文件benchmark_mi355x.py import asyncio import aiohttp import time import statistics from typing import List, Dict async def send_request(session: aiohttp.ClientSession, prompt: str, request_id: int): 发送单个请求到vLLM服务器 url http://localhost:8000/v1/completions headers {Content-Type: application/json} payload { model: llama-3-70b, prompt: prompt, max_tokens: 128, # 每个请求生成128个token temperature: 0.0, stream: False # 非流式便于计算总时间 } start_time time.perf_counter() try: async with session.post(url, jsonpayload, headersheaders) as response: result await response.json() end_time time.perf_counter() latency end_time - start_time if choices in result: generated_text result[choices][0][text] token_count len(generated_text.split()) # 粗略估算token数 return {id: request_id, latency: latency, tokens: token_count, success: True} else: print(fRequest {request_id} failed: {result}) return {id: request_id, latency: latency, tokens: 0, success: False} except Exception as e: print(fRequest {request_id} exception: {e}) return {id: request_id, latency: 0, tokens: 0, success: False} async def benchmark(concurrent_clients: int, total_requests: int, prompt: str): 执行基准测试 connector aiohttp.TCPConnector(limit0) # 不限制连接数 async with aiohttp.ClientSession(connectorconnector) as session: tasks [] request_id 0 # 创建第一批并发任务 for _ in range(min(concurrent_clients, total_requests)): tasks.append(send_request(session, prompt, request_id)) request_id 1 results [] start_test_time time.perf_counter() while tasks: done, pending await asyncio.wait(tasks, return_whenasyncio.FIRST_COMPLETED) for task in done: result await task results.append(result) # 如果还有请求需要发送则补充一个新任务 if request_id total_requests: new_task send_request(session, prompt, request_id) pending.add(new_task) request_id 1 tasks pending end_test_time time.perf_counter() total_test_duration end_test_time - start_test_time # 分析结果 successful_results [r for r in results if r[success]] latencies [r[latency] for r in successful_results] total_tokens sum([r[tokens] for r in successful_results]) print(f\n Benchmark Results (Concurrent{concurrent_clients}, Requests{total_requests}) ) print(fSuccessful requests: {len(successful_results)}/{len(results)}) print(fTotal test duration: {total_test_duration:.2f} seconds) print(fTotal tokens generated: {total_tokens}) print(fThroughput: {total_tokens / total_test_duration:.2f} tokens/second) if latencies: print(fAverage latency: {statistics.mean(latencies):.2f} seconds) print(fP95 latency: {np.percentile(latencies, 95):.2f} seconds) if len(latencies) 1 else print(fMax latency: {max(latencies):.2f} seconds) if __name__ __main__: # 测试参数 CONCURRENT_CLIENTS 8 # 并发用户数 TOTAL_REQUESTS 100 # 总请求数 TEST_PROMPT 请用中文解释一下量子计算的基本原理。 # 测试提示词 asyncio.run(benchmark(CONCURRENT_CLIENTS, TOTAL_REQUESTS, TEST_PROMPT))4.4 运行测试并解读结果确保vLLM服务器正在运行。在另一个终端运行基准测试脚本python benchmark_mi355x.py观察输出结果。关键指标是Throughput (tokens/second)和Average latency。性能对比分析思路模拟 假设我们在AMD MI355X单卡和NVIDIA B200单卡上使用完全相同的vLLM版本、模型Llama-3-70B、参数配置和测试脚本进行测试。场景一内存容量受限下的最大批次处理MI355X (192GB HBM3) 可能在不启用量化的情况下直接以BF16精度加载70B模型约140GB并留有约50GB空间用于KV Cache。这允许它设置一个非常大的--max-num-batched-tokens从而在高吞吐量场景下如批量处理大量用户查询表现优异。B200 (假设配置高显存版本) 如果其显存小于192GB则可能需要对70B模型进行量化如AWQ/GPTQ才能运行或者无法支持同样大的批处理大小。量化会引入轻微精度损失并可能增加计算开销。场景二长上下文推理当请求的上下文长度极长如128K tokens时KV Cache占用内存巨大。MI355X的大内存可以容纳更多的PagedAttention块减少换入换出从而在处理超长文本时保持更稳定的延迟和更高的吞吐。实际性能数据需实测吞吐量 在并发请求下MI355X凭借大内存支持的大批次可能取得更高的总体吞吐量tokens/sec。首Token延迟TTFT 受内存带宽和计算单元效率影响。MI355X的5.3TB/s超高内存带宽有助于快速加载参数和Cache可能带来极具竞争力的TTFT。每Token延迟 生成阶段的速度更依赖于计算核心的效率和软件优化。结论 根据网络上的相关测试与讨论参考“AMD MI355X 推理性能超越 B200”这一主题MI355X在部分LLM推理基准测试中尤其是需要大内存容量或大批次处理的场景下其性能表现已经达到甚至超越了同期的顶级竞品。其核心优势在于巨大的HBM3内存容量和带宽与vLLM的PagedAttention内存管理形成了完美互补。5. 常见问题与排查思路在AMD GPU上部署vLLM可能会遇到一些特有问题以下是常见问题的排查指南。问题现象可能原因排查步骤与解决方案rocm-smi找不到设备1. ROCm驱动未安装或安装失败。2. 用户未加入render和video组。3. 系统内核版本不兼容。1. 检查/dev/kfd和/dev/dri/renderD*设备文件是否存在。2. 运行groups确认当前用户组。3. 查看dmesg | grep -i amd|kfd检查内核错误。4. 尝试安装ROCm DKMS版本或使用官方支持的系统版本。vLLM导入错误或运行时报HIP错误1. PyTorch ROCm版本与系统ROCm版本不匹配。2. vLLM版本与PyTorch/ROCm不兼容。3. 环境变量未设置。1. 确保PyTorch是从ROCm官方索引安装的。2. 尝试从vLLM源码编译安装。3. 设置export HCC_AMDGPU_TARGETgfx90a对于MI300A或export HSA_OVERRIDE_GFX_VERSION11.0.0对于MI300X。模型加载速度极慢或内存不足1. 模型权重未下载完整或损坏。2.--gpu-memory-utilization设置过高系统OOM。3. 系统内存RAM不足导致交换分区频繁使用。1. 使用huggingface-cli的--local-dir-use-symlinks False选项确保文件完整。2. 降低--gpu-memory-utilization如0.85。3. 使用free -h检查系统内存确保有足够空闲内存。推理速度远低于预期1. 未使用FlashAttention-2。2.--block-size或--max-num-batched-tokens设置不合理。3. 模型精度dtype不是最优如使用FP32。4. CPU成为瓶颈如tokenizer处理。1. 确认vLLM安装时是否编译了FlashAttention-2支持。2. 使用性能分析工具如rocprof定位热点。3. 尝试使用bfloat16。4. 使用vllm.entrypoints.openai.api_server的--disable-log-requests减少日志开销。vllm serve输出不一致1. 未设置随机种子导致采样结果随机。2. 使用了temperature 0或top_p。3. 可能存在精度差异BF16 vs FP16。1. 在请求中设置seed: 42。2. 对于确定性输出设置temperature: 0.0。3. 确保测试时使用相同的dtype和硬件。6. 最佳实践与工程建议基于MI355X和vLLM的部署经验总结以下工程实践要点版本固化与环境隔离AI软件栈迭代迅速生产环境务必严格记录所有组件的版本ROCm版本、PyTorch版本、vLLM commit哈希、Python版本、模型版本。使用Conda或Docker将整个环境打包确保可复现性。AMD官方提供包含ROCm的Docker镜像。监控与告警使用rocm-smi定期监控GPU利用率、内存使用、温度和功耗。集成PrometheusGrafana利用vLLM的指标端点--metrics-port收集推理延迟、吞吐量、队列长度等业务指标。为GPU内存使用率、温度设置告警阈值。模型量化策略MI355X优势场景 由于其大内存对于70B及以下模型可以优先考虑不量化以保持最佳精度和简化部署流程。追求极致吞吐 如果需要运行更大的模型如未来可能的140B或追求极致的并发能力可以采用GPTQ/AWQ INT4量化能在精度损失极小的情况下将内存占用减半从而将吞吐量提升近一倍。多卡部署与推理优化张量并行Tensor Parallelism 对于单卡无法装载的巨型模型如Llama-3-405B可以使用多张MI355X通过--tensor-parallel-size进行张量并行推理。vLLM对此有良好支持。流水线并行与模型分片 对于超大规模模型可研究结合vLLM与DeepSpeed或Megatron-LM进行更复杂的分布式推理。生产环境服务化使用vllm.entrypoints.openai.api_server作为后端搭配Nginx进行负载均衡和反向代理。考虑使用vLLM的离线批处理功能对大量静态提示词进行预处理生成KV Cache并缓存可极大提升在线推理效率。制定模型更新和回滚策略利用vLLM的--model参数可以快速切换模型版本。AMD MI355X凭借其卓越的硬件规格结合vLLM这类高度优化的推理引擎正在为大模型推理赛道提供一个新的高性能选择。对于受限于GPU内存的推理任务它是一个强有力的竞争者。成功的部署离不开细致的环境配置、深入理解的参数调优以及系统的工程化实践。建议读者在评估时务必基于自身的实际模型、流量模式和延迟要求进行全面的基准测试。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门