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

本文主要是介绍使用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任务的性能。

设置

先决条件

要跟随此博客进行操作,您需要以下内容:
- 8 个 [MI300X AMD GPU](AMD Instinct™ MI300X Accelerators)。
- ROCm 6.1.0 或更高版本。
- 任意 [ROCm 支持的 Linux 发行版](System requirements (Linux) — ROCm installation (Linux))。
有关如何安装 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 为模型权重目录的路径:

export LAB_MODEL="<path to model weight>"

数据集准备

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

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

export LAB_DATASET="<path to dataset>/open_orca/"

AMD MLPerf 推理 Docker 容器设置

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

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

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

# 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 和其他框架量化模型。

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

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.gzcd /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> 下找到。

cd /lab-mlperf-inference/code/llama2-70b-99.9/test_VllmFp8
./run_scenarios.sh

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

more /lab-hist/mlperf-results/<time-stamp>/Offline/performance/run_1/mlperf_log_summary.txt
================================================
MLPerf Results Summary
================================================
SUT name : PySUT
Scenario : Offline
Mode     : PerformanceOnly
Samples per second: 80.2353
Tokens per second: 23545.5
Result is : VALIDMin duration satisfied : YesMin queries satisfied : YesEarly stopping satisfied: Yes
...

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

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

more /lab-hist/mlperf-results/<time-stamp>/Server/performance/run_1/mlperf_log_summary.txt
================================================
MLPerf Results Summary
================================================
SUT name : PySUT
Scenario : Server
Mode     : PerformanceOnly
Completed samples per second    : 69.11
Completed tokens per second: 20360.10
Result is : VALIDPerformance constraints satisfied : YesMin duration satisfied : YesMin queries satisfied : YesEarly 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。

这篇关于使用ROCm和AMD GPU进行机器学习基准测试:复现我们的MLPerf推理提交的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1129027

相关文章

Java中流式并行操作parallelStream的原理和使用方法

《Java中流式并行操作parallelStream的原理和使用方法》本文详细介绍了Java中的并行流(parallelStream)的原理、正确使用方法以及在实际业务中的应用案例,并指出在使用并行流... 目录Java中流式并行操作parallelStream0. 问题的产生1. 什么是parallelS

Linux join命令的使用及说明

《Linuxjoin命令的使用及说明》`join`命令用于在Linux中按字段将两个文件进行连接,类似于SQL的JOIN,它需要两个文件按用于匹配的字段排序,并且第一个文件的换行符必须是LF,`jo... 目录一. 基本语法二. 数据准备三. 指定文件的连接key四.-a输出指定文件的所有行五.-o指定输出

Linux jq命令的使用解读

《Linuxjq命令的使用解读》jq是一个强大的命令行工具,用于处理JSON数据,它可以用来查看、过滤、修改、格式化JSON数据,通过使用各种选项和过滤器,可以实现复杂的JSON处理任务... 目录一. 简介二. 选项2.1.2.2-c2.3-r2.4-R三. 字段提取3.1 普通字段3.2 数组字段四.

Linux kill正在执行的后台任务 kill进程组使用详解

《Linuxkill正在执行的后台任务kill进程组使用详解》文章介绍了两个脚本的功能和区别,以及执行这些脚本时遇到的进程管理问题,通过查看进程树、使用`kill`命令和`lsof`命令,分析了子... 目录零. 用到的命令一. 待执行的脚本二. 执行含子进程的脚本,并kill2.1 进程查看2.2 遇到的

详解SpringBoot+Ehcache使用示例

《详解SpringBoot+Ehcache使用示例》本文介绍了SpringBoot中配置Ehcache、自定义get/set方式,并实际使用缓存的过程,文中通过示例代码介绍的非常详细,对大家的学习或者... 目录摘要概念内存与磁盘持久化存储:配置灵活性:编码示例引入依赖:配置ehcache.XML文件:配置

Java 虚拟线程的创建与使用深度解析

《Java虚拟线程的创建与使用深度解析》虚拟线程是Java19中以预览特性形式引入,Java21起正式发布的轻量级线程,本文给大家介绍Java虚拟线程的创建与使用,感兴趣的朋友一起看看吧... 目录一、虚拟线程简介1.1 什么是虚拟线程?1.2 为什么需要虚拟线程?二、虚拟线程与平台线程对比代码对比示例:三

k8s按需创建PV和使用PVC详解

《k8s按需创建PV和使用PVC详解》Kubernetes中,PV和PVC用于管理持久存储,StorageClass实现动态PV分配,PVC声明存储需求并绑定PV,通过kubectl验证状态,注意回收... 目录1.按需创建 PV(使用 StorageClass)创建 StorageClass2.创建 PV

Redis 基本数据类型和使用详解

《Redis基本数据类型和使用详解》String是Redis最基本的数据类型,一个键对应一个值,它的功能十分强大,可以存储字符串、整数、浮点数等多种数据格式,本文给大家介绍Redis基本数据类型和... 目录一、Redis 入门介绍二、Redis 的五大基本数据类型2.1 String 类型2.2 Hash

Redis中Hash从使用过程到原理说明

《Redis中Hash从使用过程到原理说明》RedisHash结构用于存储字段-值对,适合对象数据,支持HSET、HGET等命令,采用ziplist或hashtable编码,通过渐进式rehash优化... 目录一、开篇:Hash就像超市的货架二、Hash的基本使用1. 常用命令示例2. Java操作示例三

Linux创建服务使用systemctl管理详解

《Linux创建服务使用systemctl管理详解》文章指导在Linux中创建systemd服务,设置文件权限为所有者读写、其他只读,重新加载配置,启动服务并检查状态,确保服务正常运行,关键步骤包括权... 目录创建服务 /usr/lib/systemd/system/设置服务文件权限:所有者读写js,其他