使用ROCm和AMD GPU进行机器学习基准测试:复现我们的MLPerf推理提交

Benchmarking Machine Learning using ROCm and AMD GPUs: Reproducing Our MLPerf Inference Submission --- ROCm Blogs

简介

衡量新技术的性能是自古以来的一种实验,常常引人入胜(例如,我们仍然用马力来比较新电动汽车电机的性能)。在迅速发展的机器学习(ML)领域,MLPerf在2018年5月2日由MLCommons成立,迅速成为衡量AI准确性、速度和效率的黄金标准。MLPerf为训练、高性能计算和推理性能提供了基准测试。行业中的公司使用MLPerf的提交结果来评估各种GPU和软件平台的性能,并根据这些结果做出技术采用决策。

最近,使用AMD的Instinct TM MI300X GPU进行了两次竞争性的MLPerf推理提交(一次由AMD完成,另一次由戴尔完成),你可以在这里阅读我们的GPU表现得怎么样。在这篇博客中,我们将一步步展示如何在你自己的环境中,使用ROCm和AMD Instinct TM MI300X GPU复现AMD提交给MLPerf的结果。所以,卷起袖子,开始吧!

MLPerf提交

AMD MLPerf推理v4.1提交包含三个Llama 2 70B的条目。该提交使用了基于ROCm平台和vLLM推理引擎的完全开源软件堆栈。因此,有兴趣的用户可以在AMD的提交基础上构建,并为自己的高性能推理工作负载定制软件堆栈,运行在MI300X GPU上。提交的条目如下:

  1. 8xMI300X与2x AMD EPYC 9374F(Genoa)CPU在"Available"类别中。这一条目展示了市场上可用于AI任务的最佳AMD CPU和GPU组合。

  2. 1xMI300X与2x AMD EPYC 9374F(Genoa)CPU在"Available"类别中。此条目展示了MI300X(192GB)的内存容量,使其能够运行整个Llama 2 70B模型,不像许多竞争条目需要在多个加速器之间分割任务。

  3. 8xMI300X与2x AMD EPYC Turin CPU在"Preview"类别中。此条目展示了AMD下一代CPU如何提升AI任务的性能。

设置

先决条件

要跟随此博客进行操作,您需要以下内容:

有关如何安装 ROCm 的信息,请参阅 [ROCm 快速入门安装指南](Quick start installation guide --- ROCm installation (Linux))。要尝试生成提交中第一个条目的结果,需要设置您的系统,主要有四个步骤:

  • 下载 Llama 2 70B 模型。

  • 下载 MLPerf 指定的数据集以运行推理。

  • 准备 Docker 容器。

  • 将 Llama 2 70B 模型量化为 FP8 格式。

以下是每个步骤的详细说明。

模型准备

按照 MLcommons Github 库中 [获取模型部分]的说明,将 Llama 2 70B 模型权重下载到文件系统中的某个位置。

设置环境变量 $LAB_MODEL 为模型权重目录的路径:

bash 复制代码
export LAB_MODEL="<path to model weight>"

数据集准备

根据 MLCommons GitHub 仓库中获取数据集部分的说明,下载与 Llama 2 70B 模型相关的预处理数据集文件。

$LAB_DATASET 环境变量设置为指向数据集目录中的 open_orca 目录。

bash 复制代码
export LAB_DATASET="<path to dataset>/open_orca/"

AMD MLPerf 推理 Docker 容器设置

要构建运行推理的 Docker 容器,请克隆与本文相关的仓库并切换到 src/docker 目录:

bash 复制代码
git clone https://github.com/ROCm/rocm-blogs.git
cd rocm-blogs/blogs/artificial-intelligence/mlperf-inf-4-1/src/docker

使用以下命令构建 Docker 镜像并启动容器。设置环境变量 $LAB_HIST 以指向将存储基准测试输出的目录。

python 复制代码
# set env variable LAB_HIST
export LAB_HIST="<path to the output>"

# Build the image `mlperf/llama_inference:latest`
./build_llama2.sh

# Launch a docker container
docker run -it --ipc=host --network=host --privileged --cap-add=CAP_SYS_ADMIN --device=/dev/kfd --device=/dev/dri --device=/dev/mem \
    --group-add render --cap-add=SYS_PTRACE --security-opt seccomp=unconfined \
    -v ${LAB_MODEL}:/data/llm/llama2-70b-chat \
    -v ${LAB_DATASET}:/data/open_orca \
    -v ${LAB_HIST}:/lab-hist \
    -e LAB_CLOG=/lab-hist/mlperf-results \
    mlperf/llama_inference:latest

量化准备

提交的一个重要组成部分是量化模型以利用 MI300X 的 FP8 支持。使用 Quark 将 Llama 2 70B 聊天模型量化为 OCP FP8-e4m3 格式,使用 MLPerf 要求的校准数据集进行量化。Quark 是 AMD 开发的深度学习模型量化工具包,用于从 PyTorch、ONNX 和其他框架量化模型。

在推理容器中运行以下命令量化模型:

bash 复制代码
model_dir=/data/llm/llama2-70b-chat
output_dir=/data/llm/llama2-70b-chat/quantized/quark_share/modelzoo/llama2_70b_wfp8_afp8_ofp8_nomerge/json-safetensors/
calib_dataset=/data/open_orca/open_orca_gpt4_tokenized_llama.calibration_1000.pkl.gz

cd /lab-mlperf-inference/code/llama2-70b-99.9/tools/quark-0.1.0+a9827f5-mlperf/examples/torch/language_modeling/

python3 quantize_quark.py --model_dir $model_dir \
    --output_dir $output_dir \
    --quant_scheme w_fp8_a_fp8_o_fp8 \
    --dataset $calib_dataset \
    --num_calib_data 1000 \
    --model_export vllm_adopted_safetensors \
    --no_weight_matrix_merge

注意

在容器中量化模型权重时使用的特定 KV 缓存缩放比例是经过优化的,与 vLLM 仓库中的主流版本不同。可以在 GitHub 中的这个提交中找到。

生成结果

要生成我们提交的第一个条目的结果,请在推理容器中运行以下命令。推理的日志和结果可以在容器中的目录 /lab-hist/mlperf-results/<time-stamp> 下找到。

bash 复制代码
cd /lab-mlperf-inference/code/llama2-70b-99.9/test_VllmFp8
./run_scenarios.sh

在离线场景中的结果摘要可以在 Offline/performance/run_1 文件夹下的 mlperf_log_summary.txt 文件中找到:

bash 复制代码
more /lab-hist/mlperf-results/<time-stamp>/Offline/performance/run_1/mlperf_log_summary.txt
bash 复制代码
================================================
MLPerf Results Summary
================================================
SUT name : PySUT
Scenario : Offline
Mode     : PerformanceOnly
Samples per second: 80.2353
Tokens per second: 23545.5
Result is : VALID
  Min duration satisfied : Yes
  Min queries satisfied : Yes
  Early stopping satisfied: Yes
...

在此次特定试验中,我们记录了每秒 23,545.5 个 token(未验证),这一结果与提交中记录的结果(每秒 23,514.80 个 token)相匹配。

在服务器场景中的结果摘要可以在 Server/performance/run_1/ 文件夹下的 mlperf_log_summary.txt 文件中找到:

bash 复制代码
more /lab-hist/mlperf-results/<time-stamp>/Server/performance/run_1/mlperf_log_summary.txt
bash 复制代码
================================================
MLPerf Results Summary
================================================
SUT name : PySUT
Scenario : Server
Mode     : PerformanceOnly
Completed samples per second    : 69.11
Completed tokens per second: 20360.10
Result is : VALID
  Performance constraints satisfied : Yes
  Min duration satisfied : Yes
  Min queries satisfied : Yes
  Early stopping satisfied: Yes
TTFT Early Stopping Result:
 * Run successful.
TPOT Early Stopping Result:
 * Run successful.
...

在此次特定试验中,我们记录了每秒 20,360.10 个已完成的 token(未验证),这一结果与提交中该场景下的结果(每秒 21,028.20 个 token)相当。

您还可以只针对离线场景或只针对服务器场景生成结果。要仅运行离线场景,请使用 run_tests_Offline.sh。要仅运行服务器场景,请使用 run_tests_Server.sh

总结

在这篇博客文章中,我们向您展示了如何使用 MI300X 自行复现 AMD 以 Llama 2 70B 模型提交的 MLPerf 推理结果。您可以在Benchmark MLPerf Inference: Datacenter | MLCommons V3.1找到 MLPerf 结果。请注意,由于每次运行中的硬件配置和状态可能有所不同,具体结果可能会与提交的结果有所偏差。我们鼓励您在我们的基础上进一步优化工作负载,使用 MI300X 和 ROCm。

相关推荐
静静AI学堂4 分钟前
Yolo11改策略:卷积改进|SAC,提升模型对小目标和遮挡目标的检测性能|即插即用
人工智能·深度学习·目标跟踪
martian66527 分钟前
【人工智能离散数学基础】——深入详解数理逻辑:理解基础逻辑概念,支持推理和决策系统
人工智能·数理逻辑·推理·决策系统
Schwertlilien28 分钟前
图像处理-Ch7-图像金字塔和其他变换
图像处理·人工智能
凡人的AI工具箱34 分钟前
每天40分玩转Django:Django类视图
数据库·人工智能·后端·python·django·sqlite
千天夜40 分钟前
深度学习中的残差网络、加权残差连接(WRC)与跨阶段部分连接(CSP)详解
网络·人工智能·深度学习·神经网络·yolo·机器学习
一勺汤41 分钟前
YOLOv8模型改进 第二十五讲 添加基于卷积调制(Convolution based Attention) 替换自注意力机制
深度学习·yolo·计算机视觉·模块·yolov8·yolov8改进·魔改
凡人的AI工具箱44 分钟前
每天40分玩转Django:实操图片分享社区
数据库·人工智能·后端·python·django
小军军军军军军1 小时前
MLU运行Stable Diffusion WebUI Forge【flux】
人工智能·python·语言模型·stable diffusion
cwtlw1 小时前
CSS学习记录20
前端·css·笔记·学习
诚威_lol_中大努力中1 小时前
关于VQ-GAN利用滑动窗口生成 高清图像
人工智能·神经网络·生成对抗网络