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。