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

news2024/11/15 17:22:54

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

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 : 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 文件中找到:

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 : 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。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2094108.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Session 运行机制详解:从创建到销毁

Session 运行机制详解&#xff1a;从创建到销毁 一、Session的创建二、Session的维持三、Session的销毁 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在Web开发中&#xff0c;Session机制是实现用户会话跟踪的重要手段。它允许服务器在多…

linux 9系统分区扩容

1.可以看到我的是9.2的系统&#xff0c;系统分区&#xff1a;/dev/mapper/rl-root 83G 8.0G 75G 10% / 2.接下来&#xff0c;我们新增一块新的硬盘&#xff0c;而不是直接对这个硬盘的基础上再扩容。 关机&#xff0c;加30G硬盘&#xff0c;再开机 fdisk -l fdisk /dev/…

29 路由工作原理

路由工作原理 一、理解路由工作原理 &#xff08;一&#xff09;什么是路由 ​ 将数据包从一个网络发送到另一个网络 ​ 需要依靠路由器 ​ 来完成路由器只关心网络的状态&#xff0c;决定最佳路径 &#xff08;二&#xff09;路由器工作原理 ​ 主要完成下列事情&#…

c++算法第一天

温馨提示&#xff1a;本篇文章适合刚开始练算法的小白&#xff0c;大佬若见勿嘲 、 题目 核心提取 1.所有的0移动到数组末尾 2.不能复制数组 解题思路 遇到0,cur,非0则先dest1,再交换&#xff0c;最后cur。 代码编写 温馨提示&#xff1a;这里的指针可以使用下标代替 …

nefu暑假集训4 哈希 个人模板+例题汇总

前言&#xff1a; 什么是哈希&#xff1f;哈希其实是所有字符串操作中&#xff0c;最简单的操作了&#xff08;哈希的过程&#xff0c;其实可以看作对一个串的单向加密过程&#xff0c;并且需要保证所加的密不能高概率重复&#xff08;就像不能让隔壁老王轻易地用它家的钥匙打开…

室分(室内分布系统)主要器件

室分&#xff0c;即室内分布系统&#xff0c;是一种将基站信号引入室内&#xff0c;并对信号进行分布和覆盖的系统。它主要用于解决室内通信信号覆盖不足的问题&#xff0c;提高室内通信质量。室分系统通常由信号源、传输系统、分布系统和天线等部分组成&#xff0c;可以实现对…

java计算机毕设课设—JSP企业快信系统(附源码、文章、相关截图、部署视频)

这是什么系统&#xff1f; java计算机毕设课设—JSP企业快信系统(附源码、文章、相关截图、部署视频) 详细的资源获取方式在最下方 JSP企业快信系统是一款专为企业内部及外部通信设计的小型企业通信软件&#xff0c;旨在解决企业在日常沟通中遇到的信息传递不及时、沟通不畅…

火绒安全与国际对手:全面对比与分析

目录 一、产品功能与技术特性对比 火绒安全 360安全卫士 卡巴斯基安全软件 二、市场表现与用户评价 火绒安全 360安全卫士 卡巴斯基安全软件 三、未来挑战与发展 技术与服务对比表格 结语 在数字化时代&#xff0c;网络安全成为了个人和企业面临的主要挑战之一。随着…

数学建模强化宝典(4)fminunc

一、介绍 fminunc 是 MATLAB 中用于求解无约束多变量非线性优化问题的函数。它尝试找到给定函数的最小值点&#xff0c;不需要用户提供函数的导数信息&#xff08;尽管如果提供了导数信息&#xff0c;算法通常会更快更准确地收敛&#xff09;。fminunc 使用的是拟牛顿法&#x…

stm32 8080时序驱动lcd屏幕

PSAM使用的硬件接口 PSAM读时序 PSAM写时序 相关时序 PSAM_RCRx NOR 和PSRAM控制寄存器

Ubuntu/Debian 上删除未使用的软件包

随着时间的推移&#xff0c;Linux 系统可能会有大量不再使用的软件包。这些软件包会占用大量磁盘空间&#xff0c;并可能降低系统的整体性能。 本指南将向您展示如何轻松地删除这些未使用的包。保持系统的干净和高效是很重要的&#xff0c;但是要小心&#xff0c;删除必要的软…

Kafka如何保证消息不丢失?

目录 Producer Broker Consumer 为什么Kafka没办法100%保证消息不丢失呢&#xff1f; 生产者 消费者 Broker Kafka作为一个消息中间件&#xff0c;他需要结合消息生产者和消费者一起才能工作&#xff0c;一次消息发送包含以下是三个过程&#xff1a; 1&#xff09;Prod…

QT实现电子相册

使用带有UI界面的QWidget实现电子相册 1、实现功能 1、定时器的使用&#xff0c;在当前页面的停止总时长。 2、显示当前时间 3、图片的上一张与下一张 4、图片的显示 5、进度展示、一共十张图片、进度条的初始值为10。 2、widget.h #ifndef WIDGET_H #define WIDGET_H#i…

Linux 常用命令 ulimit、uptime、curl、scp、dos2unix 提升开发和运维效率

Linux 常用命令&#xff1a;从资源限制到网络传输 一、前导&#xff1a;概述二、ulimit 用户资源三、uptime 机器启动时间负载四、curl 命令五、scp 远程拷贝六、dos2unix和unix2dos命令七、总结 一、前导&#xff1a;概述 本系列主要讲解Linux运行时命令&#xff0c;包括网络…

pycharm中opencv-python和opencv-contrib安装及测试相机链接取图

1.去到https://pypi.org/中查找opencv-python 和opencv-contrib-python当前下载的是4.10.0 2.分别下载。 3.下载完后&#xff0c;打开pycharm&#xff0c;然后新建一个项目&#xff0c;项目中新建一个main.py文件&#xff0c;设置项目配置环境为当前python环境&#xff0c; …

常用排序算法(上)

目录 前言&#xff1a; 1.排序的概念及其运用 1.1排序的概念 1.2排序运用 1.3 常见的排序算法 2.常见排序算法的实现 2.1 堆排序 2.1 1 向下调整算法 2.1 2 建堆 2.1 3 排序 2.2 插入排序 2.1.1基本思想&#xff1a; 2.1.2直接插入排序&#xff1a; 2.1.3 插…

JS设计模式之“神奇的魔术师” - 简单工厂模式

引言 在JavaScript开发中&#xff0c;我们经常需要创建和管理各种对象&#xff0c;而简单工厂模式就是一种最简单的用来创建对象的设计模式。 简单工厂模式通过一个工厂类来创建相似的对象&#xff0c;而无需直接使用具体类来实例化对象。这样可以将对象的创建过程与使用过程…

Zabbix 配置win系统登录和钉钉告警

1、配置win监控项 win系统日志ID 4624是成功登录 4625是失败登录 登录成功日志&#xff1a; eventlog[Security,,"Success Audit",,^4624$,,skip] 登录失败日志&#xff1a; eventlog[Security,,"Success Audit",,^4625$,,skip] 要监控登录的日志&…

音视频开发之旅(90)-Vision Transformer论文解读与源码分析

目录 1.背景和问题 2.Vision Transformer(VIT)模型结构 3.Patch Embedding 4.实现效果 5.代码解析 6.资料 一、背景和问题 上一篇我们学习了Transformer的原理&#xff0c;主要介绍了在NLP领域上的应用&#xff0c;那么在CV(图像视频)领域该如何使用&#xff1f; 最直观…

在Diffusers中使用LoRA微调模型

在浏览稳定扩散模型共享网站&#xff08;例如 CivitAI&#xff09;时&#xff0c;你可能遇到过一些标记为“LoRA”的自定义模型。“LoRA”到底是什么—它与典型的模型检查点有何不同&#xff1f;LoRA 可以与Diffusers包一起使用吗&#xff1f;在本文中&#xff0c;我们将回答这…