perfkitbenchmarker/linux_packages/dlrm.py (75 lines of code) (raw):
# Copyright 2024 PerfKitBenchmarker Authors. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""Package for downloading DLRMv2 data and models."""
from absl import flags
from perfkitbenchmarker import errors
from perfkitbenchmarker import regex_util
from perfkitbenchmarker import sample
# "_" is not allowed in some cloud object storage services.
PACKAGE_NAME = 'dlrm'
PREPROVISIONED_DATA = {
'day_23_dense.npy': (
'127dadd27ec933c4fc16223fc54609478891b7a51cf6f4de3781543c36f6fcc2'
),
'day_23_labels.npy': (
'b650f2fd015b8e45461e82ada9ff5eb6e31bb918ddf4968e42aef4f7f5040aad'
),
'day_23_sparse_multi_hot.npz': (
'6d2afc30d35c16e8b98f1ef0531dd620b6a0f32072b3a1d1b4eb1badb2ac3d70'
),
'weights.zip': (
'6fe76b56c15fef16903ff4f6837e01581c8b033709286945d7bb62bf3d9ec262'
),
}
DLRM_DATA = (
'day_23_dense.npy',
'day_23_labels.npy',
'day_23_sparse_multi_hot.npz',
)
DLRM_DOWNLOAD_TIMEOUT = 3600
REFERENCE_ROC_AUC = 80.31
MLPERF_ROOT = 'mlcommons'
MODEL_PATH = f'{MLPERF_ROOT}/model-terabyte'
DATA_PATH = f'{MLPERF_ROOT}/data-terabyte'
TARGET = flags.DEFINE_enum(
'dlrm_target', '99.9', ['99', '99.9'],
'Target accuracy to achieve relative to reference implementation.')
def Install(vm):
"""Download and configure the dlrm data on the VM."""
vm.InstallPackages('unzip')
vm.RemoteCommand(f'mkdir -p {DATA_PATH}')
vm.InstallPreprovisionedPackageData(
PACKAGE_NAME, DLRM_DATA, DATA_PATH, DLRM_DOWNLOAD_TIMEOUT
)
vm.InstallPreprovisionedPackageData(
PACKAGE_NAME, ['weights.zip'], MLPERF_ROOT, DLRM_DOWNLOAD_TIMEOUT
)
vm.RemoteCommand(
f'cd {MLPERF_ROOT}; unzip weights.zip -d .; '
'mv model_weights model-terabyte'
)
def CheckAccuracy(output, target='99.9'):
"""Check if reach target accuracy."""
roc_auc = regex_util.ExtractFloat(
r'roc_auc=(\d+\.\d+)%', output
)
if roc_auc / REFERENCE_ROC_AUC * 100 < float(target):
raise ValueError(
f'ROC_AUC is {roc_auc}%, '
f'not reaching {target}% of target {REFERENCE_ROC_AUC}%.')
def ParseDlrmSummary(summary, metadata, scenario):
"""Parse MLPerf DLRM summary."""
metadata['valid'] = 'Result is : VALID' in summary
if not metadata['valid']:
raise errors.Benchmarks.RunError(
'Result is invalid. Please check the log for details.'
)
samples_per_sec_field = 'Samples per second: '
if scenario == 'server':
samples_per_sec_field = 'Completed samples per second : '
samples_per_sec = regex_util.ExtractFloat(
samples_per_sec_field + f'({regex_util.FLOAT_REGEX})', summary
)
for percentile in ('50.00', '90.00', '95.00', '97.00', '99.00', '99.90'):
latency = regex_util.ExtractFloat(
percentile + r' percentile latency \(ns\)\s*: (\d+)', summary
)
metadata[f'p{percentile}'] = latency
return [
sample.Sample(
'Samples per second', samples_per_sec, 'Samples/sec', metadata
)
]